chain.js 116 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. // tslint:disable:max-line-length max-file-line-count
  6. import { add, subtract } from '../index';
  7. import { getDate, getFullYear, getHours, getMilliseconds, getMinutes, getMonth, getSeconds } from '../utils/date-getters';
  8. import { setDate, setFullYear, setHours, setMilliseconds, setMinutes, setMonth, setSeconds } from '../utils/date-setters';
  9. import { cloneDate } from '../create/clone';
  10. import { isArray, isBoolean, isDate, isDateValid, isFunction, isNumber, isObject, isString, isUndefined } from '../utils/type-checks';
  11. import { formatDate } from '../format';
  12. import { ISO_8601, RFC_2822 } from '../create/from-string-and-format';
  13. import { getDateOffset, getUTCOffset, hasAlignedHourOffset, isDaylightSavingTime, setOffsetToParsedOffset, setUTCOffset } from '../units/offset';
  14. import { isLeapYear, parseTwoDigitYear } from '../units/year';
  15. import { isAfter, isBefore, isBetween, isSame, isSameOrAfter, isSameOrBefore } from '../utils/date-compare';
  16. import { daysInMonth } from '../units/month';
  17. import { getDayOfWeek, getISODayOfWeek, getLocaleDayOfWeek, parseWeekday, setDayOfWeek, setISODayOfWeek, setLocaleDayOfWeek } from '../units/day-of-week';
  18. import { getISOWeek, getWeek, setISOWeek, setWeek } from '../units/week';
  19. import { getISOWeeksInYear, getISOWeekYear, getSetISOWeekYear, getSetWeekYear, getWeeksInYear, getWeekYear } from '../units/week-year';
  20. import { endOf, startOf } from '../utils/start-end-of';
  21. import { getQuarter, setQuarter } from '../units/quarter';
  22. import { getDayOfYear, setDayOfYear } from '../units/day-of-year';
  23. import { getZoneAbbr, getZoneName } from '../units/timezone';
  24. import { diff } from '../moment/diff';
  25. import { calendar } from '../moment/calendar';
  26. import { defineLocale, getLocale, getSetGlobalLocale, listLocales } from '../locale/locales';
  27. import { max, min } from '../moment/min-max';
  28. import { isDuration } from '../duration/constructor';
  29. import { createLocalOrUTC } from '../create/from-anything';
  30. import { createDuration } from '../duration/create';
  31. /** @type {?} */
  32. export const moment = ((/** @type {?} */ (_moment)));
  33. /**
  34. * @record
  35. */
  36. export function MomentFn() { }
  37. if (false) {
  38. /** @type {?} */
  39. MomentFn.prototype.ISO_8601;
  40. /** @type {?} */
  41. MomentFn.prototype.RFC_2822;
  42. /* Skipping unhandled member: (input?: DateInput | Khronos, format?: string | string[], localeKey?: string | boolean, strict?: boolean, isUTC?: boolean): Khronos;*/
  43. /**
  44. * @param {?=} input
  45. * @param {?=} format
  46. * @param {?=} localeKey
  47. * @param {?=} strict
  48. * @return {?}
  49. */
  50. MomentFn.prototype.utc = function (input, format, localeKey, strict) { };
  51. /**
  52. * @param {?=} input
  53. * @param {?=} format
  54. * @param {?=} localeKey
  55. * @param {?=} strict
  56. * @return {?}
  57. */
  58. MomentFn.prototype.parseZone = function (input, format, localeKey, strict) { };
  59. /**
  60. * @param {?} num
  61. * @return {?}
  62. */
  63. MomentFn.prototype.unix = function (num) { };
  64. /**
  65. * @param {?=} key
  66. * @param {?=} values
  67. * @return {?}
  68. */
  69. MomentFn.prototype.locale = function (key, values) { };
  70. /**
  71. * @param {?=} inp
  72. * @param {?=} unit
  73. * @return {?}
  74. */
  75. MomentFn.prototype.duration = function (inp, unit) { };
  76. /**
  77. * @param {?} name
  78. * @param {?=} config
  79. * @return {?}
  80. */
  81. MomentFn.prototype.defineLocale = function (name, config) { };
  82. /**
  83. * @param {?} input
  84. * @return {?}
  85. */
  86. MomentFn.prototype.parseTwoDigitYear = function (input) { };
  87. /**
  88. * @param {?=} input
  89. * @return {?}
  90. */
  91. MomentFn.prototype.isDate = function (input) { };
  92. /**
  93. * @return {?}
  94. */
  95. MomentFn.prototype.months = function () { };
  96. /**
  97. * @param {?} index
  98. * @return {?}
  99. */
  100. MomentFn.prototype.months = function (index) { };
  101. /**
  102. * @param {?} format
  103. * @return {?}
  104. */
  105. MomentFn.prototype.months = function (format) { };
  106. /**
  107. * @param {?} format
  108. * @param {?} index
  109. * @return {?}
  110. */
  111. MomentFn.prototype.months = function (format, index) { };
  112. /**
  113. * @return {?}
  114. */
  115. MomentFn.prototype.monthsShort = function () { };
  116. /**
  117. * @param {?} index
  118. * @return {?}
  119. */
  120. MomentFn.prototype.monthsShort = function (index) { };
  121. /**
  122. * @param {?} format
  123. * @return {?}
  124. */
  125. MomentFn.prototype.monthsShort = function (format) { };
  126. /**
  127. * @param {?} format
  128. * @param {?} index
  129. * @return {?}
  130. */
  131. MomentFn.prototype.monthsShort = function (format, index) { };
  132. /**
  133. * @return {?}
  134. */
  135. MomentFn.prototype.weekdays = function () { };
  136. /**
  137. * @param {?} index
  138. * @return {?}
  139. */
  140. MomentFn.prototype.weekdays = function (index) { };
  141. /**
  142. * @param {?} format
  143. * @return {?}
  144. */
  145. MomentFn.prototype.weekdays = function (format) { };
  146. /**
  147. * @param {?} format
  148. * @param {?} index
  149. * @return {?}
  150. */
  151. MomentFn.prototype.weekdays = function (format, index) { };
  152. /**
  153. * @param {?} localeSorted
  154. * @return {?}
  155. */
  156. MomentFn.prototype.weekdays = function (localeSorted) { };
  157. /**
  158. * @param {?} localeSorted
  159. * @param {?} index
  160. * @return {?}
  161. */
  162. MomentFn.prototype.weekdays = function (localeSorted, index) { };
  163. /**
  164. * @param {?} localeSorted
  165. * @param {?} format
  166. * @return {?}
  167. */
  168. MomentFn.prototype.weekdays = function (localeSorted, format) { };
  169. /**
  170. * @param {?} localeSorted
  171. * @param {?} format
  172. * @param {?} index
  173. * @return {?}
  174. */
  175. MomentFn.prototype.weekdays = function (localeSorted, format, index) { };
  176. /**
  177. * @return {?}
  178. */
  179. MomentFn.prototype.weekdaysShort = function () { };
  180. /**
  181. * @param {?} index
  182. * @return {?}
  183. */
  184. MomentFn.prototype.weekdaysShort = function (index) { };
  185. /**
  186. * @param {?} format
  187. * @return {?}
  188. */
  189. MomentFn.prototype.weekdaysShort = function (format) { };
  190. /**
  191. * @param {?} format
  192. * @param {?} index
  193. * @return {?}
  194. */
  195. MomentFn.prototype.weekdaysShort = function (format, index) { };
  196. /**
  197. * @param {?} localeSorted
  198. * @return {?}
  199. */
  200. MomentFn.prototype.weekdaysShort = function (localeSorted) { };
  201. /**
  202. * @param {?} localeSorted
  203. * @param {?} index
  204. * @return {?}
  205. */
  206. MomentFn.prototype.weekdaysShort = function (localeSorted, index) { };
  207. /**
  208. * @param {?} localeSorted
  209. * @param {?} format
  210. * @return {?}
  211. */
  212. MomentFn.prototype.weekdaysShort = function (localeSorted, format) { };
  213. /**
  214. * @param {?} localeSorted
  215. * @param {?} format
  216. * @param {?} index
  217. * @return {?}
  218. */
  219. MomentFn.prototype.weekdaysShort = function (localeSorted, format, index) { };
  220. /**
  221. * @return {?}
  222. */
  223. MomentFn.prototype.weekdaysMin = function () { };
  224. /**
  225. * @param {?} index
  226. * @return {?}
  227. */
  228. MomentFn.prototype.weekdaysMin = function (index) { };
  229. /**
  230. * @param {?} format
  231. * @return {?}
  232. */
  233. MomentFn.prototype.weekdaysMin = function (format) { };
  234. /**
  235. * @param {?} format
  236. * @param {?} index
  237. * @return {?}
  238. */
  239. MomentFn.prototype.weekdaysMin = function (format, index) { };
  240. /**
  241. * @param {?} localeSorted
  242. * @return {?}
  243. */
  244. MomentFn.prototype.weekdaysMin = function (localeSorted) { };
  245. /**
  246. * @param {?} localeSorted
  247. * @param {?} index
  248. * @return {?}
  249. */
  250. MomentFn.prototype.weekdaysMin = function (localeSorted, index) { };
  251. /**
  252. * @param {?} localeSorted
  253. * @param {?} format
  254. * @return {?}
  255. */
  256. MomentFn.prototype.weekdaysMin = function (localeSorted, format) { };
  257. /**
  258. * @param {?} localeSorted
  259. * @param {?} format
  260. * @param {?} index
  261. * @return {?}
  262. */
  263. MomentFn.prototype.weekdaysMin = function (localeSorted, format, index) { };
  264. /**
  265. * @param {?} threshold
  266. * @return {?}
  267. */
  268. MomentFn.prototype.relativeTimeThreshold = function (threshold) { };
  269. /**
  270. * @param {?} threshold
  271. * @param {?} limit
  272. * @return {?}
  273. */
  274. MomentFn.prototype.relativeTimeThreshold = function (threshold, limit) { };
  275. /**
  276. * @param {...?} dates
  277. * @return {?}
  278. */
  279. MomentFn.prototype.min = function (dates) { };
  280. /**
  281. * @param {...?} dates
  282. * @return {?}
  283. */
  284. MomentFn.prototype.max = function (dates) { };
  285. /**
  286. * @param {?=} key
  287. * @return {?}
  288. */
  289. MomentFn.prototype.localeData = function (key) { };
  290. /**
  291. * @param {?} language
  292. * @param {?=} localeSpec
  293. * @return {?}
  294. */
  295. MomentFn.prototype.updateLocale = function (language, localeSpec) { };
  296. /**
  297. * @param {?} m
  298. * @param {?} now
  299. * @return {?}
  300. */
  301. MomentFn.prototype.calendarFormat = function (m, now) { };
  302. /**
  303. * @param {?} m
  304. * @param {?} now
  305. * @return {?}
  306. */
  307. MomentFn.prototype.calendarFormat = function (m, now) { };
  308. /**
  309. * @return {?}
  310. */
  311. MomentFn.prototype.invalid = function () { };
  312. /**
  313. * @return {?}
  314. */
  315. MomentFn.prototype.locales = function () { };
  316. /**
  317. * @param {?} m
  318. * @param {?=} keepTime
  319. * @return {?}
  320. */
  321. MomentFn.prototype.updateOffset = function (m, keepTime) { };
  322. }
  323. /**
  324. * @param {?=} input
  325. * @param {?=} format
  326. * @param {?=} localeKey
  327. * @param {?=} strict
  328. * @param {?=} isUTC
  329. * @return {?}
  330. */
  331. function _moment(input, format, localeKey, strict, isUTC) {
  332. if (input instanceof Khronos) {
  333. /** @type {?} */
  334. const _date = input.clone();
  335. return isUTC ? _date.utc() : _date;
  336. }
  337. if (isBoolean(localeKey)) {
  338. return new Khronos(input, format, null, localeKey, isUTC);
  339. }
  340. return new Khronos(input, format, localeKey, strict, isUTC);
  341. }
  342. moment.utc = (/**
  343. * @param {?=} input
  344. * @param {?=} format
  345. * @param {?=} localeKey
  346. * @param {?=} strict
  347. * @return {?}
  348. */
  349. (input, format, localeKey, strict) => {
  350. return _moment(input, format, localeKey, strict, true);
  351. });
  352. moment.parseZone = (/**
  353. * @param {?=} input
  354. * @param {?=} format
  355. * @param {?=} localeKey
  356. * @param {?=} strict
  357. * @return {?}
  358. */
  359. (input, format, localeKey, strict) => {
  360. return _moment(input, format, localeKey, strict, true).parseZone();
  361. });
  362. moment.locale = getSetGlobalLocale;
  363. moment.localeData = (/**
  364. * @param {?=} key
  365. * @return {?}
  366. */
  367. (key) => {
  368. if (key instanceof Khronos) {
  369. return key.localeData();
  370. }
  371. return getLocale(key);
  372. });
  373. // moment.utc = createUTC;
  374. moment.unix = (/**
  375. * @param {?} inp
  376. * @return {?}
  377. */
  378. (inp) => new Khronos(inp * 1000));
  379. moment.ISO_8601 = ISO_8601;
  380. moment.RFC_2822 = RFC_2822;
  381. moment.defineLocale = defineLocale;
  382. moment.parseTwoDigitYear = parseTwoDigitYear;
  383. moment.isDate = isDate;
  384. moment.invalid = (/**
  385. * @return {?}
  386. */
  387. function _invalid() {
  388. return new Khronos(new Date(NaN));
  389. });
  390. // duration(inp?: Duration | DateInput | Khronos, unit?: MomentUnitOfTime): Duration;
  391. moment.duration = (/**
  392. * @param {?=} input
  393. * @param {?=} unit
  394. * @return {?}
  395. */
  396. (input, unit) => {
  397. /** @type {?} */
  398. const _unit = mapUnitOfTime(unit);
  399. if (isDate(input)) {
  400. throw new Error('todo implement');
  401. }
  402. if (input == null) {
  403. return createDuration();
  404. }
  405. if (isDuration(input)) {
  406. return createDuration(input, _unit, { _locale: input._locale });
  407. }
  408. if (isString(input) || isNumber(input) || isDuration(input) || isObject(input)) {
  409. return createDuration(input, _unit);
  410. }
  411. throw new Error('todo implement');
  412. });
  413. moment.min = (/**
  414. * @param {...?} dates
  415. * @return {?}
  416. */
  417. function _min(...dates) {
  418. /** @type {?} */
  419. const _firstArg = dates[0];
  420. /** @type {?} */
  421. const _dates = (isArray(_firstArg) ? _firstArg : dates)
  422. // tslint:disable-next-line
  423. .map((/**
  424. * @param {?} date
  425. * @return {?}
  426. */
  427. (date) => _moment(date)))
  428. .map((/**
  429. * @param {?} date
  430. * @return {?}
  431. */
  432. date => date.toDate()));
  433. /** @type {?} */
  434. const _date = min(..._dates);
  435. return new Khronos(_date);
  436. });
  437. moment.max = (/**
  438. * @param {...?} dates
  439. * @return {?}
  440. */
  441. function _max(...dates) {
  442. /** @type {?} */
  443. const _firstArg = dates[0];
  444. /** @type {?} */
  445. const _dates = (isArray(_firstArg) ? _firstArg : dates)
  446. // tslint:disable-next-line
  447. .map((/**
  448. * @param {?} date
  449. * @return {?}
  450. */
  451. (date) => _moment(date)))
  452. .map((/**
  453. * @param {?} date
  454. * @return {?}
  455. */
  456. date => date.toDate()));
  457. /** @type {?} */
  458. const _date = max(..._dates);
  459. return new Khronos(_date);
  460. });
  461. moment.locales = (/**
  462. * @return {?}
  463. */
  464. () => {
  465. return listLocales();
  466. });
  467. /**
  468. * @record
  469. */
  470. export function MomentInputObject() { }
  471. if (false) {
  472. /** @type {?|undefined} */
  473. MomentInputObject.prototype.years;
  474. /** @type {?|undefined} */
  475. MomentInputObject.prototype.year;
  476. /** @type {?|undefined} */
  477. MomentInputObject.prototype.y;
  478. /** @type {?|undefined} */
  479. MomentInputObject.prototype.months;
  480. /** @type {?|undefined} */
  481. MomentInputObject.prototype.month;
  482. /** @type {?|undefined} */
  483. MomentInputObject.prototype.M;
  484. /** @type {?|undefined} */
  485. MomentInputObject.prototype.days;
  486. /** @type {?|undefined} */
  487. MomentInputObject.prototype.day;
  488. /** @type {?|undefined} */
  489. MomentInputObject.prototype.d;
  490. /** @type {?|undefined} */
  491. MomentInputObject.prototype.dates;
  492. /** @type {?|undefined} */
  493. MomentInputObject.prototype.date;
  494. /** @type {?|undefined} */
  495. MomentInputObject.prototype.D;
  496. /** @type {?|undefined} */
  497. MomentInputObject.prototype.hours;
  498. /** @type {?|undefined} */
  499. MomentInputObject.prototype.hour;
  500. /** @type {?|undefined} */
  501. MomentInputObject.prototype.h;
  502. /** @type {?|undefined} */
  503. MomentInputObject.prototype.minutes;
  504. /** @type {?|undefined} */
  505. MomentInputObject.prototype.minute;
  506. /** @type {?|undefined} */
  507. MomentInputObject.prototype.m;
  508. /** @type {?|undefined} */
  509. MomentInputObject.prototype.seconds;
  510. /** @type {?|undefined} */
  511. MomentInputObject.prototype.second;
  512. /** @type {?|undefined} */
  513. MomentInputObject.prototype.s;
  514. /** @type {?|undefined} */
  515. MomentInputObject.prototype.milliseconds;
  516. /** @type {?|undefined} */
  517. MomentInputObject.prototype.millisecond;
  518. /** @type {?|undefined} */
  519. MomentInputObject.prototype.ms;
  520. /** @type {?|undefined} */
  521. MomentInputObject.prototype.w;
  522. /** @type {?|undefined} */
  523. MomentInputObject.prototype.week;
  524. /** @type {?|undefined} */
  525. MomentInputObject.prototype.weeks;
  526. /** @type {?|undefined} */
  527. MomentInputObject.prototype.Q;
  528. /** @type {?|undefined} */
  529. MomentInputObject.prototype.quarter;
  530. /** @type {?|undefined} */
  531. MomentInputObject.prototype.quarters;
  532. /** @type {?|undefined} */
  533. MomentInputObject.prototype.weekYear;
  534. }
  535. /** @type {?} */
  536. const _unitsPriority = {
  537. year: 1,
  538. month: 8,
  539. week: 5,
  540. isoWeek: 5,
  541. day: 11,
  542. weekday: 11,
  543. isoWeekday: 11,
  544. hours: 13,
  545. weekYear: 1,
  546. isoWeekYear: 1,
  547. quarter: 7,
  548. date: 9,
  549. dayOfYear: 4,
  550. minutes: 14,
  551. seconds: 15,
  552. milliseconds: 16
  553. };
  554. // todo: do I need 2 mappers?
  555. /** @type {?} */
  556. const _timeHashMap = {
  557. y: 'year',
  558. years: 'year',
  559. year: 'year',
  560. M: 'month',
  561. months: 'month',
  562. month: 'month',
  563. w: 'week',
  564. weeks: 'week',
  565. week: 'week',
  566. d: 'day',
  567. days: 'day',
  568. day: 'day',
  569. date: 'date',
  570. dates: 'date',
  571. D: 'date',
  572. h: 'hours',
  573. hour: 'hours',
  574. hours: 'hours',
  575. m: 'minutes',
  576. minute: 'minutes',
  577. minutes: 'minutes',
  578. s: 'seconds',
  579. second: 'seconds',
  580. seconds: 'seconds',
  581. ms: 'milliseconds',
  582. millisecond: 'milliseconds',
  583. milliseconds: 'milliseconds',
  584. quarter: 'quarter',
  585. quarters: 'quarter',
  586. q: 'quarter',
  587. Q: 'quarter',
  588. isoWeek: 'isoWeek',
  589. isoWeeks: 'isoWeek',
  590. W: 'isoWeek',
  591. weekYear: 'weekYear',
  592. weekYears: 'weekYear',
  593. gg: 'weekYears',
  594. isoWeekYear: 'isoWeekYear',
  595. isoWeekYears: 'isoWeekYear',
  596. GG: 'isoWeekYear',
  597. dayOfYear: 'dayOfYear',
  598. dayOfYears: 'dayOfYear',
  599. DDD: 'dayOfYear',
  600. weekday: 'weekday',
  601. weekdays: 'weekday',
  602. e: 'weekday',
  603. isoWeekday: 'isoWeekday',
  604. isoWeekdays: 'isoWeekday',
  605. E: 'isoWeekday'
  606. };
  607. /**
  608. * @param {?} period
  609. * @return {?}
  610. */
  611. function mapUnitOfTime(period) {
  612. return (/** @type {?} */ (_timeHashMap[period]));
  613. }
  614. /**
  615. * @param {?} obj
  616. * @return {?}
  617. */
  618. function mapMomentInputObject(obj) {
  619. /** @type {?} */
  620. const _res = {};
  621. return Object.keys(obj)
  622. .reduce((/**
  623. * @param {?} res
  624. * @param {?} key
  625. * @return {?}
  626. */
  627. (res, key) => {
  628. res[mapUnitOfTime(key)] = obj[key];
  629. return res;
  630. }), _res);
  631. }
  632. export class Khronos {
  633. /**
  634. * @param {?=} input
  635. * @param {?=} format
  636. * @param {?=} localeKey
  637. * @param {?=} strict
  638. * @param {?=} isUTC
  639. * @param {?=} offset
  640. */
  641. constructor(input, format, localeKey, strict = false, isUTC = false, offset) {
  642. this._date = new Date();
  643. this._isUTC = false;
  644. // locale will be needed to format invalid date message
  645. this._locale = getLocale(localeKey);
  646. // parse invalid input
  647. if (input === '' || input === null || (isNumber(input) && isNaN(input))) {
  648. this._date = new Date(NaN);
  649. return this;
  650. }
  651. this._isUTC = isUTC;
  652. if (this._isUTC) {
  653. this._offset = 0;
  654. }
  655. if (offset || offset === 0) {
  656. this._offset = offset;
  657. }
  658. this._isStrict = strict;
  659. this._format = format;
  660. if (!input && input !== 0 && !format) {
  661. this._date = new Date();
  662. return this;
  663. }
  664. if (isDate(input)) {
  665. this._date = cloneDate(input);
  666. return this;
  667. }
  668. // this._date = parseDate(input, format, localeKey, strict, isUTC);
  669. /** @type {?} */
  670. const config = createLocalOrUTC(input, format, localeKey, strict, isUTC);
  671. this._date = config._d;
  672. this._offset = isNumber(config._offset) ? config._offset : this._offset;
  673. this._isUTC = config._isUTC;
  674. this._isStrict = config._strict;
  675. this._format = config._f;
  676. this._tzm = config._tzm;
  677. }
  678. /**
  679. * @return {?}
  680. */
  681. _toConfig() {
  682. return { _isUTC: this._isUTC, _locale: this._locale, _offset: this._offset, _tzm: this._tzm };
  683. }
  684. /**
  685. * @param {?=} localeKey
  686. * @return {?}
  687. */
  688. locale(localeKey) {
  689. if (isUndefined(localeKey)) {
  690. return this._locale._abbr;
  691. }
  692. if (localeKey instanceof Khronos) {
  693. this._locale = localeKey._locale;
  694. return this;
  695. }
  696. /** @type {?} */
  697. const newLocaleData = getLocale(localeKey);
  698. if (newLocaleData != null) {
  699. this._locale = newLocaleData;
  700. }
  701. return this;
  702. }
  703. /**
  704. * @return {?}
  705. */
  706. localeData() {
  707. return this._locale;
  708. }
  709. // Basic
  710. /**
  711. * @param {?} val
  712. * @param {?=} period
  713. * @return {?}
  714. */
  715. add(val, period) {
  716. if (isString(val)) {
  717. this._date = add(this._date, parseInt(val, 10), mapUnitOfTime(period));
  718. }
  719. if (isNumber(val)) {
  720. this._date = add(this._date, val, mapUnitOfTime(period));
  721. }
  722. if (isObject(val)) {
  723. /** @type {?} */
  724. const _mapped = mapMomentInputObject(val);
  725. Object.keys(_mapped)
  726. .forEach((/**
  727. * @param {?} key
  728. * @return {?}
  729. */
  730. (key) => add(this._date, _mapped[key], key)));
  731. }
  732. return this;
  733. }
  734. // fixme: for some reason here 'null' for time is fine
  735. /**
  736. * @param {?=} time
  737. * @param {?=} formats
  738. * @return {?}
  739. */
  740. calendar(time, formats) {
  741. /** @type {?} */
  742. const _time = time instanceof Khronos ? time : new Khronos(time || new Date());
  743. /** @type {?} */
  744. const _offset = (this._offset || 0) - (_time._offset || 0);
  745. /** @type {?} */
  746. const _config = Object.assign(this._toConfig(), { _offset });
  747. return calendar(this._date, _time._date, formats, this._locale, _config);
  748. }
  749. /**
  750. * @return {?}
  751. */
  752. clone() {
  753. /** @type {?} */
  754. const localeKey = this._locale && this._locale._abbr || 'en';
  755. // return new Khronos(cloneDate(this._date), this._format, localeKey, this._isStrict, this._isUTC);
  756. // fails if isUTC and offset
  757. // return new Khronos(new Date(this.valueOf()),
  758. return new Khronos(this._date, this._format, localeKey, this._isStrict, this._isUTC, this._offset);
  759. }
  760. /**
  761. * @param {?} b
  762. * @param {?=} unitOfTime
  763. * @param {?=} precise
  764. * @return {?}
  765. */
  766. diff(b, unitOfTime, precise) {
  767. /** @type {?} */
  768. const unit = mapUnitOfTime(unitOfTime);
  769. /** @type {?} */
  770. const _b = b instanceof Khronos ? b : new Khronos(b);
  771. // const zoneDelta = (_b.utcOffset() - this.utcOffset());
  772. // const config = Object.assign(this._toConfig(), {
  773. // _offset: 0,
  774. // _isUTC: true,
  775. // _zoneDelta: zoneDelta
  776. // });
  777. // return diff(new Date(this.valueOf()), new Date(_b.valueOf()), unit, precise, config);
  778. return diff(this._date, _b.toDate(), unit, precise, this._toConfig());
  779. }
  780. /**
  781. * @param {?=} period
  782. * @return {?}
  783. */
  784. endOf(period) {
  785. /** @type {?} */
  786. const _per = mapUnitOfTime(period);
  787. this._date = endOf(this._date, _per, this._isUTC);
  788. return this;
  789. }
  790. /**
  791. * @param {?=} format
  792. * @return {?}
  793. */
  794. format(format) {
  795. return formatDate(this._date, format, this._locale && this._locale._abbr, this._isUTC, this._offset);
  796. }
  797. // todo: implement
  798. /**
  799. * @param {?=} time
  800. * @param {?=} withoutSuffix
  801. * @return {?}
  802. */
  803. from(time, withoutSuffix) {
  804. /** @type {?} */
  805. const _time = _moment(time);
  806. if (this.isValid() && _time.isValid()) {
  807. return createDuration({ to: this.toDate(), from: _time.toDate() })
  808. .locale(this.locale())
  809. .humanize(!withoutSuffix);
  810. }
  811. return this.localeData().invalidDate;
  812. }
  813. /**
  814. * @param {?=} withoutSuffix
  815. * @return {?}
  816. */
  817. fromNow(withoutSuffix) {
  818. return this.from(new Date(), withoutSuffix);
  819. }
  820. /**
  821. * @param {?} inp
  822. * @param {?=} suffix
  823. * @return {?}
  824. */
  825. to(inp, suffix) {
  826. throw new Error(`TODO: Implement`);
  827. }
  828. /**
  829. * @param {?=} withoutPrefix
  830. * @return {?}
  831. */
  832. toNow(withoutPrefix) {
  833. throw new Error(`TODO: Implement`);
  834. }
  835. /**
  836. * @param {?} val
  837. * @param {?=} period
  838. * @return {?}
  839. */
  840. subtract(val, period) {
  841. if (isString(val)) {
  842. this._date = subtract(this._date, parseInt(val, 10), mapUnitOfTime(period));
  843. return this;
  844. }
  845. if (isNumber(val)) {
  846. this._date = subtract(this._date, val, mapUnitOfTime(period));
  847. }
  848. if (isObject(val)) {
  849. /** @type {?} */
  850. const _mapped = mapMomentInputObject(val);
  851. Object.keys(_mapped)
  852. .forEach((/**
  853. * @param {?} key
  854. * @return {?}
  855. */
  856. (key) => subtract(this._date, _mapped[key], key)));
  857. }
  858. return this;
  859. }
  860. /**
  861. * @param {?} period
  862. * @return {?}
  863. */
  864. get(period) {
  865. if (period === 'dayOfYear') {
  866. return this.dayOfYear();
  867. }
  868. /** @type {?} */
  869. const unit = mapUnitOfTime(period);
  870. switch (unit) {
  871. case 'year':
  872. return this.year();
  873. case 'month':
  874. return this.month();
  875. // | 'week'
  876. case 'date':
  877. return this.date();
  878. case 'day':
  879. return this.day();
  880. case 'hours':
  881. return this.hours();
  882. case 'minutes':
  883. return this.minutes();
  884. case 'seconds':
  885. return this.seconds();
  886. case 'milliseconds':
  887. return this.milliseconds();
  888. case 'week':
  889. return this.week();
  890. case 'isoWeek':
  891. return this.isoWeek();
  892. case 'weekYear':
  893. return this.weekYear();
  894. case 'isoWeekYear':
  895. return this.isoWeekYear();
  896. case 'weekday':
  897. return this.weekday();
  898. case 'isoWeekday':
  899. return this.isoWeekday();
  900. case 'quarter':
  901. return this.quarter();
  902. default:
  903. throw new Error(`Unknown moment.get('${period}')`);
  904. }
  905. }
  906. /**
  907. * @param {?} period
  908. * @param {?=} input
  909. * @return {?}
  910. */
  911. set(period, input) {
  912. if (isString(period)) {
  913. /** @type {?} */
  914. const unit = mapUnitOfTime(period);
  915. switch (unit) {
  916. case 'year':
  917. return this.year(input);
  918. case 'month':
  919. return this.month(input);
  920. // | 'week'
  921. case 'day':
  922. return this.day(input);
  923. case 'date':
  924. return this.date(input);
  925. case 'hours':
  926. return this.hours(input);
  927. case 'minutes':
  928. return this.minutes(input);
  929. case 'seconds':
  930. return this.seconds(input);
  931. case 'milliseconds':
  932. return this.milliseconds(input);
  933. case 'week':
  934. return this.week(input);
  935. case 'isoWeek':
  936. return this.isoWeek(input);
  937. case 'weekYear':
  938. return this.weekYear(input);
  939. case 'isoWeekYear':
  940. return this.isoWeekYear(input);
  941. case 'weekday':
  942. return this.weekday(input);
  943. case 'isoWeekday':
  944. return this.isoWeekday(input);
  945. case 'quarter':
  946. return this.quarter(input);
  947. default:
  948. throw new Error(`Unknown moment.get('${period}')`);
  949. }
  950. }
  951. if (isObject(period)) {
  952. /** @type {?} */
  953. const _mapped = mapMomentInputObject(period);
  954. Object.keys(_mapped)
  955. .sort((/**
  956. * @param {?} a
  957. * @param {?} b
  958. * @return {?}
  959. */
  960. function (a, b) {
  961. return _unitsPriority[a] - _unitsPriority[b];
  962. }))
  963. .forEach((/**
  964. * @param {?} key
  965. * @return {?}
  966. */
  967. (key) => this.set(key, _mapped[key])));
  968. }
  969. return this;
  970. }
  971. /**
  972. * @return {?}
  973. */
  974. toString() {
  975. return this.format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
  976. }
  977. /**
  978. * @return {?}
  979. */
  980. toISOString() {
  981. if (!this.isValid()) {
  982. return null;
  983. }
  984. if (getFullYear(this._date, true) < 0 || getFullYear(this._date, true) > 9999) {
  985. return this.format('YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  986. }
  987. if (isFunction(Date.prototype.toISOString)) {
  988. // native implementation is ~50x faster, use it when we can
  989. return this.toDate().toISOString();
  990. }
  991. return this.format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  992. }
  993. /**
  994. * @return {?}
  995. */
  996. inspect() {
  997. throw new Error('TODO: implement');
  998. }
  999. /**
  1000. * @return {?}
  1001. */
  1002. toJSON() {
  1003. return this.toISOString();
  1004. }
  1005. /**
  1006. * @return {?}
  1007. */
  1008. toDate() {
  1009. return new Date(this.valueOf());
  1010. }
  1011. /**
  1012. * @return {?}
  1013. */
  1014. toObject() {
  1015. return {
  1016. // years: getFullYear(this._date, this._isUTC),
  1017. // months: getMonth(this._date, this._isUTC),
  1018. year: getFullYear(this._date, this._isUTC),
  1019. month: getMonth(this._date, this._isUTC),
  1020. date: getDate(this._date, this._isUTC),
  1021. hours: getHours(this._date, this._isUTC),
  1022. minutes: getMinutes(this._date, this._isUTC),
  1023. seconds: getSeconds(this._date, this._isUTC),
  1024. milliseconds: getMilliseconds(this._date, this._isUTC)
  1025. };
  1026. }
  1027. /**
  1028. * @return {?}
  1029. */
  1030. toArray() {
  1031. return [this.year(), this.month(), this.date(), this.hour(), this.minute(), this.second(), this.millisecond()];
  1032. }
  1033. // Dates boolean algebra
  1034. /**
  1035. * @param {?} date
  1036. * @param {?=} unit
  1037. * @return {?}
  1038. */
  1039. isAfter(date, unit) {
  1040. /** @type {?} */
  1041. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1042. return isAfter(this._date, date.toDate(), _unit);
  1043. }
  1044. /**
  1045. * @param {?} date
  1046. * @param {?=} unit
  1047. * @return {?}
  1048. */
  1049. isBefore(date, unit) {
  1050. /** @type {?} */
  1051. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1052. return isBefore(this.toDate(), date.toDate(), _unit);
  1053. }
  1054. /**
  1055. * @param {?} from
  1056. * @param {?} to
  1057. * @param {?=} unit
  1058. * @param {?=} inclusivity
  1059. * @return {?}
  1060. */
  1061. isBetween(from, to, unit, inclusivity) {
  1062. /** @type {?} */
  1063. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1064. return isBetween(this.toDate(), from.toDate(), to.toDate(), _unit, inclusivity);
  1065. }
  1066. /**
  1067. * @param {?} date
  1068. * @param {?=} unit
  1069. * @return {?}
  1070. */
  1071. isSame(date, unit) {
  1072. /** @type {?} */
  1073. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1074. return isSame(this._date, date.toDate(), _unit);
  1075. }
  1076. /**
  1077. * @param {?} date
  1078. * @param {?=} unit
  1079. * @return {?}
  1080. */
  1081. isSameOrAfter(date, unit) {
  1082. /** @type {?} */
  1083. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1084. return isSameOrAfter(this._date, date.toDate(), _unit);
  1085. }
  1086. /**
  1087. * @param {?} date
  1088. * @param {?=} unit
  1089. * @return {?}
  1090. */
  1091. isSameOrBefore(date, unit) {
  1092. /** @type {?} */
  1093. const _unit = unit ? mapUnitOfTime(unit) : void 0;
  1094. return isSameOrBefore(this._date, date.toDate(), _unit);
  1095. }
  1096. /**
  1097. * @return {?}
  1098. */
  1099. isValid() {
  1100. return isDateValid(this._date);
  1101. }
  1102. /**
  1103. * @return {?}
  1104. */
  1105. valueOf() {
  1106. return this._date.valueOf() - ((this._offset || 0) * 60000);
  1107. }
  1108. /**
  1109. * @return {?}
  1110. */
  1111. unix() {
  1112. // return getUnixTime(this._date);
  1113. return Math.floor(this.valueOf() / 1000);
  1114. }
  1115. /**
  1116. * @param {?=} b
  1117. * @param {?=} keepLocalTime
  1118. * @return {?}
  1119. */
  1120. utcOffset(b, keepLocalTime) {
  1121. /** @type {?} */
  1122. const _config = this._toConfig();
  1123. if (!b && b !== 0) {
  1124. return getUTCOffset(this._date, _config);
  1125. }
  1126. this._date = setUTCOffset(this._date, b, keepLocalTime, false, _config);
  1127. this._offset = _config._offset;
  1128. this._isUTC = _config._isUTC;
  1129. return this;
  1130. }
  1131. /**
  1132. * @param {?=} keepLocalTime
  1133. * @return {?}
  1134. */
  1135. utc(keepLocalTime) {
  1136. return this.utcOffset(0, keepLocalTime);
  1137. }
  1138. /**
  1139. * @param {?=} keepLocalTime
  1140. * @return {?}
  1141. */
  1142. local(keepLocalTime) {
  1143. if (this._isUTC) {
  1144. this.utcOffset(0, keepLocalTime);
  1145. this._isUTC = false;
  1146. if (keepLocalTime) {
  1147. this.subtract(getDateOffset(this._date), 'm');
  1148. }
  1149. }
  1150. return this;
  1151. }
  1152. /**
  1153. * @param {?=} input
  1154. * @return {?}
  1155. */
  1156. parseZone(input) {
  1157. /** @type {?} */
  1158. const _config = this._toConfig();
  1159. this._date = setOffsetToParsedOffset(this._date, input, _config);
  1160. this._offset = _config._offset;
  1161. this._isUTC = _config._isUTC;
  1162. return this;
  1163. }
  1164. /**
  1165. * @param {?=} input
  1166. * @return {?}
  1167. */
  1168. hasAlignedHourOffset(input) {
  1169. return hasAlignedHourOffset(this._date, input ? input._date : void 0);
  1170. }
  1171. /**
  1172. * @return {?}
  1173. */
  1174. isDST() {
  1175. return isDaylightSavingTime(this._date);
  1176. }
  1177. /**
  1178. * @return {?}
  1179. */
  1180. isLocal() {
  1181. return !this._isUTC;
  1182. }
  1183. /**
  1184. * @return {?}
  1185. */
  1186. isUtcOffset() {
  1187. return this._isUTC;
  1188. }
  1189. /**
  1190. * @return {?}
  1191. */
  1192. isUTC() {
  1193. return this.isUtc();
  1194. }
  1195. /**
  1196. * @return {?}
  1197. */
  1198. isUtc() {
  1199. return this._isUTC && this._offset === 0;
  1200. }
  1201. // Timezone
  1202. /**
  1203. * @return {?}
  1204. */
  1205. zoneAbbr() {
  1206. return getZoneAbbr(this._isUTC);
  1207. }
  1208. /**
  1209. * @return {?}
  1210. */
  1211. zoneName() {
  1212. return getZoneName(this._isUTC);
  1213. }
  1214. /**
  1215. * @param {?=} year
  1216. * @return {?}
  1217. */
  1218. year(year) {
  1219. if (!year && year !== 0) {
  1220. return getFullYear(this._date, this._isUTC);
  1221. }
  1222. this._date = cloneDate(setFullYear(this._date, year));
  1223. return this;
  1224. }
  1225. /**
  1226. * @param {?=} val
  1227. * @return {?}
  1228. */
  1229. weekYear(val) {
  1230. if (!val && val !== 0) {
  1231. return getWeekYear(this._date, this._locale, this.isUTC());
  1232. }
  1233. /** @type {?} */
  1234. const date = getSetWeekYear(this._date, val, this._locale, this.isUTC());
  1235. if (isDate(date)) {
  1236. this._date = date;
  1237. }
  1238. return this;
  1239. }
  1240. /**
  1241. * @param {?=} val
  1242. * @return {?}
  1243. */
  1244. isoWeekYear(val) {
  1245. if (!val && val !== 0) {
  1246. return getISOWeekYear(this._date, this.isUTC());
  1247. }
  1248. /** @type {?} */
  1249. const date = getSetISOWeekYear(this._date, val, this.isUtc());
  1250. if (isDate(date)) {
  1251. this._date = date;
  1252. }
  1253. return this;
  1254. }
  1255. /**
  1256. * @return {?}
  1257. */
  1258. isLeapYear() {
  1259. return isLeapYear(getFullYear(this.toDate(), this.isUTC()));
  1260. }
  1261. /**
  1262. * @param {?=} month
  1263. * @return {?}
  1264. */
  1265. month(month) {
  1266. if (!month && month !== 0) {
  1267. return getMonth(this._date, this._isUTC);
  1268. }
  1269. /** @type {?} */
  1270. let _month = month;
  1271. if (isString(month)) {
  1272. /** @type {?} */
  1273. const locale = this._locale || getLocale();
  1274. _month = locale.monthsParse(month);
  1275. }
  1276. if (isNumber(_month)) {
  1277. this._date = cloneDate(setMonth(this._date, _month, this._isUTC));
  1278. }
  1279. return this;
  1280. }
  1281. /**
  1282. * @param {?=} hours
  1283. * @return {?}
  1284. */
  1285. hour(hours) {
  1286. return this.hours(hours);
  1287. }
  1288. /**
  1289. * @param {?=} hours
  1290. * @return {?}
  1291. */
  1292. hours(hours) {
  1293. if (!hours && hours !== 0) {
  1294. return getHours(this._date, this._isUTC);
  1295. }
  1296. this._date = cloneDate(setHours(this._date, hours, this._isUTC));
  1297. return this;
  1298. }
  1299. /**
  1300. * @param {?=} minutes
  1301. * @return {?}
  1302. */
  1303. minute(minutes) {
  1304. return this.minutes(minutes);
  1305. }
  1306. /**
  1307. * @param {?=} minutes
  1308. * @return {?}
  1309. */
  1310. minutes(minutes) {
  1311. if (!minutes && minutes !== 0) {
  1312. return getMinutes(this._date, this._isUTC);
  1313. }
  1314. this._date = cloneDate(setMinutes(this._date, minutes, this._isUTC));
  1315. return this;
  1316. }
  1317. /**
  1318. * @param {?=} seconds
  1319. * @return {?}
  1320. */
  1321. second(seconds) {
  1322. return this.seconds(seconds);
  1323. }
  1324. /**
  1325. * @param {?=} seconds
  1326. * @return {?}
  1327. */
  1328. seconds(seconds) {
  1329. if (!seconds && seconds !== 0) {
  1330. return getSeconds(this._date, this._isUTC);
  1331. }
  1332. this._date = cloneDate(setSeconds(this._date, seconds, this._isUTC));
  1333. return this;
  1334. }
  1335. /**
  1336. * @param {?=} ms
  1337. * @return {?}
  1338. */
  1339. millisecond(ms) {
  1340. return this.milliseconds(ms);
  1341. }
  1342. /**
  1343. * @param {?=} seconds
  1344. * @return {?}
  1345. */
  1346. milliseconds(seconds) {
  1347. if (!seconds && seconds !== 0) {
  1348. return getMilliseconds(this._date, this._isUTC);
  1349. }
  1350. this._date = cloneDate(setMilliseconds(this._date, seconds, this._isUTC));
  1351. return this;
  1352. }
  1353. /**
  1354. * @param {?=} date
  1355. * @return {?}
  1356. */
  1357. date(date) {
  1358. if (!date && date !== 0) {
  1359. return getDate(this._date, this._isUTC);
  1360. }
  1361. this._date = cloneDate(setDate(this._date, date, this._isUTC));
  1362. return this;
  1363. }
  1364. /**
  1365. * @param {?=} input
  1366. * @return {?}
  1367. */
  1368. day(input) {
  1369. if (!input && input !== 0) {
  1370. return getDayOfWeek(this._date, this._isUTC);
  1371. }
  1372. /** @type {?} */
  1373. let _input = input;
  1374. if (isString(input)) {
  1375. _input = parseWeekday(input, this._locale);
  1376. }
  1377. if (isNumber(_input)) {
  1378. this._date = setDayOfWeek(this._date, _input, this._locale, this._isUTC);
  1379. }
  1380. return this;
  1381. }
  1382. /**
  1383. * @param {?=} val
  1384. * @return {?}
  1385. */
  1386. weekday(val) {
  1387. if (!val && val !== 0) {
  1388. return getLocaleDayOfWeek(this._date, this._locale, this._isUTC);
  1389. }
  1390. this._date = setLocaleDayOfWeek(this._date, val, { locale: this._locale, isUTC: this._isUTC });
  1391. return this;
  1392. }
  1393. /**
  1394. * @param {?=} val
  1395. * @return {?}
  1396. */
  1397. isoWeekday(val) {
  1398. if (!val && val !== 0) {
  1399. return getISODayOfWeek(this._date);
  1400. }
  1401. this._date = setISODayOfWeek(this._date, val);
  1402. return this;
  1403. }
  1404. /**
  1405. * @param {?=} val
  1406. * @return {?}
  1407. */
  1408. dayOfYear(val) {
  1409. if (!val && val !== 0) {
  1410. return getDayOfYear(this._date);
  1411. }
  1412. this._date = setDayOfYear(this._date, val);
  1413. return this;
  1414. }
  1415. /**
  1416. * @param {?=} input
  1417. * @return {?}
  1418. */
  1419. week(input) {
  1420. if (!input && input !== 0) {
  1421. return getWeek(this._date, this._locale);
  1422. }
  1423. this._date = setWeek(this._date, input, this._locale);
  1424. return this;
  1425. }
  1426. /**
  1427. * @param {?=} input
  1428. * @return {?}
  1429. */
  1430. weeks(input) {
  1431. return this.week(input);
  1432. }
  1433. /**
  1434. * @param {?=} val
  1435. * @return {?}
  1436. */
  1437. isoWeek(val) {
  1438. if (!val && val !== 0) {
  1439. return getISOWeek(this._date);
  1440. }
  1441. this._date = setISOWeek(this._date, val);
  1442. return this;
  1443. }
  1444. /**
  1445. * @param {?=} val
  1446. * @return {?}
  1447. */
  1448. isoWeeks(val) {
  1449. return this.isoWeek(val);
  1450. }
  1451. /**
  1452. * @return {?}
  1453. */
  1454. weeksInYear() {
  1455. return getWeeksInYear(this._date, this._isUTC, this._locale);
  1456. }
  1457. /**
  1458. * @return {?}
  1459. */
  1460. isoWeeksInYear() {
  1461. return getISOWeeksInYear(this._date, this._isUTC);
  1462. }
  1463. /**
  1464. * @return {?}
  1465. */
  1466. daysInMonth() {
  1467. return daysInMonth(getFullYear(this._date, this._isUTC), getMonth(this._date, this._isUTC));
  1468. }
  1469. /**
  1470. * @param {?=} val
  1471. * @return {?}
  1472. */
  1473. quarter(val) {
  1474. if (!val && val !== 0) {
  1475. return getQuarter(this._date, this._isUTC);
  1476. }
  1477. this._date = setQuarter(this._date, val, this._isUTC);
  1478. return this;
  1479. }
  1480. /**
  1481. * @param {?=} val
  1482. * @return {?}
  1483. */
  1484. quarters(val) {
  1485. return this.quarter(val);
  1486. }
  1487. /**
  1488. * @param {?=} period
  1489. * @return {?}
  1490. */
  1491. startOf(period) {
  1492. /** @type {?} */
  1493. const _per = mapUnitOfTime(period);
  1494. this._date = startOf(this._date, _per, this._isUTC);
  1495. return this;
  1496. }
  1497. }
  1498. if (false) {
  1499. /** @type {?} */
  1500. Khronos.prototype._date;
  1501. /** @type {?} */
  1502. Khronos.prototype._isUTC;
  1503. /** @type {?} */
  1504. Khronos.prototype._isStrict;
  1505. /** @type {?} */
  1506. Khronos.prototype._locale;
  1507. /** @type {?} */
  1508. Khronos.prototype._format;
  1509. /** @type {?} */
  1510. Khronos.prototype._offset;
  1511. /** @type {?} */
  1512. Khronos.prototype._tzm;
  1513. }
  1514. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYm9vdHN0cmFwL2Nocm9ub3MvIiwic291cmNlcyI6WyJ0ZXN0L2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBYSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFcEQsT0FBTyxFQUNMLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFFbEYsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQ3JFLFVBQVUsRUFDWCxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDeEUsV0FBVyxFQUNaLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXRFLE9BQU8sRUFDTCxhQUFhLEVBQ2IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLHVCQUF1QixFQUNqRixZQUFZLEVBQ2IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVH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QUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM1QztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Ozs7O0lBS0QsUUFBUSxDQUFDLEdBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBRUQsT0FBTyxDQUFDLE1BQXlCOztjQUN6QixJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFcEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBRUY7OztJQTF3QkMsd0JBQXlCOztJQUN6Qix5QkFBZTs7SUFDZiw0QkFBbUI7O0lBQ25CLDBCQUFnQjs7SUFDaEIsMEJBQTJCOztJQUMzQiwwQkFBZ0I7O0lBQ2hCLHVCQUFhIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoIG1heC1maWxlLWxpbmUtY291bnRcbmltcG9ydCB7IGFkZCwgcGFyc2VEYXRlLCBzdWJ0cmFjdCB9IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IERhdGVBcnJheSwgRGF0ZU9iamVjdCwgVW5pdE9mVGltZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldERhdGUsIGdldEZ1bGxZZWFyLCBnZXRIb3VycywgZ2V0TWlsbGlzZWNvbmRzLCBnZXRNaW51dGVzLCBnZXRNb250aCwgZ2V0U2Vjb25kcyxcbiAgZ2V0VW5peFRpbWVcbn0gZnJvbSAnLi4vdXRpbHMvZGF0ZS1nZXR0ZXJzJztcbmltcG9ydCB7XG4gIHNldERhdGUsIHNldEZ1bGxZZWFyLCBzZXRIb3Vycywgc2V0TWlsbGlzZWNvbmRzLCBzZXRNaW51dGVzLCBzZXRNb250aCxcbiAgc2V0U2Vjb25kc1xufSBmcm9tICcuLi91dGlscy9kYXRlLXNldHRlcnMnO1xuaW1wb3J0IHsgY2xvbmVEYXRlIH0gZnJvbSAnLi4vY3JlYXRlL2Nsb25lJztcbmltcG9ydCB7XG4gIGlzQXJyYXksXG4gIGlzQm9vbGVhbiwgaXNEYXRlLCBpc0RhdGVWYWxpZCwgaXNGdW5jdGlvbiwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZyxcbiAgaXNVbmRlZmluZWRcbn0gZnJvbSAnLi4vdXRpbHMvdHlwZS1jaGVja3MnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBJU09fODYwMSwgUkZDXzI4MjIgfSBmcm9tICcuLi9jcmVhdGUvZnJvbS1zdHJpbmctYW5kLWZvcm1hdCc7XG5pbXBvcnQgeyBMb2NhbGUsIExvY2FsZURhdGEgfSBmcm9tICcuLi9sb2NhbGUvbG9jYWxlLmNsYXNzJztcbmltcG9ydCB7XG4gIGdldERhdGVPZmZzZXQsXG4gIGdldFVUQ09mZnNldCwgaGFzQWxpZ25lZEhvdXJPZmZzZXQsIGlzRGF5bGlnaHRTYXZpbmdUaW1lLCBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldCxcbiAgc2V0VVRDT2Zmc2V0XG59IGZyb20gJy4uL3VuaXRzL29mZnNldCc7XG5pbXBvcnQgeyBpc0xlYXBZZWFyLCBwYXJzZVR3b0RpZ2l0WWVhciB9IGZyb20gJy4uL3VuaXRzL3llYXInO1xuaW1wb3J0IHsgaXNBZnRlciwgaXNCZWZvcmUsIGlzQmV0d2VlbiwgaXNTYW1lLCBpc1NhbWVPckFmdGVyLCBpc1NhbWVPckJlZm9yZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUtY29tcGFyZSc7XG5pbXBvcnQgeyBkYXlzSW5Nb250aCB9IGZyb20gJy4uL3VuaXRzL21vbnRoJztcbmltcG9ydCB7XG4gIGdldERheU9mV2VlaywgZ2V0SVNPRGF5T2ZXZWVrLCBnZXRMb2NhbGVEYXlPZldlZWssIHBhcnNlV2Vla2RheSwgc2V0RGF5T2ZXZWVrLCBzZXRJU09EYXlPZldlZWssXG4gIHNldExvY2FsZURheU9mV2Vla1xufSBmcm9tICcuLi91bml0cy9kYXktb2Ytd2Vlayc7XG5pbXBvcnQgeyBnZXRJU09XZWVrLCBnZXRXZWVrLCBzZXRJU09XZWVrLCBzZXRXZWVrIH0gZnJvbSAnLi4vdW5pdHMvd2Vlayc7XG5pbXBvcnQge1xuICBnZXRJU09XZWVrc0luWWVhciwgZ2V0SVNPV2Vla1llYXIsIGdldFNldElTT1dlZWtZZWFyLCBnZXRTZXRXZWVrWWVhciwgZ2V0V2Vla3NJblllYXIsXG4gIGdldFdlZWtZZWFyXG59IGZyb20gJy4uL3VuaXRzL3dlZWsteWVhcic7XG5pbXBvcnQgeyBlbmRPZiwgc3RhcnRPZiB9IGZyb20gJy4uL3V0aWxzL3N0YXJ0LWVuZC1vZic7XG5pbXBvcnQgeyBnZXRRdWFydGVyLCBzZXRRdWFydGVyIH0gZnJvbSAnLi4vdW5pdHMvcXVhcnRlcic7XG5pbXBvcnQgeyBnZXREYXlPZlllYXIsIHNldERheU9mWWVhciB9IGZyb20gJy4uL3VuaXRzL2RheS1vZi15ZWFyJztcbmltcG9ydCB7IGdldFpvbmVBYmJyLCBnZXRab25lTmFtZSB9IGZyb20gJy4uL3VuaXRzL3RpbWV6b25lJztcbmltcG9ydCB7IGRpZmYgfSBmcm9tICcuLi9tb21lbnQvZGlmZic7XG5pbXBvcnQgeyBEYXRlUGFyc2luZ0NvbmZpZyB9IGZyb20gJy4uL2NyZWF0ZS9wYXJzaW5nLnR5cGVzJztcbmltcG9ydCB7IGNhbGVuZGFyLCBDYWxlbmRhclNwZWMgfSBmcm9tICcuLi9tb21lbnQvY2FsZW5kYXInO1xuaW1wb3J0IHsgZGVmaW5lTG9jYWxlLCBnZXRMb2NhbGUsIGdldFNldEdsb2JhbExvY2FsZSwgbGlzdExvY2FsZXMgfSBmcm9tICcuLi9sb2NhbGUvbG9jYWxlcyc7XG5pbXBvcnQgeyBtYXgsIG1pbiB9IGZyb20gJy4uL21vbWVudC9taW4tbWF4JztcbmltcG9ydCB7IER1cmF0aW9uLCBpc0R1cmF0aW9uIH0gZnJvbSAnLi4vZHVyYXRpb24vY29uc3RydWN0b3InO1xuaW1wb3J0IHsgY3JlYXRlTG9jYWxPclVUQyB9IGZyb20gJy4uL2NyZWF0ZS9mcm9tLWFueXRoaW5nJztcbmltcG9ydCB7IGNyZWF0ZUR1cmF0aW9uIH0gZnJvbSAnLi4vZHVyYXRpb24vY3JlYXRlJztcblxuZXhwb3J0IHR5cGUgRGF0ZUlucHV0ID0gc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IHN0cmluZ1tdIHwgRGF0ZUFycmF5IHwgTW9tZW50SW5wdXRPYmplY3Q7XG5cbmV4cG9ydCBjb25zdCBtb21lbnQ6IE1vbWVudEZuID0gKF9tb21lbnQgYXMgTW9tZW50Rm4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vbWVudEZuIHtcbiAgKGlucHV0PzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0Pzogc3RyaW5nIHwgc3RyaW5nW10sIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4sIGlzVVRDPzogYm9vbGVhbik6IEtocm9ub3M7XG5cbiAgSVNPXzg2MDE6IHN0cmluZztcbiAgUkZDXzI4MjI6IHN0cmluZztcblxuICB1dGMoaW5wdXQ/OiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBmb3JtYXQ/OiBzdHJpbmcgfCBzdHJpbmdbXSwgbG9jYWxlS2V5Pzogc3RyaW5nIHwgYm9vbGVhbiwgc3RyaWN0PzogYm9vbGVhbik6IEtocm9ub3M7XG5cbiAgcGFyc2Vab25lKGlucHV0PzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0Pzogc3RyaW5nIHwgc3RyaW5nW10sIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4pOiBLaHJvbm9zO1xuXG4gIHVuaXgobnVtOiBudW1iZXIpOiBLaHJvbm9zO1xuXG4gIGxvY2FsZShrZXk/OiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWVzPzogTG9jYWxlRGF0YSk6IHN0cmluZztcblxuICBkdXJhdGlvbihpbnA/OiBEdXJhdGlvbiB8IERhdGVJbnB1dCB8IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogRHVyYXRpb247XG5cbiAgZGVmaW5lTG9jYWxlKG5hbWU6IHN0cmluZywgY29uZmlnPzogTG9jYWxlRGF0YSk6IExvY2FsZTtcblxuICBwYXJzZVR3b0RpZ2l0WWVhcihpbnB1dDogc3RyaW5nKTogbnVtYmVyO1xuXG4gIGlzRGF0ZShpbnB1dD86IGFueSk6IGlucHV0IGlzIERhdGU7XG5cbiAgbW9udGhzKCk6IHN0cmluZ1tdO1xuXG4gIG1vbnRocyhpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIG1vbnRocyhmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIG1vbnRocyhmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICBtb250aHNTaG9ydCgpOiBzdHJpbmdbXTtcblxuICBtb250aHNTaG9ydChpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIG1vbnRoc1Nob3J0KGZvcm1hdDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgbW9udGhzU2hvcnQoZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXMoKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXMoaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5cyhmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzKGZvcm1hdDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzKGxvY2FsZVNvcnRlZDogYm9vbGVhbik6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzKGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5cyhsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4sIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXMobG9jYWxlU29ydGVkOiBib29sZWFuLCBmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c1Nob3J0KCk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzU2hvcnQoaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c1Nob3J0KGZvcm1hdDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXNTaG9ydChmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZDogYm9vbGVhbik6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkOiBib29sZWFuLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkOiBib29sZWFuLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkOiBib29sZWFuLCBmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c01pbigpOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5c01pbihpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzTWluKGZvcm1hdDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXNNaW4oZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXNNaW4obG9jYWxlU29ydGVkOiBib29sZWFuKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXNNaW4obG9jYWxlU29ydGVkOiBib29sZWFuLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5c01pbihsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4sIGZvcm1hdDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQ6IHN0cmluZyk6IG51bWJlciB8IGJvb2xlYW47XG5cbiAgcmVsYXRpdmVUaW1lVGhyZXNob2xkKHRocmVzaG9sZDogc3RyaW5nLCBsaW1pdDogbnVtYmVyKTogYm9vbGVhbjtcblxuICBtaW4oLi4uZGF0ZXM6ICgoRGF0ZUlucHV0IHwgS2hyb25vcylbXSB8IChEYXRlSW5wdXQgfCBLaHJvbm9zKSlbXSk6IEtocm9ub3M7XG5cbiAgbWF4KC4uLmRhdGVzOiAoKERhdGVJbnB1dCB8IEtocm9ub3MpW10gfCAoRGF0ZUlucHV0IHwgS2hyb25vcykpW10pOiBLaHJvbm9zO1xuXG4gIGxvY2FsZURhdGEoa2V5Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBLaHJvbm9zKTogTG9jYWxlO1xuXG4gIHVwZGF0ZUxvY2FsZShsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVTcGVjPzogTG9jYWxlRGF0YSk6IExvY2FsZTtcblxuICBjYWxlbmRhckZvcm1hdChtOiBEYXRlLCBub3c6IERhdGUpOiBzdHJpbmc7XG5cbiAgLy8gdG9kbzogcmVtb3ZlIHRoaXNcbiAgY2FsZW5kYXJGb3JtYXQobTogS2hyb25vcywgbm93OiBLaHJvbm9zKTogc3RyaW5nO1xuXG4gIC8vIHRvZG86IGltcGxlbWVudFxuICBpbnZhbGlkKCk6IEtocm9ub3M7XG5cbiAgbG9jYWxlcygpOiBzdHJpbmdbXTtcblxuICAvLyB0b2RvOiBpbXBsZW1lbnRcbiAgdXBkYXRlT2Zmc2V0KG06IEtocm9ub3MsIGtlZXBUaW1lPzogYm9vbGVhbik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIF9tb21lbnQoaW5wdXQ/OiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBmb3JtYXQ/OiBzdHJpbmcgfCBzdHJpbmdbXSwgbG9jYWxlS2V5Pzogc3RyaW5nIHwgYm9vbGVhbiwgc3RyaWN0PzogYm9vbGVhbiwgaXNVVEM/OiBib29sZWFuKTogS2hyb25vcyB7XG4gIGlmIChpbnB1dCBpbnN0YW5jZW9mIEtocm9ub3MpIHtcbiAgICBjb25zdCBfZGF0ZSA9IGlucHV0LmNsb25lKCk7XG5cbiAgICByZXR1cm4gaXNVVEMgPyBfZGF0ZS51dGMoKSA6IF9kYXRlO1xuICB9XG5cbiAgaWYgKGlzQm9vbGVhbihsb2NhbGVLZXkpKSB7XG4gICAgcmV0dXJuIG5ldyBLaHJvbm9zKGlucHV0LCBmb3JtYXQsIG51bGwsIGxvY2FsZUtleSwgaXNVVEMpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBLaHJvbm9zKGlucHV0LCBmb3JtYXQsIGxvY2FsZUtleSwgc3RyaWN0LCBpc1VUQyk7XG59XG5cbm1vbWVudC51dGMgPSAoaW5wdXQ/OiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBmb3JtYXQ/OiBzdHJpbmcsIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4pOiBLaHJvbm9zID0+IHtcbiAgcmV0dXJuIF9tb21lbnQoaW5wdXQsIGZvcm1hdCwgbG9jYWxlS2V5LCBzdHJpY3QsIHRydWUpO1xufTtcblxubW9tZW50LnBhcnNlWm9uZSA9IChpbnB1dD86IERhdGVJbnB1dCB8IEtocm9ub3MsIGZvcm1hdD86IHN0cmluZywgbG9jYWxlS2V5Pzogc3RyaW5nIHwgYm9vbGVhbiwgc3RyaWN0PzogYm9vbGVhbik6IEtocm9ub3MgPT4ge1xuICByZXR1cm4gX21vbWVudChpbnB1dCwgZm9ybWF0LCBsb2NhbGVLZXksIHN0cmljdCwgdHJ1ZSkucGFyc2Vab25lKCk7XG59O1xuXG5tb21lbnQubG9jYWxlID0gZ2V0U2V0R2xvYmFsTG9jYWxlO1xubW9tZW50LmxvY2FsZURhdGEgPSAoa2V5Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBLaHJvbm9zKTogTG9jYWxlID0+IHtcbiAgaWYgKGtleSBpbnN0YW5jZW9mIEtocm9ub3MpIHtcbiAgICByZXR1cm4ga2V5LmxvY2FsZURhdGEoKTtcbiAgfVxuXG4gIHJldHVybiBnZXRMb2NhbGUoa2V5KTtcbn07XG5cbi8vIG1vbWVudC51dGMgPSBjcmVhdGVVVEM7XG5tb21lbnQudW5peCA9IChpbnA6IG51bWJlcikgPT4gbmV3IEtocm9ub3MoaW5wICogMTAwMCk7XG5tb21lbnQuSVNPXzg2MDEgPSBJU09fODYwMTtcbm1vbWVudC5SRkNfMjgyMiA9IFJGQ18yODIyO1xubW9tZW50LmRlZmluZUxvY2FsZSA9IGRlZmluZUxvY2FsZTtcbm1vbWVudC5wYXJzZVR3b0RpZ2l0WWVhciA9IHBhcnNlVHdvRGlnaXRZZWFyO1xubW9tZW50LmlzRGF0ZSA9IGlzRGF0ZTtcbm1vbWVudC5pbnZhbGlkID0gZnVuY3Rpb24gX2ludmFsaWQoKTogS2hyb25vcyB7XG4gIHJldHVybiBuZXcgS2hyb25vcyhuZXcgRGF0ZShOYU4pKTtcbn07XG5cbi8vIGR1cmF0aW9uKGlucD86IER1cmF0aW9uIHwgRGF0ZUlucHV0IHwgS2hyb25vcywgdW5pdD86IE1vbWVudFVuaXRPZlRpbWUpOiBEdXJhdGlvbjtcbm1vbWVudC5kdXJhdGlvbiA9IChpbnB1dD86IER1cmF0aW9uIHwgRGF0ZUlucHV0IHwgS2hyb25vcywgdW5pdD86IE1vbWVudFVuaXRPZlRpbWUpOiBEdXJhdGlvbiA9PiB7XG4gIGNvbnN0IF91bml0ID0gbWFwVW5pdE9mVGltZSh1bml0KTtcbiAgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RvZG8gaW1wbGVtZW50Jyk7XG4gIH1cblxuICBpZiAoaW5wdXQgPT0gbnVsbCkge1xuICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbigpO1xuICB9XG5cbiAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGlucHV0LCBfdW5pdCwgeyBfbG9jYWxlOiBpbnB1dC5fbG9jYWxlIH0pO1xuICB9XG5cbiAgaWYgKGlzU3RyaW5nKGlucHV0KSB8fCBpc051bWJlcihpbnB1dCkgfHwgaXNEdXJhdGlvbihpbnB1dCkgfHwgaXNPYmplY3Q8RGF0ZU9iamVjdD4oaW5wdXQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGlucHV0LCBfdW5pdCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ3RvZG8gaW1wbGVtZW50Jyk7XG59O1xuXG5tb21lbnQubWluID0gZnVuY3Rpb24gX21pbiguLi5kYXRlczogKChEYXRlSW5wdXQgfCBLaHJvbm9zKVtdIHwgKERhdGVJbnB1dCB8IEtocm9ub3MpKVtdKTogS2hyb25vcyB7XG4gIGNvbnN0IF9maXJzdEFyZyA9IGRhdGVzWzBdO1xuICBjb25zdCBfZGF0ZXMgPSAoaXNBcnJheShfZmlyc3RBcmcpID8gX2ZpcnN0QXJnIDogZGF0ZXMpXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIC5tYXAoKGRhdGU6IEtocm9ub3MpID0+IF9tb21lbnQoZGF0ZSkpXG4gICAgLm1hcChkYXRlID0+IGRhdGUudG9EYXRlKCkpO1xuXG4gIGNvbnN0IF9kYXRlID0gbWluKC4uLl9kYXRlcyk7XG5cbiAgcmV0dXJuIG5ldyBLaHJvbm9zKF9kYXRlKTtcbn07XG5cbm1vbWVudC5tYXggPSBmdW5jdGlvbiBfbWF4KC4uLmRhdGVzOiAoKERhdGVJbnB1dCB8IEtocm9ub3MpW10gfCAoRGF0ZUlucHV0IHwgS2hyb25vcykpW10pOiBLaHJvbm9zIHtcbiAgY29uc3QgX2ZpcnN0QXJnID0gZGF0ZXNbMF07XG4gIGNvbnN0IF9kYXRlcyA9IChpc0FycmF5KF9maXJzdEFyZykgPyBfZmlyc3RBcmcgOiBkYXRlcylcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgLm1hcCgoZGF0ZTogS2hyb25vcykgPT4gX21vbWVudChkYXRlKSlcbiAgICAubWFwKGRhdGUgPT4gZGF0ZS50b0RhdGUoKSk7XG5cbiAgY29uc3QgX2RhdGUgPSBtYXgoLi4uX2RhdGVzKTtcblxuICByZXR1cm4gbmV3IEtocm9ub3MoX2RhdGUpO1xufTtcblxubW9tZW50LmxvY2FsZXMgPSAoKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gbGlzdExvY2FsZXMoKTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9tZW50SW5wdXRPYmplY3Qge1xuICB5ZWFycz86IG51bWJlcjtcbiAgeWVhcj86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcblxuICBtb250aHM/OiBudW1iZXI7XG4gIG1vbnRoPzogbnVtYmVyO1xuICBNPzogbnVtYmVyO1xuXG4gIGRheXM/OiBudW1iZXI7XG4gIGRheT86IG51bWJlcjtcbiAgZD86IG51bWJlcjtcblxuICBkYXRlcz86IG51bWJlcjtcbiAgZGF0ZT86IG51bWJlcjtcbiAgRD86IG51bWJlcjtcblxuICBob3Vycz86IG51bWJlcjtcbiAgaG91cj86IG51bWJlcjtcbiAgaD86IG51bWJlcjtcblxuICBtaW51dGVzPzogbnVtYmVyO1xuICBtaW51dGU/OiBudW1iZXI7XG4gIG0/OiBudW1iZXI7XG5cbiAgc2Vjb25kcz86IG51bWJlcjtcbiAgc2Vjb25kPzogbnVtYmVyO1xuICBzPzogbnVtYmVyO1xuXG4gIG1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgbWlsbGlzZWNvbmQ/OiBudW1iZXI7XG4gIG1zPzogbnVtYmVyO1xuXG4gIHc/OiBudW1iZXI7XG4gIHdlZWs/OiBudW1iZXI7XG4gIHdlZWtzPzogbnVtYmVyO1xuXG4gIFE/OiBudW1iZXI7XG4gIHF1YXJ0ZXI/OiBudW1iZXI7XG4gIHF1YXJ0ZXJzPzogbnVtYmVyO1xuXG4gIHdlZWtZZWFyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBNb21lbnRVbml0T2ZUaW1lID0gKFxuICAneWVhcicgfCAneWVhcnMnIHwgJ3knIHxcbiAgJ21vbnRoJyB8ICdtb250aHMnIHwgJ00nIHxcbiAgJ3dlZWsnIHwgJ3dlZWtzJyB8ICd3JyB8XG4gICdkYXknIHwgJ2RheXMnIHwgJ2QnIHxcbiAgJ2hvdXInIHwgJ2hvdXJzJyB8ICdoJyB8XG4gICdtaW51dGUnIHwgJ21pbnV0ZXMnIHwgJ20nIHxcbiAgJ3NlY29uZCcgfCAnc2Vjb25kcycgfCAncycgfFxuICAnbWlsbGlzZWNvbmQnIHwgJ21pbGxpc2Vjb25kcycgfCAnbXMnIHxcbiAgJ3EnIHwgJ3F1YXJ0ZXInIHwgJ3F1YXJ0ZXJzJyB8ICdRJyB8XG4gICdpc29XZWVrJyB8ICdpc29XZWVrcycgfCAnVycgfFxuICAnZGF0ZScgfCAnZGF0ZXMnIHwgJ0QnXG4gICk7XG5cbmV4cG9ydCB0eXBlIE1vbWVudEFsbCA9IE1vbWVudFVuaXRPZlRpbWUgfFxuICAnd2Vla1llYXInIHwgJ3dlZWtZZWFycycgfCAnZ2cnIHxcbiAgJ2lzb1dlZWtZZWFyJyB8ICdpc29XZWVrWWVhcnMnIHwgJ0dHJyB8XG4gICdkYXlPZlllYXInIHwgJ2RheU9mWWVhcnMnIHwgJ0RERCcgfFxuICAnd2Vla2RheScgfCAnd2Vla2RheXMnIHwgJ2UnIHxcbiAgJ2lzb1dlZWtkYXknIHwgJ2lzb1dlZWtkYXlzJyB8ICdFJztcblxuY29uc3QgX3VuaXRzUHJpb3JpdHk6IHtba2V5IGluIFVuaXRPZlRpbWVdOiBudW1iZXJ9ID0ge1xuICB5ZWFyOiAxLFxuICBtb250aDogOCxcbiAgd2VlazogNSxcbiAgaXNvV2VlazogNSxcbiAgZGF5OiAxMSxcbiAgd2Vla2RheTogMTEsXG4gIGlzb1dlZWtkYXk6IDExLFxuICBob3VyczogMTMsXG4gIHdlZWtZZWFyOiAxLFxuICBpc29XZWVrWWVhcjogMSxcbiAgcXVhcnRlcjogNyxcbiAgZGF0ZTogOSxcbiAgZGF5T2ZZZWFyOiA0LFxuICBtaW51dGVzOiAxNCxcbiAgc2Vjb25kczogMTUsXG4gIG1pbGxpc2Vjb25kczogMTZcbn07XG5cbi8vIHRvZG86IGRvIEkgbmVlZCAyIG1hcHBlcnM/XG5jb25zdCBfdGltZUhhc2hNYXA6IHsgW2tleSBpbiBNb21lbnRBbGxdOiBVbml0T2ZUaW1lIHwgc3RyaW5nIH0gPSB7XG4gIHk6ICd5ZWFyJyxcbiAgeWVhcnM6ICd5ZWFyJyxcbiAgeWVhcjogJ3llYXInLFxuICBNOiAnbW9udGgnLFxuICBtb250aHM6ICdtb250aCcsXG4gIG1vbnRoOiAnbW9udGgnLFxuICB3OiAnd2VlaycsXG4gIHdlZWtzOiAnd2VlaycsXG4gIHdlZWs6ICd3ZWVrJyxcblxuICBkOiAnZGF5JyxcbiAgZGF5czogJ2RheScsXG4gIGRheTogJ2RheScsXG5cbiAgZGF0ZTogJ2RhdGUnLFxuICBkYXRlczogJ2RhdGUnLFxuICBEOiAnZGF0ZScsXG5cbiAgaDogJ2hvdXJzJyxcbiAgaG91cjogJ2hvdXJzJyxcbiAgaG91cnM6ICdob3VycycsXG4gIG06ICdtaW51dGVzJyxcbiAgbWludXRlOiAnbWludXRlcycsXG4gIG1pbnV0ZXM6ICdtaW51dGVzJyxcbiAgczogJ3NlY29uZHMnLFxuICBzZWNvbmQ6ICdzZWNvbmRzJyxcbiAgc2Vjb25kczogJ3NlY29uZHMnLFxuICBtczogJ21pbGxpc2Vjb25kcycsXG4gIG1pbGxpc2Vjb25kOiAnbWlsbGlzZWNvbmRzJyxcbiAgbWlsbGlzZWNvbmRzOiAnbWlsbGlzZWNvbmRzJyxcbiAgcXVhcnRlcjogJ3F1YXJ0ZXInLFxuICBxdWFydGVyczogJ3F1YXJ0ZXInLFxuICBxOiAncXVhcnRlcicsXG4gIFE6ICdxdWFydGVyJyxcbiAgaXNvV2VlazogJ2lzb1dlZWsnLFxuICBpc29XZWVrczogJ2lzb1dlZWsnLFxuICBXOiAnaXNvV2VlaycsXG4gIHdlZWtZZWFyOiAnd2Vla1llYXInLFxuICB3ZWVrWWVhcnM6ICd3ZWVrWWVhcicsXG4gIGdnOiAnd2Vla1llYXJzJyxcbiAgaXNvV2Vla1llYXI6ICdpc29XZWVrWWVhcicsXG4gIGlzb1dlZWtZZWFyczogJ2lzb1dlZWtZZWFyJyxcbiAgR0c6ICdpc29XZWVrWWVhcicsXG4gIGRheU9mWWVhcjogJ2RheU9mWWVhcicsXG4gIGRheU9mWWVhcnM6ICdkYXlPZlllYXInLFxuICBEREQ6ICdkYXlPZlllYXInLFxuICB3ZWVrZGF5OiAnd2Vla2RheScsXG4gIHdlZWtkYXlzOiAnd2Vla2RheScsXG4gIGU6ICd3ZWVrZGF5JyxcbiAgaXNvV2Vla2RheTogJ2lzb1dlZWtkYXknLFxuICBpc29XZWVrZGF5czogJ2lzb1dlZWtkYXknLFxuICBFOiAnaXNvV2Vla2RheSdcbn07XG5cbmZ1bmN0aW9uIG1hcFVuaXRPZlRpbWUocGVyaW9kOiBNb21lbnRBbGwpOiBVbml0T2ZUaW1lIHtcbiAgcmV0dXJuIF90aW1lSGFzaE1hcFtwZXJpb2RdIGFzIFVuaXRPZlRpbWU7XG59XG5cbmZ1bmN0aW9uIG1hcE1vbWVudElucHV0T2JqZWN0KG9iajogTW9tZW50SW5wdXRPYmplY3QpOiB7W2tleSBpbiBVbml0T2ZUaW1lXT86IG51bWJlcn0ge1xuICBjb25zdCBfcmVzOiB7W2tleSBpbiBVbml0T2ZUaW1lXT86IG51bWJlcn0gPSB7fTtcblxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKVxuICAgIC5yZWR1Y2UoKHJlcywga2V5OiBrZXlvZiBNb21lbnRJbnB1dE9iamVjdCkgPT4ge1xuICAgICAgcmVzW21hcFVuaXRPZlRpbWUoa2V5KV0gPSBvYmpba2V5XTtcblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCBfcmVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIEtocm9ub3Mge1xuICBfZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIF9pc1VUQyA9IGZhbHNlO1xuICBfaXNTdHJpY3Q6IGJvb2xlYW47XG4gIF9sb2NhbGU6IExvY2FsZTtcbiAgX2Zvcm1hdDogc3RyaW5nIHwgc3RyaW5nW107XG4gIF9vZmZzZXQ6IG51bWJlcjtcbiAgX3R6bTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0PzogRGF0ZUlucHV0LFxuICAgICAgICAgICAgICBmb3JtYXQ/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgbG9jYWxlS2V5Pzogc3RyaW5nLFxuICAgICAgICAgICAgICBzdHJpY3QgPSBmYWxzZSxcbiAgICAgICAgICAgICAgaXNVVEMgPSBmYWxzZSxcbiAgICAgICAgICAgICAgb2Zmc2V0PzogbnVtYmVyKSB7XG4gICAgLy8gbG9jYWxlIHdpbGwgYmUgbmVlZGVkIHRvIGZvcm1hdCBpbnZhbGlkIGRhdGUgbWVzc2FnZVxuICAgIHRoaXMuX2xvY2FsZSA9IGdldExvY2FsZShsb2NhbGVLZXkpO1xuICAgIC8vIHBhcnNlIGludmFsaWQgaW5wdXRcbiAgICBpZiAoaW5wdXQgPT09ICcnIHx8IGlucHV0ID09PSBudWxsIHx8IChpc051bWJlcihpbnB1dCkgJiYgaXNOYU4oaW5wdXQpKSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IG5ldyBEYXRlKE5hTik7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2lzVVRDID0gaXNVVEM7XG4gICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICB0aGlzLl9vZmZzZXQgPSAwO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0IHx8IG9mZnNldCA9PT0gMCkge1xuICAgICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0O1xuICAgIH1cbiAgICB0aGlzLl9pc1N0cmljdCA9IHN0cmljdDtcbiAgICB0aGlzLl9mb3JtYXQgPSBmb3JtYXQ7XG5cbiAgICBpZiAoIWlucHV0ICYmIGlucHV0ICE9PSAwICYmICFmb3JtYXQpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShpbnB1dCk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIHRoaXMuX2RhdGUgPSBwYXJzZURhdGUoaW5wdXQsIGZvcm1hdCwgbG9jYWxlS2V5LCBzdHJpY3QsIGlzVVRDKTtcbiAgICBjb25zdCBjb25maWcgPSBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZUtleSwgc3RyaWN0LCBpc1VUQyk7XG4gICAgdGhpcy5fZGF0ZSA9IGNvbmZpZy5fZDtcbiAgICB0aGlzLl9vZmZzZXQgPSBpc051bWJlcihjb25maWcuX29mZnNldCkgPyBjb25maWcuX29mZnNldCA6IHRoaXMuX29mZnNldDtcbiAgICB0aGlzLl9pc1VUQyA9IGNvbmZpZy5faXNVVEM7XG4gICAgdGhpcy5faXNTdHJpY3QgPSBjb25maWcuX3N0cmljdDtcbiAgICB0aGlzLl9mb3JtYXQgPSBjb25maWcuX2Y7XG4gICAgdGhpcy5fdHptID0gY29uZmlnLl90em07XG4gIH1cblxuICBfdG9Db25maWcoKTogRGF0ZVBhcnNpbmdDb25maWcge1xuICAgIHJldHVybiB7IF9pc1VUQzogdGhpcy5faXNVVEMsIF9sb2NhbGU6IHRoaXMuX2xvY2FsZSwgX29mZnNldDogdGhpcy5fb2Zmc2V0LCBfdHptOiB0aGlzLl90em0gfTtcbiAgfVxuXG4gIC8vIExvY2FsZVxuICBsb2NhbGUoKTogc3RyaW5nO1xuICBsb2NhbGUobG9jYWxlS2V5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IEtocm9ub3MpOiBLaHJvbm9zO1xuICBsb2NhbGUobG9jYWxlS2V5Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBLaHJvbm9zKTogS2hyb25vcyB8IHN0cmluZyB7XG4gICAgaWYgKGlzVW5kZWZpbmVkKGxvY2FsZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgfVxuXG4gICAgaWYgKGxvY2FsZUtleSBpbnN0YW5jZW9mIEtocm9ub3MpIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IGxvY2FsZUtleS5fbG9jYWxlO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGxvY2FsZUtleSk7XG4gICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxvY2FsZURhdGEoKTogTG9jYWxlIHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICB9XG5cbiAgLy8gQmFzaWNcblxuICBhZGQodmFsOiBudW1iZXIgfCBzdHJpbmcgfCBNb21lbnRJbnB1dE9iamVjdCwgcGVyaW9kPzogVW5pdE9mVGltZSB8IE1vbWVudFVuaXRPZlRpbWUpOiBLaHJvbm9zIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IGFkZCh0aGlzLl9kYXRlLCBwYXJzZUludCh2YWwsIDEwKSwgbWFwVW5pdE9mVGltZShwZXJpb2QpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIodmFsKSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IGFkZCh0aGlzLl9kYXRlLCB2YWwsIG1hcFVuaXRPZlRpbWUocGVyaW9kKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0PE1vbWVudElucHV0T2JqZWN0Pih2YWwpKSB7XG4gICAgICBjb25zdCBfbWFwcGVkID0gbWFwTW9tZW50SW5wdXRPYmplY3QodmFsKTtcbiAgICAgIE9iamVjdC5rZXlzKF9tYXBwZWQpXG4gICAgICAgIC5mb3JFYWNoKChrZXk6IFVuaXRPZlRpbWUpID0+IGFkZCh0aGlzLl9kYXRlLCBfbWFwcGVkW2tleV0sIGtleSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZml4bWU6IGZvciBzb21lIHJlYXNvbiBoZXJlICdudWxsJyBmb3IgdGltZSBpcyBmaW5lXG4gIGNhbGVuZGFyKHRpbWU/OiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBmb3JtYXRzPzogQ2FsZW5kYXJTcGVjKTogc3RyaW5nIHtcbiAgICBjb25zdCBfdGltZSA9IHRpbWUgaW5zdGFuY2VvZiBLaHJvbm9zID8gdGltZSA6IG5ldyBLaHJvbm9zKHRpbWUgfHwgbmV3IERhdGUoKSk7XG4gICAgY29uc3QgX29mZnNldCA9ICh0aGlzLl9vZmZzZXQgfHwgMCkgLSAoX3RpbWUuX29mZnNldCB8fCAwKTtcbiAgICBjb25zdCBfY29uZmlnID0gT2JqZWN0LmFzc2lnbih0aGlzLl90b0NvbmZpZygpLCB7IF9vZmZzZXQgfSk7XG5cbiAgICByZXR1cm4gY2FsZW5kYXIodGhpcy5fZGF0ZSwgX3RpbWUuX2RhdGUsXG4gICAgICBmb3JtYXRzLCB0aGlzLl9sb2NhbGUsIF9jb25maWcpO1xuICB9XG5cbiAgY2xvbmUoKTogS2hyb25vcyB7XG4gICAgY29uc3QgbG9jYWxlS2V5ID0gdGhpcy5fbG9jYWxlICYmIHRoaXMuX2xvY2FsZS5fYWJiciB8fCAnZW4nO1xuXG4gICAgLy8gcmV0dXJuIG5ldyBLaHJvbm9zKGNsb25lRGF0ZSh0aGlzLl9kYXRlKSwgdGhpcy5fZm9ybWF0LCBsb2NhbGVLZXksIHRoaXMuX2lzU3RyaWN0LCB0aGlzLl9pc1VUQyk7XG4gICAgLy8gZmFpbHMgaWYgaXNVVEMgYW5kIG9mZnNldFxuICAgIC8vIHJldHVybiBuZXcgS2hyb25vcyhuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSksXG4gICAgcmV0dXJuIG5ldyBLaHJvbm9zKHRoaXMuX2RhdGUsXG4gICAgICB0aGlzLl9mb3JtYXQsXG4gICAgICBsb2NhbGVLZXksXG4gICAgICB0aGlzLl9pc1N0cmljdCxcbiAgICAgIHRoaXMuX2lzVVRDLFxuICAgICAgdGhpcy5fb2Zmc2V0KTtcbiAgfVxuXG4gIGRpZmYoYjogRGF0ZUlucHV0IHwgS2hyb25vcywgdW5pdE9mVGltZT86IE1vbWVudFVuaXRPZlRpbWUsIHByZWNpc2U/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBjb25zdCB1bml0ID0gbWFwVW5pdE9mVGltZSh1bml0T2ZUaW1lKTtcbiAgICBjb25zdCBfYiA9IGIgaW5zdGFuY2VvZiBLaHJvbm9zID8gYiA6IG5ldyBLaHJvbm9zKGIpO1xuICAgIC8vIGNvbnN0IHpvbmVEZWx0YSA9IChfYi51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpO1xuICAgIC8vIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24odGhpcy5fdG9Db25maWcoKSwge1xuICAgIC8vICAgX29mZnNldDogMCxcbiAgICAvLyAgIF9pc1VUQzogdHJ1ZSxcbiAgICAvLyAgIF96b25lRGVsdGE6IHpvbmVEZWx0YVxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBkaWZmKG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKSwgbmV3IERhdGUoX2IudmFsdWVPZigpKSwgdW5pdCwgcHJlY2lzZSwgY29uZmlnKTtcblxuICAgIHJldHVybiBkaWZmKHRoaXMuX2RhdGUsIF9iLnRvRGF0ZSgpLCB1bml0LCBwcmVjaXNlLCB0aGlzLl90b0NvbmZpZygpKTtcbiAgfVxuXG4gIGVuZE9mKHBlcmlvZD86IE1vbWVudFVuaXRPZlRpbWUpOiBLaHJvbm9zIHtcbiAgICBjb25zdCBfcGVyID0gbWFwVW5pdE9mVGltZShwZXJpb2QpO1xuICAgIHRoaXMuX2RhdGUgPSBlbmRPZih0aGlzLl9kYXRlLCBfcGVyLCB0aGlzLl9pc1VUQyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZvcm1hdChmb3JtYXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXREYXRlKHRoaXMuX2RhdGUsIGZvcm1hdCwgdGhpcy5fbG9jYWxlICYmIHRoaXMuX2xvY2FsZS5fYWJiciwgdGhpcy5faXNVVEMsIHRoaXMuX29mZnNldCk7XG4gIH1cblxuICAvLyB0b2RvOiBpbXBsZW1lbnRcbiAgZnJvbSh0aW1lPzogRGF0ZUlucHV0IHwgS2hyb25vcywgd2l0aG91dFN1ZmZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGNvbnN0IF90aW1lID0gX21vbWVudCh0aW1lKTtcbiAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgX3RpbWUuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyB0bzogdGhpcy50b0RhdGUoKSwgZnJvbTogX3RpbWUudG9EYXRlKCkgfSlcbiAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZTtcbiAgfVxuXG4gIGZyb21Ob3cod2l0aG91dFN1ZmZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZyb20obmV3IERhdGUoKSwgd2l0aG91dFN1ZmZpeCk7XG4gIH1cblxuICB0byhpbnA6IERhdGVJbnB1dCB8IEtocm9ub3MsIHN1ZmZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcihgVE9ETzogSW1wbGVtZW50YCk7XG4gIH1cblxuICB0b05vdyh3aXRob3V0UHJlZml4PzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUT0RPOiBJbXBsZW1lbnRgKTtcbiAgfVxuXG4gIHN1YnRyYWN0KHZhbDogbnVtYmVyIHwgc3RyaW5nIHwgTW9tZW50SW5wdXRPYmplY3QsIHBlcmlvZD86IFVuaXRPZlRpbWUgfCBNb21lbnRVbml0T2ZUaW1lKTogS2hyb25vcyB7XG4gICAgaWYgKGlzU3RyaW5nKHZhbCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBzdWJ0cmFjdCh0aGlzLl9kYXRlLCBwYXJzZUludCh2YWwsIDEwKSwgbWFwVW5pdE9mVGltZShwZXJpb2QpKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBzdWJ0cmFjdCh0aGlzLl9kYXRlLCB2YWwsIG1hcFVuaXRPZlRpbWUocGVyaW9kKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0PE1vbWVudElucHV0T2JqZWN0Pih2YWwpKSB7XG4gICAgICBjb25zdCBfbWFwcGVkID0gbWFwTW9tZW50SW5wdXRPYmplY3QodmFsKTtcbiAgICAgIE9iamVjdC5rZXlzKF9tYXBwZWQpXG4gICAgICAgIC5mb3JFYWNoKChrZXk6IFVuaXRPZlRpbWUpID0+IHN1YnRyYWN0KHRoaXMuX2RhdGUsIF9tYXBwZWRba2V5XSwga2V5KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXQocGVyaW9kOiBNb21lbnRBbGwpOiBudW1iZXIge1xuICAgIGlmIChwZXJpb2QgPT09ICdkYXlPZlllYXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXlPZlllYXIoKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bml0ID0gbWFwVW5pdE9mVGltZShwZXJpb2QpO1xuICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKTtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKTtcbiAgICAgIC8vIHwgJ3dlZWsnXG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZSgpO1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF5KCk7XG4gICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCk7XG4gICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgcmV0dXJuIHRoaXMubWludXRlcygpO1xuICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgIHJldHVybiB0aGlzLnNlY29uZHMoKTtcbiAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kcygpO1xuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIHJldHVybiB0aGlzLndlZWsoKTtcbiAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrKCk7XG4gICAgICBjYXNlICd3ZWVrWWVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKCk7XG4gICAgICBjYXNlICdpc29XZWVrWWVhcic6XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCk7XG4gICAgICBjYXNlICd3ZWVrZGF5JzpcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheSgpO1xuICAgICAgY2FzZSAnaXNvV2Vla2RheSc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtkYXkoKTtcbiAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICByZXR1cm4gdGhpcy5xdWFydGVyKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9tZW50LmdldCgnJHtwZXJpb2R9JylgKTtcbiAgICB9XG4gIH1cblxuICBzZXQocGVyaW9kOiBNb21lbnRBbGwgfCBNb21lbnRJbnB1dE9iamVjdCwgaW5wdXQ/OiBudW1iZXIpOiBLaHJvbm9zIHtcblxuICAgIGlmIChpc1N0cmluZyhwZXJpb2QpKSB7XG4gICAgICBjb25zdCB1bml0ID0gbWFwVW5pdE9mVGltZShwZXJpb2QpO1xuICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgIHJldHVybiB0aGlzLnllYXIoaW5wdXQpO1xuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoaW5wdXQpO1xuICAgICAgICAvLyB8ICd3ZWVrJ1xuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgIHJldHVybiB0aGlzLmRheShpbnB1dCk7XG4gICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmRhdGUoaW5wdXQpO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoaW5wdXQpO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzKGlucHV0KTtcbiAgICAgICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc2Vjb25kcyhpbnB1dCk7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmRzKGlucHV0KTtcbiAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2VlayhpbnB1dCk7XG4gICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWsoaW5wdXQpO1xuICAgICAgICBjYXNlICd3ZWVrWWVhcic6XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoaW5wdXQpO1xuICAgICAgICBjYXNlICdpc29XZWVrWWVhcic6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla1llYXIoaW5wdXQpO1xuICAgICAgICBjYXNlICd3ZWVrZGF5JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWVrZGF5KGlucHV0KTtcbiAgICAgICAgY2FzZSAnaXNvV2Vla2RheSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2Vla2RheShpbnB1dCk7XG4gICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgIHJldHVybiB0aGlzLnF1YXJ0ZXIoaW5wdXQpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb21lbnQuZ2V0KCcke3BlcmlvZH0nKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdDxNb21lbnRJbnB1dE9iamVjdD4ocGVyaW9kKSkge1xuICAgICAgY29uc3QgX21hcHBlZCA9IG1hcE1vbWVudElucHV0T2JqZWN0KHBlcmlvZCk7XG4gICAgICBPYmplY3Qua2V5cyhfbWFwcGVkKVxuICAgICAgICAuc29ydChmdW5jdGlvbihhOiBVbml0T2ZUaW1lLCBiOiBVbml0T2ZUaW1lKTogbnVtYmVyIHtcbiAgICAgICAgICByZXR1cm4gX3VuaXRzUHJpb3JpdHlbYV0gLSBfdW5pdHNQcmlvcml0eVtiXTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZvckVhY2goKGtleTogVW5pdE9mVGltZSkgPT4gdGhpcy5zZXQoa2V5LCBfbWFwcGVkW2tleV0pKTtcbiAgICB9XG5cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gIH1cblxuICB0b0lTT1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChnZXRGdWxsWWVhcih0aGlzLl9kYXRlLCB0cnVlKSA8IDAgfHwgZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdHJ1ZSkgPiA5OTk5KSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXQoJ1lZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKSkge1xuICAgICAgLy8gbmF0aXZlIGltcGxlbWVudGF0aW9uIGlzIH41MHggZmFzdGVyLCB1c2UgaXQgd2hlbiB3ZSBjYW5cbiAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyk7XG4gIH1cblxuICBpbnNwZWN0KCk6IHN0cmluZyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUT0RPOiBpbXBsZW1lbnQnKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICB0b0RhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKTtcbiAgfVxuXG4gIHRvT2JqZWN0KCk6IHtba2V5IGluIE1vbWVudFVuaXRPZlRpbWVdPzogbnVtYmVyfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIHllYXJzOiBnZXRGdWxsWWVhcih0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksXG4gICAgICAvLyBtb250aHM6IGdldE1vbnRoKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcblxuICAgICAgeWVhcjogZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLFxuICAgICAgbW9udGg6IGdldE1vbnRoKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcbiAgICAgIGRhdGU6IGdldERhdGUodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLFxuICAgICAgaG91cnM6IGdldEhvdXJzKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcbiAgICAgIG1pbnV0ZXM6IGdldE1pbnV0ZXModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLFxuICAgICAgc2Vjb25kczogZ2V0U2Vjb25kcyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksXG4gICAgICBtaWxsaXNlY29uZHM6IGdldE1pbGxpc2Vjb25kcyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQylcbiAgICB9O1xuICB9XG5cbiAgdG9BcnJheSgpOiBEYXRlQXJyYXkge1xuICAgIHJldHVybiBbdGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCksIHRoaXMuaG91cigpLCB0aGlzLm1pbnV0ZSgpLCB0aGlzLnNlY29uZCgpLCB0aGlzLm1pbGxpc2Vjb25kKCldO1xuICB9XG5cblxuICAvLyBEYXRlcyBib29sZWFuIGFsZ2VicmFcblxuICBpc0FmdGVyKGRhdGU6IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogYm9vbGVhbiB7XG4gICAgY29uc3QgX3VuaXQgPSB1bml0ID8gbWFwVW5pdE9mVGltZSh1bml0KSA6IHZvaWQgMDtcblxuICAgIHJldHVybiBpc0FmdGVyKHRoaXMuX2RhdGUsIGRhdGUudG9EYXRlKCksIF91bml0KTtcbiAgfVxuXG4gIGlzQmVmb3JlKGRhdGU6IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogYm9vbGVhbiB7XG4gICAgY29uc3QgX3VuaXQgPSB1bml0ID8gbWFwVW5pdE9mVGltZSh1bml0KSA6IHZvaWQgMDtcblxuICAgIHJldHVybiBpc0JlZm9yZSh0aGlzLnRvRGF0ZSgpLCBkYXRlLnRvRGF0ZSgpLCBfdW5pdCk7XG4gIH1cblxuICBpc0JldHdlZW4oZnJvbTogS2hyb25vcywgdG86IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lLCBpbmNsdXNpdml0eT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNCZXR3ZWVuKHRoaXMudG9EYXRlKCksIGZyb20udG9EYXRlKCksIHRvLnRvRGF0ZSgpLCBfdW5pdCwgaW5jbHVzaXZpdHkpO1xuICB9XG5cbiAgaXNTYW1lKGRhdGU6IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogYm9vbGVhbiB7XG4gICAgY29uc3QgX3VuaXQgPSB1bml0ID8gbWFwVW5pdE9mVGltZSh1bml0KSA6IHZvaWQgMDtcblxuICAgIHJldHVybiBpc1NhbWUodGhpcy5fZGF0ZSwgZGF0ZS50b0RhdGUoKSwgX3VuaXQpO1xuICB9XG5cbiAgaXNTYW1lT3JBZnRlcihkYXRlOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNTYW1lT3JBZnRlcih0aGlzLl9kYXRlLCBkYXRlLnRvRGF0ZSgpLCBfdW5pdCk7XG4gIH1cblxuICBpc1NhbWVPckJlZm9yZShkYXRlOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNTYW1lT3JCZWZvcmUodGhpcy5fZGF0ZSwgZGF0ZS50b0RhdGUoKSwgX3VuaXQpO1xuICB9XG5cbiAgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNEYXRlVmFsaWQodGhpcy5fZGF0ZSk7XG4gIH1cblxuICB2YWx1ZU9mKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGUudmFsdWVPZigpIC0gKCh0aGlzLl9vZmZzZXQgfHwgMCkgKiA2MDAwMCk7XG4gIH1cblxuICB1bml4KCk6IG51bWJlciB7XG4gICAgLy8gcmV0dXJuIGdldFVuaXhUaW1lKHRoaXMuX2RhdGUpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gIH1cblxuXG4gIC8vIE9mZnNldFxuXG4gIHV0Y09mZnNldCgpOiBudW1iZXI7XG4gIHV0Y09mZnNldChiOiBudW1iZXIgfCBzdHJpbmcsIGtlZXBMb2NhbFRpbWU/OiBib29sZWFuKTogS2hyb25vcztcbiAgdXRjT2Zmc2V0KGI/OiBudW1iZXIgfCBzdHJpbmcsIGtlZXBMb2NhbFRpbWU/OiBib29sZWFuKTogbnVtYmVyIHwgS2hyb25vcyB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHRoaXMuX3RvQ29uZmlnKCk7XG5cbiAgICBpZiAoIWIgJiYgYiAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldFVUQ09mZnNldCh0aGlzLl9kYXRlLCBfY29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gc2V0VVRDT2Zmc2V0KHRoaXMuX2RhdGUsIGIsIGtlZXBMb2NhbFRpbWUsIGZhbHNlLCBfY29uZmlnKTtcblxuICAgIHRoaXMuX29mZnNldCA9IF9jb25maWcuX29mZnNldDtcbiAgICB0aGlzLl9pc1VUQyA9IF9jb25maWcuX2lzVVRDO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1dGMoa2VlcExvY2FsVGltZT86IGJvb2xlYW4pOiBLaHJvbm9zIHtcbiAgICByZXR1cm4gdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gIH1cblxuICBsb2NhbChrZWVwTG9jYWxUaW1lPzogYm9vbGVhbik6IEtocm9ub3Mge1xuICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgdGhpcy51dGNPZmZzZXQoMCwga2VlcExvY2FsVGltZSk7XG4gICAgICB0aGlzLl9pc1VUQyA9IGZhbHNlO1xuXG4gICAgICBpZiAoa2VlcExvY2FsVGltZSkge1xuICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcy5fZGF0ZSksICdtJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwYXJzZVpvbmUoaW5wdXQ/OiBzdHJpbmcpOiBLaHJvbm9zIHtcbiAgICBjb25zdCBfY29uZmlnID0gdGhpcy5fdG9Db25maWcoKTtcbiAgICB0aGlzLl9kYXRlID0gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQodGhpcy5fZGF0ZSwgaW5wdXQsIF9jb25maWcpO1xuXG4gICAgdGhpcy5fb2Zmc2V0ID0gX2NvbmZpZy5fb2Zmc2V0O1xuICAgIHRoaXMuX2lzVVRDID0gX2NvbmZpZy5faXNVVEM7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGhhc0FsaWduZWRIb3VyT2Zmc2V0KGlucHV0PzogS2hyb25vcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXNBbGlnbmVkSG91ck9mZnNldCh0aGlzLl9kYXRlLCBpbnB1dCA/IGlucHV0Ll9kYXRlIDogdm9pZCAwKTtcbiAgfVxuXG4gIGlzRFNUKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0RheWxpZ2h0U2F2aW5nVGltZSh0aGlzLl9kYXRlKTtcbiAgfVxuXG4gIGlzTG9jYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLl9pc1VUQztcbiAgfVxuXG4gIGlzVXRjT2Zmc2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1VUQztcbiAgfVxuXG4gIGlzVVRDKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzVXRjKCk7XG4gIH1cblxuICBpc1V0YygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwO1xuICB9XG5cbiAgLy8gVGltZXpvbmVcblxuICB6b25lQWJicigpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRab25lQWJicih0aGlzLl9pc1VUQyk7XG4gIH1cblxuICB6b25lTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXRab25lTmFtZSh0aGlzLl9pc1VUQyk7XG4gIH1cblxuICAvLyBZZWFyXG5cbiAgeWVhcigpOiBudW1iZXI7XG4gIHllYXIoeWVhcjogbnVtYmVyKTogS2hyb25vcztcbiAgeWVhcih5ZWFyPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF5ZWFyICYmIHllYXIgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRGdWxsWWVhcih0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXRGdWxsWWVhcih0aGlzLl9kYXRlLCB5ZWFyKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdlZWtZZWFyKCk6IG51bWJlcjtcbiAgd2Vla1llYXIodmFsOiBudW1iZXIpOiBLaHJvbm9zO1xuICB3ZWVrWWVhcih2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRXZWVrWWVhcih0aGlzLl9kYXRlLCB0aGlzLl9sb2NhbGUsIHRoaXMuaXNVVEMoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IGdldFNldFdlZWtZZWFyKHRoaXMuX2RhdGUsIHZhbCwgdGhpcy5fbG9jYWxlLCB0aGlzLmlzVVRDKCkpO1xuICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaXNvV2Vla1llYXIoKTogbnVtYmVyIDtcbiAgaXNvV2Vla1llYXIodmFsOiBudW1iZXIpOiBLaHJvbm9zIDtcbiAgaXNvV2Vla1llYXIodmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0SVNPV2Vla1llYXIodGhpcy5fZGF0ZSwgdGhpcy5pc1VUQygpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRlID0gZ2V0U2V0SVNPV2Vla1llYXIodGhpcy5fZGF0ZSwgdmFsLCB0aGlzLmlzVXRjKCkpO1xuXG4gICAgaWYgKGlzRGF0ZShkYXRlKSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IGRhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpc0xlYXBZZWFyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0xlYXBZZWFyKGdldEZ1bGxZZWFyKHRoaXMudG9EYXRlKCksIHRoaXMuaXNVVEMoKSkpO1xuICB9XG5cbiAgLy8gTW9udGhcblxuICBtb250aCgpOiBudW1iZXI7XG4gIG1vbnRoKG1vbnRoOiBudW1iZXIgfCBzdHJpbmcpOiBLaHJvbm9zO1xuICBtb250aChtb250aD86IG51bWJlciB8IHN0cmluZyk6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghbW9udGggJiYgbW9udGggIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRNb250aCh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgbGV0IF9tb250aCA9IG1vbnRoO1xuXG4gICAgaWYgKGlzU3RyaW5nKG1vbnRoKSkge1xuICAgICAgY29uc3QgbG9jYWxlID0gdGhpcy5fbG9jYWxlIHx8IGdldExvY2FsZSgpO1xuICAgICAgX21vbnRoID0gbG9jYWxlLm1vbnRoc1BhcnNlKG1vbnRoKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIoX21vbnRoKSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXRNb250aCh0aGlzLl9kYXRlLCBfbW9udGgsIHRoaXMuX2lzVVRDKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgaG91cigpOiBudW1iZXI7XG4gIGhvdXIoaG91cnM6IG51bWJlcik6IEtocm9ub3M7XG4gIGhvdXIoaG91cnM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5ob3Vycyhob3Vycyk7XG4gIH1cblxuICBob3VycygpOiBudW1iZXI7XG4gIGhvdXJzKGhvdXJzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBob3Vycyhob3Vycz86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghaG91cnMgJiYgaG91cnMgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRIb3Vycyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXRIb3Vycyh0aGlzLl9kYXRlLCBob3VycywgdGhpcy5faXNVVEMpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIG1pbnV0ZSgpOiBudW1iZXI7XG4gIG1pbnV0ZShtaW51dGVzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBtaW51dGUobWludXRlcz86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1pbnV0ZXMobWludXRlcyk7XG4gIH1cblxuICBtaW51dGVzKCk6IG51bWJlcjtcbiAgbWludXRlcyhtaW51dGVzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBtaW51dGVzKG1pbnV0ZXM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIW1pbnV0ZXMgJiYgbWludXRlcyAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldE1pbnV0ZXModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0TWludXRlcyh0aGlzLl9kYXRlLCBtaW51dGVzLCB0aGlzLl9pc1VUQykpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgc2Vjb25kKCk6IG51bWJlcjtcbiAgc2Vjb25kKHNlY29uZHM6IG51bWJlcik6IEtocm9ub3M7XG4gIHNlY29uZChzZWNvbmRzPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2Vjb25kcyhzZWNvbmRzKTtcbiAgfVxuXG4gIHNlY29uZHMoKTogbnVtYmVyO1xuICBzZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IEtocm9ub3M7XG4gIHNlY29uZHMoc2Vjb25kcz86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghc2Vjb25kcyAmJiBzZWNvbmRzICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0U2Vjb25kcyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXRTZWNvbmRzKHRoaXMuX2RhdGUsIHNlY29uZHMsIHRoaXMuX2lzVVRDKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBtaWxsaXNlY29uZCgpOiBudW1iZXI7XG4gIG1pbGxpc2Vjb25kKG1zOiBudW1iZXIpOiBLaHJvbm9zO1xuICBtaWxsaXNlY29uZChtcz86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kcyhtcyk7XG4gIH1cblxuICBtaWxsaXNlY29uZHMoKTogbnVtYmVyO1xuICBtaWxsaXNlY29uZHMoc2Vjb25kczogbnVtYmVyKTogS2hyb25vcztcbiAgbWlsbGlzZWNvbmRzKHNlY29uZHM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXNlY29uZHMgJiYgc2Vjb25kcyAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldE1pbGxpc2Vjb25kcyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXRNaWxsaXNlY29uZHModGhpcy5fZGF0ZSwgc2Vjb25kcywgdGhpcy5faXNVVEMpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gRGF5XG5cbiAgZGF0ZSgpOiBudW1iZXI7XG4gIGRhdGUoZGF0ZTogbnVtYmVyKTogS2hyb25vcztcbiAgZGF0ZShkYXRlPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCFkYXRlICYmIGRhdGUgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXREYXRlKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gY2xvbmVEYXRlKHNldERhdGUodGhpcy5fZGF0ZSwgZGF0ZSwgdGhpcy5faXNVVEMpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZGF5KCk6IG51bWJlciA7XG4gIGRheShpbnB1dDogbnVtYmVyIHwgc3RyaW5nKTogS2hyb25vcyA7XG4gIGRheShpbnB1dD86IG51bWJlciB8IHN0cmluZyk6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghaW5wdXQgJiYgaW5wdXQgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXREYXlPZldlZWsodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIGxldCBfaW5wdXQgPSBpbnB1dDtcblxuICAgIGlmIChpc1N0cmluZyhpbnB1dCkpIHtcbiAgICAgIF9pbnB1dCA9IHBhcnNlV2Vla2RheShpbnB1dCwgdGhpcy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNOdW1iZXIoX2lucHV0KSkge1xuICAgICAgdGhpcy5fZGF0ZSA9IHNldERheU9mV2Vlayh0aGlzLl9kYXRlLCBfaW5wdXQsIHRoaXMuX2xvY2FsZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgd2Vla2RheSgpOiBudW1iZXIgO1xuICB3ZWVrZGF5KHZhbDogbnVtYmVyKTogS2hyb25vcyA7XG4gIHdlZWtkYXkodmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0TG9jYWxlRGF5T2ZXZWVrKHRoaXMuX2RhdGUsIHRoaXMuX2xvY2FsZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBzZXRMb2NhbGVEYXlPZldlZWsodGhpcy5fZGF0ZSwgdmFsLCB7IGxvY2FsZTogdGhpcy5fbG9jYWxlLCBpc1VUQzogdGhpcy5faXNVVEMgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlzb1dlZWtkYXkoKTogbnVtYmVyIDtcbiAgaXNvV2Vla2RheSh2YWw6IG51bWJlciB8IHN0cmluZyk6IEtocm9ub3MgO1xuICBpc29XZWVrZGF5KHZhbD86IG51bWJlciB8IHN0cmluZyk6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldElTT0RheU9mV2Vlayh0aGlzLl9kYXRlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gc2V0SVNPRGF5T2ZXZWVrKHRoaXMuX2RhdGUsIHZhbCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRheU9mWWVhcigpOiBudW1iZXI7XG4gIGRheU9mWWVhcih2YWw6IG51bWJlcik6IEtocm9ub3M7XG4gIGRheU9mWWVhcih2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXREYXlPZlllYXIodGhpcy5fZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IHNldERheU9mWWVhcih0aGlzLl9kYXRlLCB2YWwpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBXZWVrXG5cbiAgd2VlaygpOiBudW1iZXI7XG4gIHdlZWsoaW5wdXQ6IG51bWJlcik6IEtocm9ub3M7XG4gIHdlZWsoaW5wdXQ/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIWlucHV0ICYmIGlucHV0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0V2Vlayh0aGlzLl9kYXRlLCB0aGlzLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBzZXRXZWVrKHRoaXMuX2RhdGUsIGlucHV0LCB0aGlzLl9sb2NhbGUpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgd2Vla3MoKTogbnVtYmVyO1xuICB3ZWVrcyhpbnB1dDogbnVtYmVyKTogS2hyb25vcztcbiAgd2Vla3MoaW5wdXQ/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53ZWVrKGlucHV0KTtcbiAgfVxuXG4gIGlzb1dlZWsoKTogbnVtYmVyIDtcbiAgaXNvV2Vlayh2YWw6IG51bWJlcik6IEtocm9ub3MgO1xuICBpc29XZWVrKHZhbD86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldElTT1dlZWsodGhpcy5fZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IHNldElTT1dlZWsodGhpcy5fZGF0ZSwgdmFsKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGlzb1dlZWtzKCk6IG51bWJlciA7XG4gIGlzb1dlZWtzKHZhbDogbnVtYmVyKTogS2hyb25vcyA7XG4gIGlzb1dlZWtzKHZhbD86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlzb1dlZWsodmFsKTtcbiAgfVxuXG4gIHdlZWtzSW5ZZWFyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldFdlZWtzSW5ZZWFyKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDLCB0aGlzLl9sb2NhbGUpO1xuICB9XG5cbiAgaXNvV2Vla3NJblllYXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0SVNPV2Vla3NJblllYXIodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICB9XG5cblxuICBkYXlzSW5Nb250aCgpOiBudW1iZXIge1xuICAgIHJldHVybiBkYXlzSW5Nb250aChnZXRGdWxsWWVhcih0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksIGdldE1vbnRoKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSk7XG4gIH1cblxuXG4gIHF1YXJ0ZXIoKTogbnVtYmVyO1xuICBxdWFydGVyKHZhbDogbnVtYmVyKTogS2hyb25vcztcbiAgcXVhcnRlcih2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRRdWFydGVyKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gc2V0UXVhcnRlcih0aGlzLl9kYXRlLCB2YWwsIHRoaXMuX2lzVVRDKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIHF1YXJ0ZXJzKCk6IG51bWJlcjtcbiAgcXVhcnRlcnModmFsOiBudW1iZXIpOiBLaHJvbm9zO1xuICBxdWFydGVycyh2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5xdWFydGVyKHZhbCk7XG4gIH1cblxuICBzdGFydE9mKHBlcmlvZD86IE1vbWVudFVuaXRPZlRpbWUpOiBLaHJvbm9zIHtcbiAgICBjb25zdCBfcGVyID0gbWFwVW5pdE9mVGltZShwZXJpb2QpO1xuICAgIHRoaXMuX2RhdGUgPSBzdGFydE9mKHRoaXMuX2RhdGUsIF9wZXIsIHRoaXMuX2lzVVRDKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbn1cbiJdfQ==