studiokit-scaffolding-js 7.1.0 → 7.1.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +137 -137
  3. package/lib/components/ActionList.js +1 -1
  4. package/lib/components/AlertDialog.js +1 -1
  5. package/lib/components/AlertWithIcon.js +1 -1
  6. package/lib/components/ConnectedModal.js +3 -3
  7. package/lib/components/Dropdowns/GroupsDropdown.js +1 -1
  8. package/lib/components/Dropdowns/ManagedNavDropdown.js +4 -4
  9. package/lib/components/Dropdowns/UserDropdown.js +1 -1
  10. package/lib/components/Dropdowns/index.js +1 -1
  11. package/lib/components/EntityOwnerList.js +1 -1
  12. package/lib/components/Error.js +1 -1
  13. package/lib/components/ErrorBoundary.js +1 -1
  14. package/lib/components/ErrorMessage.js +1 -1
  15. package/lib/components/Forms/DateField.js +1 -1
  16. package/lib/components/Forms/TimeField.js +1 -1
  17. package/lib/components/Forms/index.js +1 -1
  18. package/lib/components/Groups/CreateEditCopySaveButtons.js +1 -1
  19. package/lib/components/Groups/ExternalGroups/Attach.js +1 -1
  20. package/lib/components/Groups/ExternalGroups/Table.js +1 -1
  21. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +1 -1
  22. package/lib/components/Groups/RosterSyncInfo.js +1 -1
  23. package/lib/components/HOC/AccessibleAppComponent.js +6 -6
  24. package/lib/components/HOC/ActivityRequiredComponent.js +50 -50
  25. package/lib/components/HOC/AsyncComponent.js +1 -1
  26. package/lib/components/HOC/AuthenticatedComponent.js +1 -1
  27. package/lib/components/HOC/CollectionComponent.js +11 -11
  28. package/lib/components/HOC/CollectionFirstItemComponent.js +4 -4
  29. package/lib/components/HOC/CollectionItemComponent.js +11 -11
  30. package/lib/components/HOC/ConnectedModalComponent.js +15 -15
  31. package/lib/components/HOC/DataDependentComponent.js +1 -1
  32. package/lib/components/HOC/EntityComponent.js +12 -12
  33. package/lib/components/HOC/FullscreenModalComponent.js +24 -24
  34. package/lib/components/HOC/GroupActivityRequiredComponent.js +19 -19
  35. package/lib/components/HOC/GuidComponent.js +5 -5
  36. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +7 -7
  37. package/lib/components/HOC/ModelErrorRedirectComponent.js +12 -12
  38. package/lib/components/HOC/SearchPersistorComponent.js +43 -43
  39. package/lib/components/HOC/UnauthenticatedComponent.js +1 -1
  40. package/lib/components/HOC/UserComponent.js +1 -1
  41. package/lib/components/Icons/IconAlphaList.js +1 -1
  42. package/lib/components/Icons/IconExternalUser.js +1 -1
  43. package/lib/components/Icons/IconImpersonation.js +1 -1
  44. package/lib/components/Icons/IconStopImpersonating.js +1 -1
  45. package/lib/components/Icons/IconTable.js +1 -1
  46. package/lib/components/Icons/IconTableDeleteCol.js +1 -1
  47. package/lib/components/Icons/IconTableDeleteRow.js +1 -1
  48. package/lib/components/Icons/IconTableInsertCol.js +1 -1
  49. package/lib/components/Icons/IconTableInsertRow.js +1 -1
  50. package/lib/components/Impersonation/Button.js +1 -1
  51. package/lib/components/Impersonation/Link.js +1 -1
  52. package/lib/components/Impersonation/UserDetail.css +22 -22
  53. package/lib/components/Impersonation/UserDetail.js +3 -3
  54. package/lib/components/Loading.js +1 -1
  55. package/lib/components/LockDownBrowser/Check.js +1 -1
  56. package/lib/components/LockDownBrowser/ExitButton.js +1 -1
  57. package/lib/components/LockDownBrowser/Launch.js +1 -1
  58. package/lib/components/Lti/Confirm.js +1 -1
  59. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +1 -1
  60. package/lib/components/Lti/Launch.js +1 -1
  61. package/lib/components/Lti/LaunchGroup.js +1 -1
  62. package/lib/components/ManageTable.js +1 -1
  63. package/lib/components/ManageTableNoDataComponent.js +1 -1
  64. package/lib/components/NewVersionAlert.js +1 -1
  65. package/lib/components/NotFound.js +1 -1
  66. package/lib/components/Notifications.js +1 -1
  67. package/lib/components/PaginationNextButton.js +1 -1
  68. package/lib/components/PaginationPreviousButton.js +1 -1
  69. package/lib/components/Quill/CustomToolbar.js +1 -1
  70. package/lib/components/Quill/Formats/Image.js +5 -5
  71. package/lib/components/Quill/Formats/List.js +3 -3
  72. package/lib/components/Quill/Formats/Video.js +3 -3
  73. package/lib/components/Quill/ImageDropModule.js +17 -17
  74. package/lib/components/Quill/ImageWarning.js +1 -1
  75. package/lib/components/Quill/ImageWithAltTextModal.js +1 -1
  76. package/lib/components/Quill/Specs/CustomImageSpec.js +7 -7
  77. package/lib/components/Quill/Specs/CustomVideoSpec.js +9 -9
  78. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +8 -8
  79. package/lib/components/Quill/TableModule/Blots/TableBlot.js +1 -1
  80. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +1 -1
  81. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +1 -1
  82. package/lib/components/Quill/TableModule/Blots/TableContainer.js +1 -1
  83. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +1 -1
  84. package/lib/components/Quill/TableModule/constants.js +1 -1
  85. package/lib/components/Quill/TableModule/index.css +171 -171
  86. package/lib/components/Quill/TableModule/index.js +1 -1
  87. package/lib/components/Quill/TableModule/utils.js +1 -1
  88. package/lib/components/Quill/accessibilityFix.js +14 -14
  89. package/lib/components/Quill/index.js +1 -1
  90. package/lib/components/RefreshIndicator/Bordered.js +1 -1
  91. package/lib/components/RefreshIndicator/Inline.js +1 -1
  92. package/lib/components/RefreshIndicator/index.js +1 -1
  93. package/lib/components/SearchControls.js +1 -1
  94. package/lib/components/SentryRoute.js +1 -1
  95. package/lib/components/Tables/RoleFilter.js +1 -1
  96. package/lib/components/Tables/TextFilter.js +1 -1
  97. package/lib/components/UserRoles/Add.js +1 -1
  98. package/lib/components/UserRoles/Context.js +4 -4
  99. package/lib/components/UserRoles/RoleCell.js +5 -4
  100. package/lib/components/UserRoles/Select.js +16 -5
  101. package/lib/components/UserRoles/Table.js +1 -1
  102. package/lib/components/UserRoles/index.js +3 -3
  103. package/lib/config/eslint/index.js +1 -1
  104. package/lib/config/eslint/lib/order.js +1 -1
  105. package/lib/config/eslint/lib/prettier.js +1 -1
  106. package/lib/config/eslint/lib/typescript.js +1 -1
  107. package/lib/config/eslint/react.js +1 -1
  108. package/lib/constants/baseActivity.js +1 -1
  109. package/lib/constants/baseRole.js +1 -1
  110. package/lib/constants/configuration.js +1 -1
  111. package/lib/constants/externalProviderType.js +1 -1
  112. package/lib/constants/fetchErrorData.js +1 -1
  113. package/lib/constants/index.js +1 -1
  114. package/lib/constants/lockDownBrowser.js +1 -1
  115. package/lib/constants/mockData.js +3 -3
  116. package/lib/constants/modelStatus.js +1 -1
  117. package/lib/constants/notificationType.js +1 -1
  118. package/lib/constants/operatingSystem.js +1 -1
  119. package/lib/constants/shard.js +1 -1
  120. package/lib/constants/table.js +1 -1
  121. package/lib/constants/tier.js +1 -1
  122. package/lib/constants/userRole.js +1 -1
  123. package/lib/css/base/_base.css +98 -98
  124. package/lib/css/base/_typography.css +130 -130
  125. package/lib/css/components/_alert.css +86 -86
  126. package/lib/css/components/_bootstrap-grid.css +28 -28
  127. package/lib/css/components/_buttons.css +390 -397
  128. package/lib/css/components/_forms.css +106 -101
  129. package/lib/css/components/_menu.css +56 -56
  130. package/lib/css/components/_modals.css +46 -46
  131. package/lib/css/components/_quill.css +323 -315
  132. package/lib/css/components/_tables.css +504 -497
  133. package/lib/css/components/_tags.css +12 -12
  134. package/lib/css/index-with-variables.css +15 -15
  135. package/lib/css/index.css +14 -14
  136. package/lib/css/utils/_border.css +463 -463
  137. package/lib/css/utils/_color.css +317 -317
  138. package/lib/css/utils/_display.css +305 -305
  139. package/lib/css/utils/_focus.css +12 -0
  140. package/lib/css/utils/_general.css +48 -48
  141. package/lib/css/utils/_icon.css +16 -16
  142. package/lib/css/utils/_text.css +25 -25
  143. package/lib/css/utils/_width.css +60 -60
  144. package/lib/css/variables.css +90 -84
  145. package/lib/endpointMappings.js +1 -1
  146. package/lib/hooks/useCollection.js +1 -1
  147. package/lib/hooks/useCollectionConfiguration.js +7 -7
  148. package/lib/hooks/useCollectionItem.js +1 -1
  149. package/lib/hooks/useEventCalback.js +13 -13
  150. package/lib/hooks/useGuid.js +3 -3
  151. package/lib/hooks/usePrevious.js +23 -23
  152. package/lib/index.js +1 -1
  153. package/lib/redux/actionCreator.js +1 -1
  154. package/lib/redux/actions/AuthAction.js +7 -7
  155. package/lib/redux/actions/ModalAction.js +1 -1
  156. package/lib/redux/actions/ModelAction.js +17 -17
  157. package/lib/redux/actions/NotificationAction.js +1 -1
  158. package/lib/redux/actions/SearchAction.js +1 -1
  159. package/lib/redux/actions/index.js +1 -1
  160. package/lib/redux/configureReducers.js +7 -7
  161. package/lib/redux/configureStore.js +1 -1
  162. package/lib/redux/helpers.js +1 -1
  163. package/lib/redux/reducers/authReducer.js +3 -3
  164. package/lib/redux/reducers/index.js +1 -1
  165. package/lib/redux/reducers/modalsReducer.js +1 -1
  166. package/lib/redux/reducers/modelsReducer.js +48 -48
  167. package/lib/redux/reducers/notificationsReducer.js +1 -1
  168. package/lib/redux/reducers/searchReducer.js +9 -9
  169. package/lib/redux/sagas/appInsightsSaga.js +1 -1
  170. package/lib/redux/sagas/authSaga.js +1 -1
  171. package/lib/redux/sagas/caliperSaga.js +16 -16
  172. package/lib/redux/sagas/clockOffsetSaga.js +9 -9
  173. package/lib/redux/sagas/configurationSaga.js +1 -1
  174. package/lib/redux/sagas/downtimeApiErrorSaga.js +1 -1
  175. package/lib/redux/sagas/errorSaga.js +1 -1
  176. package/lib/redux/sagas/googleAnalyticsSaga.js +1 -1
  177. package/lib/redux/sagas/identityProviderSaga.js +1 -1
  178. package/lib/redux/sagas/initialDataLoadSaga.js +1 -1
  179. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +1 -1
  180. package/lib/redux/sagas/modelFetchSaga.js +49 -49
  181. package/lib/redux/sagas/noStoreSaga.js +1 -1
  182. package/lib/redux/sagas/postLoginDataSaga.js +6 -6
  183. package/lib/redux/sagas/postLoginRedirectSaga.js +4 -4
  184. package/lib/redux/sagas/rootSaga.js +1 -1
  185. package/lib/redux/sagas/sentrySaga.js +1 -1
  186. package/lib/redux/sagas/userIdSaga.js +1 -1
  187. package/lib/services/codeProviderService.js +1 -1
  188. package/lib/services/dateService.js +3 -3
  189. package/lib/services/documentService.js +4 -4
  190. package/lib/services/fetchService.js +25 -25
  191. package/lib/services/persistenceService.js +1 -1
  192. package/lib/services/ticketProviderService.js +1 -1
  193. package/lib/services/tokenPersistenceService.js +1 -1
  194. package/lib/services/windowService.js +1 -1
  195. package/lib/startup.js +18 -18
  196. package/lib/types/AppConfiguration.js +1 -1
  197. package/lib/types/Artifact.js +1 -1
  198. package/lib/types/BaseReduxState.js +1 -1
  199. package/lib/types/Client.js +1 -1
  200. package/lib/types/Collection.js +1 -1
  201. package/lib/types/Configuration.js +1 -1
  202. package/lib/types/DeepLinkingResponseRequest.js +1 -1
  203. package/lib/types/DeletableModel.js +1 -1
  204. package/lib/types/Event.js +1 -1
  205. package/lib/types/ExternalGroup.js +1 -1
  206. package/lib/types/ExternalProvider.js +1 -1
  207. package/lib/types/ExternalTerm.js +1 -1
  208. package/lib/types/Group.js +1 -1
  209. package/lib/types/IdentityProvider.js +1 -1
  210. package/lib/types/LtiLaunch.js +1 -1
  211. package/lib/types/NameOnlyEntity.js +1 -1
  212. package/lib/types/Notification.js +1 -1
  213. package/lib/types/OptionalRecord.js +1 -1
  214. package/lib/types/OwnerSchedule.js +1 -1
  215. package/lib/types/PropertyOfType.js +1 -1
  216. package/lib/types/Quill.js +1 -1
  217. package/lib/types/RoleDescription.js +1 -1
  218. package/lib/types/Search.js +1 -1
  219. package/lib/types/SimpleLocation.js +1 -1
  220. package/lib/types/UniTime.js +1 -1
  221. package/lib/types/User.js +1 -1
  222. package/lib/types/UserRole.js +1 -1
  223. package/lib/types/auth/AuthState.js +1 -1
  224. package/lib/types/auth/CasV1LoginRequestBody.js +1 -1
  225. package/lib/types/auth/ClientCredentials.js +1 -1
  226. package/lib/types/auth/CodeProviderService.js +1 -1
  227. package/lib/types/auth/LocalLoginRequestBody.js +1 -1
  228. package/lib/types/auth/TicketProviderService.js +1 -1
  229. package/lib/types/auth/TokenPersistenceService.js +1 -1
  230. package/lib/types/auth/index.js +1 -1
  231. package/lib/types/externals.d.js +1 -1
  232. package/lib/types/index.js +1 -1
  233. package/lib/types/net/EndpointConfig.js +1 -1
  234. package/lib/types/net/EndpointMapping.js +1 -1
  235. package/lib/types/net/EndpointMappings.js +1 -1
  236. package/lib/types/net/ErrorHandler.js +1 -1
  237. package/lib/types/net/FetchConfig.js +1 -1
  238. package/lib/types/net/FetchErrorData.js +1 -1
  239. package/lib/types/net/FetchResult.js +1 -1
  240. package/lib/types/net/HTTPMethod.js +1 -1
  241. package/lib/types/net/HTTPStatusCode.js +1 -1
  242. package/lib/types/net/Metadata.js +1 -1
  243. package/lib/types/net/Model.js +1 -1
  244. package/lib/types/net/ModelCollection.js +1 -1
  245. package/lib/types/net/ModelsState.js +1 -1
  246. package/lib/types/net/OAuthToken.js +1 -1
  247. package/lib/types/net/OAuthTokenOrNull.js +1 -1
  248. package/lib/types/net/TokenAccessFunction.js +1 -1
  249. package/lib/types/net/index.js +1 -1
  250. package/lib/utils/baseActivity.js +87 -87
  251. package/lib/utils/baseRole.js +1 -1
  252. package/lib/utils/collection.js +20 -20
  253. package/lib/utils/cookies.js +1 -1
  254. package/lib/utils/date.js +111 -111
  255. package/lib/utils/dom.js +42 -42
  256. package/lib/utils/domainIdentifier.js +1 -1
  257. package/lib/utils/entityUserRole.js +1 -1
  258. package/lib/utils/error.js +1 -1
  259. package/lib/utils/events.js +4 -4
  260. package/lib/utils/externalGroup.js +1 -1
  261. package/lib/utils/externalProviders.js +1 -1
  262. package/lib/utils/externalTerms.js +1 -1
  263. package/lib/utils/fetch.js +10 -10
  264. package/lib/utils/group.js +1 -1
  265. package/lib/utils/groupDates.js +1 -1
  266. package/lib/utils/groupRoles.js +1 -1
  267. package/lib/utils/lockDownBrowser.js +1 -1
  268. package/lib/utils/logger.js +1 -1
  269. package/lib/utils/lti.js +1 -1
  270. package/lib/utils/model.js +5 -5
  271. package/lib/utils/number.js +11 -11
  272. package/lib/utils/promise.js +1 -1
  273. package/lib/utils/quill.js +16 -16
  274. package/lib/utils/route.js +1 -1
  275. package/lib/utils/search.js +1 -1
  276. package/lib/utils/shard.js +1 -1
  277. package/lib/utils/sort.js +1 -1
  278. package/lib/utils/string.js +1 -1
  279. package/lib/utils/table.js +4 -4
  280. package/lib/utils/timezone.js +1 -1
  281. package/lib/utils/url.js +20 -19
  282. package/lib/utils/user.js +1 -1
  283. package/lib/utils/userAgent.js +1 -1
  284. package/lib/utils/userRole.js +16 -16
  285. package/package.json +224 -224
package/lib/utils/date.js CHANGED
@@ -34,31 +34,31 @@ exports.setClockOffset = exports.isTimeInputSupported = void 0;
34
34
  var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
35
35
  var _momentTimezoneUtils = _interopRequireDefault(require("moment-timezone/moment-timezone-utils"));
36
36
  var _timezone = require("./timezone");
37
- /**
38
- * This value is used by time-sensitive functions in this module and other date/time utils. Any time
39
- * a new Date object is constructed, it will use this value to adjust the time by this offset (to
40
- * make it consistent with a known time)
37
+ /**
38
+ * This value is used by time-sensitive functions in this module and other date/time utils. Any time
39
+ * a new Date object is constructed, it will use this value to adjust the time by this offset (to
40
+ * make it consistent with a known time)
41
41
  */
42
42
  let clockOffset = 0;
43
43
 
44
- /**
45
- * When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
46
- * used to update the difference between the (accurate) server time and the browser time
44
+ /**
45
+ * When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
46
+ * used to update the difference between the (accurate) server time and the browser time
47
47
  */
48
48
  const setClockOffset = function (offset) {
49
49
  clockOffset = offset;
50
50
  };
51
51
 
52
- /**
53
- * Get the current UTC time, calibrated to the API server's clock
52
+ /**
53
+ * Get the current UTC time, calibrated to the API server's clock
54
54
  */
55
55
  exports.setClockOffset = setClockOffset;
56
56
  const getServerNowUtc = function () {
57
57
  return new Date(Date.now() + clockOffset);
58
58
  };
59
59
 
60
- /**
61
- * Return the provided date, offset by the clockOffset
60
+ /**
61
+ * Return the provided date, offset by the clockOffset
62
62
  */
63
63
  exports.getServerNowUtc = getServerNowUtc;
64
64
  const getOffsetDate = date => {
@@ -109,13 +109,13 @@ function getEndOfMinute(dateTimeUtc) {
109
109
  .toDate();
110
110
  }
111
111
 
112
- /**
113
- * Is the current time, "now", **after or equal to** the given date.
114
- *
115
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
116
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
117
- *
118
- * @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
112
+ /**
113
+ * Is the current time, "now", **after or equal to** the given date.
114
+ *
115
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
116
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
117
+ *
118
+ * @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
119
119
  */
120
120
  function isNowEqualOrAfterDate(dateTimeUtc) {
121
121
  let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
@@ -127,13 +127,13 @@ function isNowEqualOrAfterDate(dateTimeUtc) {
127
127
  return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
128
128
  }
129
129
 
130
- /**
131
- * Is the current time, "now", **before or equal to** the given date.
132
- *
133
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
134
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
135
- *
136
- * @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
130
+ /**
131
+ * Is the current time, "now", **before or equal to** the given date.
132
+ *
133
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
134
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
135
+ *
136
+ * @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
137
137
  */
138
138
  function isNowEqualOrBeforeDate(dateTimeUtc) {
139
139
  let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
@@ -145,13 +145,13 @@ function isNowEqualOrBeforeDate(dateTimeUtc) {
145
145
  return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
146
146
  }
147
147
 
148
- /**
149
- * Is the current time, "now", **after** the given date.
150
- *
151
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
152
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
153
- *
154
- * @returns Whether or not "now" is **after** `dateTimeUtc`.
148
+ /**
149
+ * Is the current time, "now", **after** the given date.
150
+ *
151
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
152
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
153
+ *
154
+ * @returns Whether or not "now" is **after** `dateTimeUtc`.
155
155
  */
156
156
  function isNowAfterDate(dateTimeUtc) {
157
157
  let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
@@ -163,13 +163,13 @@ function isNowAfterDate(dateTimeUtc) {
163
163
  return currentMoment > adjustedDateTimeMoment;
164
164
  }
165
165
 
166
- /**
167
- * Is the current time, "now", **before** the given date.
168
- *
169
- * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
170
- * @param nowUtc Optional. The current time, "now", as an ISO date string.
171
- *
172
- * @returns Whether or not "now" is **before** `dateTimeUtc`.
166
+ /**
167
+ * Is the current time, "now", **before** the given date.
168
+ *
169
+ * @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
170
+ * @param nowUtc Optional. The current time, "now", as an ISO date string.
171
+ *
172
+ * @returns Whether or not "now" is **before** `dateTimeUtc`.
173
173
  */
174
174
  function isNowBeforeDate(dateTimeUtc) {
175
175
  let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
@@ -181,66 +181,66 @@ function isNowBeforeDate(dateTimeUtc) {
181
181
  return currentMoment < adjustedDateTimeMoment;
182
182
  }
183
183
 
184
- /**
185
- * Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
186
- * @param dateTimeUtc A UTC date time string
187
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
184
+ /**
185
+ * Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
186
+ * @param dateTimeUtc A UTC date time string
187
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
188
188
  */
189
189
  function getFormattedFullDateAndTime(dateTimeUtc) {
190
190
  let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
191
191
  return applyFormat(dateTimeUtc, `MMMM D, YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
192
192
  }
193
193
 
194
- /**
195
- * Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
196
- * @param dateTimeUtc A UTC date time string
197
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
194
+ /**
195
+ * Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
196
+ * @param dateTimeUtc A UTC date time string
197
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
198
198
  */
199
199
  function getFormattedFullDateWithWeek(dateTimeUtc) {
200
200
  let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
201
201
  return applyFormat(dateTimeUtc, `ddd, M/D/YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
202
202
  }
203
203
 
204
- /**
205
- * Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
206
- * @param dateTimeUtc A UTC date time string
207
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
204
+ /**
205
+ * Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
206
+ * @param dateTimeUtc A UTC date time string
207
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
208
208
  */
209
209
  function getFormattedNumberedDateAndTime(dateTimeUtc) {
210
210
  let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
211
211
  return applyFormat(dateTimeUtc, `M/D/YY h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
212
212
  }
213
213
 
214
- /**
215
- * Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
216
- * @param dateTimeUtc A UTC date time string
217
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
214
+ /**
215
+ * Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
216
+ * @param dateTimeUtc A UTC date time string
217
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
218
218
  */
219
219
  function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc) {
220
220
  let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
221
221
  return applyFormat(dateTimeUtc, `M/D h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
222
222
  }
223
223
 
224
- /**
225
- * Returns a date string with short month and full year, e.g. `Mar 5, 2018`
226
- * @param dateTimeUtc A UTC date time string
224
+ /**
225
+ * Returns a date string with short month and full year, e.g. `Mar 5, 2018`
226
+ * @param dateTimeUtc A UTC date time string
227
227
  */
228
228
  function getFormattedSimplifiedDate(dateTimeUtc) {
229
229
  return applyFormat(dateTimeUtc, 'MMM D, YYYY');
230
230
  }
231
231
 
232
- /**
233
- * Returns a date string with short month and no year, e.g. `Mar 5`
234
- * @param dateTimeUtc A UTC date time string
232
+ /**
233
+ * Returns a date string with short month and no year, e.g. `Mar 5`
234
+ * @param dateTimeUtc A UTC date time string
235
235
  */
236
236
  function getFormattedSimplifiedDateWithoutYear(dateTimeUtc) {
237
237
  return applyFormat(dateTimeUtc, 'MMM D');
238
238
  }
239
239
 
240
- /**
241
- * Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
242
- * @param dateTimeUtc A UTC date time string
243
- * @param nowUtc (optional) A UTC date time string of "now". Used for testing.
240
+ /**
241
+ * Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
242
+ * @param dateTimeUtc A UTC date time string
243
+ * @param nowUtc (optional) A UTC date time string of "now". Used for testing.
244
244
  */
245
245
  function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
246
246
  let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
@@ -249,53 +249,53 @@ function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
249
249
  return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0 ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc) : getFormattedSimplifiedDate(dateTimeUtc);
250
250
  }
251
251
 
252
- /**
253
- * Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
254
- * @param dateTimeUtc A UTC date time string
252
+ /**
253
+ * Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
254
+ * @param dateTimeUtc A UTC date time string
255
255
  */
256
256
  function getFormattedNumberedDate(dateTimeUtc) {
257
257
  return applyFormat(dateTimeUtc, 'M/D/YY');
258
258
  }
259
259
 
260
- /**
261
- * Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
262
- * @param dateTimeUtc A UTC date time string
260
+ /**
261
+ * Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
262
+ * @param dateTimeUtc A UTC date time string
263
263
  */
264
264
  function getFormattedNumberedDateWithFullYear(dateTimeUtc) {
265
265
  return applyFormat(dateTimeUtc, 'M/D/YYYY');
266
266
  }
267
267
 
268
- /**
269
- * Returns a date string for use in HTML inputs, e.g. `2018-03-05`
270
- * @param dateTimeUtc A UTC date time string
268
+ /**
269
+ * Returns a date string for use in HTML inputs, e.g. `2018-03-05`
270
+ * @param dateTimeUtc A UTC date time string
271
271
  */
272
272
  function getFormattedNumberedDateForInput(dateTimeUtc) {
273
273
  return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
274
274
  }
275
275
 
276
- /**
277
- * Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
278
- * @param dateTimeUtc A UTC date time string
276
+ /**
277
+ * Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
278
+ * @param dateTimeUtc A UTC date time string
279
279
  */
280
280
  function getFormattedNumberedDateWithoutYear(dateTimeUtc) {
281
281
  return applyFormat(dateTimeUtc, 'M/D');
282
282
  }
283
283
 
284
- /**
285
- * Returns a time string, e.g. `4:05 PM EDT`
286
- * @param dateTimeUtc A UTC date time string
287
- * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
284
+ /**
285
+ * Returns a time string, e.g. `4:05 PM EDT`
286
+ * @param dateTimeUtc A UTC date time string
287
+ * @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
288
288
  */
289
289
  function getFormattedNumberedTime(dateTimeUtc) {
290
290
  let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
291
291
  return applyFormat(dateTimeUtc, `h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
292
292
  }
293
293
 
294
- /**
295
- * Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
296
- * @param dateTimeUtc A UTC date time string
297
- * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
298
- * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
294
+ /**
295
+ * Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
296
+ * @param dateTimeUtc A UTC date time string
297
+ * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
298
+ * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
299
299
  */
300
300
  function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
301
301
  let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
@@ -311,32 +311,32 @@ function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
311
311
  `${time} ${timezoneAbbreviation} (${timeZoneId.replace('_', ' ')})`;
312
312
  }
313
313
 
314
- /**
315
- * Returns a time string without time zone, e.g. `4:05 PM`
316
- * @param dateTimeUtc A UTC date time string
314
+ /**
315
+ * Returns a time string without time zone, e.g. `4:05 PM`
316
+ * @param dateTimeUtc A UTC date time string
317
317
  */
318
318
  function getFormattedNumberedTimeWithoutZone(dateTimeUtc) {
319
319
  return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
320
320
  }
321
321
 
322
- /**
323
- * Returns a time string without time zone, in 24 hr time, e.g. `16:05`
324
- * @param dateTimeUtc A UTC date time string
322
+ /**
323
+ * Returns a time string without time zone, in 24 hr time, e.g. `16:05`
324
+ * @param dateTimeUtc A UTC date time string
325
325
  */
326
326
  function getFormattedNumberedTimeWithoutZoneOrMeridian(dateTimeUtc) {
327
327
  return applyFormat(dateTimeUtc, 'HH:mm');
328
328
  }
329
329
 
330
- /**
331
- * Returns a full formatted time zone string for the given `timeZoneId`.
332
- *
333
- * Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
334
- *
335
- * If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
336
- *
337
- * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
338
- * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
339
- * @param nowUtc (optional) The current time, "now", as an ISO date string.
330
+ /**
331
+ * Returns a full formatted time zone string for the given `timeZoneId`.
332
+ *
333
+ * Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
334
+ *
335
+ * If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
336
+ *
337
+ * @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
338
+ * @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
339
+ * @param nowUtc (optional) The current time, "now", as an ISO date string.
340
340
  */
341
341
  function getFullFormattedTimeZone() {
342
342
  let timeZoneId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _timezone.guessTimeZoneId)();
@@ -365,19 +365,19 @@ function getFullFormattedTimeZone() {
365
365
  `${abbreviationsString} (${readableZoneId})`;
366
366
  }
367
367
 
368
- /**
369
- * Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
370
- *
371
- * @param dateTimeUtc The date to format.
368
+ /**
369
+ * Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
370
+ *
371
+ * @param dateTimeUtc The date to format.
372
372
  */
373
373
  function getFormattedTimeZone(dateTimeUtc) {
374
374
  return applyFormat(dateTimeUtc, 'z');
375
375
  }
376
376
 
377
- /**
378
- * Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
379
- * @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
380
- * @param {*} format The format to use
377
+ /**
378
+ * Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
379
+ * @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
380
+ * @param {*} format The format to use
381
381
  */
382
382
  function applyFormat(dateTimeUtc, format) {
383
383
  let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
@@ -398,4 +398,4 @@ const isTimeInputSupported = exports.isTimeInputSupported = isInputTypeSupported
398
398
  function isDateTimeValid(dateTime) {
399
399
  return !!dateTime && (0, _momentTimezone.default)(dateTime).isValid();
400
400
  }
401
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xyXG5pbXBvcnQgbW9tZW50VXRpbHMgZnJvbSAnbW9tZW50LXRpbWV6b25lL21vbWVudC10aW1lem9uZS11dGlscydcclxuaW1wb3J0IHsgZ2V0RGVmYXVsdFRpbWVab25lSWQsIGd1ZXNzVGltZVpvbmVJZCB9IGZyb20gJy4vdGltZXpvbmUnXHJcblxyXG4vKipcclxuICogVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRpbWUtc2Vuc2l0aXZlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhbmQgb3RoZXIgZGF0ZS90aW1lIHV0aWxzLiBBbnkgdGltZVxyXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXHJcbiAqIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIGEga25vd24gdGltZSlcclxuICovXHJcbmxldCBjbG9ja09mZnNldCA9IDBcclxuXHJcbi8qKlxyXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXHJcbiAqIHVzZWQgdG8gdXBkYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIChhY2N1cmF0ZSkgc2VydmVyIHRpbWUgYW5kIHRoZSBicm93c2VyIHRpbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xyXG5cdGNsb2NrT2Zmc2V0ID0gb2Zmc2V0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGN1cnJlbnQgVVRDIHRpbWUsIGNhbGlicmF0ZWQgdG8gdGhlIEFQSSBzZXJ2ZXIncyBjbG9ja1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFNlcnZlck5vd1V0YyA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIGNsb2NrT2Zmc2V0KVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0T2Zmc2V0RGF0ZSA9IChkYXRlOiBEYXRlKSA9PiB7XHJcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXHJcblx0ZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pID0+IHtcclxuXHRyZXR1cm4gbW9tZW50LnV0YyhkYXRlVGltZVV0YykudHoodGltZVpvbmVJZClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUgPSAoZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSA9PiB7XHJcblx0Y29uc3QgdGltZVpvbmVJZCA9IGdldERlZmF1bHRUaW1lWm9uZUlkKClcclxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcclxuXHRjb25zdCBsb2NhbE1vbWVudCA9IG1vbWVudChsb2NhbERhdGVUaW1lKVxyXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gbW9tZW50LnR6KFxyXG5cdFx0W1xyXG5cdFx0XHRsb2NhbE1vbWVudC55ZWFyKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1vbnRoKCksXHJcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuaG91cigpLFxyXG5cdFx0XHRsb2NhbE1vbWVudC5taW51dGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1pbGxpc2Vjb25kKClcclxuXHRcdF0sXHJcblx0XHR0aW1lWm9uZUlkXHJcblx0KVxyXG5cdHJldHVybiB6b25lZE1vbWVudFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0TG9jYWxNb21lbnRGcm9tVXRjID0gKFxyXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcclxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcclxuKSA9PiB7XHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXHJcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQoW1xyXG5cdFx0em9uZWRNb21lbnQueWVhcigpLFxyXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcclxuXHRcdHpvbmVkTW9tZW50LmRhdGUoKSxcclxuXHRcdHpvbmVkTW9tZW50LmhvdXIoKSxcclxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxyXG5cdFx0em9uZWRNb21lbnQuc2Vjb25kKCksXHJcblx0XHR6b25lZE1vbWVudC5taWxsaXNlY29uZCgpXHJcblx0XSlcclxuXHRyZXR1cm4gbG9jYWxNb21lbnRcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldExvY2FsRGF0ZVRpbWVGcm9tVXRjID0gKGRhdGVUaW1lVXRjOiBzdHJpbmcpID0+IHtcclxuXHRyZXR1cm4gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKS50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGF0ZU1pbnVzVGltZSA9IChkYXRlVGltZTogRGF0ZSkgPT4ge1xyXG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIG1vbWVudChkYXRlVGltZVV0YylcclxuXHRcdC5zdGFydE9mKCdkYXknKVxyXG5cdFx0LmFkZCgxLCAnZGF5cycpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5kT2ZNaW51dGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXHJcblx0XHQuc3RhcnRPZignbWludXRlJylcclxuXHRcdC5hZGQoMSwgJ21pbnV0ZScpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG4vKipcclxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKiphZnRlciBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICpcclxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xyXG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH1cclxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxyXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxyXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0VxdWFsT3JCZWZvcmVEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XHJcblx0aWYgKCFkYXRlVGltZVV0Yykge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXHJcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXHJcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQuaXNTYW1lT3JCZWZvcmUoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlcioqIGBkYXRlVGltZVV0Y2AuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNOb3dBZnRlckRhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA+IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGZ1bGwgZGF0ZSwgZS5nLiBgTWFyY2ggNSwgMjAxOCBAIDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkRnVsbERhdGVBbmRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggZGF5IG9mIHdlZWsgYW5kIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBlLmcuIGBNb24sIDMvNS8yMDE4IEAgNDowNSBQTSBFRFRgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZVdpdGhXZWVrKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBhbmQgbm8gbGVhZGluZyB6ZXJvZXMsIGUuZy4gYDMvNS8xOCA0OjA1IFBNIEVEVGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMsIG5vIGxlYWRpbmcgemVyb2VzLCBhbmQgbm8geWVhciwgZS5nLiBgMy81IDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIHNob3J0IG1vbnRoIGFuZCBmdWxsIHllYXIsIGUuZy4gYE1hciA1LCAyMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNTU0gRCwgWVlZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTU1NIEQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGFzIGVpdGhlciAnTU1NIEQsIFlZWVknIG9yICdNTU0gRCcgaWYgdGhlIGRhdGUncyB5ZWFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHllYXJcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIG5vd1V0YyAob3B0aW9uYWwpIEEgVVRDIGRhdGUgdGltZSBzdHJpbmcgb2YgXCJub3dcIi4gVXNlZCBmb3IgdGVzdGluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxyXG5cdGRhdGVUaW1lVXRjOiBzdHJpbmcsXHJcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxyXG4pIHtcclxuXHRjb25zdCBub3dVdGNNb21lbnQgPSBtb21lbnQobm93VXRjKVxyXG5cdGNvbnN0IGRhdGVUaW1lTW9tZW50ID0gbW9tZW50KGRhdGVUaW1lVXRjKVxyXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxyXG5cdFx0PyBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjKVxyXG5cdFx0OiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0YylcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRC9ZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgbm8gbGVhZGluZyB6ZXJvZXMsIGFuZCBmdWxsIHllYXIsIGUuZy4gYDMvNS8yMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGZvciB1c2UgaW4gSFRNTCBpbnB1dHMsIGUuZy4gYDIwMTgtMDMtMDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlRm9ySW5wdXQoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ1lZWVktTU0tREQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRCcpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcsIGUuZy4gYDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHRpbWUgc3RyaW5nIHdpdGggcG9zc2libHkgZnVsbCB0aW1lIHpvbmUgbmFtZSwgZS5nLiBgNDowNSBQTSBFRFRgIG9yIGA0OjA1IFBNIENTVCAoQXNpYS9UYWlwZWkpYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUoXHJcblx0ZGF0ZVRpbWVVdGM6IHN0cmluZyxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pIHtcclxuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcclxuXHRjb25zdCB0aW1lID0gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnLCB0aW1lWm9uZUlkKVxyXG5cdGNvbnN0IHRpbWV6b25lQWJicmV2aWF0aW9uID0gem9uZWRNb21lbnQuem9uZUFiYnIoKVxyXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXHJcblx0XHQ/IC8vIERvbid0IHNob3cgdGhlIGZ1bGwgem9uZSBuYW1lIGlmIGluIEVEVCBvciBFU1QsIHVubGVzcyB0b2xkIHRvXHJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259YFxyXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcclxuXHRcdFx0Ly8gRXg6IFwiQXNpYS9UYWlwZWlcIlxyXG5cdFx0XHRgJHt0aW1lfSAke3RpbWV6b25lQWJicmV2aWF0aW9ufSAoJHt0aW1lWm9uZUlkLnJlcGxhY2UoJ18nLCAnICcpfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ2g6bW1cXHUwMGEwQScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGluIDI0IGhyIHRpbWUsIGUuZy4gYDE2OjA1YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lT3JNZXJpZGlhbihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bGwgZm9ybWF0dGVkIHRpbWUgem9uZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBgdGltZVpvbmVJZGAuXHJcbiAqXHJcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcclxuICpcclxuICogSWYgYWJicmV2aWF0aW9ucyBhcmUgbm90IGFscGhhIGNoYXJhY3RlcnMsIGUuZy4gYC0wNGAsIHRoZW4gb25seSB0aGUgdGltZVpvbmVJZCBpcyByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lKFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKClcclxuKSB7XHJcblx0Y29uc3Qgem9uZSA9IG1vbWVudC50ei56b25lKHRpbWVab25lSWQpXHJcblx0aWYgKCF6b25lKSByZXR1cm4gJydcclxuXHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMobm93VXRjLCB0aW1lWm9uZUlkKVxyXG5cdC8vIGZpbHRlciB0aGUgem9uZSBkYXRhIGRvd24gdG8ganVzdCByZWNlbnQgeWVhcnMsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgMTkwMCB0byAyMDM4XHJcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcclxuXHQvLyBmaW5kIGFsbCB1bmlxdWUgYWJicmV2aWF0aW9ucyBmb3IgdGhlIHpvbmUsIGNvbWJpbmVkIGludG8gYSBzdHJpbmdcclxuXHRjb25zdCBhYmJyZXZpYXRpb25zID0gZmlsdGVyZWRab25lLmFiYnJzXHJcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXHJcblx0XHQuZmlsdGVyKGFiYnIgPT4gL1thLXpBLVpdKy9nLnRlc3QoYWJicikpXHJcblx0XHQucmVkdWNlKCh1bmlxdWVBYmJyczogc3RyaW5nW10sIGFiYnIpID0+IHtcclxuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xyXG5cdFx0XHRcdHVuaXF1ZUFiYnJzLnB1c2goYWJicilcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcclxuXHRcdH0sIFtdKVxyXG5cdGNvbnN0IGFiYnJldmlhdGlvbnNTdHJpbmcgPSBhYmJyZXZpYXRpb25zLmxlbmd0aCA+IDAgPyBhYmJyZXZpYXRpb25zLmpvaW4oJy8nKSA6IG51bGxcclxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcclxuXHRyZXR1cm4gIWFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdD8gcmVhZGFibGVab25lSWRcclxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxyXG5cdFx0XHQ/IC8vIERvbid0IHNob3cgdGhlIHpvbmVJZCBpZiBpbiBFYXN0ZXJuLCB1bmxlc3MgdG9sZCB0b1xyXG5cdFx0XHRcdGFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxyXG5cdFx0XHRcdGAke2FiYnJldmlhdGlvbnNTdHJpbmd9ICgke3JlYWRhYmxlWm9uZUlkfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiYXNpYyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0ZSwgZS5nLiBgRURUYC5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAneicpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3JtYXRzIGEgZGF0ZSB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0LiBQYXJzZXMgdGhlIGRhdGUgYXMgVVRDLCB0aGVuIGNvbnZlcnRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSwgdGhlbiBmb3JtYXRzLlxyXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxyXG4gKiBAcGFyYW0geyp9IGZvcm1hdCBUaGUgZm9ybWF0IHRvIHVzZVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xyXG5cdHJldHVybiBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpLmZvcm1hdChmb3JtYXQpXHJcbn1cclxuXHJcbmNvbnN0IGlzSW5wdXRUeXBlU3VwcG9ydGVkID0gKHR5cGU6IHN0cmluZykgPT4ge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG5cdFx0dGVzdC50eXBlID0gdHlwZVxyXG5cdFx0Y29uc3QgaXNTdXBwb3J0ZWQgPSB0ZXN0LnR5cGUgPT09IHR5cGVcclxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxyXG5cdH0gY2F0Y2gge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXHJcblxyXG5leHBvcnQgY29uc3QgaXNUaW1lSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgndGltZScpXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlVGltZVZhbGlkKGRhdGVUaW1lOiBzdHJpbmcgfCBEYXRlKSB7XHJcblx0cmV0dXJuICEhZGF0ZVRpbWUgJiYgbW9tZW50KGRhdGVUaW1lKS5pc1ZhbGlkKClcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFB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QUFHLENBQUM7RUFDbkQsT0FBTyxDQUFDaUIsbUJBQW1CLEdBQ3hCRSxjQUFjLEdBQ2RGLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxDQUFDckIsaUJBQWlCO0VBQ3REO0VBQ0RxQixtQkFBbUI7RUFDbEI7RUFDRCxHQUFHQSxtQkFBbUIsS0FBS0UsY0FBYyxHQUFHO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxvQkFBb0JBLENBQUN2RixXQUFtQixFQUFFO0VBQ3pELE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsR0FBRyxDQUFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOEMsV0FBV0EsQ0FBQzlDLFdBQW1CLEVBQUV3RixNQUFjLEVBQWtDO0VBQUEsSUFBaENuRixVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUN2RixPQUFPUCxxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUMsQ0FBQ21GLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDO0FBQ3JFO0FBRUEsTUFBTUMsb0JBQW9CLEdBQUlDLElBQVksSUFBSztFQUM5QyxJQUFJO0lBQ0gsTUFBTVgsSUFBSSxHQUFHWSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDNUNiLElBQUksQ0FBQ1csSUFBSSxHQUFHQSxJQUFJO0lBQ2hCLE1BQU1HLFdBQVcsR0FBR2QsSUFBSSxDQUFDVyxJQUFJLEtBQUtBLElBQUk7SUFDdEMsT0FBT0csV0FBVztFQUNuQixDQUFDLENBQUMsTUFBTTtJQUNQLE9BQU8sS0FBSztFQUNiO0FBQ0QsQ0FBQztBQUVNLE1BQU1DLG9CQUFvQixHQUFBdEcsT0FBQSxDQUFBc0csb0JBQUEsR0FBR0wsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELE1BQU1NLG9CQUFvQixHQUFBdkcsT0FBQSxDQUFBdUcsb0JBQUEsR0FBR04sb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELFNBQVNPLGVBQWVBLENBQUN0RSxRQUF1QixFQUFFO0VBQ3hELE9BQU8sQ0FBQyxDQUFDQSxRQUFRLElBQUksSUFBQW5CLHVCQUFNLEVBQUNtQixRQUFRLENBQUMsQ0FBQ3VFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hEIiwiaWdub3JlTGlzdCI6W119
401
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xuaW1wb3J0IG1vbWVudFV0aWxzIGZyb20gJ21vbWVudC10aW1lem9uZS9tb21lbnQtdGltZXpvbmUtdXRpbHMnXG5pbXBvcnQgeyBnZXREZWZhdWx0VGltZVpvbmVJZCwgZ3Vlc3NUaW1lWm9uZUlkIH0gZnJvbSAnLi90aW1lem9uZSdcblxuLyoqXG4gKiBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGltZS1zZW5zaXRpdmUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFuZCBvdGhlciBkYXRlL3RpbWUgdXRpbHMuIEFueSB0aW1lXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXG4gKiBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCBhIGtub3duIHRpbWUpXG4gKi9cbmxldCBjbG9ja09mZnNldCA9IDBcblxuLyoqXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXG4gKiB1c2VkIHRvIHVwZGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAoYWNjdXJhdGUpIHNlcnZlciB0aW1lIGFuZCB0aGUgYnJvd3NlciB0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xuXHRjbG9ja09mZnNldCA9IG9mZnNldFxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBVVEMgdGltZSwgY2FsaWJyYXRlZCB0byB0aGUgQVBJIHNlcnZlcidzIGNsb2NrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJOb3dVdGMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgY2xvY2tPZmZzZXQpXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPZmZzZXREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0cmV0dXJuIG1vbWVudC51dGMoZGF0ZVRpbWVVdGMpLnR6KHRpbWVab25lSWQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGNJbkRlZmF1bHRab25lID0gKGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkgPT4ge1xuXHRjb25zdCB0aW1lWm9uZUlkID0gZ2V0RGVmYXVsdFRpbWVab25lSWQoKVxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQobG9jYWxEYXRlVGltZSlcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBtb21lbnQudHooXG5cdFx0W1xuXHRcdFx0bG9jYWxNb21lbnQueWVhcigpLFxuXHRcdFx0bG9jYWxNb21lbnQubW9udGgoKSxcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcblx0XHRcdGxvY2FsTW9tZW50LmhvdXIoKSxcblx0XHRcdGxvY2FsTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXG5cdFx0XHRsb2NhbE1vbWVudC5taWxsaXNlY29uZCgpXG5cdFx0XSxcblx0XHR0aW1lWm9uZUlkXG5cdClcblx0cmV0dXJuIHpvbmVkTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXG5cdGNvbnN0IGxvY2FsTW9tZW50ID0gbW9tZW50KFtcblx0XHR6b25lZE1vbWVudC55ZWFyKCksXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcblx0XHR6b25lZE1vbWVudC5kYXRlKCksXG5cdFx0em9uZWRNb21lbnQuaG91cigpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdHpvbmVkTW9tZW50LnNlY29uZCgpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbGxpc2Vjb25kKClcblx0XSlcblx0cmV0dXJuIGxvY2FsTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbERhdGVUaW1lRnJvbVV0YyA9IChkYXRlVGltZVV0Yzogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpLnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlTWludXNUaW1lID0gKGRhdGVUaW1lOiBEYXRlKSA9PiB7XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ2RheScpXG5cdFx0LmFkZCgxLCAnZGF5cycpXG5cdFx0LnN1YnRyYWN0KDMsICdtaWxsaXNlY29uZHMnKSAvLyBtdXN0IGJlIG1pbnVzIDMgZm9yIFNRTCBkYXRlXG5cdFx0LnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZk1pbnV0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ21pbnV0ZScpXG5cdFx0LmFkZCgxLCAnbWludXRlJylcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcblx0XHQudG9EYXRlKClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmFmdGVyIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlciBvciBlcXVhbCB0byoqIGBkYXRlVGltZVV0Y2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0Yylcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmJlZm9yZSBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckJlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudC5pc1NhbWVPckJlZm9yZShhZGp1c3RlZERhdGVUaW1lTW9tZW50KVxufVxuXG4vKipcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93QWZ0ZXJEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0Yylcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQgPiBhZGp1c3RlZERhdGVUaW1lTW9tZW50XG59XG5cbi8qKlxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKipiZWZvcmUqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmJlZm9yZSoqIGBkYXRlVGltZVV0Y2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBmdWxsIGRhdGUsIGUuZy4gYE1hcmNoIDUsIDIwMTggQCA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGRheSBvZiB3ZWVrIGFuZCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgZS5nLiBgTW9uLCAzLzUvMjAxOCBAIDQ6MDUgUE0gRURUYFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzUvMTggNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZShkYXRlVGltZVV0Yzogc3RyaW5nLCB3aXRoVGltZVpvbmUgPSB0cnVlKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIG5vIHllYXIsIGUuZy4gYDMvNSA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgZnVsbCB5ZWFyLCBlLmcuIGBNYXIgNSwgMjAxOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBELCBZWVlZJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBEJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgYXMgZWl0aGVyICdNTU0gRCwgWVlZWScgb3IgJ01NTSBEJyBpZiB0aGUgZGF0ZSdzIHllYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgeWVhclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nIG9mIFwibm93XCIuIFVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpXG4pIHtcblx0Y29uc3Qgbm93VXRjTW9tZW50ID0gbW9tZW50KG5vd1V0Yylcblx0Y29uc3QgZGF0ZVRpbWVNb21lbnQgPSBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxuXHRcdD8gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yylcblx0XHQ6IGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QvWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIGZ1bGwgeWVhciwgZS5nLiBgMy81LzIwMThgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aEZ1bGxZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyBmb3IgdXNlIGluIEhUTUwgaW5wdXRzLCBlLmcuIGAyMDE4LTAzLTA1YFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0KGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnWVlZWS1NTS1ERCcpXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZywgZS5nLiBgNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCBgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aCBwb3NzaWJseSBmdWxsIHRpbWUgem9uZSBuYW1lLCBlLmcuIGA0OjA1IFBNIEVEVGAgb3IgYDQ6MDUgUE0gQ1NUIChBc2lhL1RhaXBlaSlgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHNob3dFYXN0ZXJuWm9uZUlkIChvcHRpb25hbCkgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgdGltZVpvbmVJZCBpbiB0aGUgcmVzdWx0IGZvciBFU1QvRURULiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aEZ1bGxab25lKFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcbikge1xuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZSA9IGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnaDptbVxcdTAwYTBBJywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZXpvbmVBYmJyZXZpYXRpb24gPSB6b25lZE1vbWVudC56b25lQWJicigpXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXG5cdFx0PyAvLyBEb24ndCBzaG93IHRoZSBmdWxsIHpvbmUgbmFtZSBpZiBpbiBFRFQgb3IgRVNULCB1bmxlc3MgdG9sZCB0b1xuXHRcdFx0YCR7dGltZX0gJHt0aW1lem9uZUFiYnJldmlhdGlvbn1gXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcblx0XHRcdC8vIEV4OiBcIkFzaWEvVGFpcGVpXCJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259ICgke3RpbWVab25lSWQucmVwbGFjZSgnXycsICcgJyl9KWBcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZyB3aXRob3V0IHRpbWUgem9uZSwgaW4gMjQgaHIgdGltZSwgZS5nLiBgMTY6MDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdWxsIGZvcm1hdHRlZCB0aW1lIHpvbmUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gYHRpbWVab25lSWRgLlxuICpcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcbiAqXG4gKiBJZiBhYmJyZXZpYXRpb25zIGFyZSBub3QgYWxwaGEgY2hhcmFjdGVycywgZS5nLiBgLTA0YCwgdGhlbiBvbmx5IHRoZSB0aW1lWm9uZUlkIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cbiAqIEBwYXJhbSBzaG93RWFzdGVyblpvbmVJZCAob3B0aW9uYWwpIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRpbWVab25lSWQgaW4gdGhlIHJlc3VsdCBmb3IgRVNUL0VEVC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsRm9ybWF0dGVkVGltZVpvbmUoXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcblx0c2hvd0Vhc3Rlcm5ab25lSWQgPSBmYWxzZSxcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxuKSB7XG5cdGNvbnN0IHpvbmUgPSBtb21lbnQudHouem9uZSh0aW1lWm9uZUlkKVxuXHRpZiAoIXpvbmUpIHJldHVybiAnJ1xuXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKG5vd1V0YywgdGltZVpvbmVJZClcblx0Ly8gZmlsdGVyIHRoZSB6b25lIGRhdGEgZG93biB0byBqdXN0IHJlY2VudCB5ZWFycywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAxOTAwIHRvIDIwMzhcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcblx0Ly8gZmluZCBhbGwgdW5pcXVlIGFiYnJldmlhdGlvbnMgZm9yIHRoZSB6b25lLCBjb21iaW5lZCBpbnRvIGEgc3RyaW5nXG5cdGNvbnN0IGFiYnJldmlhdGlvbnMgPSBmaWx0ZXJlZFpvbmUuYWJicnNcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXG5cdFx0LmZpbHRlcihhYmJyID0+IC9bYS16QS1aXSsvZy50ZXN0KGFiYnIpKVxuXHRcdC5yZWR1Y2UoKHVuaXF1ZUFiYnJzOiBzdHJpbmdbXSwgYWJicikgPT4ge1xuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xuXHRcdFx0XHR1bmlxdWVBYmJycy5wdXNoKGFiYnIpXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcblx0XHR9LCBbXSlcblx0Y29uc3QgYWJicmV2aWF0aW9uc1N0cmluZyA9IGFiYnJldmlhdGlvbnMubGVuZ3RoID4gMCA/IGFiYnJldmlhdGlvbnMuam9pbignLycpIDogbnVsbFxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcblx0cmV0dXJuICFhYmJyZXZpYXRpb25zU3RyaW5nXG5cdFx0PyByZWFkYWJsZVpvbmVJZFxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxuXHRcdFx0PyAvLyBEb24ndCBzaG93IHRoZSB6b25lSWQgaWYgaW4gRWFzdGVybiwgdW5sZXNzIHRvbGQgdG9cblx0XHRcdFx0YWJicmV2aWF0aW9uc1N0cmluZ1xuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxuXHRcdFx0XHRgJHthYmJyZXZpYXRpb25zU3RyaW5nfSAoJHtyZWFkYWJsZVpvbmVJZH0pYFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2ljIHRpbWUgem9uZSBhYmJyZXZpYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRlLCBlLmcuIGBFRFRgLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ3onKVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBkYXRlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQuIFBhcnNlcyB0aGUgZGF0ZSBhcyBVVEMsIHRoZW4gY29udmVydHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lLCB0aGVuIGZvcm1hdHMuXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxuICogQHBhcmFtIHsqfSBmb3JtYXQgVGhlIGZvcm1hdCB0byB1c2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKS5mb3JtYXQoZm9ybWF0KVxufVxuXG5jb25zdCBpc0lucHV0VHlwZVN1cHBvcnRlZCA9ICh0eXBlOiBzdHJpbmcpID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXHRcdHRlc3QudHlwZSA9IHR5cGVcblx0XHRjb25zdCBpc1N1cHBvcnRlZCA9IHRlc3QudHlwZSA9PT0gdHlwZVxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXG5cbmV4cG9ydCBjb25zdCBpc1RpbWVJbnB1dFN1cHBvcnRlZCA9IGlzSW5wdXRUeXBlU3VwcG9ydGVkKCd0aW1lJylcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVRpbWVWYWxpZChkYXRlVGltZTogc3RyaW5nIHwgRGF0ZSkge1xuXHRyZXR1cm4gISFkYXRlVGltZSAmJiBtb21lbnQoZGF0ZVRpbWUpLmlzVmFsaWQoKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxlQUFBLEdBQUFDLHNCQUFBLENBQUFD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LEdBQUd5RSxhQUFhLENBQUNVLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0VBQ3JGLE1BQU1DLGNBQWMsR0FBR2pGLFVBQVUsQ0FBQzhELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ25ELE9BQU8sQ0FBQ2lCLG1CQUFtQixHQUN4QkUsY0FBYyxHQUNkRixtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQ3JCLGlCQUFpQjtFQUN0RDtFQUNEcUIsbUJBQW1CO0VBQ2xCO0VBQ0QsR0FBR0EsbUJBQW1CLEtBQUtFLGNBQWMsR0FBRztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUFDdkYsV0FBbUIsRUFBRTtFQUN6RCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzhDLFdBQVdBLENBQUM5QyxXQUFtQixFQUFFd0YsTUFBYyxFQUFrQztFQUFBLElBQWhDbkYsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFDdkYsT0FBT1AscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDLENBQUNtRixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUNyRTtBQUVBLE1BQU1DLG9CQUFvQixHQUFJQyxJQUFZLElBQUs7RUFDOUMsSUFBSTtJQUNILE1BQU1YLElBQUksR0FBR1ksUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQzVDYixJQUFJLENBQUNXLElBQUksR0FBR0EsSUFBSTtJQUNoQixNQUFNRyxXQUFXLEdBQUdkLElBQUksQ0FBQ1csSUFBSSxLQUFLQSxJQUFJO0lBQ3RDLE9BQU9HLFdBQVc7RUFDbkIsQ0FBQyxDQUFDLE1BQU07SUFDUCxPQUFPLEtBQUs7RUFDYjtBQUNELENBQUM7QUFFTSxNQUFNQyxvQkFBb0IsR0FBQXRHLE9BQUEsQ0FBQXNHLG9CQUFBLEdBQUdMLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxNQUFNTSxvQkFBb0IsR0FBQXZHLE9BQUEsQ0FBQXVHLG9CQUFBLEdBQUdOLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxTQUFTTyxlQUFlQSxDQUFDdEUsUUFBdUIsRUFBRTtFQUN4RCxPQUFPLENBQUMsQ0FBQ0EsUUFBUSxJQUFJLElBQUFuQix1QkFBTSxFQUFDbUIsUUFBUSxDQUFDLENBQUN1RSxPQUFPLENBQUMsQ0FBQztBQUNoRCIsImlnbm9yZUxpc3QiOltdfQ==