3cx_tapi/3CX_TAPI.user.js
2021-08-27 18:14:41 +02:00

9030 lines
936 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==UserScript==
// @name 3CX TAPI
// @namespace http://cp-solutions.at
// @version 7.0.3
// @author Daniel Triendl <d.triendl@cp-solutions.at>
// @copyright Copyright 2021 CP Solutions GmbH
// @source http://scootaloo.cp-austria.at/gitlist/3cx_tapi.git
// @downloadURL http://scootaloo.cp-austria.at/gitlist/3cx_tapi.git/raw/master/3CX_TAPI.user.js
// @match https://192.168.0.154:5001/webclient*
// @match https://cpsolution.my3cx.at:5001/webclient*
// @require https://cdn.jsdelivr.net/gh/CoeJoder/waitForKeyElements.js@v1.2/waitForKeyElements.js
// @require https://cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js
// @require https://cdn.jsdelivr.net/npm/axios-userscript-adapter@0.1.4/dist/axiosGmxhrAdapter.min.js
// @require file://C:\dev\git\3cx_tapi\dist\index.prod.user.js
// @grant GM.xmlHttpRequest
// @grant GM.notification
// @grant GM.getValue
// @grant GM.setValue
// @connect cpatapi.cpsrvweb2016.cp-austria.at
// @run-at document-end
// ==/UserScript==
/******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/chrono-node/dist/calculation/mergingCalculation.js":
/*!*************************************************************************!*\
!*** ./node_modules/chrono-node/dist/calculation/mergingCalculation.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.mergeDateTimeComponent = exports.mergeDateTimeResult = void 0;
const index_1 = __webpack_require__(/*! ../index */ "./node_modules/chrono-node/dist/index.js");
function mergeDateTimeResult(dateResult, timeResult) {
const result = dateResult.clone();
const beginDate = dateResult.start;
const beginTime = timeResult.start;
result.start = mergeDateTimeComponent(beginDate, beginTime);
if (dateResult.end != null || timeResult.end != null) {
const endDate = dateResult.end == null ? dateResult.start : dateResult.end;
const endTime = timeResult.end == null ? timeResult.start : timeResult.end;
const endDateTime = mergeDateTimeComponent(endDate, endTime);
if (dateResult.end == null && endDateTime.date().getTime() < result.start.date().getTime()) {
if (endDateTime.isCertain("day")) {
endDateTime.assign("day", endDateTime.get("day") + 1);
} else {
endDateTime.imply("day", endDateTime.get("day") + 1);
}
}
result.end = endDateTime;
}
return result;
}
exports.mergeDateTimeResult = mergeDateTimeResult;
function mergeDateTimeComponent(dateComponent, timeComponent) {
const dateTimeComponent = dateComponent.clone();
if (timeComponent.isCertain("hour")) {
dateTimeComponent.assign("hour", timeComponent.get("hour"));
dateTimeComponent.assign("minute", timeComponent.get("minute"));
if (timeComponent.isCertain("second")) {
dateTimeComponent.assign("second", timeComponent.get("second"));
if (timeComponent.isCertain("millisecond")) {
dateTimeComponent.assign("millisecond", timeComponent.get("millisecond"));
} else {
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
}
} else {
dateTimeComponent.imply("second", timeComponent.get("second"));
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
}
} else {
dateTimeComponent.imply("hour", timeComponent.get("hour"));
dateTimeComponent.imply("minute", timeComponent.get("minute"));
dateTimeComponent.imply("second", timeComponent.get("second"));
dateTimeComponent.imply("millisecond", timeComponent.get("millisecond"));
}
if (timeComponent.isCertain("timezoneOffset")) {
dateTimeComponent.assign("timezoneOffset", timeComponent.get("timezoneOffset"));
}
if (timeComponent.isCertain("meridiem")) {
dateTimeComponent.assign("meridiem", timeComponent.get("meridiem"));
} else if (timeComponent.get("meridiem") != null && dateTimeComponent.get("meridiem") == null) {
dateTimeComponent.imply("meridiem", timeComponent.get("meridiem"));
}
if (dateTimeComponent.get("meridiem") == index_1.Meridiem.PM && dateTimeComponent.get("hour") < 12) {
if (timeComponent.isCertain("hour")) {
dateTimeComponent.assign("hour", dateTimeComponent.get("hour") + 12);
} else {
dateTimeComponent.imply("hour", dateTimeComponent.get("hour") + 12);
}
}
return dateTimeComponent;
}
exports.mergeDateTimeComponent = mergeDateTimeComponent;
/***/ }),
/***/ "./node_modules/chrono-node/dist/calculation/weeks.js":
/*!************************************************************!*\
!*** ./node_modules/chrono-node/dist/calculation/weeks.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.toDayJSClosestWeekday = exports.toDayJSWeekday = void 0;
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
function toDayJSWeekday(refDate, offset, modifier) {
if (!modifier) {
return toDayJSClosestWeekday(refDate, offset);
}
let date = dayjs_1.default(refDate);
switch (modifier) {
case "this":
date = date.day(offset);
break;
case "next":
date = date.day(offset + 7);
break;
case "last":
date = date.day(offset - 7);
break;
}
return date;
}
exports.toDayJSWeekday = toDayJSWeekday;
function toDayJSClosestWeekday(refDate, offset) {
let date = dayjs_1.default(refDate);
const refOffset = date.day();
if (Math.abs(offset - 7 - refOffset) < Math.abs(offset - refOffset)) {
date = date.day(offset - 7);
} else if (Math.abs(offset + 7 - refOffset) < Math.abs(offset - refOffset)) {
date = date.day(offset + 7);
} else {
date = date.day(offset);
}
return date;
}
exports.toDayJSClosestWeekday = toDayJSClosestWeekday;
/***/ }),
/***/ "./node_modules/chrono-node/dist/calculation/years.js":
/*!************************************************************!*\
!*** ./node_modules/chrono-node/dist/calculation/years.js ***!
\************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.findYearClosestToRef = exports.findMostLikelyADYear = void 0;
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
function findMostLikelyADYear(yearNumber) {
if (yearNumber < 100) {
if (yearNumber > 50) {
yearNumber = yearNumber + 1900;
} else {
yearNumber = yearNumber + 2000;
}
}
return yearNumber;
}
exports.findMostLikelyADYear = findMostLikelyADYear;
function findYearClosestToRef(refDate, day, month) {
const refMoment = dayjs_1.default(refDate);
let dateMoment = refMoment;
dateMoment = dateMoment.month(month - 1);
dateMoment = dateMoment.date(day);
dateMoment = dateMoment.year(refMoment.year());
const nextYear = dateMoment.add(1, "y");
const lastYear = dateMoment.add(-1, "y");
if (Math.abs(nextYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) {
dateMoment = nextYear;
} else if (Math.abs(lastYear.diff(refMoment)) < Math.abs(dateMoment.diff(refMoment))) {
dateMoment = lastYear;
}
return dateMoment.year();
}
exports.findYearClosestToRef = findYearClosestToRef;
/***/ }),
/***/ "./node_modules/chrono-node/dist/chrono.js":
/*!*************************************************!*\
!*** ./node_modules/chrono-node/dist/chrono.js ***!
\*************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.ParsingContext = exports.Chrono = void 0;
const results_1 = __webpack_require__(/*! ./results */ "./node_modules/chrono-node/dist/results.js");
const en_1 = __webpack_require__(/*! ./locales/en */ "./node_modules/chrono-node/dist/locales/en/index.js");
class Chrono {
constructor(configuration) {
configuration = configuration || en_1.createCasualConfiguration();
this.parsers = [...configuration.parsers];
this.refiners = [...configuration.refiners];
}
clone() {
return new Chrono({
parsers: [...this.parsers],
refiners: [...this.refiners]
});
}
parseDate(text, referenceDate, option) {
const results = this.parse(text, referenceDate, option);
return results.length > 0 ? results[0].start.date() : null;
}
parse(text, referenceDate, option) {
const context = new ParsingContext(text, referenceDate, option);
let results = [];
this.parsers.forEach(parser => {
const parsedResults = Chrono.executeParser(context, parser);
results = results.concat(parsedResults);
});
results.sort((a, b) => {
return a.index - b.index;
});
this.refiners.forEach(function (refiner) {
results = refiner.refine(context, results);
});
return results;
}
static executeParser(context, parser) {
const results = [];
const pattern = parser.pattern(context);
const originalText = context.text;
let remainingText = context.text;
let match = pattern.exec(remainingText);
while (match) {
const index = match.index + originalText.length - remainingText.length;
match.index = index;
const result = parser.extract(context, match);
if (!result) {
remainingText = originalText.substring(match.index + 1);
match = pattern.exec(remainingText);
continue;
}
let parsedResult = null;
if (result instanceof results_1.ParsingResult) {
parsedResult = result;
} else if (result instanceof results_1.ParsingComponents) {
parsedResult = context.createParsingResult(match.index, match[0]);
parsedResult.start = result;
} else {
parsedResult = context.createParsingResult(match.index, match[0], result);
}
context.debug(() => console.log(`${parser.constructor.name} extracted result ${parsedResult}`));
results.push(parsedResult);
remainingText = originalText.substring(index + parsedResult.text.length);
match = pattern.exec(remainingText);
}
return results;
}
}
exports.Chrono = Chrono;
class ParsingContext {
constructor(text, refDate, option) {
this.text = text;
this.reference = new results_1.ReferenceWithTimezone(refDate);
this.option = option !== null && option !== void 0 ? option : {};
this.refDate = this.reference.instant;
}
createParsingComponents(components) {
if (components instanceof results_1.ParsingComponents) {
return components;
}
return new results_1.ParsingComponents(this.reference, components);
}
createParsingResult(index, textOrEndIndex, startComponents, endComponents) {
const text = typeof textOrEndIndex === "string" ? textOrEndIndex : this.text.substring(index, textOrEndIndex);
const start = startComponents ? this.createParsingComponents(startComponents) : null;
const end = endComponents ? this.createParsingComponents(endComponents) : null;
return new results_1.ParsingResult(this.reference, index, text, start, end);
}
debug(block) {
if (this.option.debug) {
if (this.option.debug instanceof Function) {
this.option.debug(block);
} else {
const handler = this.option.debug;
handler.debug(block);
}
}
}
}
exports.ParsingContext = ParsingContext;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/abstractRefiners.js":
/*!******************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/abstractRefiners.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.MergingRefiner = exports.Filter = void 0;
class Filter {
refine(context, results) {
return results.filter(r => this.isValid(context, r));
}
}
exports.Filter = Filter;
class MergingRefiner {
refine(context, results) {
if (results.length < 2) {
return results;
}
const mergedResults = [];
let curResult = results[0];
let nextResult = null;
for (let i = 1; i < results.length; i++) {
nextResult = results[i];
const textBetween = context.text.substring(curResult.index + curResult.text.length, nextResult.index);
if (!this.shouldMergeResults(textBetween, curResult, nextResult, context)) {
mergedResults.push(curResult);
curResult = nextResult;
} else {
const left = curResult;
const right = nextResult;
const mergedResult = this.mergeResults(textBetween, left, right, context);
context.debug(() => {
console.log(`${this.constructor.name} merged ${left} and ${right} into ${mergedResult}`);
});
curResult = mergedResult;
}
}
if (curResult != null) {
mergedResults.push(curResult);
}
return mergedResults;
}
}
exports.MergingRefiner = MergingRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/casualReferences.js":
/*!******************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/casualReferences.js ***!
\******************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.tonight = exports.tomorrow = exports.yesterday = exports.today = exports.now = void 0;
const results_1 = __webpack_require__(/*! ../results */ "./node_modules/chrono-node/dist/results.js");
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const dayjs_2 = __webpack_require__(/*! ../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const index_1 = __webpack_require__(/*! ../index */ "./node_modules/chrono-node/dist/index.js");
function now(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.assignSimilarTime(component, targetDate);
component.assign("timezoneOffset", targetDate.utcOffset());
return component;
}
exports.now = now;
function today(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.implySimilarTime(component, targetDate);
return component;
}
exports.today = today;
function yesterday(reference) {
let targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
targetDate = targetDate.add(-1, "day");
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.implySimilarTime(component, targetDate);
return component;
}
exports.yesterday = yesterday;
function tomorrow(reference) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
dayjs_2.assignTheNextDay(component, targetDate);
return component;
}
exports.tomorrow = tomorrow;
function tonight(reference, implyHour = 22) {
const targetDate = dayjs_1.default(reference.instant);
const component = new results_1.ParsingComponents(reference, {});
component.imply("hour", implyHour);
component.imply("meridiem", index_1.Meridiem.PM);
dayjs_2.assignSimilarDate(component, targetDate);
return component;
}
exports.tonight = tonight;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js":
/*!****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.AbstractParserWithWordBoundaryChecking = void 0;
class AbstractParserWithWordBoundaryChecking {
constructor() {
this.cachedInnerPattern = null;
this.cachedPattern = null;
}
pattern(context) {
const innerPattern = this.innerPattern(context);
if (innerPattern == this.cachedInnerPattern) {
return this.cachedPattern;
}
this.cachedPattern = new RegExp(`(\\W|^)${innerPattern.source}`, innerPattern.flags);
this.cachedInnerPattern = innerPattern;
return this.cachedPattern;
}
extract(context, match) {
const header = match[1];
match.index = match.index + header.length;
match[0] = match[0].substring(header.length);
for (let i = 2; i < match.length; i++) {
match[i - 1] = match[i];
}
return this.innerExtract(context, match);
}
}
exports.AbstractParserWithWordBoundaryChecking = AbstractParserWithWordBoundaryChecking;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.AbstractTimeExpressionParser = void 0;
const index_1 = __webpack_require__(/*! ../../index */ "./node_modules/chrono-node/dist/index.js");
function primaryTimePattern(primaryPrefix, primarySuffix) {
return new RegExp("(^|\\s|T|\\b)" + `${primaryPrefix}` + "(\\d{1,4})" + "(?:" + "(?:\\.|\\:|\\)" + "(\\d{1,2})" + "(?:" + "(?:\\:|\\)" + "(\\d{2})" + "(?:\\.(\\d{1,6}))?" + ")?" + ")?" + "(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" + `${primarySuffix}`, "i");
}
function followingTimePatten(followingPhase, followingSuffix) {
return new RegExp(`^(${followingPhase})` + "(\\d{1,4})" + "(?:" + "(?:\\.|\\:|\\)" + "(\\d{1,2})" + "(?:" + "(?:\\.|\\:|\\)" + "(\\d{1,2})(?:\\.(\\d{1,6}))?" + ")?" + ")?" + "(?:\\s*(a\\.m\\.|p\\.m\\.|am?|pm?))?" + `${followingSuffix}`, "i");
}
const HOUR_GROUP = 2;
const MINUTE_GROUP = 3;
const SECOND_GROUP = 4;
const MILLI_SECOND_GROUP = 5;
const AM_PM_HOUR_GROUP = 6;
class AbstractTimeExpressionParser {
constructor(strictMode = false) {
this.cachedPrimaryPrefix = null;
this.cachedPrimarySuffix = null;
this.cachedPrimaryTimePattern = null;
this.cachedFollowingPhase = null;
this.cachedFollowingSuffix = null;
this.cachedFollowingTimePatten = null;
this.strictMode = strictMode;
}
primarySuffix() {
return "(?=\\W|$)";
}
followingSuffix() {
return "(?=\\W|$)";
}
pattern(context) {
return this.getPrimaryTimePatternThroughCache();
}
extract(context, match) {
const startComponents = this.extractPrimaryTimeComponents(context, match);
if (!startComponents) {
match.index += match[0].length;
return null;
}
const index = match.index + match[1].length;
const text = match[0].substring(match[1].length);
const result = context.createParsingResult(index, text, startComponents);
match.index += match[0].length;
const remainingText = context.text.substring(match.index);
const followingPattern = this.getFollowingTimePatternThroughCache();
const followingMatch = followingPattern.exec(remainingText);
if (!followingMatch || followingMatch[0].match(/^\s*([+-])\s*\d{3,4}$/)) {
return this.checkAndReturnWithoutFollowingPattern(result);
}
result.end = this.extractFollowingTimeComponents(context, followingMatch, result);
if (result.end) {
result.text += followingMatch[0];
}
return this.checkAndReturnWithFollowingPattern(result);
}
extractPrimaryTimeComponents(context, match, strict = false) {
const components = context.createParsingComponents();
let minute = 0;
let meridiem = null;
let hour = parseInt(match[HOUR_GROUP]);
if (hour > 100) {
if (this.strictMode || match[MINUTE_GROUP] != null) {
return null;
}
minute = hour % 100;
hour = Math.floor(hour / 100);
}
if (hour > 24) {
return null;
}
if (match[MINUTE_GROUP] != null) {
if (match[MINUTE_GROUP].length == 1 && !match[AM_PM_HOUR_GROUP]) {
return null;
}
minute = parseInt(match[MINUTE_GROUP]);
}
if (minute >= 60) {
return null;
}
if (hour > 12) {
meridiem = index_1.Meridiem.PM;
}
if (match[AM_PM_HOUR_GROUP] != null) {
if (hour > 12) return null;
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
if (ampm == "a") {
meridiem = index_1.Meridiem.AM;
if (hour == 12) {
hour = 0;
}
}
if (ampm == "p") {
meridiem = index_1.Meridiem.PM;
if (hour != 12) {
hour += 12;
}
}
}
components.assign("hour", hour);
components.assign("minute", minute);
if (meridiem !== null) {
components.assign("meridiem", meridiem);
} else {
if (hour < 12) {
components.imply("meridiem", index_1.Meridiem.AM);
} else {
components.imply("meridiem", index_1.Meridiem.PM);
}
}
if (match[MILLI_SECOND_GROUP] != null) {
const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
if (millisecond >= 1000) return null;
components.assign("millisecond", millisecond);
}
if (match[SECOND_GROUP] != null) {
const second = parseInt(match[SECOND_GROUP]);
if (second >= 60) return null;
components.assign("second", second);
}
return components;
}
extractFollowingTimeComponents(context, match, result) {
const components = context.createParsingComponents();
if (match[MILLI_SECOND_GROUP] != null) {
const millisecond = parseInt(match[MILLI_SECOND_GROUP].substring(0, 3));
if (millisecond >= 1000) return null;
components.assign("millisecond", millisecond);
}
if (match[SECOND_GROUP] != null) {
const second = parseInt(match[SECOND_GROUP]);
if (second >= 60) return null;
components.assign("second", second);
}
let hour = parseInt(match[HOUR_GROUP]);
let minute = 0;
let meridiem = -1;
if (match[MINUTE_GROUP] != null) {
minute = parseInt(match[MINUTE_GROUP]);
} else if (hour > 100) {
minute = hour % 100;
hour = Math.floor(hour / 100);
}
if (minute >= 60 || hour > 24) {
return null;
}
if (hour >= 12) {
meridiem = index_1.Meridiem.PM;
}
if (match[AM_PM_HOUR_GROUP] != null) {
if (hour > 12) {
return null;
}
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
if (ampm == "a") {
meridiem = index_1.Meridiem.AM;
if (hour == 12) {
hour = 0;
if (!components.isCertain("day")) {
components.imply("day", components.get("day") + 1);
}
}
}
if (ampm == "p") {
meridiem = index_1.Meridiem.PM;
if (hour != 12) hour += 12;
}
if (!result.start.isCertain("meridiem")) {
if (meridiem == index_1.Meridiem.AM) {
result.start.imply("meridiem", index_1.Meridiem.AM);
if (result.start.get("hour") == 12) {
result.start.assign("hour", 0);
}
} else {
result.start.imply("meridiem", index_1.Meridiem.PM);
if (result.start.get("hour") != 12) {
result.start.assign("hour", result.start.get("hour") + 12);
}
}
}
}
components.assign("hour", hour);
components.assign("minute", minute);
if (meridiem >= 0) {
components.assign("meridiem", meridiem);
} else {
const startAtPM = result.start.isCertain("meridiem") && result.start.get("hour") > 12;
if (startAtPM) {
if (result.start.get("hour") - 12 > hour) {
components.imply("meridiem", index_1.Meridiem.AM);
} else if (hour <= 12) {
components.assign("hour", hour + 12);
components.assign("meridiem", index_1.Meridiem.PM);
}
} else if (hour > 12) {
components.imply("meridiem", index_1.Meridiem.PM);
} else if (hour <= 12) {
components.imply("meridiem", index_1.Meridiem.AM);
}
}
if (components.date().getTime() < result.start.date().getTime()) {
components.imply("day", components.get("day") + 1);
}
return components;
}
checkAndReturnWithoutFollowingPattern(result) {
if (result.text.match(/^\d$/)) {
return null;
}
if (result.text.match(/\d[apAP]$/)) {
return null;
}
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)$/);
if (endingWithNumbers) {
const endingNumbers = endingWithNumbers[1];
if (this.strictMode) {
return null;
}
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) {
return null;
}
const endingNumberVal = parseInt(endingNumbers);
if (endingNumberVal > 24) {
return null;
}
}
return result;
}
checkAndReturnWithFollowingPattern(result) {
if (result.text.match(/^\d+-\d+$/)) {
return null;
}
const endingWithNumbers = result.text.match(/[^\d:.](\d[\d.]+)\s*-\s*(\d[\d.]+)$/);
if (endingWithNumbers) {
if (this.strictMode) {
return null;
}
const startingNumbers = endingWithNumbers[1];
const endingNumbers = endingWithNumbers[2];
if (endingNumbers.includes(".") && !endingNumbers.match(/\d(\.\d{2})+$/)) {
return null;
}
const endingNumberVal = parseInt(endingNumbers);
const startingNumberVal = parseInt(startingNumbers);
if (endingNumberVal > 24 || startingNumberVal > 24) {
return null;
}
}
return result;
}
getPrimaryTimePatternThroughCache() {
const primaryPrefix = this.primaryPrefix();
const primarySuffix = this.primarySuffix();
if (this.cachedPrimaryPrefix === primaryPrefix && this.cachedPrimarySuffix === primarySuffix) {
return this.cachedPrimaryTimePattern;
}
this.cachedPrimaryTimePattern = primaryTimePattern(primaryPrefix, primarySuffix);
this.cachedPrimaryPrefix = primaryPrefix;
this.cachedPrimarySuffix = primarySuffix;
return this.cachedPrimaryTimePattern;
}
getFollowingTimePatternThroughCache() {
const followingPhase = this.followingPhase();
const followingSuffix = this.followingSuffix();
if (this.cachedFollowingPhase === followingPhase && this.cachedFollowingSuffix === followingSuffix) {
return this.cachedFollowingTimePatten;
}
this.cachedFollowingTimePatten = followingTimePatten(followingPhase, followingSuffix);
this.cachedFollowingPhase = followingPhase;
this.cachedFollowingSuffix = followingSuffix;
return this.cachedFollowingTimePatten;
}
}
exports.AbstractTimeExpressionParser = AbstractTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js":
/*!*************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js ***!
\*************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ./AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("([0-9]{4})\\-([0-9]{1,2})\\-([0-9]{1,2})" + "(?:T" + "([0-9]{1,2}):([0-9]{1,2})" + "(?:" + ":([0-9]{1,2})(?:\\.(\\d{1,4}))?" + ")?" + "(?:" + "Z|([+-]\\d{2}):?(\\d{2})?" + ")?" + ")?" + "(?=\\W|$)", "i");
const YEAR_NUMBER_GROUP = 1;
const MONTH_NUMBER_GROUP = 2;
const DATE_NUMBER_GROUP = 3;
const HOUR_NUMBER_GROUP = 4;
const MINUTE_NUMBER_GROUP = 5;
const SECOND_NUMBER_GROUP = 6;
const MILLISECOND_NUMBER_GROUP = 7;
const TZD_HOUR_OFFSET_GROUP = 8;
const TZD_MINUTE_OFFSET_GROUP = 9;
class ISOFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const components = {};
components["year"] = parseInt(match[YEAR_NUMBER_GROUP]);
components["month"] = parseInt(match[MONTH_NUMBER_GROUP]);
components["day"] = parseInt(match[DATE_NUMBER_GROUP]);
if (match[HOUR_NUMBER_GROUP] != null) {
components["hour"] = parseInt(match[HOUR_NUMBER_GROUP]);
components["minute"] = parseInt(match[MINUTE_NUMBER_GROUP]);
if (match[SECOND_NUMBER_GROUP] != null) {
components["second"] = parseInt(match[SECOND_NUMBER_GROUP]);
}
if (match[MILLISECOND_NUMBER_GROUP] != null) {
components["millisecond"] = parseInt(match[MILLISECOND_NUMBER_GROUP]);
}
if (match[TZD_HOUR_OFFSET_GROUP] == null) {
components["timezoneOffset"] = 0;
} else {
const hourOffset = parseInt(match[TZD_HOUR_OFFSET_GROUP]);
let minuteOffset = 0;
if (match[TZD_MINUTE_OFFSET_GROUP] != null) {
minuteOffset = parseInt(match[TZD_MINUTE_OFFSET_GROUP]);
}
let offset = hourOffset * 60;
if (offset < 0) {
offset -= minuteOffset;
} else {
offset += minuteOffset;
}
components["timezoneOffset"] = offset;
}
}
return components;
}
}
exports.default = ISOFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js":
/*!*******************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js ***!
\*******************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const PATTERN = new RegExp("([^\\d]|^)" + "([0-3]{0,1}[0-9]{1})[\\/\\.\\-]([0-3]{0,1}[0-9]{1})" + "(?:[\\/\\.\\-]([0-9]{4}|[0-9]{2}))?" + "(\\W|$)", "i");
const OPENING_GROUP = 1;
const ENDING_GROUP = 5;
const FIRST_NUMBERS_GROUP = 2;
const SECOND_NUMBERS_GROUP = 3;
const YEAR_GROUP = 4;
class SlashDateFormatParser {
constructor(littleEndian) {
this.groupNumberMonth = littleEndian ? SECOND_NUMBERS_GROUP : FIRST_NUMBERS_GROUP;
this.groupNumberDay = littleEndian ? FIRST_NUMBERS_GROUP : SECOND_NUMBERS_GROUP;
}
pattern() {
return PATTERN;
}
extract(context, match) {
if (match[OPENING_GROUP] == "/" || match[ENDING_GROUP] == "/") {
match.index += match[0].length;
return;
}
const index = match.index + match[OPENING_GROUP].length;
const text = match[0].substr(match[OPENING_GROUP].length, match[0].length - match[OPENING_GROUP].length - match[ENDING_GROUP].length);
if (text.match(/^\d\.\d$/) || text.match(/^\d\.\d{1,2}\.\d{1,2}\s*$/)) {
return;
}
if (!match[YEAR_GROUP] && match[0].indexOf("/") < 0) {
return;
}
const result = context.createParsingResult(index, text);
let month = parseInt(match[this.groupNumberMonth]);
let day = parseInt(match[this.groupNumberDay]);
if (month < 1 || month > 12) {
if (month > 12) {
if (day >= 1 && day <= 12 && month <= 31) {
[day, month] = [month, day];
} else {
return null;
}
}
}
if (day < 1 || day > 31) {
return null;
}
result.start.assign("day", day);
result.start.assign("month", month);
if (match[YEAR_GROUP]) {
const rawYearNumber = parseInt(match[YEAR_GROUP]);
const year = years_1.findMostLikelyADYear(rawYearNumber);
result.start.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
result.start.imply("year", year);
}
return result;
}
}
exports.default = SlashDateFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js":
/*!****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const abstractRefiners_1 = __webpack_require__(/*! ../abstractRefiners */ "./node_modules/chrono-node/dist/common/abstractRefiners.js");
class AbstractMergeDateRangeRefiner extends abstractRefiners_1.MergingRefiner {
shouldMergeResults(textBetween, currentResult, nextResult) {
return !currentResult.end && !nextResult.end && textBetween.match(this.patternBetween()) != null;
}
mergeResults(textBetween, fromResult, toResult) {
if (!fromResult.start.isOnlyWeekdayComponent() && !toResult.start.isOnlyWeekdayComponent()) {
toResult.start.getCertainComponents().forEach(key => {
if (!fromResult.start.isCertain(key)) {
fromResult.start.assign(key, toResult.start.get(key));
}
});
fromResult.start.getCertainComponents().forEach(key => {
if (!toResult.start.isCertain(key)) {
toResult.start.assign(key, fromResult.start.get(key));
}
});
}
if (fromResult.start.date().getTime() > toResult.start.date().getTime()) {
let fromMoment = fromResult.start.dayjs();
let toMoment = toResult.start.dayjs();
if (fromResult.start.isOnlyWeekdayComponent() && fromMoment.add(-7, "days").isBefore(toMoment)) {
fromMoment = fromMoment.add(-7, "days");
fromResult.start.imply("day", fromMoment.date());
fromResult.start.imply("month", fromMoment.month() + 1);
fromResult.start.imply("year", fromMoment.year());
} else if (toResult.start.isOnlyWeekdayComponent() && toMoment.add(7, "days").isAfter(fromMoment)) {
toMoment = toMoment.add(7, "days");
toResult.start.imply("day", toMoment.date());
toResult.start.imply("month", toMoment.month() + 1);
toResult.start.imply("year", toMoment.year());
} else {
[toResult, fromResult] = [fromResult, toResult];
}
}
const result = fromResult.clone();
result.start = fromResult.start;
result.end = toResult.start;
result.index = Math.min(fromResult.index, toResult.index);
if (fromResult.index < toResult.index) {
result.text = fromResult.text + textBetween + toResult.text;
} else {
result.text = toResult.text + textBetween + fromResult.text;
}
return result;
}
}
exports.default = AbstractMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js":
/*!***************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js ***!
\***************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const abstractRefiners_1 = __webpack_require__(/*! ../abstractRefiners */ "./node_modules/chrono-node/dist/common/abstractRefiners.js");
const mergingCalculation_1 = __webpack_require__(/*! ../../calculation/mergingCalculation */ "./node_modules/chrono-node/dist/calculation/mergingCalculation.js");
class ENMergeDateTimeRefiner extends abstractRefiners_1.MergingRefiner {
shouldMergeResults(textBetween, currentResult, nextResult) {
return (currentResult.start.isOnlyDate() && nextResult.start.isOnlyTime() || nextResult.start.isOnlyDate() && currentResult.start.isOnlyTime()) && textBetween.match(this.patternBetween()) != null;
}
mergeResults(textBetween, currentResult, nextResult) {
const result = currentResult.start.isOnlyDate() ? mergingCalculation_1.mergeDateTimeResult(currentResult, nextResult) : mergingCalculation_1.mergeDateTimeResult(nextResult, currentResult);
result.index = currentResult.index;
result.text = currentResult.text + textBetween + nextResult.text;
return result;
}
}
exports.default = ENMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const TIMEZONE_NAME_PATTERN = new RegExp("^\\s*,?\\s*\\(?([A-Z]{2,4})\\)?(?=\\W|$)", "i");
const DEFAULT_TIMEZONE_ABBR_MAP = {
ACDT: 630,
ACST: 570,
ADT: -180,
AEDT: 660,
AEST: 600,
AFT: 270,
AKDT: -480,
AKST: -540,
ALMT: 360,
AMST: -180,
AMT: -240,
ANAST: 720,
ANAT: 720,
AQTT: 300,
ART: -180,
AST: -240,
AWDT: 540,
AWST: 480,
AZOST: 0,
AZOT: -60,
AZST: 300,
AZT: 240,
BNT: 480,
BOT: -240,
BRST: -120,
BRT: -180,
BST: 60,
BTT: 360,
CAST: 480,
CAT: 120,
CCT: 390,
CDT: -300,
CEST: 120,
CET: 60,
CHADT: 825,
CHAST: 765,
CKT: -600,
CLST: -180,
CLT: -240,
COT: -300,
CST: -360,
CVT: -60,
CXT: 420,
ChST: 600,
DAVT: 420,
EASST: -300,
EAST: -360,
EAT: 180,
ECT: -300,
EDT: -240,
EEST: 180,
EET: 120,
EGST: 0,
EGT: -60,
EST: -300,
ET: -300,
FJST: 780,
FJT: 720,
FKST: -180,
FKT: -240,
FNT: -120,
GALT: -360,
GAMT: -540,
GET: 240,
GFT: -180,
GILT: 720,
GMT: 0,
GST: 240,
GYT: -240,
HAA: -180,
HAC: -300,
HADT: -540,
HAE: -240,
HAP: -420,
HAR: -360,
HAST: -600,
HAT: -90,
HAY: -480,
HKT: 480,
HLV: -210,
HNA: -240,
HNC: -360,
HNE: -300,
HNP: -480,
HNR: -420,
HNT: -150,
HNY: -540,
HOVT: 420,
ICT: 420,
IDT: 180,
IOT: 360,
IRDT: 270,
IRKST: 540,
IRKT: 540,
IRST: 210,
IST: 330,
JST: 540,
KGT: 360,
KRAST: 480,
KRAT: 480,
KST: 540,
KUYT: 240,
LHDT: 660,
LHST: 630,
LINT: 840,
MAGST: 720,
MAGT: 720,
MART: -510,
MAWT: 300,
MDT: -360,
MESZ: 120,
MEZ: 60,
MHT: 720,
MMT: 390,
MSD: 240,
MSK: 240,
MST: -420,
MUT: 240,
MVT: 300,
MYT: 480,
NCT: 660,
NDT: -90,
NFT: 690,
NOVST: 420,
NOVT: 360,
NPT: 345,
NST: -150,
NUT: -660,
NZDT: 780,
NZST: 720,
OMSST: 420,
OMST: 420,
PDT: -420,
PET: -300,
PETST: 720,
PETT: 720,
PGT: 600,
PHOT: 780,
PHT: 480,
PKT: 300,
PMDT: -120,
PMST: -180,
PONT: 660,
PST: -480,
PT: -480,
PWT: 540,
PYST: -180,
PYT: -240,
RET: 240,
SAMT: 240,
SAST: 120,
SBT: 660,
SCT: 240,
SGT: 480,
SRT: -180,
SST: -660,
TAHT: -600,
TFT: 300,
TJT: 300,
TKT: 780,
TLT: 540,
TMT: 300,
TVT: 720,
ULAT: 480,
UTC: 0,
UYST: -120,
UYT: -180,
UZT: 300,
VET: -210,
VLAST: 660,
VLAT: 660,
VUT: 660,
WAST: 120,
WAT: 60,
WEST: 60,
WESZ: 60,
WET: 0,
WEZ: 0,
WFT: 720,
WGST: -120,
WGT: -180,
WIB: 420,
WIT: 540,
WITA: 480,
WST: 780,
WT: 0,
YAKST: 600,
YAKT: 600,
YAPT: 600,
YEKST: 360,
YEKT: 360
};
class ExtractTimezoneAbbrRefiner {
constructor(timezoneOverrides) {
this.timezone = Object.assign(Object.assign({}, DEFAULT_TIMEZONE_ABBR_MAP), timezoneOverrides);
}
refine(context, results) {
var _a;
const timezoneOverrides = (_a = context.option.timezones) !== null && _a !== void 0 ? _a : {};
results.forEach(result => {
var _a, _b;
const suffix = context.text.substring(result.index + result.text.length);
const match = TIMEZONE_NAME_PATTERN.exec(suffix);
if (!match) {
return;
}
const timezoneAbbr = match[1].toUpperCase();
const extractedTimezoneOffset = (_b = (_a = timezoneOverrides[timezoneAbbr]) !== null && _a !== void 0 ? _a : this.timezone[timezoneAbbr]) !== null && _b !== void 0 ? _b : null;
if (extractedTimezoneOffset === null) {
return;
}
context.debug(() => {
console.log(`Extracting timezone: '${timezoneAbbr}' into : ${extractedTimezoneOffset}`);
});
const currentTimezoneOffset = result.start.get("timezoneOffset");
if (currentTimezoneOffset !== null && extractedTimezoneOffset != currentTimezoneOffset) {
if (result.start.isCertain("timezoneOffset")) {
return;
}
if (timezoneAbbr != match[1]) {
return;
}
}
result.text += match[0];
if (!result.start.isCertain("timezoneOffset")) {
result.start.assign("timezoneOffset", extractedTimezoneOffset);
}
if (result.end != null && !result.end.isCertain("timezoneOffset")) {
result.end.assign("timezoneOffset", extractedTimezoneOffset);
}
});
return results;
}
}
exports.default = ExtractTimezoneAbbrRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js":
/*!***************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js ***!
\***************************************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const TIMEZONE_OFFSET_PATTERN = new RegExp("^\\s*(?:(?:GMT|UTC)\\s?)?([+-])(\\d{1,2})(?::?(\\d{2}))?", "i");
const TIMEZONE_OFFSET_SIGN_GROUP = 1;
const TIMEZONE_OFFSET_HOUR_OFFSET_GROUP = 2;
const TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP = 3;
class ExtractTimezoneOffsetRefiner {
refine(context, results) {
results.forEach(function (result) {
if (result.start.isCertain("timezoneOffset")) {
return;
}
const suffix = context.text.substring(result.index + result.text.length);
const match = TIMEZONE_OFFSET_PATTERN.exec(suffix);
if (!match) {
return;
}
context.debug(() => {
console.log(`Extracting timezone: '${match[0]}' into : ${result}`);
});
const hourOffset = parseInt(match[TIMEZONE_OFFSET_HOUR_OFFSET_GROUP]);
const minuteOffset = parseInt(match[TIMEZONE_OFFSET_MINUTE_OFFSET_GROUP] || "0");
let timezoneOffset = hourOffset * 60 + minuteOffset;
if (match[TIMEZONE_OFFSET_SIGN_GROUP] === "-") {
timezoneOffset = -timezoneOffset;
}
if (result.end != null) {
result.end.assign("timezoneOffset", timezoneOffset);
}
result.start.assign("timezoneOffset", timezoneOffset);
result.text += match[0];
});
return results;
}
}
exports.default = ExtractTimezoneOffsetRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
class ForwardDateRefiner {
refine(context, results) {
if (!context.option.forwardDate) {
return results;
}
results.forEach(function (result) {
let refMoment = dayjs_1.default(context.refDate);
if (result.start.isOnlyDayMonthComponent() && refMoment.isAfter(result.start.dayjs())) {
for (let i = 0; i < 3 && refMoment.isAfter(result.start.dayjs()); i++) {
result.start.imply("year", result.start.get("year") + 1);
context.debug(() => {
console.log(`Forward yearly adjusted for ${result} (${result.start})`);
});
if (result.end && !result.end.isCertain("year")) {
result.end.imply("year", result.end.get("year") + 1);
context.debug(() => {
console.log(`Forward yearly adjusted for ${result} (${result.end})`);
});
}
}
}
if (result.start.isOnlyWeekdayComponent() && refMoment.isAfter(result.start.dayjs())) {
if (refMoment.day() > result.start.get("weekday")) {
refMoment = refMoment.day(result.start.get("weekday") + 7);
} else {
refMoment = refMoment.day(result.start.get("weekday"));
}
result.start.imply("day", refMoment.date());
result.start.imply("month", refMoment.month() + 1);
result.start.imply("year", refMoment.year());
context.debug(() => {
console.log(`Forward weekly adjusted for ${result} (${result.start})`);
});
if (result.end && result.end.isOnlyWeekdayComponent()) {
if (refMoment.day() > result.end.get("weekday")) {
refMoment = refMoment.day(result.end.get("weekday") + 7);
} else {
refMoment = refMoment.day(result.end.get("weekday"));
}
result.end.imply("day", refMoment.date());
result.end.imply("month", refMoment.month() + 1);
result.end.imply("year", refMoment.year());
context.debug(() => {
console.log(`Forward weekly adjusted for ${result} (${result.end})`);
});
}
}
});
return results;
}
}
exports.default = ForwardDateRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js":
/*!***************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js ***!
\***************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const abstractRefiners_1 = __webpack_require__(/*! ../abstractRefiners */ "./node_modules/chrono-node/dist/common/abstractRefiners.js");
class MergeWeekdayComponentRefiner extends abstractRefiners_1.MergingRefiner {
mergeResults(textBetween, currentResult, nextResult) {
const newResult = nextResult.clone();
newResult.index = currentResult.index;
newResult.text = currentResult.text + textBetween + newResult.text;
newResult.start.assign("weekday", currentResult.start.get("weekday"));
if (newResult.end) {
newResult.end.assign("weekday", currentResult.start.get("weekday"));
}
return newResult;
}
shouldMergeResults(textBetween, currentResult, nextResult) {
const weekdayThenNormalDate = currentResult.start.isOnlyWeekdayComponent() && !currentResult.start.isCertain("hour") && nextResult.start.isCertain("day");
return weekdayThenNormalDate && textBetween.match(/^,?\s*$/) != null;
}
}
exports.default = MergeWeekdayComponentRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
class OverlapRemovalRefiner {
refine(context, results) {
if (results.length < 2) {
return results;
}
const filteredResults = [];
let prevResult = results[0];
for (let i = 1; i < results.length; i++) {
const result = results[i];
if (result.index < prevResult.index + prevResult.text.length) {
if (result.text.length > prevResult.text.length) {
prevResult = result;
}
} else {
filteredResults.push(prevResult);
prevResult = result;
}
}
if (prevResult != null) {
filteredResults.push(prevResult);
}
return filteredResults;
}
}
exports.default = OverlapRemovalRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js":
/*!*******************************************************************************!*\
!*** ./node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js ***!
\*******************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const abstractRefiners_1 = __webpack_require__(/*! ../abstractRefiners */ "./node_modules/chrono-node/dist/common/abstractRefiners.js");
class UnlikelyFormatFilter extends abstractRefiners_1.Filter {
constructor(strictMode) {
super();
this.strictMode = strictMode;
}
isValid(context, result) {
if (result.text.replace(" ", "").match(/^\d*(\.\d*)?$/)) {
context.debug(() => {
console.log(`Removing unlikely result '${result.text}'`);
});
return false;
}
if (!result.start.isValidDate()) {
context.debug(() => {
console.log(`Removing invalid result: ${result} (${result.start})`);
});
return false;
}
if (result.end && !result.end.isValidDate()) {
context.debug(() => {
console.log(`Removing invalid result: ${result} (${result.end})`);
});
return false;
}
if (this.strictMode) {
return this.isStrictModeValid(context, result);
}
return true;
}
isStrictModeValid(context, result) {
if (result.start.isOnlyWeekdayComponent()) {
context.debug(() => {
console.log(`(Strict) Removing weekday only component: ${result} (${result.end})`);
});
return false;
}
if (result.start.isOnlyTime() && (!result.start.isCertain("hour") || !result.start.isCertain("minute"))) {
context.debug(() => {
console.log(`(Strict) Removing uncertain time component: ${result} (${result.end})`);
});
return false;
}
return true;
}
}
exports.default = UnlikelyFormatFilter;
/***/ }),
/***/ "./node_modules/chrono-node/dist/configurations.js":
/*!*********************************************************!*\
!*** ./node_modules/chrono-node/dist/configurations.js ***!
\*********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.includeCommonConfiguration = void 0;
const ExtractTimezoneAbbrRefiner_1 = __importDefault(__webpack_require__(/*! ./common/refiners/ExtractTimezoneAbbrRefiner */ "./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneAbbrRefiner.js"));
const ExtractTimezoneOffsetRefiner_1 = __importDefault(__webpack_require__(/*! ./common/refiners/ExtractTimezoneOffsetRefiner */ "./node_modules/chrono-node/dist/common/refiners/ExtractTimezoneOffsetRefiner.js"));
const OverlapRemovalRefiner_1 = __importDefault(__webpack_require__(/*! ./common/refiners/OverlapRemovalRefiner */ "./node_modules/chrono-node/dist/common/refiners/OverlapRemovalRefiner.js"));
const ForwardDateRefiner_1 = __importDefault(__webpack_require__(/*! ./common/refiners/ForwardDateRefiner */ "./node_modules/chrono-node/dist/common/refiners/ForwardDateRefiner.js"));
const UnlikelyFormatFilter_1 = __importDefault(__webpack_require__(/*! ./common/refiners/UnlikelyFormatFilter */ "./node_modules/chrono-node/dist/common/refiners/UnlikelyFormatFilter.js"));
const ISOFormatParser_1 = __importDefault(__webpack_require__(/*! ./common/parsers/ISOFormatParser */ "./node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"));
const MergeWeekdayComponentRefiner_1 = __importDefault(__webpack_require__(/*! ./common/refiners/MergeWeekdayComponentRefiner */ "./node_modules/chrono-node/dist/common/refiners/MergeWeekdayComponentRefiner.js"));
function includeCommonConfiguration(configuration, strictMode = false) {
configuration.parsers.unshift(new ISOFormatParser_1.default());
configuration.refiners.unshift(new MergeWeekdayComponentRefiner_1.default());
configuration.refiners.unshift(new ExtractTimezoneAbbrRefiner_1.default());
configuration.refiners.unshift(new ExtractTimezoneOffsetRefiner_1.default());
configuration.refiners.unshift(new OverlapRemovalRefiner_1.default());
configuration.refiners.push(new OverlapRemovalRefiner_1.default());
configuration.refiners.push(new ForwardDateRefiner_1.default());
configuration.refiners.push(new UnlikelyFormatFilter_1.default(strictMode));
return configuration;
}
exports.includeCommonConfiguration = includeCommonConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/index.js":
/*!************************************************!*\
!*** ./node_modules/chrono-node/dist/index.js ***!
\************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseDate = exports.parse = exports.casual = exports.strict = exports.nl = exports.pt = exports.ja = exports.fr = exports.de = exports.Meridiem = exports.Chrono = exports.en = void 0;
const en = __importStar(__webpack_require__(/*! ./locales/en */ "./node_modules/chrono-node/dist/locales/en/index.js"));
exports.en = en;
const chrono_1 = __webpack_require__(/*! ./chrono */ "./node_modules/chrono-node/dist/chrono.js");
Object.defineProperty(exports, "Chrono", ({
enumerable: true,
get: function () {
return chrono_1.Chrono;
}
}));
var Meridiem;
(function (Meridiem) {
Meridiem[Meridiem["AM"] = 0] = "AM";
Meridiem[Meridiem["PM"] = 1] = "PM";
})(Meridiem = exports.Meridiem || (exports.Meridiem = {}));
const de = __importStar(__webpack_require__(/*! ./locales/de */ "./node_modules/chrono-node/dist/locales/de/index.js"));
exports.de = de;
const fr = __importStar(__webpack_require__(/*! ./locales/fr */ "./node_modules/chrono-node/dist/locales/fr/index.js"));
exports.fr = fr;
const ja = __importStar(__webpack_require__(/*! ./locales/ja */ "./node_modules/chrono-node/dist/locales/ja/index.js"));
exports.ja = ja;
const pt = __importStar(__webpack_require__(/*! ./locales/pt */ "./node_modules/chrono-node/dist/locales/pt/index.js"));
exports.pt = pt;
const nl = __importStar(__webpack_require__(/*! ./locales/nl */ "./node_modules/chrono-node/dist/locales/nl/index.js"));
exports.nl = nl;
exports.strict = en.strict;
exports.casual = en.casual;
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
const pattern_1 = __webpack_require__(/*! ../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const years_1 = __webpack_require__(/*! ../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
exports.WEEKDAY_DICTIONARY = {
"sonntag": 0,
"so": 0,
"montag": 1,
"mo": 1,
"dienstag": 2,
"di": 2,
"mittwoch": 3,
"mi": 3,
"donnerstag": 4,
"do": 4,
"freitag": 5,
"fr": 5,
"samstag": 6,
"sa": 6
};
exports.MONTH_DICTIONARY = {
"januar": 1,
"jan": 1,
"jan.": 1,
"februar": 2,
"feb": 2,
"feb.": 2,
"märz": 3,
"maerz": 3,
"mär": 3,
"mär.": 3,
"mrz": 3,
"mrz.": 3,
"april": 4,
"apr": 4,
"apr.": 4,
"mai": 5,
"juni": 6,
"jun": 6,
"jun.": 6,
"juli": 7,
"jul": 7,
"jul.": 7,
"august": 8,
"aug": 8,
"aug.": 8,
"september": 9,
"sep": 9,
"sep.": 9,
"sept": 9,
"sept.": 9,
"oktober": 10,
"okt": 10,
"okt.": 10,
"november": 11,
"nov": 11,
"nov.": 11,
"dezember": 12,
"dez": 12,
"dez.": 12
};
exports.INTEGER_WORD_DICTIONARY = {
"eins": 1,
"zwei": 2,
"drei": 3,
"vier": 4,
"fünf": 5,
"fuenf": 5,
"sechs": 6,
"sieben": 7,
"acht": 8,
"neun": 9,
"zehn": 10,
"elf": 11,
"zwölf": 12,
"zwoelf": 12
};
exports.TIME_UNIT_DICTIONARY = {
sec: "second",
second: "second",
seconds: "second",
min: "minute",
mins: "minute",
minute: "minute",
minutes: "minute",
h: "hour",
hr: "hour",
hrs: "hour",
hour: "hour",
hours: "hour",
day: "d",
days: "d",
week: "week",
weeks: "week",
month: "month",
months: "month",
y: "year",
yr: "year",
year: "year",
years: "year"
};
exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;
function parseNumberPattern(match) {
const num = match.toLowerCase();
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
return exports.INTEGER_WORD_DICTIONARY[num];
} else if (num === "a" || num === "an") {
return 1;
} else if (num.match(/few/)) {
return 3;
} else if (num.match(/half/)) {
return 0.5;
} else if (num.match(/couple/)) {
return 2;
} else if (num.match(/several/)) {
return 7;
}
return parseFloat(num);
}
exports.parseNumberPattern = parseNumberPattern;
exports.YEAR_PATTERN = `(?:[0-9]{1,4}(?:\\s*[vn]\\.?\\s*C(?:hr)?\\.?)?)`;
function parseYear(match) {
if (/v/i.test(match)) {
return -parseInt(match.replace(/[^0-9]+/gi, ""));
}
if (/n/i.test(match)) {
return parseInt(match.replace(/[^0-9]+/gi, ""));
}
const rawYearNumber = parseInt(match);
return years_1.findMostLikelyADYear(rawYearNumber);
}
exports.parseYear = parseYear;
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN);
function parseTimeUnits(timeunitText) {
const fragments = {};
let remainingText = timeunitText;
let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
while (match) {
collectDateTimeFragment(fragments, match);
remainingText = remainingText.substring(match[0].length);
match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
}
return fragments;
}
exports.parseTimeUnits = parseTimeUnits;
function collectDateTimeFragment(fragments, match) {
const num = parseNumberPattern(match[1]);
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
fragments[unit] = num;
}
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
const configurations_1 = __webpack_require__(/*! ../../configurations */ "./node_modules/chrono-node/dist/configurations.js");
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
const SlashDateFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/SlashDateFormatParser */ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"));
const ISOFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/ISOFormatParser */ "./node_modules/chrono-node/dist/common/parsers/ISOFormatParser.js"));
const DETimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/DETimeExpressionParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js"));
const DEWeekdayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/DEWeekdayParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js"));
const DEMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/DEMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js"));
const DEMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/DEMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js"));
const DECasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/DECasualDateParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js"));
const DECasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/DECasualTimeParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"));
const DEMonthNameLittleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/DEMonthNameLittleEndianParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js"));
exports.casual = new chrono_1.Chrono(createCasualConfiguration());
exports.strict = new chrono_1.Chrono(createConfiguration(true));
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new DECasualTimeParser_1.default());
option.parsers.unshift(new DECasualDateParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration(strictMode = true, littleEndian = true) {
return configurations_1.includeCommonConfiguration({
parsers: [new ISOFormatParser_1.default(), new SlashDateFormatParser_1.default(littleEndian), new DETimeExpressionParser_1.default(), new DEMonthNameLittleEndianParser_1.default(), new DEWeekdayParser_1.default()],
refiners: [new DEMergeDateRangeRefiner_1.default(), new DEMergeDateTimeRefiner_1.default()]
}, strictMode);
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/parsers/DECasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const DECasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./DECasualTimeParser */ "./node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js"));
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
const PATTERN = new RegExp(`(jetzt|heute|morgen|übermorgen|uebermorgen|gestern|vorgestern|letzte\\s*nacht)` + `(?:\\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht))?` + `(?=\\W|$)`, "i");
const DATE_GROUP = 1;
const TIME_GROUP = 2;
class DECasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return PATTERN;
}
innerExtract(context, match) {
let targetDate = dayjs_1.default(context.refDate);
const dateKeyword = (match[DATE_GROUP] || "").toLowerCase();
const timeKeyword = (match[TIME_GROUP] || "").toLowerCase();
let component = context.createParsingComponents();
switch (dateKeyword) {
case "jetzt":
component = references.now(context.reference);
break;
case "heute":
component = references.today(context.reference);
break;
case "morgen":
dayjs_2.assignTheNextDay(component, targetDate);
break;
case "übermorgen":
case "uebermorgen":
targetDate = targetDate.add(1, "day");
dayjs_2.assignTheNextDay(component, targetDate);
break;
case "gestern":
targetDate = targetDate.add(-1, "day");
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.implySimilarTime(component, targetDate);
break;
case "vorgestern":
targetDate = targetDate.add(-2, "day");
dayjs_2.assignSimilarDate(component, targetDate);
dayjs_2.implySimilarTime(component, targetDate);
break;
default:
if (dateKeyword.match(/letzte\s*nacht/)) {
if (targetDate.hour() > 6) {
targetDate = targetDate.add(-1, "day");
}
dayjs_2.assignSimilarDate(component, targetDate);
component.imply("hour", 0);
}
break;
}
if (timeKeyword) {
component = DECasualTimeParser_1.default.extractTimeComponents(component, timeKeyword);
}
return component;
}
}
exports.default = DECasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/parsers/DECasualTimeParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const timeunits_1 = __webpack_require__(/*! ../../../utils/timeunits */ "./node_modules/chrono-node/dist/utils/timeunits.js");
class DECasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(diesen)?\s*(morgen|vormittag|mittags?|nachmittag|abend|nacht|mitternacht)(?=\W|$)/i;
}
innerExtract(context, match) {
const targetDate = dayjs_1.default(context.refDate);
const timeKeywordPattern = match[2].toLowerCase();
const component = context.createParsingComponents();
dayjs_2.implySimilarTime(component, targetDate);
return DECasualTimeParser.extractTimeComponents(component, timeKeywordPattern);
}
static extractTimeComponents(component, timeKeywordPattern) {
switch (timeKeywordPattern) {
case "morgen":
component.imply("hour", 6);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
case "vormittag":
component.imply("hour", 9);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
case "mittag":
case "mittags":
component.imply("hour", 12);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
case "nachmittag":
component.imply("hour", 15);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.PM);
break;
case "abend":
component.imply("hour", 18);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.PM);
break;
case "nacht":
component.imply("hour", 22);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.PM);
break;
case "mitternacht":
if (component.get("hour") > 1) {
component = timeunits_1.addImpliedTimeUnits(component, {
"day": 1
});
}
component.imply("hour", 0);
component.imply("minute", 0);
component.imply("second", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
}
return component;
}
}
exports.default = DECasualTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/parsers/DEMonthNameLittleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/de/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/de/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("(?:am\\s*?)?" + "(?:den\\s*?)?" + `([0-9]{1,2})\\.` + `(?:\\s*(?:bis(?:\\s*(?:am|zum))?|\\-|\\|\\s)\\s*([0-9]{1,2})\\.?)?\\s*` + `(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + `(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` + `(?=\\W|$)`, "i");
const DATE_GROUP = 1;
const DATE_TO_GROUP = 2;
const MONTH_NAME_GROUP = 3;
const YEAR_GROUP = 4;
class DEMonthNameLittleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const result = context.createParsingResult(match.index, match[0]);
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = parseInt(match[DATE_GROUP]);
if (day > 31) {
match.index = match.index + match[DATE_GROUP].length;
return null;
}
result.start.assign("month", month);
result.start.assign("day", day);
if (match[YEAR_GROUP]) {
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
result.start.assign("year", yearNumber);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
result.start.imply("year", year);
}
if (match[DATE_TO_GROUP]) {
const endDate = parseInt(match[DATE_TO_GROUP]);
result.end = result.start.clone();
result.end.assign("day", endDate);
}
return result;
}
}
exports.default = DEMonthNameLittleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/parsers/DETimeExpressionParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractTimeExpressionParser_1 = __webpack_require__(/*! ../../../common/parsers/AbstractTimeExpressionParser */ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js");
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
class DETimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
primaryPrefix() {
return "(?:(?:um|von)\\s*)?";
}
followingPhase() {
return "\\s*(?:\\-|\\|\\~|\\〜|bis)\\s*";
}
primarySuffix() {
return "(?:\\s*uhr)?(?:\\s*(?:morgens|vormittags|nachmittags|abends|nachts))?(?=\\W|$)";
}
extractPrimaryTimeComponents(context, match) {
const components = super.extractPrimaryTimeComponents(context, match);
if (components) {
if (match[0].endsWith("morgens") || match[0].endsWith("vormittags")) {
components.assign("meridiem", index_1.Meridiem.AM);
const hour = components.get("hour");
if (hour < 12) {
components.assign("hour", components.get("hour"));
}
}
if (match[0].endsWith("nachmittags") || match[0].endsWith("abends") || match[0].endsWith("nachts")) {
components.assign("meridiem", index_1.Meridiem.PM);
const hour = components.get("hour");
if (hour < 12) {
components.assign("hour", components.get("hour") + 12);
}
}
}
return components;
}
}
exports.default = DETimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/parsers/DEWeekdayParser.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/de/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const weeks_1 = __webpack_require__(/*! ../../../calculation/weeks */ "./node_modules/chrono-node/dist/calculation/weeks.js");
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\)\\s*)?" + "(?:a[mn]\\s*?)?" + "(?:(diese[mn]|letzte[mn]|n(?:ä|ae)chste[mn])\\s*)?" + `(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + "(?:\\s*(?:\\,|\\)|\\))?" + "(?:\\s*(diese|letzte|n(?:ä|ae)chste)\\s*woche)?" + "(?=\\W|$)", "i");
const PREFIX_GROUP = 1;
const SUFFIX_GROUP = 3;
const WEEKDAY_GROUP = 2;
class DEWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek];
const prefix = match[PREFIX_GROUP];
const postfix = match[SUFFIX_GROUP];
let modifierWord = prefix || postfix;
modifierWord = modifierWord || "";
modifierWord = modifierWord.toLowerCase();
let modifier = null;
if (modifierWord.match(/letzte/)) {
modifier = "last";
} else if (modifierWord.match(/chste/)) {
modifier = "next";
} else if (modifierWord.match(/diese/)) {
modifier = "this";
}
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier);
return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year());
}
}
exports.default = DEWeekdayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class DEMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(bis(?:\s*(?:am|zum))?|-)\s*$/i;
}
}
exports.default = DEMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/de/refiners/DEMergeDateTimeRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"));
class DEMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
patternBetween() {
return new RegExp("^\\s*(T|um|am|,|-)?\\s*$");
}
}
exports.default = DEMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.FULL_MONTH_NAME_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
const pattern_1 = __webpack_require__(/*! ../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const years_1 = __webpack_require__(/*! ../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
exports.WEEKDAY_DICTIONARY = {
sunday: 0,
sun: 0,
"sun.": 0,
monday: 1,
mon: 1,
"mon.": 1,
tuesday: 2,
tue: 2,
"tue.": 2,
wednesday: 3,
wed: 3,
"wed.": 3,
thursday: 4,
thurs: 4,
"thurs.": 4,
thur: 4,
"thur.": 4,
thu: 4,
"thu.": 4,
friday: 5,
fri: 5,
"fri.": 5,
saturday: 6,
sat: 6,
"sat.": 6
};
exports.FULL_MONTH_NAME_DICTIONARY = {
january: 1,
february: 2,
march: 3,
april: 4,
may: 5,
june: 6,
july: 7,
august: 8,
september: 9,
october: 10,
november: 11,
december: 12
};
exports.MONTH_DICTIONARY = Object.assign(Object.assign({}, exports.FULL_MONTH_NAME_DICTIONARY), {
jan: 1,
"jan.": 1,
feb: 2,
"feb.": 2,
mar: 3,
"mar.": 3,
apr: 4,
"apr.": 4,
jun: 6,
"jun.": 6,
jul: 7,
"jul.": 7,
aug: 8,
"aug.": 8,
sep: 9,
"sep.": 9,
sept: 9,
"sept.": 9,
oct: 10,
"oct.": 10,
nov: 11,
"nov.": 11,
dec: 12,
"dec.": 12
});
exports.INTEGER_WORD_DICTIONARY = {
one: 1,
two: 2,
three: 3,
four: 4,
five: 5,
six: 6,
seven: 7,
eight: 8,
nine: 9,
ten: 10,
eleven: 11,
twelve: 12
};
exports.ORDINAL_WORD_DICTIONARY = {
first: 1,
second: 2,
third: 3,
fourth: 4,
fifth: 5,
sixth: 6,
seventh: 7,
eighth: 8,
ninth: 9,
tenth: 10,
eleventh: 11,
twelfth: 12,
thirteenth: 13,
fourteenth: 14,
fifteenth: 15,
sixteenth: 16,
seventeenth: 17,
eighteenth: 18,
nineteenth: 19,
twentieth: 20,
"twenty first": 21,
"twenty-first": 21,
"twenty second": 22,
"twenty-second": 22,
"twenty third": 23,
"twenty-third": 23,
"twenty fourth": 24,
"twenty-fourth": 24,
"twenty fifth": 25,
"twenty-fifth": 25,
"twenty sixth": 26,
"twenty-sixth": 26,
"twenty seventh": 27,
"twenty-seventh": 27,
"twenty eighth": 28,
"twenty-eighth": 28,
"twenty ninth": 29,
"twenty-ninth": 29,
"thirtieth": 30,
"thirty first": 31,
"thirty-first": 31
};
exports.TIME_UNIT_DICTIONARY = {
sec: "second",
second: "second",
seconds: "second",
min: "minute",
mins: "minute",
minute: "minute",
minutes: "minute",
h: "hour",
hr: "hour",
hrs: "hour",
hour: "hour",
hours: "hour",
day: "d",
days: "d",
week: "week",
weeks: "week",
month: "month",
months: "month",
y: "year",
yr: "year",
year: "year",
years: "year"
};
exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|half(?:\\s*an?)?|an?(?:\\s*few)?|few|several|a?\\s*couple\\s*(?:of)?)`;
function parseNumberPattern(match) {
const num = match.toLowerCase();
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
return exports.INTEGER_WORD_DICTIONARY[num];
} else if (num === "a" || num === "an") {
return 1;
} else if (num.match(/few/)) {
return 3;
} else if (num.match(/half/)) {
return 0.5;
} else if (num.match(/couple/)) {
return 2;
} else if (num.match(/several/)) {
return 7;
}
return parseFloat(num);
}
exports.parseNumberPattern = parseNumberPattern;
exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:st|nd|rd|th)?)`;
function parseOrdinalNumberPattern(match) {
let num = match.toLowerCase();
if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) {
return exports.ORDINAL_WORD_DICTIONARY[num];
}
num = num.replace(/(?:st|nd|rd|th)$/i, "");
return parseInt(num);
}
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern;
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:BE|AD|BC|BCE|CE)|[1-2][0-9]{3}|[5-9][0-9])`;
function parseYear(match) {
if (/BE/i.test(match)) {
match = match.replace(/BE/i, "");
return parseInt(match) - 543;
}
if (/BCE?/i.test(match)) {
match = match.replace(/BCE?/i, "");
return -parseInt(match);
}
if (/(AD|CE)/i.test(match)) {
match = match.replace(/(AD|CE)/i, "");
return parseInt(match);
}
const rawYearNumber = parseInt(match);
return years_1.findMostLikelyADYear(rawYearNumber);
}
exports.parseYear = parseYear;
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:about|around)\\s*)?`, SINGLE_TIME_UNIT_PATTERN);
function parseTimeUnits(timeunitText) {
const fragments = {};
let remainingText = timeunitText;
let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
while (match) {
collectDateTimeFragment(fragments, match);
remainingText = remainingText.substring(match[0].length);
match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
}
return fragments;
}
exports.parseTimeUnits = parseTimeUnits;
function collectDateTimeFragment(fragments, match) {
const num = parseNumberPattern(match[1]);
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
fragments[unit] = num;
}
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.GB = exports.strict = exports.casual = void 0;
const ENTimeUnitWithinFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENTimeUnitWithinFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js"));
const ENMonthNameLittleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENMonthNameLittleEndianParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js"));
const ENMonthNameMiddleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENMonthNameMiddleEndianParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js"));
const ENMonthNameParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENMonthNameParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js"));
const ENCasualYearMonthDayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENCasualYearMonthDayParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js"));
const ENSlashMonthFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENSlashMonthFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js"));
const ENTimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENTimeExpressionParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js"));
const ENTimeUnitAgoFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENTimeUnitAgoFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js"));
const ENTimeUnitLaterFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENTimeUnitLaterFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js"));
const ENMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/ENMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js"));
const ENMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/ENMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js"));
const configurations_1 = __webpack_require__(/*! ../../configurations */ "./node_modules/chrono-node/dist/configurations.js");
const ENCasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENCasualDateParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js"));
const ENCasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENCasualTimeParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js"));
const ENWeekdayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENWeekdayParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js"));
const ENRelativeDateFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENRelativeDateFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js"));
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
const SlashDateFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/SlashDateFormatParser */ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"));
const ENTimeUnitCasualRelativeFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/ENTimeUnitCasualRelativeFormatParser */ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js"));
exports.casual = new chrono_1.Chrono(createCasualConfiguration(false));
exports.strict = new chrono_1.Chrono(createConfiguration(true, false));
exports.GB = new chrono_1.Chrono(createConfiguration(false, true));
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration(littleEndian = false) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new ENCasualDateParser_1.default());
option.parsers.unshift(new ENCasualTimeParser_1.default());
option.parsers.unshift(new ENMonthNameParser_1.default());
option.parsers.unshift(new ENRelativeDateFormatParser_1.default());
option.parsers.unshift(new ENTimeUnitCasualRelativeFormatParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration(strictMode = true, littleEndian = false) {
return configurations_1.includeCommonConfiguration({
parsers: [new SlashDateFormatParser_1.default(littleEndian), new ENTimeUnitWithinFormatParser_1.default(), new ENMonthNameLittleEndianParser_1.default(), new ENMonthNameMiddleEndianParser_1.default(), new ENWeekdayParser_1.default(), new ENCasualYearMonthDayParser_1.default(), new ENSlashMonthFormatParser_1.default(), new ENTimeExpressionParser_1.default(strictMode), new ENTimeUnitAgoFormatParser_1.default(strictMode), new ENTimeUnitLaterFormatParser_1.default(strictMode)],
refiners: [new ENMergeDateTimeRefiner_1.default(), new ENMergeDateRangeRefiner_1.default()]
}, strictMode);
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENCasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
const PATTERN = /(now|today|tonight|tomorrow|tmr|tmrw|yesterday|last\s*night)(?=\W|$)/i;
class ENCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return PATTERN;
}
innerExtract(context, match) {
let targetDate = dayjs_1.default(context.refDate);
const lowerText = match[0].toLowerCase();
const component = context.createParsingComponents();
switch (lowerText) {
case "now":
return references.now(context.reference);
case "today":
return references.today(context.reference);
case "yesterday":
return references.yesterday(context.reference);
case "tomorrow":
case "tmr":
case "tmrw":
return references.tomorrow(context.reference);
case "tonight":
return references.tonight(context.reference);
default:
if (lowerText.match(/last\s*night/)) {
if (targetDate.hour() > 6) {
targetDate = targetDate.add(-1, "day");
}
dayjs_2.assignSimilarDate(component, targetDate);
component.imply("hour", 0);
}
break;
}
return component;
}
}
exports.default = ENCasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENCasualTimeParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const PATTERN = /(?:this)?\s*(morning|afternoon|evening|night|midnight|noon)(?=\W|$)/i;
class ENCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const targetDate = dayjs_1.default(context.refDate);
const component = context.createParsingComponents();
switch (match[1].toLowerCase()) {
case "afternoon":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 15);
break;
case "evening":
case "night":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 20);
break;
case "midnight":
dayjs_2.assignTheNextDay(component, targetDate);
component.imply("hour", 0);
component.imply("minute", 0);
component.imply("second", 0);
break;
case "morning":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 6);
break;
case "noon":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 12);
break;
}
return component;
}
}
exports.default = ENCasualTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js":
/*!****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENCasualYearMonthDayParser.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` + `(?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` + `([0-9]{1,2})` + "(?=\\W|$)", "i");
const YEAR_NUMBER_GROUP = 1;
const MONTH_NAME_GROUP = 2;
const MONTH_NUMBER_GROUP = 3;
const DATE_NUMBER_GROUP = 4;
class ENCasualYearMonthDayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
if (month < 1 || month > 12) {
return null;
}
const year = parseInt(match[YEAR_NUMBER_GROUP]);
const day = parseInt(match[DATE_NUMBER_GROUP]);
return {
day: day,
month: month,
year: year
};
}
}
exports.default = ENCasualYearMonthDayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameLittleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const constants_3 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("(?:on\\s*?)?" + `(${constants_3.ORDINAL_NUMBER_PATTERN})` + "(?:\\s*" + "(?:to|\\-|\\|until|through|till|\\s)\\s*" + `(${constants_3.ORDINAL_NUMBER_PATTERN})` + ")?" + "(?:-|/|\\s*(?:of)?\\s*)" + "(" + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + ")" + "(?:" + "(?:-|/|,?\\s*)" + `(${constants_2.YEAR_PATTERN}(?![^\\s]\\d))` + ")?" + "(?=\\W|$)", "i");
const DATE_GROUP = 1;
const DATE_TO_GROUP = 2;
const MONTH_NAME_GROUP = 3;
const YEAR_GROUP = 4;
class ENMonthNameLittleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const result = context.createParsingResult(match.index, match[0]);
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]);
if (day > 31) {
match.index = match.index + match[DATE_GROUP].length;
return null;
}
result.start.assign("month", month);
result.start.assign("day", day);
if (match[YEAR_GROUP]) {
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
result.start.assign("year", yearNumber);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
result.start.imply("year", year);
}
if (match[DATE_TO_GROUP]) {
const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
result.end = result.start.clone();
result.end.assign("day", endDate);
}
return result;
}
}
exports.default = ENMonthNameLittleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameMiddleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const constants_3 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + "(?:-|/|\\s*,?\\s*)" + `(${constants_2.ORDINAL_NUMBER_PATTERN})(?!\\s*(?:am|pm))\\s*` + "(?:" + "(?:to|\\-)\\s*" + `(${constants_2.ORDINAL_NUMBER_PATTERN})\\s*` + ")?" + "(?:" + "(?:-|/|\\s*,?\\s*)" + `(${constants_3.YEAR_PATTERN})` + ")?" + "(?=\\W|$)(?!\\:\\d)", "i");
const MONTH_NAME_GROUP = 1;
const DATE_GROUP = 2;
const DATE_TO_GROUP = 3;
const YEAR_GROUP = 4;
class ENMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]);
if (day > 31) {
return null;
}
const components = context.createParsingComponents({
day: day,
month: month
});
if (match[YEAR_GROUP]) {
const year = constants_3.parseYear(match[YEAR_GROUP]);
components.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
components.imply("year", year);
}
if (!match[DATE_TO_GROUP]) {
return components;
}
const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
const result = context.createParsingResult(match.index, match[0]);
result.start = components;
result.end = components.clone();
result.end.assign("day", endDate);
return result;
}
}
exports.default = ENMonthNameMiddleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js":
/*!*******************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENMonthNameParser.js ***!
\*******************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`((?:in)\\s*)?` + `(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + `\\s*` + `(?:` + `[,-]?\\s*(${constants_2.YEAR_PATTERN})?` + ")?" + "(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i");
const PREFIX_GROUP = 1;
const MONTH_NAME_GROUP = 2;
const YEAR_GROUP = 3;
class ENMonthNameParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const monthName = match[MONTH_NAME_GROUP].toLowerCase();
if (match[0].length <= 3 && !constants_1.FULL_MONTH_NAME_DICTIONARY[monthName]) {
return null;
}
const result = context.createParsingResult(match.index + (match[PREFIX_GROUP] || "").length, match.index + match[0].length);
result.start.imply("day", 1);
const month = constants_1.MONTH_DICTIONARY[monthName];
result.start.assign("month", month);
if (match[YEAR_GROUP]) {
const year = constants_2.parseYear(match[YEAR_GROUP]);
result.start.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, 1, month);
result.start.imply("year", year);
}
return result;
}
}
exports.default = ENMonthNameParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js":
/*!****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENRelativeDateFormatParser.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const PATTERN = new RegExp(`(this|next|last|past)\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})(?=\\s*)` + "(?=\\W|$)", "i");
const MODIFIER_WORD_GROUP = 1;
const RELATIVE_WORD_GROUP = 2;
class ENRelativeDateFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const modifier = match[MODIFIER_WORD_GROUP].toLowerCase();
const unitWord = match[RELATIVE_WORD_GROUP].toLowerCase();
const timeunit = constants_1.TIME_UNIT_DICTIONARY[unitWord];
if (modifier == "next") {
const timeUnits = {};
timeUnits[timeunit] = 1;
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
if (modifier == "last" || modifier == "past") {
const timeUnits = {};
timeUnits[timeunit] = -1;
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
const components = context.createParsingComponents();
let date = dayjs_1.default(context.refDate);
if (unitWord.match(/week/i)) {
date = date.add(-date.get("d"), "d");
components.imply("day", date.date());
components.imply("month", date.month() + 1);
components.imply("year", date.year());
} else if (unitWord.match(/month/i)) {
date = date.add(-date.date() + 1, "d");
components.imply("day", date.date());
components.assign("year", date.year());
components.assign("month", date.month() + 1);
} else if (unitWord.match(/year/i)) {
date = date.add(-date.date() + 1, "d");
date = date.add(-date.month(), "month");
components.imply("day", date.date());
components.imply("month", date.month() + 1);
components.assign("year", date.year());
}
return components;
}
}
exports.default = ENRelativeDateFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENSlashMonthFormatParser.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i");
const MONTH_GROUP = 1;
const YEAR_GROUP = 2;
class ENSlashMonthFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const year = parseInt(match[YEAR_GROUP]);
const month = parseInt(match[MONTH_GROUP]);
return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year);
}
}
exports.default = ENSlashMonthFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENTimeExpressionParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractTimeExpressionParser_1 = __webpack_require__(/*! ../../../common/parsers/AbstractTimeExpressionParser */ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js");
class ENTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
constructor(strictMode) {
super(strictMode);
}
followingPhase() {
return "\\s*(?:\\-|\\|\\~|\\〜|to|\\?)\\s*";
}
primaryPrefix() {
return "(?:(?:at|from)\\s*)??";
}
primarySuffix() {
return "(?:\\s*(?:o\\W*clock|at\\s*night|in\\s*the\\s*(?:morning|afternoon)))?(?!/)(?=\\W|$)";
}
extractPrimaryTimeComponents(context, match) {
const components = super.extractPrimaryTimeComponents(context, match);
if (components) {
if (match[0].endsWith("night")) {
const hour = components.get("hour");
if (hour >= 6 && hour < 12) {
components.assign("hour", components.get("hour") + 12);
components.assign("meridiem", index_1.Meridiem.PM);
} else if (hour < 6) {
components.assign("meridiem", index_1.Meridiem.AM);
}
}
if (match[0].endsWith("afternoon")) {
components.assign("meridiem", index_1.Meridiem.PM);
const hour = components.get("hour");
if (hour >= 0 && hour <= 6) {
components.assign("hour", components.get("hour") + 12);
}
}
if (match[0].endsWith("morning")) {
components.assign("meridiem", index_1.Meridiem.AM);
const hour = components.get("hour");
if (hour < 12) {
components.assign("hour", components.get("hour"));
}
}
}
return components;
}
}
exports.default = ENTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js":
/*!***************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitAgoFormatParser.js ***!
\***************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const timeunits_1 = __webpack_require__(/*! ../../../utils/timeunits */ "./node_modules/chrono-node/dist/utils/timeunits.js");
const PATTERN = new RegExp("" + "(" + constants_1.TIME_UNITS_PATTERN + ")" + "(?:ago|before|earlier)(?=(?:\\W|$))", "i");
const STRICT_PATTERN = new RegExp("" + "(" + constants_1.TIME_UNITS_PATTERN + ")" + "ago(?=(?:\\W|$))", "i");
class ENTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
constructor(strictMode) {
super();
this.strictMode = strictMode;
}
innerPattern() {
return this.strictMode ? STRICT_PATTERN : PATTERN;
}
innerExtract(context, match) {
const timeUnits = constants_1.parseTimeUnits(match[1]);
const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}
exports.default = ENTimeUnitAgoFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js":
/*!**************************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitCasualRelativeFormatParser.js ***!
\**************************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const timeunits_1 = __webpack_require__(/*! ../../../utils/timeunits */ "./node_modules/chrono-node/dist/utils/timeunits.js");
const PATTERN = new RegExp(`(this|last|past|next|\\+|-)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
class ENTimeUnitCasualRelativeFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const prefix = match[1].toLowerCase();
let timeUnits = constants_1.parseTimeUnits(match[2]);
switch (prefix) {
case "last":
case "past":
case "-":
timeUnits = timeunits_1.reverseTimeUnits(timeUnits);
break;
}
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = ENTimeUnitCasualRelativeFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js":
/*!*****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitLaterFormatParser.js ***!
\*****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("" + "(" + constants_1.TIME_UNITS_PATTERN + ")" + "(later|after|from now|henceforth|forward|out)" + "(?=(?:\\W|$))", "i");
const STRICT_PATTERN = new RegExp("" + "(" + constants_1.TIME_UNITS_PATTERN + ")" + "(later|from now)" + "(?=(?:\\W|$))", "i");
const GROUP_NUM_TIMEUNITS = 1;
class ENTimeUnitLaterFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
constructor(strictMode) {
super();
this.strictMode = strictMode;
}
innerPattern() {
return this.strictMode ? STRICT_PATTERN : PATTERN;
}
innerExtract(context, match) {
const fragments = constants_1.parseTimeUnits(match[GROUP_NUM_TIMEUNITS]);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, fragments);
}
}
exports.default = ENTimeUnitLaterFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js":
/*!******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENTimeUnitWithinFormatParser.js ***!
\******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN_WITH_PREFIX = new RegExp(`(?:within|in|for)\\s*` + `(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
const PATTERN_WITHOUT_PREFIX = new RegExp(`(?:(?:about|around|roughly|approximately|just)\\s*(?:~\\s*)?)?(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
class ENTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return context.option.forwardDate ? PATTERN_WITHOUT_PREFIX : PATTERN_WITH_PREFIX;
}
innerExtract(context, match) {
const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = ENTimeUnitWithinFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/parsers/ENWeekdayParser.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/en/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const weeks_1 = __webpack_require__(/*! ../../../calculation/weeks */ "./node_modules/chrono-node/dist/calculation/weeks.js");
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\)\\s*)?" + "(?:on\\s*?)?" + "(?:(this|last|past|next)\\s*)?" + `(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + "(?:\\s*(?:\\,|\\)|\\))?" + "(?:\\s*(this|last|past|next)\\s*week)?" + "(?=\\W|$)", "i");
const PREFIX_GROUP = 1;
const WEEKDAY_GROUP = 2;
const POSTFIX_GROUP = 3;
class ENWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek];
const prefix = match[PREFIX_GROUP];
const postfix = match[POSTFIX_GROUP];
let modifierWord = prefix || postfix;
modifierWord = modifierWord || "";
modifierWord = modifierWord.toLowerCase();
let modifier = null;
if (modifierWord == "last" || modifierWord == "past") {
modifier = "last";
} else if (modifierWord == "next") {
modifier = "next";
} else if (modifierWord == "this") {
modifier = "this";
}
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier);
return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year());
}
}
exports.default = ENWeekdayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class ENMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(to|-)\s*$/i;
}
}
exports.default = ENMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/en/refiners/ENMergeDateTimeRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"));
class ENMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
patternBetween() {
return new RegExp("^\\s*(T|at|after|before|on|of|,|-)?\\s*$");
}
}
exports.default = ENMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
const pattern_1 = __webpack_require__(/*! ../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
exports.WEEKDAY_DICTIONARY = {
"dimanche": 0,
"dim": 0,
"lundi": 1,
"lun": 1,
"mardi": 2,
"mar": 2,
"mercredi": 3,
"mer": 3,
"jeudi": 4,
"jeu": 4,
"vendredi": 5,
"ven": 5,
"samedi": 6,
"sam": 6
};
exports.MONTH_DICTIONARY = {
"janvier": 1,
"jan": 1,
"jan.": 1,
"février": 2,
"fév": 2,
"fév.": 2,
"fevrier": 2,
"fev": 2,
"fev.": 2,
"mars": 3,
"mar": 3,
"mar.": 3,
"avril": 4,
"avr": 4,
"avr.": 4,
"mai": 5,
"juin": 6,
"jun": 6,
"juillet": 7,
"juil": 7,
"jul": 7,
"jul.": 7,
"août": 8,
"aout": 8,
"septembre": 9,
"sep": 9,
"sep.": 9,
"sept": 9,
"sept.": 9,
"octobre": 10,
"oct": 10,
"oct.": 10,
"novembre": 11,
"nov": 11,
"nov.": 11,
"décembre": 12,
"decembre": 12,
"dec": 12,
"dec.": 12
};
exports.INTEGER_WORD_DICTIONARY = {
"un": 1,
"deux": 2,
"trois": 3,
"quatre": 4,
"cinq": 5,
"six": 6,
"sept": 7,
"huit": 8,
"neuf": 9,
"dix": 10,
"onze": 11,
"douze": 12,
"treize": 13
};
exports.TIME_UNIT_DICTIONARY = {
"sec": "second",
"seconde": "second",
"secondes": "second",
"min": "minute",
"mins": "minute",
"minute": "minute",
"minutes": "minute",
"h": "hour",
"hr": "hour",
"hrs": "hour",
"heure": "hour",
"heures": "hour",
"jour": "d",
"jours": "d",
"semaine": "week",
"semaines": "week",
"mois": "month",
"trimestre": "quarter",
"trimestres": "quarter",
"ans": "year",
"année": "year",
"années": "year"
};
exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|une?|quelques?|demi-?)`;
function parseNumberPattern(match) {
const num = match.toLowerCase();
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
return exports.INTEGER_WORD_DICTIONARY[num];
} else if (num === "une" || num === "un") {
return 1;
} else if (num.match(/quelques?/)) {
return 3;
} else if (num.match(/demi-?/)) {
return 0.5;
}
return parseFloat(num);
}
exports.parseNumberPattern = parseNumberPattern;
exports.ORDINAL_NUMBER_PATTERN = `(?:[0-9]{1,2}(?:er)?)`;
function parseOrdinalNumberPattern(match) {
let num = match.toLowerCase();
num = num.replace(/(?:er)$/i, "");
return parseInt(num);
}
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern;
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:AC|AD|p\\.\\s*C(?:hr?)?\\.\\s*n\\.)|[1-2][0-9]{3}|[5-9][0-9])`;
function parseYear(match) {
if (/AC/i.test(match)) {
match = match.replace(/BC/i, "");
return -parseInt(match);
}
if (/AD/i.test(match) || /C/i.test(match)) {
match = match.replace(/[^\d]+/i, "");
return parseInt(match);
}
let yearNumber = parseInt(match);
if (yearNumber < 100) {
if (yearNumber > 50) {
yearNumber = yearNumber + 1900;
} else {
yearNumber = yearNumber + 2000;
}
}
return yearNumber;
}
exports.parseYear = parseYear;
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern("", SINGLE_TIME_UNIT_PATTERN);
function parseTimeUnits(timeunitText) {
const fragments = {};
let remainingText = timeunitText;
let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
while (match) {
collectDateTimeFragment(fragments, match);
remainingText = remainingText.substring(match[0].length);
match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
}
return fragments;
}
exports.parseTimeUnits = parseTimeUnits;
function collectDateTimeFragment(fragments, match) {
const num = parseNumberPattern(match[1]);
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
fragments[unit] = num;
}
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
const configurations_1 = __webpack_require__(/*! ../../configurations */ "./node_modules/chrono-node/dist/configurations.js");
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
const FRCasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRCasualDateParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js"));
const FRCasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRCasualTimeParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js"));
const SlashDateFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/SlashDateFormatParser */ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"));
const FRTimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRTimeExpressionParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js"));
const FRMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/FRMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js"));
const FRMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/FRMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js"));
const FRWeekdayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRWeekdayParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js"));
const FRSpecificTimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRSpecificTimeExpressionParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js"));
const FRMonthNameLittleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRMonthNameLittleEndianParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js"));
const FRTimeUnitAgoFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRTimeUnitAgoFormatParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js"));
const FRTimeUnitWithinFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRTimeUnitWithinFormatParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js"));
const FRTimeUnitRelativeFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/FRTimeUnitRelativeFormatParser */ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js"));
exports.casual = new chrono_1.Chrono(createCasualConfiguration());
exports.strict = new chrono_1.Chrono(createConfiguration(true));
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new FRCasualDateParser_1.default());
option.parsers.unshift(new FRCasualTimeParser_1.default());
option.parsers.unshift(new FRTimeUnitRelativeFormatParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration(strictMode = true, littleEndian = true) {
return configurations_1.includeCommonConfiguration({
parsers: [new SlashDateFormatParser_1.default(littleEndian), new FRMonthNameLittleEndianParser_1.default(), new FRTimeExpressionParser_1.default(), new FRSpecificTimeExpressionParser_1.default(), new FRTimeUnitAgoFormatParser_1.default(), new FRTimeUnitWithinFormatParser_1.default(), new FRWeekdayParser_1.default()],
refiners: [new FRMergeDateTimeRefiner_1.default(), new FRMergeDateRangeRefiner_1.default()]
}, strictMode);
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
class FRCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(maintenant|aujourd'hui|demain|hier|cette\s*nuit|la\s*veille)(?=\W|$)/i;
}
innerExtract(context, match) {
let targetDate = dayjs_1.default(context.refDate);
const lowerText = match[0].toLowerCase();
const component = context.createParsingComponents();
switch (lowerText) {
case "maintenant":
return references.now(context.reference);
case "aujourd'hui":
return references.today(context.reference);
case "hier":
return references.yesterday(context.reference);
case "demain":
return references.tomorrow(context.reference);
default:
if (lowerText.match(/cette\s*nuit/)) {
dayjs_2.assignSimilarDate(component, targetDate);
component.imply("hour", 22);
component.imply("meridiem", index_1.Meridiem.PM);
} else if (lowerText.match(/la\s*veille/)) {
targetDate = targetDate.add(-1, "day");
dayjs_2.assignSimilarDate(component, targetDate);
component.imply("hour", 0);
}
}
return component;
}
}
exports.default = FRCasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRCasualTimeParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
class FRCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(cet?)?\s*(matin|soir|après-midi|aprem|a midi|à minuit)(?=\W|$)/i;
}
innerExtract(context, match) {
const suffixLower = match[2].toLowerCase();
const component = context.createParsingComponents();
switch (suffixLower) {
case "après-midi":
case "aprem":
component.imply("hour", 14);
component.imply("minute", 0);
component.imply("meridiem", index_1.Meridiem.PM);
break;
case "soir":
component.imply("hour", 18);
component.imply("minute", 0);
component.imply("meridiem", index_1.Meridiem.PM);
break;
case "matin":
component.imply("hour", 8);
component.imply("minute", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
case "a midi":
component.imply("hour", 12);
component.imply("minute", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
case "à minuit":
component.imply("hour", 0);
component.imply("meridiem", index_1.Meridiem.AM);
break;
}
return component;
}
}
exports.default = FRCasualTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRMonthNameLittleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const constants_3 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("(?:on\\s*?)?" + `(${constants_3.ORDINAL_NUMBER_PATTERN})` + `(?:\\s*(?:au|\\-|\\|jusqu'au?|\\s)\\s*(${constants_3.ORDINAL_NUMBER_PATTERN}))?` + `(?:-|/|\\s*(?:de)?\\s*)` + `(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + `(?:(?:-|/|,?\\s*)(${constants_2.YEAR_PATTERN}(?![^\\s]\\d)))?` + `(?=\\W|$)`, "i");
const DATE_GROUP = 1;
const DATE_TO_GROUP = 2;
const MONTH_NAME_GROUP = 3;
const YEAR_GROUP = 4;
class FRMonthNameLittleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const result = context.createParsingResult(match.index, match[0]);
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = constants_3.parseOrdinalNumberPattern(match[DATE_GROUP]);
if (day > 31) {
match.index = match.index + match[DATE_GROUP].length;
return null;
}
result.start.assign("month", month);
result.start.assign("day", day);
if (match[YEAR_GROUP]) {
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
result.start.assign("year", yearNumber);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
result.start.imply("year", year);
}
if (match[DATE_TO_GROUP]) {
const endDate = constants_3.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
result.end = result.start.clone();
result.end.assign("day", endDate);
}
return result;
}
}
exports.default = FRMonthNameLittleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js":
/*!********************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRSpecificTimeExpressionParser.js ***!
\********************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const FIRST_REG_PATTERN = new RegExp("(^|\\s|T)" + "(?:(?:[àa])\\s*)?" + "(\\d{1,2})(?:h|:)?" + "(?:(\\d{1,2})(?:m|:)?)?" + "(?:(\\d{1,2})(?:s|:)?)?" + "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" + "(?=\\W|$)", "i");
const SECOND_REG_PATTERN = new RegExp("^\\s*(\\-|\\|\\~|\\〜|[àa]|\\?)\\s*" + "(\\d{1,2})(?:h|:)?" + "(?:(\\d{1,2})(?:m|:)?)?" + "(?:(\\d{1,2})(?:s|:)?)?" + "(?:\\s*(A\\.M\\.|P\\.M\\.|AM?|PM?))?" + "(?=\\W|$)", "i");
const HOUR_GROUP = 2;
const MINUTE_GROUP = 3;
const SECOND_GROUP = 4;
const AM_PM_HOUR_GROUP = 5;
class FRSpecificTimeExpressionParser {
pattern(context) {
return FIRST_REG_PATTERN;
}
extract(context, match) {
const result = context.createParsingResult(match.index + match[1].length, match[0].substring(match[1].length));
if (result.text.match(/^\d{4}$/)) {
match.index += match[0].length;
return null;
}
result.start = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), match);
if (!result.start) {
match.index += match[0].length;
return null;
}
const remainingText = context.text.substring(match.index + match[0].length);
const secondMatch = SECOND_REG_PATTERN.exec(remainingText);
if (secondMatch) {
result.end = FRSpecificTimeExpressionParser.extractTimeComponent(result.start.clone(), secondMatch);
if (result.end) {
result.text += secondMatch[0];
}
}
return result;
}
static extractTimeComponent(extractingComponents, match) {
let hour = 0;
let minute = 0;
let meridiem = null;
hour = parseInt(match[HOUR_GROUP]);
if (match[MINUTE_GROUP] != null) {
minute = parseInt(match[MINUTE_GROUP]);
}
if (minute >= 60 || hour > 24) {
return null;
}
if (hour >= 12) {
meridiem = index_1.Meridiem.PM;
}
if (match[AM_PM_HOUR_GROUP] != null) {
if (hour > 12) return null;
const ampm = match[AM_PM_HOUR_GROUP][0].toLowerCase();
if (ampm == "a") {
meridiem = index_1.Meridiem.AM;
if (hour == 12) {
hour = 0;
}
}
if (ampm == "p") {
meridiem = index_1.Meridiem.PM;
if (hour != 12) {
hour += 12;
}
}
}
extractingComponents.assign("hour", hour);
extractingComponents.assign("minute", minute);
if (meridiem !== null) {
extractingComponents.assign("meridiem", meridiem);
} else {
if (hour < 12) {
extractingComponents.imply("meridiem", index_1.Meridiem.AM);
} else {
extractingComponents.imply("meridiem", index_1.Meridiem.PM);
}
}
if (match[SECOND_GROUP] != null) {
const second = parseInt(match[SECOND_GROUP]);
if (second >= 60) return null;
extractingComponents.assign("second", second);
}
return extractingComponents;
}
}
exports.default = FRSpecificTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeExpressionParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractTimeExpressionParser_1 = __webpack_require__(/*! ../../../common/parsers/AbstractTimeExpressionParser */ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js");
class FRTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
primaryPrefix() {
return "(?:(?:[àa])\\s*)?";
}
followingPhase() {
return "\\s*(?:\\-|\\|\\~|\\〜|[àa]|\\?)\\s*";
}
extractPrimaryTimeComponents(context, match) {
if (match[0].match(/^\s*\d{4}\s*$/)) {
return null;
}
return super.extractPrimaryTimeComponents(context, match);
}
}
exports.default = FRTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js":
/*!***************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitAgoFormatParser.js ***!
\***************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const timeunits_1 = __webpack_require__(/*! ../../../utils/timeunits */ "./node_modules/chrono-node/dist/utils/timeunits.js");
class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
constructor() {
super();
}
innerPattern() {
return new RegExp(`il y a\\s*(${constants_1.TIME_UNITS_PATTERN})(?=(?:\\W|$))`, "i");
}
innerExtract(context, match) {
const timeUnits = constants_1.parseTimeUnits(match[1]);
const outputTimeUnits = timeunits_1.reverseTimeUnits(timeUnits);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, outputTimeUnits);
}
}
exports.default = FRTimeUnitAgoFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js":
/*!********************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitRelativeFormatParser.js ***!
\********************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const timeunits_1 = __webpack_require__(/*! ../../../utils/timeunits */ "./node_modules/chrono-node/dist/utils/timeunits.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
class FRTimeUnitAgoFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
constructor() {
super();
}
innerPattern() {
return new RegExp(`(?:les?|la|l'|du|des?)\\s*` + `(${constants_1.NUMBER_PATTERN})?` + `(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?` + `\\s*(${pattern_1.matchAnyPattern(constants_1.TIME_UNIT_DICTIONARY)})` + `(?:\\s*(prochaine?s?|derni[eè]re?s?|pass[ée]e?s?|pr[ée]c[ée]dents?|suivante?s?))?`, "i");
}
innerExtract(context, match) {
const num = match[1] ? constants_1.parseNumberPattern(match[1]) : 1;
const unit = constants_1.TIME_UNIT_DICTIONARY[match[3].toLowerCase()];
let timeUnits = {};
timeUnits[unit] = num;
let modifier = match[2] || match[4] || "";
modifier = modifier.toLowerCase();
if (!modifier) {
return;
}
if (/derni[eè]re?s?/.test(modifier) || /pass[ée]e?s?/.test(modifier) || /pr[ée]c[ée]dents?/.test(modifier)) {
timeUnits = timeunits_1.reverseTimeUnits(timeUnits);
}
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = FRTimeUnitAgoFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js":
/*!******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRTimeUnitWithinFormatParser.js ***!
\******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
class FRTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return new RegExp(`(?:dans|en|pour|pendant)\\s*(${constants_1.TIME_UNITS_PATTERN})(?=\\W|$)`, "i");
}
innerExtract(context, match) {
const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = FRTimeUnitWithinFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/parsers/FRWeekdayParser.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/fr/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const weeks_1 = __webpack_require__(/*! ../../../calculation/weeks */ "./node_modules/chrono-node/dist/calculation/weeks.js");
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\)\\s*)?" + "(?:(?:ce)\\s*)?" + `(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + "(?:\\s*(?:\\,|\\)|\\))?" + "(?:\\s*(dernier|prochain)\\s*)?" + "(?=\\W|\\d|$)", "i");
const WEEKDAY_GROUP = 1;
const POSTFIX_GROUP = 2;
class FRWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek];
if (offset === undefined) {
return null;
}
let suffix = match[POSTFIX_GROUP];
suffix = suffix || "";
suffix = suffix.toLowerCase();
let modifier = null;
if (suffix == "dernier") {
modifier = "last";
} else if (suffix == "prochain") {
modifier = "next";
}
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier);
return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year());
}
}
exports.default = FRWeekdayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class FRMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(à|a|-)\s*$/i;
}
}
exports.default = FRMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/fr/refiners/FRMergeDateTimeRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"));
class FRMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
patternBetween() {
return new RegExp("^\\s*(T|à|a|vers|de|,|-)?\\s*$");
}
}
exports.default = FRMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/ja/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/ja/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.toHankaku = void 0;
function toHankaku(text) {
return String(text).replace(/\u2019/g, "\u0027").replace(/\u201D/g, "\u0022").replace(/\u3000/g, "\u0020").replace(/\uFFE5/g, "\u00A5").replace(/[\uFF01\uFF03-\uFF06\uFF08\uFF09\uFF0C-\uFF19\uFF1C-\uFF1F\uFF21-\uFF3B\uFF3D\uFF3F\uFF41-\uFF5B\uFF5D\uFF5E]/g, alphaNum);
}
exports.toHankaku = toHankaku;
function alphaNum(token) {
return String.fromCharCode(token.charCodeAt(0) - 65248);
}
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/ja/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/ja/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
const JPStandardParser_1 = __importDefault(__webpack_require__(/*! ./parsers/JPStandardParser */ "./node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js"));
const JPMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/JPMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js"));
const JPCasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/JPCasualDateParser */ "./node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js"));
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
exports.casual = new chrono_1.Chrono(createCasualConfiguration());
exports.strict = new chrono_1.Chrono(createConfiguration());
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration() {
const option = createConfiguration();
option.parsers.unshift(new JPCasualDateParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration() {
return {
parsers: [new JPStandardParser_1.default()],
refiners: [new JPMergeDateRangeRefiner_1.default()]
};
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/ja/parsers/JPCasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
const PATTERN = /今日|当日|昨日|明日|今夜|今夕|今晩|今朝/i;
class JPCasualDateParser {
pattern() {
return PATTERN;
}
extract(context, match) {
const text = match[0];
const date = dayjs_1.default(context.refDate);
const components = context.createParsingComponents();
switch (text) {
case "昨日":
return references.yesterday(context.reference);
case "明日":
return references.tomorrow(context.reference);
case "今日":
case "当日":
return references.today(context.reference);
}
if (text == "今夜" || text == "今夕" || text == "今晩") {
components.imply("hour", 22);
components.assign("meridiem", index_1.Meridiem.PM);
} else if (text.match("今朝")) {
components.imply("hour", 6);
components.assign("meridiem", index_1.Meridiem.AM);
}
components.assign("day", date.date());
components.assign("month", date.month() + 1);
components.assign("year", date.year());
return components;
}
}
exports.default = JPCasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js":
/*!******************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/ja/parsers/JPStandardParser.js ***!
\******************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/ja/constants.js");
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const PATTERN = /(?:(?:([同今本])|((昭和|平成|令和)?([0-9-]{1,4}|元)))年\s*)?([0-9-]{1,2})月\s*([0-9-]{1,2})日/i;
const SPECIAL_YEAR_GROUP = 1;
const TYPICAL_YEAR_GROUP = 2;
const ERA_GROUP = 3;
const YEAR_NUMBER_GROUP = 4;
const MONTH_GROUP = 5;
const DAY_GROUP = 6;
class JPStandardParser {
pattern() {
return PATTERN;
}
extract(context, match) {
const month = parseInt(constants_1.toHankaku(match[MONTH_GROUP]));
const day = parseInt(constants_1.toHankaku(match[DAY_GROUP]));
const components = context.createParsingComponents({
day: day,
month: month
});
if (match[SPECIAL_YEAR_GROUP] && match[SPECIAL_YEAR_GROUP].match("同|今|本")) {
const moment = dayjs_1.default(context.refDate);
components.assign("year", moment.year());
}
if (match[TYPICAL_YEAR_GROUP]) {
const yearNumText = match[YEAR_NUMBER_GROUP];
let year = yearNumText == "元" ? 1 : parseInt(constants_1.toHankaku(yearNumText));
if (match[ERA_GROUP] == "令和") {
year += 2018;
} else if (match[ERA_GROUP] == "平成") {
year += 1988;
} else if (match[ERA_GROUP] == "昭和") {
year += 1925;
}
components.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
components.imply("year", year);
}
return components;
}
}
exports.default = JPStandardParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/ja/refiners/JPMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class JPMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(から|ー|-)\s*$/i;
}
}
exports.default = JPMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseTimeUnits = exports.TIME_UNITS_PATTERN = exports.parseYear = exports.YEAR_PATTERN = exports.parseOrdinalNumberPattern = exports.ORDINAL_NUMBER_PATTERN = exports.parseNumberPattern = exports.NUMBER_PATTERN = exports.TIME_UNIT_DICTIONARY = exports.ORDINAL_WORD_DICTIONARY = exports.INTEGER_WORD_DICTIONARY = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
const pattern_1 = __webpack_require__(/*! ../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const years_1 = __webpack_require__(/*! ../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
exports.WEEKDAY_DICTIONARY = {
zondag: 0,
zon: 0,
"zon.": 0,
zo: 0,
"zo.": 0,
maandag: 1,
ma: 1,
"ma.": 1,
dinsdag: 2,
din: 2,
"din.": 2,
di: 2,
"di.": 2,
woensdag: 3,
woe: 3,
"woe.": 3,
wo: 3,
"wo.": 3,
donderdag: 4,
dond: 4,
"dond.": 4,
do: 4,
"do.": 4,
vrijdag: 5,
vrij: 5,
"vrij.": 5,
vr: 5,
"vr.": 5,
zaterdag: 6,
zat: 6,
"zat.": 6,
"za": 6,
"za.": 6
};
exports.MONTH_DICTIONARY = {
januari: 1,
jan: 1,
"jan.": 1,
februari: 2,
feb: 2,
"feb.": 2,
maart: 3,
mar: 3,
"mar.": 3,
april: 4,
apr: 4,
"apr.": 4,
mei: 5,
juni: 6,
jun: 6,
"jun.": 6,
juli: 7,
jul: 7,
"jul.": 7,
augustus: 8,
aug: 8,
"aug.": 8,
september: 9,
sep: 9,
"sep.": 9,
sept: 9,
"sept.": 9,
oktober: 10,
okt: 10,
"okt.": 10,
november: 11,
nov: 11,
"nov.": 11,
december: 12,
dec: 12,
"dec.": 12
};
exports.INTEGER_WORD_DICTIONARY = {
een: 1,
twee: 2,
drie: 3,
vier: 4,
vijf: 5,
zes: 6,
zeven: 7,
acht: 8,
negen: 9,
tien: 10,
elf: 11,
twaalf: 12
};
exports.ORDINAL_WORD_DICTIONARY = {
eerste: 1,
tweede: 2,
derde: 3,
vierde: 4,
vijfde: 5,
zesde: 6,
zevende: 7,
achtste: 8,
negende: 9,
tiende: 10,
elfde: 11,
twaalfde: 12,
dertiende: 13,
veertiende: 14,
vijftiende: 15,
zestiende: 16,
zeventiende: 17,
achttiende: 18,
negentiende: 19,
twintigste: 20,
"eenentwintigste": 21,
"tweeëntwintigste": 22,
"drieentwintigste": 23,
"vierentwintigste": 24,
"vijfentwintigste": 25,
"zesentwintigste": 26,
"zevenentwintigste": 27,
"achtentwintig": 28,
"negenentwintig": 29,
"dertigste": 30,
"eenendertigste": 31
};
exports.TIME_UNIT_DICTIONARY = {
sec: "second",
second: "second",
seconden: "second",
min: "minute",
mins: "minute",
minute: "minute",
minuten: "minute",
h: "hour",
hr: "hour",
hrs: "hour",
uur: "hour",
uren: "hour",
dag: "d",
dagen: "d",
week: "week",
weken: "week",
maand: "month",
maanden: "month",
jaar: "year",
jr: "year",
jaren: "year"
};
exports.NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.INTEGER_WORD_DICTIONARY)}|[0-9]+|[0-9]+\\.[0-9]+|een?|halve?)`;
function parseNumberPattern(match) {
const num = match.toLowerCase();
if (exports.INTEGER_WORD_DICTIONARY[num] !== undefined) {
return exports.INTEGER_WORD_DICTIONARY[num];
} else if (num === "een") {
return 1;
} else if (num.match(/halve?/)) {
return 0.5;
}
return parseFloat(num);
}
exports.parseNumberPattern = parseNumberPattern;
exports.ORDINAL_NUMBER_PATTERN = `(?:${pattern_1.matchAnyPattern(exports.ORDINAL_WORD_DICTIONARY)}|[0-9]{1,2}(?:ste|de)?)`;
function parseOrdinalNumberPattern(match) {
let num = match.toLowerCase();
if (exports.ORDINAL_WORD_DICTIONARY[num] !== undefined) {
return exports.ORDINAL_WORD_DICTIONARY[num];
}
num = num.replace(/(?:ste|de)$/i, "");
return parseInt(num);
}
exports.parseOrdinalNumberPattern = parseOrdinalNumberPattern;
exports.YEAR_PATTERN = `(?:[1-9][0-9]{0,3}\\s*(?:voor Christus|na Christus)|[1-2][0-9]{3}|[5-9][0-9])`;
function parseYear(match) {
if (/voor Christus/i.test(match)) {
match = match.replace(/voor Christus/i, "");
return -parseInt(match);
}
if (/na Christus/i.test(match)) {
match = match.replace(/na Christus/i, "");
return parseInt(match);
}
const rawYearNumber = parseInt(match);
return years_1.findMostLikelyADYear(rawYearNumber);
}
exports.parseYear = parseYear;
const SINGLE_TIME_UNIT_PATTERN = `(${exports.NUMBER_PATTERN})\\s{0,5}(${pattern_1.matchAnyPattern(exports.TIME_UNIT_DICTIONARY)})\\s{0,5}`;
const SINGLE_TIME_UNIT_REGEX = new RegExp(SINGLE_TIME_UNIT_PATTERN, "i");
exports.TIME_UNITS_PATTERN = pattern_1.repeatedTimeunitPattern(`(?:(?:binnen|in)\\s*)?`, SINGLE_TIME_UNIT_PATTERN);
function parseTimeUnits(timeunitText) {
const fragments = {};
let remainingText = timeunitText;
let match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
while (match) {
collectDateTimeFragment(fragments, match);
remainingText = remainingText.substring(match[0].length);
match = SINGLE_TIME_UNIT_REGEX.exec(remainingText);
}
return fragments;
}
exports.parseTimeUnits = parseTimeUnits;
function collectDateTimeFragment(fragments, match) {
const num = parseNumberPattern(match[1]);
const unit = exports.TIME_UNIT_DICTIONARY[match[2].toLowerCase()];
fragments[unit] = num;
}
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
const configurations_1 = __webpack_require__(/*! ../../configurations */ "./node_modules/chrono-node/dist/configurations.js");
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
const NLMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/NLMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js"));
const NLMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/NLMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js"));
const NLCasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLCasualDateParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js"));
const NLCasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLCasualTimeParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js"));
const SlashDateFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/SlashDateFormatParser */ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"));
const NLTimeUnitWithinFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLTimeUnitWithinFormatParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js"));
const NLWeekdayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLWeekdayParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js"));
const NLMonthNameMiddleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLMonthNameMiddleEndianParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js"));
const NLMonthNameParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLMonthNameParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js"));
const NLSlashMonthFormatParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLSlashMonthFormatParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js"));
const NLTimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLTimeExpressionParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js"));
const NLCasualYearMonthDayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLCasualYearMonthDayParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js"));
const NLCasualDateTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/NLCasualDateTimeParser */ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js"));
exports.casual = new chrono_1.Chrono(createCasualConfiguration());
exports.strict = new chrono_1.Chrono(createConfiguration(true));
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.unshift(new NLCasualDateParser_1.default());
option.parsers.unshift(new NLCasualTimeParser_1.default());
option.parsers.unshift(new NLCasualDateTimeParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration(strictMode = true, littleEndian = true) {
return configurations_1.includeCommonConfiguration({
parsers: [new SlashDateFormatParser_1.default(littleEndian), new NLMonthNameMiddleEndianParser_1.default(), new NLMonthNameParser_1.default(), new NLTimeExpressionParser_1.default(), new NLTimeUnitWithinFormatParser_1.default(), new NLSlashMonthFormatParser_1.default(), new NLWeekdayParser_1.default(), new NLCasualYearMonthDayParser_1.default()],
refiners: [new NLMergeDateTimeRefiner_1.default(), new NLMergeDateRangeRefiner_1.default()]
}, strictMode);
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
class NLCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(nu|vandaag|morgen|morgend|gisteren)(?=\W|$)/i;
}
innerExtract(context, match) {
const lowerText = match[0].toLowerCase();
const component = context.createParsingComponents();
switch (lowerText) {
case "nu":
return references.now(context.reference);
case "vandaag":
return references.today(context.reference);
case "morgen":
case "morgend":
return references.tomorrow(context.reference);
case "gisteren":
return references.yesterday(context.reference);
}
return component;
}
}
exports.default = NLCasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualDateTimeParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const dayjs_1 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const dayjs_2 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const DATE_GROUP = 1;
const TIME_OF_DAY_GROUP = 2;
class NLCasualDateTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(gisteren|morgen|van)(ochtend|middag|namiddag|avond|nacht)(?=\W|$)/i;
}
innerExtract(context, match) {
const dateText = match[DATE_GROUP].toLowerCase();
const timeText = match[TIME_OF_DAY_GROUP].toLowerCase();
const component = context.createParsingComponents();
const targetDate = dayjs_2.default(context.refDate);
switch (dateText) {
case "gisteren":
dayjs_1.assignSimilarDate(component, targetDate.add(-1, "day"));
break;
case "van":
dayjs_1.assignSimilarDate(component, targetDate);
break;
case "morgen":
dayjs_1.assignTheNextDay(component, targetDate);
break;
}
switch (timeText) {
case "ochtend":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 6);
break;
case "middag":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 12);
break;
case "namiddag":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 15);
break;
case "avond":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 20);
break;
}
return component;
}
}
exports.default = NLCasualDateTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualTimeParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const dayjs_2 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const DAY_GROUP = 1;
const MOMENT_GROUP = 2;
class NLCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return /(deze)?\s*(namiddag|avond|middernacht|ochtend|middag|'s middags|'s avonds|'s ochtends)(?=\W|$)/i;
}
innerExtract(context, match) {
const targetDate = dayjs_1.default(context.refDate);
const component = context.createParsingComponents();
if (match[DAY_GROUP] === "deze") {
component.assign("day", context.refDate.getDate());
component.assign("month", context.refDate.getMonth() + 1);
component.assign("year", context.refDate.getFullYear());
}
switch (match[MOMENT_GROUP].toLowerCase()) {
case "namiddag":
case "'s namiddags":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 15);
break;
case "avond":
case "'s avonds'":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 20);
break;
case "middernacht":
dayjs_2.assignTheNextDay(component, targetDate);
component.imply("hour", 0);
component.imply("minute", 0);
component.imply("second", 0);
break;
case "ochtend":
case "'s ochtends":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 6);
break;
case "middag":
case "'s middags":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 12);
break;
}
return component;
}
}
exports.default = NLCasualTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js":
/*!****************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLCasualYearMonthDayParser.js ***!
\****************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`([0-9]{4})[\\.\\/\\s]` + `(?:(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})|([0-9]{1,2}))[\\.\\/\\s]` + `([0-9]{1,2})` + "(?=\\W|$)", "i");
const YEAR_NUMBER_GROUP = 1;
const MONTH_NAME_GROUP = 2;
const MONTH_NUMBER_GROUP = 3;
const DATE_NUMBER_GROUP = 4;
class NLCasualYearMonthDayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const month = match[MONTH_NUMBER_GROUP] ? parseInt(match[MONTH_NUMBER_GROUP]) : constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
if (month < 1 || month > 12) {
return null;
}
const year = parseInt(match[YEAR_NUMBER_GROUP]);
const day = parseInt(match[DATE_NUMBER_GROUP]);
return {
day: day,
month: month,
year: year
};
}
}
exports.default = NLCasualYearMonthDayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameMiddleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const constants_3 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("(?:on\\s*?)?" + `(${constants_2.ORDINAL_NUMBER_PATTERN})` + "(?:\\s*" + "(?:tot|\\-|\\|until|through|till|\\s)\\s*" + `(${constants_2.ORDINAL_NUMBER_PATTERN})` + ")?" + "(?:-|/|\\s*(?:of)?\\s*)" + "(" + pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY) + ")" + "(?:" + "(?:-|/|,?\\s*)" + `(${constants_3.YEAR_PATTERN}(?![^\\s]\\d))` + ")?" + "(?=\\W|$)", "i");
const MONTH_NAME_GROUP = 3;
const DATE_GROUP = 1;
const DATE_TO_GROUP = 2;
const YEAR_GROUP = 4;
class NLMonthNameMiddleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = constants_2.parseOrdinalNumberPattern(match[DATE_GROUP]);
if (day > 31) {
match.index = match.index + match[DATE_GROUP].length;
return null;
}
const components = context.createParsingComponents({
day: day,
month: month
});
if (match[YEAR_GROUP]) {
const year = constants_3.parseYear(match[YEAR_GROUP]);
components.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
components.imply("year", year);
}
if (!match[DATE_TO_GROUP]) {
return components;
}
const endDate = constants_2.parseOrdinalNumberPattern(match[DATE_TO_GROUP]);
const result = context.createParsingResult(match.index, match[0]);
result.start = components;
result.end = components.clone();
result.end.assign("day", endDate);
return result;
}
}
exports.default = NLMonthNameMiddleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js":
/*!*******************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLMonthNameParser.js ***!
\*******************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + `\\s*` + `(?:` + `[,-]?\\s*(${constants_2.YEAR_PATTERN})?` + ")?" + "(?=[^\\s\\w]|\\s+[^0-9]|\\s+$|$)", "i");
const MONTH_NAME_GROUP = 1;
const YEAR_GROUP = 2;
class NLMonthNameParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const components = context.createParsingComponents();
components.imply("day", 1);
const monthName = match[MONTH_NAME_GROUP];
const month = constants_1.MONTH_DICTIONARY[monthName.toLowerCase()];
components.assign("month", month);
if (match[YEAR_GROUP]) {
const year = constants_2.parseYear(match[YEAR_GROUP]);
components.assign("year", year);
} else {
const year = years_1.findYearClosestToRef(context.refDate, 1, month);
components.imply("year", year);
}
return components;
}
}
exports.default = NLMonthNameParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLSlashMonthFormatParser.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp("([0-9]|0[1-9]|1[012])/([0-9]{4})" + "", "i");
const MONTH_GROUP = 1;
const YEAR_GROUP = 2;
class NLSlashMonthFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const year = parseInt(match[YEAR_GROUP]);
const month = parseInt(match[MONTH_GROUP]);
return context.createParsingComponents().imply("day", 1).assign("month", month).assign("year", year);
}
}
exports.default = NLSlashMonthFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeExpressionParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractTimeExpressionParser_1 = __webpack_require__(/*! ../../../common/parsers/AbstractTimeExpressionParser */ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js");
class NLTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
primaryPrefix() {
return "(?:(?:om)\\s*)?";
}
followingPhase() {
return "\\s*(?:\\-|\\|\\~|\\〜|om|\\?)\\s*";
}
extractPrimaryTimeComponents(context, match) {
if (match[0].match(/^\s*\d{4}\s*$/)) {
return null;
}
return super.extractPrimaryTimeComponents(context, match);
}
}
exports.default = NLTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js":
/*!******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLTimeUnitWithinFormatParser.js ***!
\******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const results_1 = __webpack_require__(/*! ../../../results */ "./node_modules/chrono-node/dist/results.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
class NLTimeUnitWithinFormatParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return new RegExp(`(?:binnen|in|binnen de|voor)\\s*` + "(" + constants_1.TIME_UNITS_PATTERN + ")" + `(?=\\W|$)`, "i");
}
innerExtract(context, match) {
const timeUnits = constants_1.parseTimeUnits(match[1]);
return results_1.ParsingComponents.createRelativeFromRefInstant(context.refDate, timeUnits);
}
}
exports.default = NLTimeUnitWithinFormatParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/parsers/NLWeekdayParser.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../../nl/constants */ "./node_modules/chrono-node/dist/locales/nl/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const weeks_1 = __webpack_require__(/*! ../../../calculation/weeks */ "./node_modules/chrono-node/dist/calculation/weeks.js");
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\)\\s*)?" + "(?:op\\s*?)?" + "(?:(deze|vorige|volgende)\\s*(?:week\\s*)?)?" + `(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + "(?=\\W|$)", "i");
const PREFIX_GROUP = 1;
const WEEKDAY_GROUP = 2;
const POSTFIX_GROUP = 3;
class NLWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek];
const prefix = match[PREFIX_GROUP];
const postfix = match[POSTFIX_GROUP];
let modifierWord = prefix || postfix;
modifierWord = modifierWord || "";
modifierWord = modifierWord.toLowerCase();
let modifier = null;
if (modifierWord == "vorige") {
modifier = "last";
} else if (modifierWord == "volgende") {
modifier = "next";
} else if (modifierWord == "deze") {
modifier = "this";
}
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier);
return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year());
}
}
exports.default = NLWeekdayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class NLMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(tot|-)\s*$/i;
}
}
exports.default = NLMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/nl/refiners/NLMergeDateTimeRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"));
class NLMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
patternBetween() {
return new RegExp("^\\s*(om|na|voor|in de|,|-)?\\s*$");
}
}
exports.default = NLMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/constants.js":
/*!***************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/constants.js ***!
\***************************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.parseYear = exports.YEAR_PATTERN = exports.MONTH_DICTIONARY = exports.WEEKDAY_DICTIONARY = void 0;
exports.WEEKDAY_DICTIONARY = {
"domingo": 0,
"dom": 0,
"segunda": 1,
"segunda-feira": 1,
"seg": 1,
"terça": 2,
"terça-feira": 2,
"ter": 2,
"quarta": 3,
"quarta-feira": 3,
"qua": 3,
"quinta": 4,
"quinta-feira": 4,
"qui": 4,
"sexta": 5,
"sexta-feira": 5,
"sex": 5,
"sábado": 6,
"sabado": 6,
"sab": 6
};
exports.MONTH_DICTIONARY = {
"janeiro": 1,
"jan": 1,
"jan.": 1,
"fevereiro": 2,
"fev": 2,
"fev.": 2,
"março": 3,
"mar": 3,
"mar.": 3,
"abril": 4,
"abr": 4,
"abr.": 4,
"maio": 5,
"mai": 5,
"mai.": 5,
"junho": 6,
"jun": 6,
"jun.": 6,
"julho": 7,
"jul": 7,
"jul.": 7,
"agosto": 8,
"ago": 8,
"ago.": 8,
"setembro": 9,
"set": 9,
"set.": 9,
"outubro": 10,
"out": 10,
"out.": 10,
"novembro": 11,
"nov": 11,
"nov.": 11,
"dezembro": 12,
"dez": 12,
"dez.": 12
};
exports.YEAR_PATTERN = "[0-9]{1,4}(?![^\\s]\\d)(?:\\s*[a|d]\\.?\\s*c\\.?|\\s*a\\.?\\s*d\\.?)?";
function parseYear(match) {
if (match.match(/^[0-9]{1,4}$/)) {
let yearNumber = parseInt(match);
if (yearNumber < 100) {
if (yearNumber > 50) {
yearNumber = yearNumber + 1900;
} else {
yearNumber = yearNumber + 2000;
}
}
return yearNumber;
}
if (match.match(/a\.?\s*c\.?/i)) {
match = match.replace(/a\.?\s*c\.?/i, "");
return -parseInt(match);
}
return parseInt(match);
}
exports.parseYear = parseYear;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/index.js":
/*!***********************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/index.js ***!
\***********************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.createConfiguration = exports.createCasualConfiguration = exports.parseDate = exports.parse = exports.strict = exports.casual = void 0;
const configurations_1 = __webpack_require__(/*! ../../configurations */ "./node_modules/chrono-node/dist/configurations.js");
const chrono_1 = __webpack_require__(/*! ../../chrono */ "./node_modules/chrono-node/dist/chrono.js");
const SlashDateFormatParser_1 = __importDefault(__webpack_require__(/*! ../../common/parsers/SlashDateFormatParser */ "./node_modules/chrono-node/dist/common/parsers/SlashDateFormatParser.js"));
const PTWeekdayParser_1 = __importDefault(__webpack_require__(/*! ./parsers/PTWeekdayParser */ "./node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js"));
const PTTimeExpressionParser_1 = __importDefault(__webpack_require__(/*! ./parsers/PTTimeExpressionParser */ "./node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js"));
const PTMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/PTMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js"));
const PTMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ./refiners/PTMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js"));
const PTMonthNameLittleEndianParser_1 = __importDefault(__webpack_require__(/*! ./parsers/PTMonthNameLittleEndianParser */ "./node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js"));
const PTCasualDateParser_1 = __importDefault(__webpack_require__(/*! ./parsers/PTCasualDateParser */ "./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js"));
const PTCasualTimeParser_1 = __importDefault(__webpack_require__(/*! ./parsers/PTCasualTimeParser */ "./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js"));
exports.casual = new chrono_1.Chrono(createCasualConfiguration());
exports.strict = new chrono_1.Chrono(createConfiguration(true));
function parse(text, ref, option) {
return exports.casual.parse(text, ref, option);
}
exports.parse = parse;
function parseDate(text, ref, option) {
return exports.casual.parseDate(text, ref, option);
}
exports.parseDate = parseDate;
function createCasualConfiguration(littleEndian = true) {
const option = createConfiguration(false, littleEndian);
option.parsers.push(new PTCasualDateParser_1.default());
option.parsers.push(new PTCasualTimeParser_1.default());
return option;
}
exports.createCasualConfiguration = createCasualConfiguration;
function createConfiguration(strictMode = true, littleEndian = true) {
return configurations_1.includeCommonConfiguration({
parsers: [new SlashDateFormatParser_1.default(littleEndian), new PTWeekdayParser_1.default(), new PTTimeExpressionParser_1.default(), new PTMonthNameLittleEndianParser_1.default()],
refiners: [new PTMergeDateTimeRefiner_1.default(), new PTMergeDateRangeRefiner_1.default()]
}, strictMode);
}
exports.createConfiguration = createConfiguration;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualDateParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
enumerable: true,
get: function () {
return m[k];
}
});
} : function (o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
});
var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
Object.defineProperty(o, "default", {
enumerable: true,
value: v
});
} : function (o, v) {
o["default"] = v;
});
var __importStar = this && this.__importStar || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const references = __importStar(__webpack_require__(/*! ../../../common/casualReferences */ "./node_modules/chrono-node/dist/common/casualReferences.js"));
class PTCasualDateParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern(context) {
return /(agora|hoje|amanha|amanhã|ontem)(?=\W|$)/i;
}
innerExtract(context, match) {
const lowerText = match[0].toLowerCase();
const component = context.createParsingComponents();
switch (lowerText) {
case "agora":
return references.now(context.reference);
case "hoje":
return references.today(context.reference);
case "amanha":
case "amanhã":
return references.tomorrow(context.reference);
case "ontem":
return references.yesterday(context.reference);
}
return component;
}
}
exports.default = PTCasualDateParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js":
/*!********************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/parsers/PTCasualTimeParser.js ***!
\********************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const index_1 = __webpack_require__(/*! ../../../index */ "./node_modules/chrono-node/dist/index.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const dayjs_1 = __webpack_require__(/*! ../../../utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const dayjs_2 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
class PTCasualTimeParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return /(?:esta\s*)?(manha|manhã|tarde|meia-noite|meio-dia|noite)(?=\W|$)/i;
}
innerExtract(context, match) {
const targetDate = dayjs_2.default(context.refDate);
const component = context.createParsingComponents();
switch (match[1].toLowerCase()) {
case "tarde":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 15);
break;
case "noite":
component.imply("meridiem", index_1.Meridiem.PM);
component.imply("hour", 22);
break;
case "manha":
case "manhã":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 6);
break;
case "meia-noite":
dayjs_1.assignTheNextDay(component, targetDate);
component.imply("hour", 0);
component.imply("minute", 0);
component.imply("second", 0);
break;
case "meio-dia":
component.imply("meridiem", index_1.Meridiem.AM);
component.imply("hour", 12);
break;
}
return component;
}
}
exports.default = PTCasualTimeParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js":
/*!*******************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/parsers/PTMonthNameLittleEndianParser.js ***!
\*******************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const years_1 = __webpack_require__(/*! ../../../calculation/years */ "./node_modules/chrono-node/dist/calculation/years.js");
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/pt/constants.js");
const constants_2 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/pt/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const PATTERN = new RegExp(`([0-9]{1,2})(?:º|ª|°)?` + "(?:\\s*(?:desde|de|\\-|\\|ao?|\\s)\\s*([0-9]{1,2})(?:º|ª|°)?)?\\s*(?:de)?\\s*" + `(?:-|/|\\s*(?:de|,)?\\s*)` + `(${pattern_1.matchAnyPattern(constants_1.MONTH_DICTIONARY)})` + `(?:\\s*(?:de|,)?\\s*(${constants_2.YEAR_PATTERN}))?` + `(?=\\W|$)`, "i");
const DATE_GROUP = 1;
const DATE_TO_GROUP = 2;
const MONTH_NAME_GROUP = 3;
const YEAR_GROUP = 4;
class PTMonthNameLittleEndianParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const result = context.createParsingResult(match.index, match[0]);
const month = constants_1.MONTH_DICTIONARY[match[MONTH_NAME_GROUP].toLowerCase()];
const day = parseInt(match[DATE_GROUP]);
if (day > 31) {
match.index = match.index + match[DATE_GROUP].length;
return null;
}
result.start.assign("month", month);
result.start.assign("day", day);
if (match[YEAR_GROUP]) {
const yearNumber = constants_2.parseYear(match[YEAR_GROUP]);
result.start.assign("year", yearNumber);
} else {
const year = years_1.findYearClosestToRef(context.refDate, day, month);
result.start.imply("year", year);
}
if (match[DATE_TO_GROUP]) {
const endDate = parseInt(match[DATE_TO_GROUP]);
result.end = result.start.clone();
result.end.assign("day", endDate);
}
return result;
}
}
exports.default = PTMonthNameLittleEndianParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js":
/*!************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/parsers/PTTimeExpressionParser.js ***!
\************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractTimeExpressionParser_1 = __webpack_require__(/*! ../../../common/parsers/AbstractTimeExpressionParser */ "./node_modules/chrono-node/dist/common/parsers/AbstractTimeExpressionParser.js");
class PTTimeExpressionParser extends AbstractTimeExpressionParser_1.AbstractTimeExpressionParser {
primaryPrefix() {
return "(?:(?:ao?|às?|das|da|de|do)\\s*)?";
}
followingPhase() {
return "\\s*(?:\\-|\\|\\~|\\〜|a(?:o)?|\\?)\\s*";
}
}
exports.default = PTTimeExpressionParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js":
/*!*****************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/parsers/PTWeekdayParser.js ***!
\*****************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const constants_1 = __webpack_require__(/*! ../constants */ "./node_modules/chrono-node/dist/locales/pt/constants.js");
const pattern_1 = __webpack_require__(/*! ../../../utils/pattern */ "./node_modules/chrono-node/dist/utils/pattern.js");
const AbstractParserWithWordBoundary_1 = __webpack_require__(/*! ../../../common/parsers/AbstractParserWithWordBoundary */ "./node_modules/chrono-node/dist/common/parsers/AbstractParserWithWordBoundary.js");
const weeks_1 = __webpack_require__(/*! ../../../calculation/weeks */ "./node_modules/chrono-node/dist/calculation/weeks.js");
const PATTERN = new RegExp("(?:(?:\\,|\\(|\\)\\s*)?" + "(?:(este|esta|passado|pr[oó]ximo)\\s*)?" + `(${pattern_1.matchAnyPattern(constants_1.WEEKDAY_DICTIONARY)})` + "(?:\\s*(?:\\,|\\)|\\))?" + "(?:\\s*(este|esta|passado|pr[óo]ximo)\\s*semana)?" + "(?=\\W|\\d|$)", "i");
const PREFIX_GROUP = 1;
const WEEKDAY_GROUP = 2;
const POSTFIX_GROUP = 3;
class PTWeekdayParser extends AbstractParserWithWordBoundary_1.AbstractParserWithWordBoundaryChecking {
innerPattern() {
return PATTERN;
}
innerExtract(context, match) {
const dayOfWeek = match[WEEKDAY_GROUP].toLowerCase();
const offset = constants_1.WEEKDAY_DICTIONARY[dayOfWeek];
if (offset === undefined) {
return null;
}
const prefix = match[PREFIX_GROUP];
const postfix = match[POSTFIX_GROUP];
let norm = prefix || postfix || "";
norm = norm.toLowerCase();
let modifier = null;
if (norm == "passado") {
modifier = "this";
} else if (norm == "próximo" || norm == "proximo") {
modifier = "next";
} else if (norm == "este") {
modifier = "this";
}
const date = weeks_1.toDayJSWeekday(context.refDate, offset, modifier);
return context.createParsingComponents().assign("weekday", offset).imply("day", date.date()).imply("month", date.month() + 1).imply("year", date.year());
}
}
exports.default = PTWeekdayParser;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js":
/*!**************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateRangeRefiner.js ***!
\**************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateRangeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateRangeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateRangeRefiner.js"));
class PTMergeDateRangeRefiner extends AbstractMergeDateRangeRefiner_1.default {
patternBetween() {
return /^\s*(?:-)\s*$/i;
}
}
exports.default = PTMergeDateRangeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js":
/*!*************************************************************************************!*\
!*** ./node_modules/chrono-node/dist/locales/pt/refiners/PTMergeDateTimeRefiner.js ***!
\*************************************************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
const AbstractMergeDateTimeRefiner_1 = __importDefault(__webpack_require__(/*! ../../../common/refiners/AbstractMergeDateTimeRefiner */ "./node_modules/chrono-node/dist/common/refiners/AbstractMergeDateTimeRefiner.js"));
class PTMergeDateTimeRefiner extends AbstractMergeDateTimeRefiner_1.default {
patternBetween() {
return new RegExp("^\\s*(?:,|à)?\\s*$");
}
}
exports.default = PTMergeDateTimeRefiner;
/***/ }),
/***/ "./node_modules/chrono-node/dist/results.js":
/*!**************************************************!*\
!*** ./node_modules/chrono-node/dist/results.js ***!
\**************************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
"use strict";
var __importDefault = this && this.__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.ParsingResult = exports.ParsingComponents = exports.ReferenceWithTimezone = void 0;
const quarterOfYear_1 = __importDefault(__webpack_require__(/*! dayjs/plugin/quarterOfYear */ "./node_modules/dayjs/plugin/quarterOfYear.js"));
const dayjs_1 = __importDefault(__webpack_require__(/*! dayjs */ "./node_modules/dayjs/dayjs.min.js"));
const dayjs_2 = __webpack_require__(/*! ./utils/dayjs */ "./node_modules/chrono-node/dist/utils/dayjs.js");
const timezone_1 = __webpack_require__(/*! ./timezone */ "./node_modules/chrono-node/dist/timezone.js");
dayjs_1.default.extend(quarterOfYear_1.default);
class ReferenceWithTimezone {
constructor(input) {
var _a, _b;
input = input !== null && input !== void 0 ? input : new Date();
if (input instanceof Date) {
this.instant = input;
this.timezoneOffset = -input.getTimezoneOffset();
} else {
this.instant = (_a = input.instant) !== null && _a !== void 0 ? _a : new Date();
this.timezoneOffset = timezone_1.toTimezoneOffset((_b = input.timezone) !== null && _b !== void 0 ? _b : -this.instant.getTimezoneOffset());
}
}
}
exports.ReferenceWithTimezone = ReferenceWithTimezone;
class ParsingComponents {
constructor(reference, knownComponents) {
this.reference = reference;
this.knownValues = {};
this.impliedValues = {};
if (knownComponents) {
for (const key in knownComponents) {
this.knownValues[key] = knownComponents[key];
}
}
const refDayJs = dayjs_1.default(reference.instant);
this.imply("day", refDayJs.date());
this.imply("month", refDayJs.month() + 1);
this.imply("year", refDayJs.year());
this.imply("hour", 12);
this.imply("minute", 0);
this.imply("second", 0);
this.imply("millisecond", 0);
}
get(component) {
if (component in this.knownValues) {
return this.knownValues[component];
}
if (component in this.impliedValues) {
return this.impliedValues[component];
}
return null;
}
isCertain(component) {
return component in this.knownValues;
}
getCertainComponents() {
return Object.keys(this.knownValues);
}
imply(component, value) {
if (component in this.knownValues) {
return this;
}
this.impliedValues[component] = value;
return this;
}
assign(component, value) {
this.knownValues[component] = value;
delete this.impliedValues[component];
return this;
}
delete(component) {
delete this.knownValues[component];
delete this.impliedValues[component];
}
clone() {
const component = new ParsingComponents(this.reference);
component.knownValues = {};
component.impliedValues = {};
for (const key in this.knownValues) {
component.knownValues[key] = this.knownValues[key];
}
for (const key in this.impliedValues) {
component.impliedValues[key] = this.impliedValues[key];
}
return component;
}
isOnlyDate() {
return !this.isCertain("hour") && !this.isCertain("minute") && !this.isCertain("second");
}
isOnlyTime() {
return !this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month");
}
isOnlyWeekdayComponent() {
return this.isCertain("weekday") && !this.isCertain("day") && !this.isCertain("month");
}
isOnlyDayMonthComponent() {
return this.isCertain("day") && this.isCertain("month") && !this.isCertain("year");
}
isValidDate() {
const date = this.dateWithoutTimezoneAdjustment();
if (date.getFullYear() !== this.get("year")) return false;
if (date.getMonth() !== this.get("month") - 1) return false;
if (date.getDate() !== this.get("day")) return false;
if (this.get("hour") != null && date.getHours() != this.get("hour")) return false;
if (this.get("minute") != null && date.getMinutes() != this.get("minute")) return false;
return true;
}
toString() {
return `[ParsingComponents {knownValues: ${JSON.stringify(this.knownValues)}, impliedValues: ${JSON.stringify(this.impliedValues)}}]`;
}
dayjs() {
return dayjs_1.default(this.date());
}
date() {
const date = this.dateWithoutTimezoneAdjustment();
return new Date(date.getTime() + this.getSystemTimezoneAdjustmentMinute() * 60000);
}
dateWithoutTimezoneAdjustment() {
const date = new Date(this.get("year"), this.get("month") - 1, this.get("day"), this.get("hour"), this.get("minute"), this.get("second"), this.get("millisecond"));
date.setFullYear(this.get("year"));
return date;
}
getSystemTimezoneAdjustmentMinute() {
var _a;
const currentTimezoneOffset = -new Date().getTimezoneOffset();
const targetTimezoneOffset = (_a = this.get("timezoneOffset")) !== null && _a !== void 0 ? _a : this.reference.timezoneOffset;
return currentTimezoneOffset - targetTimezoneOffset;
}
static createRelativeFromRefInstant(refInstant, fragments) {
let date = dayjs_1.default(refInstant);
for (const key in fragments) {
date = date.add(fragments[key], key);
}
const reference = new ReferenceWithTimezone(refInstant);
const components = new ParsingComponents(reference);
if (fragments["hour"] || fragments["minute"] || fragments["second"]) {
dayjs_2.assignSimilarTime(components, date);
dayjs_2.assignSimilarDate(components, date);
components.assign("timezoneOffset", -refInstant.getTimezoneOffset());
} else {
dayjs_2.implySimilarTime(components, date);
components.imply("timezoneOffset", -refInstant.getTimezoneOffset());
if (fragments["d"]) {
components.assign("day", date.date());
components.assign("month", date.month() + 1);
components.assign("year", date.year());
} else {
if (fragments["week"]) {
components.imply("weekday", date.day());
}
components.imply("day", date.date());
if (fragments["month"]) {
components.assign("month", date.month() + 1);
components.assign("year", date.year());
} else {
components.imply("month", date.month() + 1);
if (fragments["year"]) {
components.assign("year", date.year());
} else {
components.imply("year", date.year());
}
}
}
}
return components;
}
}
exports.ParsingComponents = ParsingComponents;
class ParsingResult {
constructor(reference, index, text, start, end) {
this.reference = reference;
this.refDate = reference.instant;
this.index = index;
this.text = text;
this.start = start || new ParsingComponents(reference);
this.end = end;
}
clone() {
const result = new ParsingResult(this.reference, this.index, this.text);
result.start = this.start ? this.start.clone() : null;
result.end = this.end ? this.end.clone() : null;
return result;
}
date() {
return this.start.date();
}
toString() {
return `[ParsingResult {index: ${this.index}, text: '${this.text}', ...}]`;
}
}
exports.ParsingResult = ParsingResult;
/***/ }),
/***/ "./node_modules/chrono-node/dist/timezone.js":
/*!***************************************************!*\
!*** ./node_modules/chrono-node/dist/timezone.js ***!
\***************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.toTimezoneOffset = exports.TIMEZONE_ABBR_MAP = void 0;
exports.TIMEZONE_ABBR_MAP = {
ACDT: 630,
ACST: 570,
ADT: -180,
AEDT: 660,
AEST: 600,
AFT: 270,
AKDT: -480,
AKST: -540,
ALMT: 360,
AMST: -180,
AMT: -240,
ANAST: 720,
ANAT: 720,
AQTT: 300,
ART: -180,
AST: -240,
AWDT: 540,
AWST: 480,
AZOST: 0,
AZOT: -60,
AZST: 300,
AZT: 240,
BNT: 480,
BOT: -240,
BRST: -120,
BRT: -180,
BST: 60,
BTT: 360,
CAST: 480,
CAT: 120,
CCT: 390,
CDT: -300,
CEST: 120,
CET: 60,
CHADT: 825,
CHAST: 765,
CKT: -600,
CLST: -180,
CLT: -240,
COT: -300,
CST: -360,
CVT: -60,
CXT: 420,
ChST: 600,
DAVT: 420,
EASST: -300,
EAST: -360,
EAT: 180,
ECT: -300,
EDT: -240,
EEST: 180,
EET: 120,
EGST: 0,
EGT: -60,
EST: -300,
ET: -300,
FJST: 780,
FJT: 720,
FKST: -180,
FKT: -240,
FNT: -120,
GALT: -360,
GAMT: -540,
GET: 240,
GFT: -180,
GILT: 720,
GMT: 0,
GST: 240,
GYT: -240,
HAA: -180,
HAC: -300,
HADT: -540,
HAE: -240,
HAP: -420,
HAR: -360,
HAST: -600,
HAT: -90,
HAY: -480,
HKT: 480,
HLV: -210,
HNA: -240,
HNC: -360,
HNE: -300,
HNP: -480,
HNR: -420,
HNT: -150,
HNY: -540,
HOVT: 420,
ICT: 420,
IDT: 180,
IOT: 360,
IRDT: 270,
IRKST: 540,
IRKT: 540,
IRST: 210,
IST: 330,
JST: 540,
KGT: 360,
KRAST: 480,
KRAT: 480,
KST: 540,
KUYT: 240,
LHDT: 660,
LHST: 630,
LINT: 840,
MAGST: 720,
MAGT: 720,
MART: -510,
MAWT: 300,
MDT: -360,
MESZ: 120,
MEZ: 60,
MHT: 720,
MMT: 390,
MSD: 240,
MSK: 240,
MST: -420,
MUT: 240,
MVT: 300,
MYT: 480,
NCT: 660,
NDT: -90,
NFT: 690,
NOVST: 420,
NOVT: 360,
NPT: 345,
NST: -150,
NUT: -660,
NZDT: 780,
NZST: 720,
OMSST: 420,
OMST: 420,
PDT: -420,
PET: -300,
PETST: 720,
PETT: 720,
PGT: 600,
PHOT: 780,
PHT: 480,
PKT: 300,
PMDT: -120,
PMST: -180,
PONT: 660,
PST: -480,
PT: -480,
PWT: 540,
PYST: -180,
PYT: -240,
RET: 240,
SAMT: 240,
SAST: 120,
SBT: 660,
SCT: 240,
SGT: 480,
SRT: -180,
SST: -660,
TAHT: -600,
TFT: 300,
TJT: 300,
TKT: 780,
TLT: 540,
TMT: 300,
TVT: 720,
ULAT: 480,
UTC: 0,
UYST: -120,
UYT: -180,
UZT: 300,
VET: -210,
VLAST: 660,
VLAT: 660,
VUT: 660,
WAST: 120,
WAT: 60,
WEST: 60,
WESZ: 60,
WET: 0,
WEZ: 0,
WFT: 720,
WGST: -120,
WGT: -180,
WIB: 420,
WIT: 540,
WITA: 480,
WST: 780,
WT: 0,
YAKST: 600,
YAKT: 600,
YAPT: 600,
YEKST: 360,
YEKT: 360
};
function toTimezoneOffset(timezoneInput) {
var _a;
if (typeof timezoneInput === "number") {
return timezoneInput;
}
return (_a = exports.TIMEZONE_ABBR_MAP[timezoneInput]) !== null && _a !== void 0 ? _a : 0;
}
exports.toTimezoneOffset = toTimezoneOffset;
/***/ }),
/***/ "./node_modules/chrono-node/dist/utils/dayjs.js":
/*!******************************************************!*\
!*** ./node_modules/chrono-node/dist/utils/dayjs.js ***!
\******************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.implySimilarTime = exports.assignSimilarTime = exports.assignSimilarDate = exports.assignTheNextDay = void 0;
function assignTheNextDay(component, targetDayJs) {
targetDayJs = targetDayJs.add(1, "day");
assignSimilarDate(component, targetDayJs);
implySimilarTime(component, targetDayJs);
}
exports.assignTheNextDay = assignTheNextDay;
function assignSimilarDate(component, targetDayJs) {
component.assign("day", targetDayJs.date());
component.assign("month", targetDayJs.month() + 1);
component.assign("year", targetDayJs.year());
}
exports.assignSimilarDate = assignSimilarDate;
function assignSimilarTime(component, targetDayJs) {
component.assign("hour", targetDayJs.hour());
component.assign("minute", targetDayJs.minute());
component.assign("second", targetDayJs.second());
component.assign("millisecond", targetDayJs.millisecond());
}
exports.assignSimilarTime = assignSimilarTime;
function implySimilarTime(component, targetDayJs) {
component.imply("hour", targetDayJs.hour());
component.imply("minute", targetDayJs.minute());
component.imply("second", targetDayJs.second());
component.imply("millisecond", targetDayJs.millisecond());
}
exports.implySimilarTime = implySimilarTime;
/***/ }),
/***/ "./node_modules/chrono-node/dist/utils/pattern.js":
/*!********************************************************!*\
!*** ./node_modules/chrono-node/dist/utils/pattern.js ***!
\********************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.matchAnyPattern = exports.extractTerms = exports.repeatedTimeunitPattern = void 0;
function repeatedTimeunitPattern(prefix, singleTimeunitPattern) {
const singleTimeunitPatternNoCapture = singleTimeunitPattern.replace(/\((?!\?)/g, "(?:");
return `${prefix}${singleTimeunitPatternNoCapture}\\s*(?:,?\\s{0,5}${singleTimeunitPatternNoCapture}){0,10}`;
}
exports.repeatedTimeunitPattern = repeatedTimeunitPattern;
function extractTerms(dictionary) {
let keys;
if (dictionary instanceof Array) {
keys = [...dictionary];
} else if (dictionary instanceof Map) {
keys = Array.from(dictionary.keys());
} else {
keys = Object.keys(dictionary);
}
return keys;
}
exports.extractTerms = extractTerms;
function matchAnyPattern(dictionary) {
const joinedTerms = extractTerms(dictionary).sort((a, b) => b.length - a.length).join("|").replace(/\./g, "\\.");
return `(?:${joinedTerms})`;
}
exports.matchAnyPattern = matchAnyPattern;
/***/ }),
/***/ "./node_modules/chrono-node/dist/utils/timeunits.js":
/*!**********************************************************!*\
!*** ./node_modules/chrono-node/dist/utils/timeunits.js ***!
\**********************************************************/
/***/ (function(__unused_webpack_module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports.addImpliedTimeUnits = exports.reverseTimeUnits = void 0;
function reverseTimeUnits(timeUnits) {
const reversed = {};
for (const key in timeUnits) {
reversed[key] = -timeUnits[key];
}
return reversed;
}
exports.reverseTimeUnits = reverseTimeUnits;
function addImpliedTimeUnits(components, timeUnits) {
const output = components.clone();
let date = components.dayjs();
for (const key in timeUnits) {
date = date.add(timeUnits[key], key);
}
if ("day" in timeUnits || "d" in timeUnits || "week" in timeUnits || "month" in timeUnits || "year" in timeUnits) {
output.imply("day", date.date());
output.imply("month", date.month() + 1);
output.imply("year", date.year());
}
if ("second" in timeUnits || "minute" in timeUnits || "hour" in timeUnits) {
output.imply("second", date.second());
output.imply("minute", date.minute());
output.imply("hour", date.hour());
}
return output;
}
exports.addImpliedTimeUnits = addImpliedTimeUnits;
/***/ }),
/***/ "./node_modules/css-loader/dist/runtime/api.js":
/*!*****************************************************!*\
!*** ./node_modules/css-loader/dist/runtime/api.js ***!
\*****************************************************/
/***/ (function(module) {
"use strict";
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
// eslint-disable-next-line func-names
module.exports = function (cssWithMappingToString) {
var list = []; // return the list of modules as css string
list.toString = function toString() {
return this.map(function (item) {
var content = cssWithMappingToString(item);
if (item[2]) {
return "@media ".concat(item[2], " {").concat(content, "}");
}
return content;
}).join("");
}; // import a list of modules into the list
// eslint-disable-next-line func-names
list.i = function (modules, mediaQuery, dedupe) {
if (typeof modules === "string") {
// eslint-disable-next-line no-param-reassign
modules = [[null, modules, ""]];
}
var alreadyImportedModules = {};
if (dedupe) {
for (var i = 0; i < this.length; i++) {
// eslint-disable-next-line prefer-destructuring
var id = this[i][0];
if (id != null) {
alreadyImportedModules[id] = true;
}
}
}
for (var _i = 0; _i < modules.length; _i++) {
var item = [].concat(modules[_i]);
if (dedupe && alreadyImportedModules[item[0]]) {
// eslint-disable-next-line no-continue
continue;
}
if (mediaQuery) {
if (!item[2]) {
item[2] = mediaQuery;
} else {
item[2] = "".concat(mediaQuery, " and ").concat(item[2]);
}
}
list.push(item);
}
};
return list;
};
/***/ }),
/***/ "./node_modules/css-loader/dist/runtime/cssWithMappingToString.js":
/*!************************************************************************!*\
!*** ./node_modules/css-loader/dist/runtime/cssWithMappingToString.js ***!
\************************************************************************/
/***/ (function(module) {
"use strict";
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for (var i = 0, arr2 = new Array(len); i < len; i++) {
arr2[i] = arr[i];
}
return arr2;
}
function _iterableToArrayLimit(arr, i) {
var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
module.exports = function cssWithMappingToString(item) {
var _item = _slicedToArray(item, 4),
content = _item[1],
cssMapping = _item[3];
if (typeof btoa === "function") {
// eslint-disable-next-line no-undef
var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
var sourceMapping = "/*# ".concat(data, " */");
var sourceURLs = cssMapping.sources.map(function (source) {
return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");
});
return [content].concat(sourceURLs).concat([sourceMapping]).join("\n");
}
return [content].join("\n");
};
/***/ }),
/***/ "./node_modules/dayjs/dayjs.min.js":
/*!*****************************************!*\
!*** ./node_modules/dayjs/dayjs.min.js ***!
\*****************************************/
/***/ (function(module) {
!function (t, e) {
true ? module.exports = e() : 0;
}(this, function () {
"use strict";
var t = 1e3,
e = 6e4,
n = 36e5,
r = "millisecond",
i = "second",
s = "minute",
u = "hour",
a = "day",
o = "week",
f = "month",
h = "quarter",
c = "year",
d = "date",
$ = "Invalid Date",
l = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,
y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,
M = {
name: "en",
weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_")
},
m = function (t, e, n) {
var r = String(t);
return !r || r.length >= e ? t : "" + Array(e + 1 - r.length).join(n) + t;
},
g = {
s: m,
z: function (t) {
var e = -t.utcOffset(),
n = Math.abs(e),
r = Math.floor(n / 60),
i = n % 60;
return (e <= 0 ? "+" : "-") + m(r, 2, "0") + ":" + m(i, 2, "0");
},
m: function t(e, n) {
if (e.date() < n.date()) return -t(n, e);
var r = 12 * (n.year() - e.year()) + (n.month() - e.month()),
i = e.clone().add(r, f),
s = n - i < 0,
u = e.clone().add(r + (s ? -1 : 1), f);
return +(-(r + (n - i) / (s ? i - u : u - i)) || 0);
},
a: function (t) {
return t < 0 ? Math.ceil(t) || 0 : Math.floor(t);
},
p: function (t) {
return {
M: f,
y: c,
w: o,
d: a,
D: d,
h: u,
m: s,
s: i,
ms: r,
Q: h
}[t] || String(t || "").toLowerCase().replace(/s$/, "");
},
u: function (t) {
return void 0 === t;
}
},
D = "en",
v = {};
v[D] = M;
var p = function (t) {
return t instanceof _;
},
S = function (t, e, n) {
var r;
if (!t) return D;
if ("string" == typeof t) v[t] && (r = t), e && (v[t] = e, r = t);else {
var i = t.name;
v[i] = t, r = i;
}
return !n && r && (D = r), r || !n && D;
},
w = function (t, e) {
if (p(t)) return t.clone();
var n = "object" == typeof e ? e : {};
return n.date = t, n.args = arguments, new _(n);
},
O = g;
O.l = S, O.i = p, O.w = function (t, e) {
return w(t, {
locale: e.$L,
utc: e.$u,
x: e.$x,
$offset: e.$offset
});
};
var _ = function () {
function M(t) {
this.$L = S(t.locale, null, !0), this.parse(t);
}
var m = M.prototype;
return m.parse = function (t) {
this.$d = function (t) {
var e = t.date,
n = t.utc;
if (null === e) return new Date(NaN);
if (O.u(e)) return new Date();
if (e instanceof Date) return new Date(e);
if ("string" == typeof e && !/Z$/i.test(e)) {
var r = e.match(l);
if (r) {
var i = r[2] - 1 || 0,
s = (r[7] || "0").substring(0, 3);
return n ? new Date(Date.UTC(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s)) : new Date(r[1], i, r[3] || 1, r[4] || 0, r[5] || 0, r[6] || 0, s);
}
}
return new Date(e);
}(t), this.$x = t.x || {}, this.init();
}, m.init = function () {
var t = this.$d;
this.$y = t.getFullYear(), this.$M = t.getMonth(), this.$D = t.getDate(), this.$W = t.getDay(), this.$H = t.getHours(), this.$m = t.getMinutes(), this.$s = t.getSeconds(), this.$ms = t.getMilliseconds();
}, m.$utils = function () {
return O;
}, m.isValid = function () {
return !(this.$d.toString() === $);
}, m.isSame = function (t, e) {
var n = w(t);
return this.startOf(e) <= n && n <= this.endOf(e);
}, m.isAfter = function (t, e) {
return w(t) < this.startOf(e);
}, m.isBefore = function (t, e) {
return this.endOf(e) < w(t);
}, m.$g = function (t, e, n) {
return O.u(t) ? this[e] : this.set(n, t);
}, m.unix = function () {
return Math.floor(this.valueOf() / 1e3);
}, m.valueOf = function () {
return this.$d.getTime();
}, m.startOf = function (t, e) {
var n = this,
r = !!O.u(e) || e,
h = O.p(t),
$ = function (t, e) {
var i = O.w(n.$u ? Date.UTC(n.$y, e, t) : new Date(n.$y, e, t), n);
return r ? i : i.endOf(a);
},
l = function (t, e) {
return O.w(n.toDate()[t].apply(n.toDate("s"), (r ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e)), n);
},
y = this.$W,
M = this.$M,
m = this.$D,
g = "set" + (this.$u ? "UTC" : "");
switch (h) {
case c:
return r ? $(1, 0) : $(31, 11);
case f:
return r ? $(1, M) : $(0, M + 1);
case o:
var D = this.$locale().weekStart || 0,
v = (y < D ? y + 7 : y) - D;
return $(r ? m - v : m + (6 - v), M);
case a:
case d:
return l(g + "Hours", 0);
case u:
return l(g + "Minutes", 1);
case s:
return l(g + "Seconds", 2);
case i:
return l(g + "Milliseconds", 3);
default:
return this.clone();
}
}, m.endOf = function (t) {
return this.startOf(t, !1);
}, m.$set = function (t, e) {
var n,
o = O.p(t),
h = "set" + (this.$u ? "UTC" : ""),
$ = (n = {}, n[a] = h + "Date", n[d] = h + "Date", n[f] = h + "Month", n[c] = h + "FullYear", n[u] = h + "Hours", n[s] = h + "Minutes", n[i] = h + "Seconds", n[r] = h + "Milliseconds", n)[o],
l = o === a ? this.$D + (e - this.$W) : e;
if (o === f || o === c) {
var y = this.clone().set(d, 1);
y.$d[$](l), y.init(), this.$d = y.set(d, Math.min(this.$D, y.daysInMonth())).$d;
} else $ && this.$d[$](l);
return this.init(), this;
}, m.set = function (t, e) {
return this.clone().$set(t, e);
}, m.get = function (t) {
return this[O.p(t)]();
}, m.add = function (r, h) {
var d,
$ = this;
r = Number(r);
var l = O.p(h),
y = function (t) {
var e = w($);
return O.w(e.date(e.date() + Math.round(t * r)), $);
};
if (l === f) return this.set(f, this.$M + r);
if (l === c) return this.set(c, this.$y + r);
if (l === a) return y(1);
if (l === o) return y(7);
var M = (d = {}, d[s] = e, d[u] = n, d[i] = t, d)[l] || 1,
m = this.$d.getTime() + r * M;
return O.w(m, this);
}, m.subtract = function (t, e) {
return this.add(-1 * t, e);
}, m.format = function (t) {
var e = this;
if (!this.isValid()) return $;
var n = t || "YYYY-MM-DDTHH:mm:ssZ",
r = O.z(this),
i = this.$locale(),
s = this.$H,
u = this.$m,
a = this.$M,
o = i.weekdays,
f = i.months,
h = function (t, r, i, s) {
return t && (t[r] || t(e, n)) || i[r].substr(0, s);
},
c = function (t) {
return O.s(s % 12 || 12, t, "0");
},
d = i.meridiem || function (t, e, n) {
var r = t < 12 ? "AM" : "PM";
return n ? r.toLowerCase() : r;
},
l = {
YY: String(this.$y).slice(-2),
YYYY: this.$y,
M: a + 1,
MM: O.s(a + 1, 2, "0"),
MMM: h(i.monthsShort, a, f, 3),
MMMM: h(f, a),
D: this.$D,
DD: O.s(this.$D, 2, "0"),
d: String(this.$W),
dd: h(i.weekdaysMin, this.$W, o, 2),
ddd: h(i.weekdaysShort, this.$W, o, 3),
dddd: o[this.$W],
H: String(s),
HH: O.s(s, 2, "0"),
h: c(1),
hh: c(2),
a: d(s, u, !0),
A: d(s, u, !1),
m: String(u),
mm: O.s(u, 2, "0"),
s: String(this.$s),
ss: O.s(this.$s, 2, "0"),
SSS: O.s(this.$ms, 3, "0"),
Z: r
};
return n.replace(y, function (t, e) {
return e || l[t] || r.replace(":", "");
});
}, m.utcOffset = function () {
return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
}, m.diff = function (r, d, $) {
var l,
y = O.p(d),
M = w(r),
m = (M.utcOffset() - this.utcOffset()) * e,
g = this - M,
D = O.m(this, M);
return D = (l = {}, l[c] = D / 12, l[f] = D, l[h] = D / 3, l[o] = (g - m) / 6048e5, l[a] = (g - m) / 864e5, l[u] = g / n, l[s] = g / e, l[i] = g / t, l)[y] || g, $ ? D : O.a(D);
}, m.daysInMonth = function () {
return this.endOf(f).$D;
}, m.$locale = function () {
return v[this.$L];
}, m.locale = function (t, e) {
if (!t) return this.$L;
var n = this.clone(),
r = S(t, e, !0);
return r && (n.$L = r), n;
}, m.clone = function () {
return O.w(this.$d, this);
}, m.toDate = function () {
return new Date(this.valueOf());
}, m.toJSON = function () {
return this.isValid() ? this.toISOString() : null;
}, m.toISOString = function () {
return this.$d.toISOString();
}, m.toString = function () {
return this.$d.toUTCString();
}, M;
}(),
b = _.prototype;
return w.prototype = b, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function (t) {
b[t[1]] = function (e) {
return this.$g(e, t[0], t[1]);
};
}), w.extend = function (t, e) {
return t.$i || (t(e, _, w), t.$i = !0), w;
}, w.locale = S, w.isDayjs = p, w.unix = function (t) {
return w(1e3 * t);
}, w.en = v[D], w.Ls = v, w.p = {}, w;
});
/***/ }),
/***/ "./node_modules/dayjs/plugin/quarterOfYear.js":
/*!****************************************************!*\
!*** ./node_modules/dayjs/plugin/quarterOfYear.js ***!
\****************************************************/
/***/ (function(module) {
!function (t, n) {
true ? module.exports = n() : 0;
}(this, function () {
"use strict";
var t = "month",
n = "quarter";
return function (e, i) {
var r = i.prototype;
r.quarter = function (t) {
return this.$utils().u(t) ? Math.ceil((this.month() + 1) / 3) : this.month(this.month() % 3 + 3 * (t - 1));
};
var s = r.add;
r.add = function (e, i) {
return e = Number(e), this.$utils().p(i) === n ? this.add(3 * e, t) : s.bind(this)(e, i);
};
var u = r.startOf;
r.startOf = function (e, i) {
var r = this.$utils(),
s = !!r.u(i) || i;
if (r.p(e) === n) {
var o = this.quarter() - 1;
return s ? this.month(3 * o).startOf(t).startOf("day") : this.month(3 * o + 2).endOf(t).endOf("day");
}
return u.bind(this)(e, i);
};
};
});
/***/ }),
/***/ "./src/debounce.js":
/*!*************************!*\
!*** ./src/debounce.js ***!
\*************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "debounce": function() { return /* binding */ debounce; }
/* harmony export */ });
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
}
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js!./src/status.css":
/*!**************************************************************!*\
!*** ./node_modules/css-loader/dist/cjs.js!./src/status.css ***!
\**************************************************************/
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/cssWithMappingToString.js */ "./node_modules/css-loader/dist/runtime/cssWithMappingToString.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
// Imports
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_cssWithMappingToString_js__WEBPACK_IMPORTED_MODULE_0___default()));
// Module
___CSS_LOADER_EXPORT___.push([module.id, ".tapi-dropdown {\n position: relative;\n display: inline-block;\n}\n\n.tapi-dropdown-content {\n display: none;\n position: absolute;\n min-width: 200px;\n overflow: auto;\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n z-index: 1;\n color: #000;\n}\n\n.show {\n display: block;\n}\n", "",{"version":3,"sources":["webpack://./src/status.css"],"names":[],"mappings":"AAAA;IACI,kBAAkB;IAClB,qBAAqB;AACzB;;AAEA;IACI,aAAa;IACb,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,4CAA4C;IAC5C,UAAU;IACV,WAAW;AACf;;AAEA;IACI,cAAc;AAClB","sourcesContent":[".tapi-dropdown {\n position: relative;\n display: inline-block;\n}\n\n.tapi-dropdown-content {\n display: none;\n position: absolute;\n min-width: 200px;\n overflow: auto;\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n z-index: 1;\n color: #000;\n}\n\n.show {\n display: block;\n}\n"],"sourceRoot":""}]);
// Exports
/* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___);
/***/ }),
/***/ "./src/status.css":
/*!************************!*\
!*** ./src/status.css ***!
\************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _node_modules_css_loader_dist_cjs_js_status_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./status.css */ "./node_modules/css-loader/dist/cjs.js!./src/status.css");
var options = {};
options.insert = "head";
options.singleton = false;
var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_status_css__WEBPACK_IMPORTED_MODULE_1__.default, options);
/* harmony default export */ __webpack_exports__["default"] = (_node_modules_css_loader_dist_cjs_js_status_css__WEBPACK_IMPORTED_MODULE_1__.default.locals || {});
/***/ }),
/***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
/*!****************************************************************************!*\
!*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
\****************************************************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
"use strict";
var isOldIE = function isOldIE() {
var memo;
return function memorize() {
if (typeof memo === 'undefined') {
// Test for IE <= 9 as proposed by Browserhacks
// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
// Tests for existence of standard globals is to allow style-loader
// to operate correctly into non-standard environments
// @see https://github.com/webpack-contrib/style-loader/issues/177
memo = Boolean(window && document && document.all && !window.atob);
}
return memo;
};
}();
var getTarget = function getTarget() {
var memo = {};
return function memorize(target) {
if (typeof memo[target] === 'undefined') {
var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
try {
// This will throw an exception if access to iframe is blocked
// due to cross-origin restrictions
styleTarget = styleTarget.contentDocument.head;
} catch (e) {
// istanbul ignore next
styleTarget = null;
}
}
memo[target] = styleTarget;
}
return memo[target];
};
}();
var stylesInDom = [];
function getIndexByIdentifier(identifier) {
var result = -1;
for (var i = 0; i < stylesInDom.length; i++) {
if (stylesInDom[i].identifier === identifier) {
result = i;
break;
}
}
return result;
}
function modulesToDom(list, options) {
var idCountMap = {};
var identifiers = [];
for (var i = 0; i < list.length; i++) {
var item = list[i];
var id = options.base ? item[0] + options.base : item[0];
var count = idCountMap[id] || 0;
var identifier = "".concat(id, " ").concat(count);
idCountMap[id] = count + 1;
var index = getIndexByIdentifier(identifier);
var obj = {
css: item[1],
media: item[2],
sourceMap: item[3]
};
if (index !== -1) {
stylesInDom[index].references++;
stylesInDom[index].updater(obj);
} else {
stylesInDom.push({
identifier: identifier,
updater: addStyle(obj, options),
references: 1
});
}
identifiers.push(identifier);
}
return identifiers;
}
function insertStyleElement(options) {
var style = document.createElement('style');
var attributes = options.attributes || {};
if (typeof attributes.nonce === 'undefined') {
var nonce = true ? __webpack_require__.nc : 0;
if (nonce) {
attributes.nonce = nonce;
}
}
Object.keys(attributes).forEach(function (key) {
style.setAttribute(key, attributes[key]);
});
if (typeof options.insert === 'function') {
options.insert(style);
} else {
var target = getTarget(options.insert || 'head');
if (!target) {
throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
}
target.appendChild(style);
}
return style;
}
function removeStyleElement(style) {
// istanbul ignore if
if (style.parentNode === null) {
return false;
}
style.parentNode.removeChild(style);
}
/* istanbul ignore next */
var replaceText = function replaceText() {
var textStore = [];
return function replace(index, replacement) {
textStore[index] = replacement;
return textStore.filter(Boolean).join('\n');
};
}();
function applyToSingletonTag(style, index, remove, obj) {
var css = remove ? '' : obj.media ? "@media ".concat(obj.media, " {").concat(obj.css, "}") : obj.css; // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = replaceText(index, css);
} else {
var cssNode = document.createTextNode(css);
var childNodes = style.childNodes;
if (childNodes[index]) {
style.removeChild(childNodes[index]);
}
if (childNodes.length) {
style.insertBefore(cssNode, childNodes[index]);
} else {
style.appendChild(cssNode);
}
}
}
function applyToTag(style, options, obj) {
var css = obj.css;
var media = obj.media;
var sourceMap = obj.sourceMap;
if (media) {
style.setAttribute('media', media);
} else {
style.removeAttribute('media');
}
if (sourceMap && typeof btoa !== 'undefined') {
css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
} // For old IE
/* istanbul ignore if */
if (style.styleSheet) {
style.styleSheet.cssText = css;
} else {
while (style.firstChild) {
style.removeChild(style.firstChild);
}
style.appendChild(document.createTextNode(css));
}
}
var singleton = null;
var singletonCounter = 0;
function addStyle(obj, options) {
var style;
var update;
var remove;
if (options.singleton) {
var styleIndex = singletonCounter++;
style = singleton || (singleton = insertStyleElement(options));
update = applyToSingletonTag.bind(null, style, styleIndex, false);
remove = applyToSingletonTag.bind(null, style, styleIndex, true);
} else {
style = insertStyleElement(options);
update = applyToTag.bind(null, style, options);
remove = function remove() {
removeStyleElement(style);
};
}
update(obj);
return function updateStyle(newObj) {
if (newObj) {
if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {
return;
}
update(obj = newObj);
} else {
remove();
}
};
}
module.exports = function (list, options) {
options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
// tags it will allow on a page
if (!options.singleton && typeof options.singleton !== 'boolean') {
options.singleton = isOldIE();
}
list = list || [];
var lastIdentifiers = modulesToDom(list, options);
return function update(newList) {
newList = newList || [];
if (Object.prototype.toString.call(newList) !== '[object Array]') {
return;
}
for (var i = 0; i < lastIdentifiers.length; i++) {
var identifier = lastIdentifiers[i];
var index = getIndexByIdentifier(identifier);
stylesInDom[index].references--;
}
var newLastIdentifiers = modulesToDom(newList, options);
for (var _i = 0; _i < lastIdentifiers.length; _i++) {
var _identifier = lastIdentifiers[_i];
var _index = getIndexByIdentifier(_identifier);
if (stylesInDom[_index].references === 0) {
stylesInDom[_index].updater();
stylesInDom.splice(_index, 1);
}
}
lastIdentifiers = newLastIdentifiers;
};
};
/***/ }),
/***/ "./src/call-history.ts":
/*!*****************************!*\
!*** ./src/call-history.ts ***!
\*****************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "CallHistory": function() { return /* binding */ CallHistory; }
/* harmony export */ });
/* harmony import */ var chrono_node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! chrono-node */ "./node_modules/chrono-node/dist/index.js");
/* harmony import */ var chrono_node__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chrono_node__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
class CallHistory {
constructor() {
this.callerIds = {};
}
updateCallHistoryEntry(call, callerId) {
var span = call.querySelector('span');
this.showTimeManager(call, span.nextSibling.textContent.trim(), callerId);
if (callerId && callerId.tD_NAME !== '') {
var text = span.textContent;
span.textContent = callerId.tD_NAME;
var br = document.createElement('br');
var span2 = document.createElement('span');
span2.style.fontSize = 'small';
span2.textContent = text;
span.parentNode.insertBefore(br, span.nextSibling);
span.parentNode.insertBefore(span2, span.nextSibling);
}
}
showTimeManager(call, date, callerId) {
var dateParts = date.match(/^(?<date>.*), (?<duration>[0-9]{2}:[0-9]{2}:[0-9]{2})$/);
var duration = '00:00:00';
if (dateParts) {
date = dateParts.groups.date;
duration = dateParts.groups.duration;
}
var parsedDate = chrono_node__WEBPACK_IMPORTED_MODULE_0__.de.parseDate(date);
if (!parsedDate) {
parsedDate = chrono_node__WEBPACK_IMPORTED_MODULE_0__.parseDate(date);
}
if (!parsedDate) {
return;
}
// Date parsing is awful, just assume the first number is the day of month
var day = date.match(/[0-9]+/)[0];
var parsedDuration = chrono_node__WEBPACK_IMPORTED_MODULE_0__.parseDate(duration);
console.log('TAPI call history time:', date, 'parsedDate:', parsedDate, 'duration:', duration, 'parsedDuration:', parsedDuration);
var connect = parsedDate.getFullYear().toString() +
(parsedDate.getMonth() + 1).toString().padStart(2, '0') + // (January gives 0)
day.toString().padStart(2, '0') +
parsedDate.getHours().toString().padStart(2, '0') +
parsedDate.getMinutes().toString().padStart(2, '0');
var length = (parsedDuration.getHours() * 60 + parsedDuration.getMinutes()).toString();
var toolbar = call.querySelector('.wcToolbarTiles');
var href = 'domizil://PM/Zeitbuchung?';
if (callerId && callerId.tD_ID) {
href += 'KontaktId=' + callerId.tD_ID + '&';
}
href += 'connect=' + connect + '&length=' + length;
var a = document.createElement('a');
a.title = 'PM Zeitbuchung';
a.dataset.domizilLink = href;
a.onclick = () => {
window.open(href);
};
a.innerHTML = '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 559.98 559.98" width="20" height="20">' +
'<g>' +
' <g>' +
' <path d="M279.99,0C125.601,0,0,125.601,0,279.99c0,154.39,125.601,279.99,279.99,279.99c154.39,0,279.99-125.601,279.99-279.99' +
' C559.98,125.601,434.38,0,279.99,0z M279.99,498.78c-120.644,0-218.79-98.146-218.79-218.79' +
' c0-120.638,98.146-218.79,218.79-218.79s218.79,98.152,218.79,218.79C498.78,400.634,400.634,498.78,279.99,498.78z"/>' +
' <path d="M304.226,280.326V162.976c0-13.103-10.618-23.721-23.716-23.721c-13.102,0-23.721,10.618-23.721,23.721v124.928' +
' c0,0.373,0.092,0.723,0.11,1.096c-0.312,6.45,1.91,12.999,6.836,17.926l88.343,88.336c9.266,9.266,24.284,9.266,33.543,0' +
' c9.26-9.266,9.266-24.284,0-33.544L304.226,280.326z"/>' +
' </g>' +
'</g>' +
'</svg>';
toolbar.insertBefore(a, toolbar.firstChild);
}
showCallHistory(element) {
return __awaiter(this, void 0, void 0, function* () {
var span = element.querySelector('span');
var number = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.extractNumber)(span.textContent);
if (!number) {
this.updateCallHistoryEntry(element, undefined);
return;
}
if (this.callerIds[number] !== undefined) {
this.updateCallHistoryEntry(element, this.callerIds[number]);
}
else {
var response = yield _utils__WEBPACK_IMPORTED_MODULE_1__.axios.get('http://cpatapi.cpsrvweb2016.cp-austria.at/callerid/' + encodeURIComponent(number));
var callerId = { tD_NAME: '' };
if (response.status === 200) {
callerId = response.data;
}
console.log('TAPI call histroy callerid response', number, response, callerId);
this.callerIds[number] = callerId;
this.updateCallHistoryEntry(element, callerId);
}
});
}
}
/***/ }),
/***/ "./src/call-notification.ts":
/*!**********************************!*\
!*** ./src/call-notification.ts ***!
\**********************************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "CallNotification": function() { return /* binding */ CallNotification; }
/* harmony export */ });
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
class CallNotification {
showCallNotification(element) {
return __awaiter(this, void 0, void 0, function* () {
var number = element.dataset.id;
console.log('TAPI call notification', number);
number = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.extractNumber)(number);
if (!number) {
console.log('TAPI callerid no number found');
return;
}
console.log('TAPI searching callerid for', number);
var response = yield _utils__WEBPACK_IMPORTED_MODULE_0__.axios.get('http://cpatapi.cpsrvweb2016.cp-austria.at/callerid/' + encodeURIComponent(number));
console.log('TAPI callerid response', response);
var notification = {
text: number
};
if (response.status === 200) {
var callerId = response.data;
if (callerId) {
notification.text = callerId.tD_NAME + '\r\n' + number + ' (' + callerId.tD_MEDIUM + ')';
}
}
// eslint-disable-next-line no-undef
GM.notification(notification);
});
}
}
/***/ }),
/***/ "./src/search.ts":
/*!***********************!*\
!*** ./src/search.ts ***!
\***********************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "Search": function() { return /* binding */ Search; }
/* harmony export */ });
/* harmony import */ var _debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debounce */ "./src/debounce.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
class Search {
constructor() {
this.currentSearchText = '';
this.doSearch = (0,_debounce__WEBPACK_IMPORTED_MODULE_0__.debounce)(() => __awaiter(this, void 0, void 0, function* () {
var search = document.getElementById('tapiSearchInput');
var searchText = search.value.trim();
if (searchText === '') {
this.removeSearchResults();
return;
}
else if (searchText === this.currentSearchText) {
return;
}
console.log('Searching TAPI');
var response = yield _utils__WEBPACK_IMPORTED_MODULE_1__.axios.get('http://cpatapi.cpsrvweb2016.cp-austria.at/search?query=' + encodeURIComponent(searchText));
console.log('TAPI Search response', response);
var contacts = response.data;
console.log('TAPI Contacts', contacts);
this.removeSearchResults();
this.currentSearchText = searchText;
var resultList = document.createElement('ul');
resultList.id = 'tapiResults';
resultList.classList.add('search-nav-absolute');
resultList.classList.add('search-nav-ul');
document.getElementById('tapiSearchBox').appendChild(resultList);
resultList.innerHTML = '';
contacts.forEach(contact => {
var li = document.createElement('li');
li.classList.add('tapi-search-result');
li.classList.add('search-result');
li.classList.add('pointer');
li.onmouseover = () => { this.selectResult(li); };
li.dataset.tapiNumber = contact.tD_NUMBER_TAPI;
li.onclick = () => { this.dial(contact.tD_NUMBER_TAPI); };
li.style.listStyle = 'outside none none'; // display: flex; align-items: center;
var resultText = document.createElement('div');
resultText.classList.add('search-result-txt');
li.appendChild(resultText);
var line1 = document.createElement('div');
line1.appendChild(document.createTextNode(contact.tD_NAME));
resultText.appendChild(line1);
var line2 = document.createElement('div');
line2.appendChild(document.createTextNode(contact.tD_MEDIUM + ': ' + contact.tD_NUMBER_TAPI));
resultText.appendChild(line2);
resultList.appendChild(li);
});
}), 200);
}
createSearchWindow(element) {
console.log('Create TAPI Search');
var form = document.createElement('form');
form.style.width = '200px';
form.style.float = 'right';
form.style.marginRight = '20px';
form.onsubmit = () => {
var items = document.getElementsByClassName('tapi-search-result-selected');
if (items.length === 0) {
items = document.getElementsByClassName('tapi-search-result');
}
if (items.length > 0) {
this.dial(items[0].dataset.tapiNumber);
}
return false;
};
var searchBox = document.createElement('div');
searchBox.classList.add('contact-search-box');
searchBox.id = 'tapiSearchBox';
form.appendChild(searchBox);
var searchWrapper = document.createElement('div');
searchWrapper.classList.add('search-input-wrapper');
searchWrapper.style.position = 'relative';
searchBox.appendChild(searchWrapper);
var search = document.createElement('input');
search.id = 'tapiSearchInput';
search.autocomplete = 'off';
search.classList.add('padder');
search.classList.add('rounded');
search.classList.add('bg-light');
search.classList.add('no-border');
search.classList.add('contact-search-box');
search.placeholder = 'TAPI Suche';
search.onfocus = () => { this.doSearch(); };
search.onkeydown = (ev) => { this.doSearchKeyDown(ev); };
search.onblur = () => {
console.log('TAPI Search exit', this);
setTimeout(() => {
console.log('TAPI clear search results');
this.removeSearchResults();
}, 500);
};
searchWrapper.appendChild(search);
var icon = document.createElement('span');
icon.classList.add('fa');
icon.classList.add('fa-search');
icon.classList.add('form-control-feedback');
icon.style.color = 'grey';
searchWrapper.appendChild(icon);
element.appendChild(form);
}
removeSearchResults() {
var resultList = document.getElementById('tapiResults');
if (resultList) {
resultList.parentNode.removeChild(resultList);
}
this.currentSearchText = '';
}
doSearchKeyDown(ev) {
if (ev.key === 'ArrowUp') {
let items = document.getElementsByClassName('tapi-search-result-selected');
if (items.length > 0) {
var prev = items[0].previousSibling;
}
if (!prev) {
items = document.getElementsByClassName('tapi-search-result');
if (items.length > 0) {
prev = items[items.length - 1];
}
}
if (prev) {
this.selectResult(prev);
prev.scrollIntoView(true);
}
}
else if (ev.key === 'ArrowDown') {
let items = document.getElementsByClassName('tapi-search-result-selected');
if (items.length > 0) {
var next = items[0].nextSibling;
}
if (!next) {
items = document.getElementsByClassName('tapi-search-result');
if (items.length > 0) {
next = items[0];
}
}
if (next) {
this.selectResult(next);
next.scrollIntoView(false);
}
}
else {
this.doSearch();
}
}
selectResult(resultLi) {
var items = document.getElementsByClassName('tapi-search-result');
for (var item of items) {
item.classList.remove('bg-light');
item.classList.remove('tapi-search-result-selected');
}
resultLi.classList.add('bg-light');
resultLi.classList.add('tapi-search-result-selected');
}
dial(number) {
var searchInput = document.getElementsByName('searchByNumberInput');
if (searchInput.length > 0) {
searchInput[0].value = number;
searchInput[0].focus();
(0,_utils__WEBPACK_IMPORTED_MODULE_1__.fireChangeEvents)(searchInput[0]);
}
}
}
/***/ }),
/***/ "./src/status.ts":
/*!***********************!*\
!*** ./src/status.ts ***!
\***********************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "Status": function() { return /* binding */ Status; }
/* harmony export */ });
/* harmony import */ var _status_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./status.css */ "./src/status.css");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/utils.ts");
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
class Status {
constructor() {
this._enabled = false;
this._statusOn = 'menuAvailable';
this._statusOff = 'menuAway';
this._currentStatus = undefined;
}
showStatus(element) {
return __awaiter(this, void 0, void 0, function* () {
this._user = yield GM.getValue('tapi-zc-user', '');
this._enabled = yield GM.getValue('tapi-zc-enabled', false);
this._statusOn = yield GM.getValue('tapi-zc-on', 'menuAvailable');
this._statusOff = yield GM.getValue('tapi-zc-off', 'menuAvailable');
console.log('tapi-zc-user', this._user, 'tapi-zc-enabled', this._enabled, 'tapi-zc-on', this._statusOn, 'tapi-zc-off', this._statusOff);
var div = document.createElement('div');
div.classList.add('tapi-dropdown');
var button = document.createElement('button');
button.id = 'tapi-zc-button';
button.classList.add('btn');
button.classList.add('btn-default');
button.innerText = 'ZeitConsens';
button.onclick = () => {
document.getElementById('tapi-zc-dropdown').classList.toggle('show');
};
div.appendChild(button);
var html = '<div class="form-group">' +
' <label for="tapi-zc-user">Username</label>' +
' <input type="text" class="form-control" name="tapi-zc-user" id="tapi-zc-user">' +
'</div>' +
'<div class="form-group">' +
' <label for="tapi-zc-on">Signed in</label>' +
' <select id="tapi-zc-on" class="form-control">' +
' <option value="menuAvailable">Available</option>' +
' <option value="menuOutofoffice">Do Not Disturb</option>' +
' <option value="menuCustom1">Verfügbar DW</option>' +
' </select>' +
'</div>' +
'<div class="form-group">' +
' <label for="tapi-zc-off">Signed in</label>' +
' <select id="tapi-zc-off" class="form-control">' +
' <option value="menuAway">Away</option>' +
' <option value="menuOutofoffice">Do Not Disturb</option>' +
' </select>' +
'</div>' +
'<div class="checkbox">' +
' <label class="i-checks" for="tapi-zc-enabled">' +
' <input type="checkbox" id="tapi-zc-enabled">' +
' <i></i><span>Enabled</span>' +
'</label>';
'</div>';
var dropdown = document.createElement('div');
dropdown.classList.add('tapi-dropdown-content');
dropdown.classList.add('panel-body');
dropdown.id = 'tapi-zc-dropdown';
dropdown.innerHTML = html;
div.appendChild(dropdown);
element.insertBefore(div, element.firstChild);
var zcUser = document.getElementById('tapi-zc-user');
zcUser.value = this._user;
zcUser.onchange = () => {
this._user = zcUser.value;
GM.setValue('tapi-zc-user', this._user);
console.log('tapi-zc-user', this._user);
this._currentStatus = undefined;
};
var zcEnabled = document.getElementById('tapi-zc-enabled');
zcEnabled.checked = this._enabled;
zcEnabled.onchange = () => {
this._enabled = zcEnabled.checked;
GM.setValue('tapi-zc-enabled', this._enabled);
console.log('tapi-zc-enabled', this._enabled);
this._currentStatus = undefined;
this.checkStatus();
};
var zcOn = document.getElementById('tapi-zc-on');
zcOn.value = this._statusOn;
zcOn.onchange = () => {
this._statusOn = zcOn.value;
GM.setValue('tapi-zc-on', this._statusOn);
console.log('tapi-zc-on', this._statusOn);
this._currentStatus = undefined;
};
var zcOff = document.getElementById('tapi-zc-off');
zcOff.value = this._statusOff;
zcOff.onchange = () => {
this._statusOff = zcOff.value;
GM.setValue('tapi-zc-off', this._statusOff);
console.log('tapi-zc-off', this._statusOff);
this._currentStatus = undefined;
};
this.checkStatus();
});
}
checkStatus() {
return __awaiter(this, void 0, void 0, function* () {
if (this._enabled) {
var response = yield _utils__WEBPACK_IMPORTED_MODULE_1__.axios.get('http://cpatapi.cpsrvweb2016.cp-austria.at/availability/' + encodeURIComponent(this._user));
if (response.status == 200) {
var status = response.data;
if (this._currentStatus !== status.loggedIn) {
this._currentStatus = status.loggedIn;
console.log('New status, loggedIn', this._currentStatus);
document.getElementsByClassName("current-status")[0].click();
setTimeout(() => {
var statusId = this._currentStatus ? this._statusOn : this._statusOff;
document.getElementById(statusId).click();
}, 1000);
}
}
setTimeout(() => this.checkStatus(), 10000);
}
});
}
}
/***/ }),
/***/ "./src/utils.ts":
/*!**********************!*\
!*** ./src/utils.ts ***!
\**********************/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "axios": function() { return /* reexport default from dynamic */ axios__WEBPACK_IMPORTED_MODULE_0___default.a; },
/* harmony export */ "extractNumber": function() { return /* binding */ extractNumber; },
/* harmony export */ "fireChangeEvents": function() { return /* binding */ fireChangeEvents; }
/* harmony export */ });
/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! axios */ "axios");
/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(axios__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var axios_userscript_adapter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios-userscript-adapter */ "axios-userscript-adapter");
/* harmony import */ var axios_userscript_adapter__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(axios_userscript_adapter__WEBPACK_IMPORTED_MODULE_1__);
/**
* @typedef {Object} AxiosResponse
* @property {Object} data
* @property {Object} headers
* @property {Object} config
* @property {Object} request
* @property {number} code
* @property {string} statusText
*/
/**
* @typedef {Object} AxiosError
* @property {AxiosResponse} response
*/
(axios__WEBPACK_IMPORTED_MODULE_0___default().defaults.adapter) = (axios_userscript_adapter__WEBPACK_IMPORTED_MODULE_1___default());
function extractNumber(s) {
var match = /(\+?[0-9]{4,})/.exec(s);
if (!match) {
return undefined;
}
var number = match[1];
if (number.startsWith('+')) {
number = number.replace('+', '00');
}
return number;
}
function fireChangeEvents(element) {
var changeEvent = null;
changeEvent = document.createEvent('HTMLEvents');
changeEvent.initEvent('input', true, true);
element.dispatchEvent(changeEvent);
console.debug('input event dispatched for element: ' + element.id);
changeEvent = document.createEvent('HTMLEvents');
changeEvent.initEvent('keyup', true, true);
element.dispatchEvent(changeEvent);
console.debug('keyup event dispatched for element: ' + element.id);
changeEvent = document.createEvent('HTMLEvents');
changeEvent.initEvent('change', true, true);
element.dispatchEvent(changeEvent);
console.debug('change event dispatched for element: ' + element.id);
}
/***/ }),
/***/ "axios":
/*!************************!*\
!*** external "axios" ***!
\************************/
/***/ (function(module) {
"use strict";
module.exports = axios;
/***/ }),
/***/ "axios-userscript-adapter":
/*!************************************!*\
!*** external "axiosGmxhrAdapter" ***!
\************************************/
/***/ (function(module) {
"use strict";
module.exports = axiosGmxhrAdapter;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ id: moduleId,
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
!function() {
"use strict";
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var chrono_node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! chrono-node */ "./node_modules/chrono-node/dist/index.js");
/* harmony import */ var chrono_node__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chrono_node__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _call_history__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./call-history */ "./src/call-history.ts");
/* harmony import */ var _call_notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./call-notification */ "./src/call-notification.ts");
/* harmony import */ var _search__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./search */ "./src/search.ts");
/* harmony import */ var _status__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./status */ "./src/status.ts");
// eslint-disable-next-line @typescript-eslint/no-unused-vars
console.log('script start');
const search = new _search__WEBPACK_IMPORTED_MODULE_3__.Search(); // eslint-disable-next-line no-undef
waitForKeyElements('div.nav-search', element => {
search.createSearchWindow(element);
}, true);
const callNotification = new _call_notification__WEBPACK_IMPORTED_MODULE_2__.CallNotification(); // eslint-disable-next-line no-undef
waitForKeyElements('call-view', element => {
callNotification.showCallNotification(element);
}, false);
const callHistory = new _call_history__WEBPACK_IMPORTED_MODULE_1__.CallHistory(); // eslint-disable-next-line no-undef
waitForKeyElements('.call-history-list call', element => {
callHistory.showCallHistory(element);
}, false);
const status = new _status__WEBPACK_IMPORTED_MODULE_4__.Status(); // eslint-disable-next-line no-undef
waitForKeyElements('#status-change', element => {
status.showStatus(element);
}, false);
}();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NhbGN1bGF0aW9uL21lcmdpbmdDYWxjdWxhdGlvbi5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NhbGN1bGF0aW9uL3dlZWtzLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY2FsY3VsYXRpb24veWVhcnMuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jaHJvbm8uanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vYWJzdHJhY3RSZWZpbmVycy5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5LmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9wYXJzZXJzL0lTT0Zvcm1hdFBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9wYXJzZXJzL1NsYXNoRGF0ZUZvcm1hdFBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvRm9yd2FyZERhdGVSZWZpbmVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL01lcmdlV2Vla2RheUNvbXBvbmVudFJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9jb21tb24vcmVmaW5lcnMvT3ZlcmxhcFJlbW92YWxSZWZpbmVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29tbW9uL3JlZmluZXJzL1VubGlrZWx5Rm9ybWF0RmlsdGVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvY29uZmlndXJhdGlvbnMuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvY29uc3RhbnRzLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9pbmRleC5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvcGFyc2Vycy9ERUNhc3VhbERhdGVQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2RlL3BhcnNlcnMvREVDYXN1YWxUaW1lUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9wYXJzZXJzL0RFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9wYXJzZXJzL0RFVGltZUV4cHJlc3Npb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2RlL3BhcnNlcnMvREVXZWVrZGF5UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9kZS9yZWZpbmVycy9ERU1lcmdlRGF0ZVJhbmdlUmVmaW5lci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZGUvcmVmaW5lcnMvREVNZXJnZURhdGVUaW1lUmVmaW5lci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vY29uc3RhbnRzLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9pbmRleC5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTkNhc3VhbERhdGVQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOTW9udGhOYW1lUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOU2xhc2hNb250aEZvcm1hdFBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVFeHByZXNzaW9uUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3BhcnNlcnMvRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcGFyc2Vycy9FTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9lbi9wYXJzZXJzL0VOV2Vla2RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZW4vcmVmaW5lcnMvRU5NZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2VuL3JlZmluZXJzL0VOTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJDYXN1YWxEYXRlUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSQ2FzdWFsVGltZVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3BhcnNlcnMvRlJUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcGFyc2Vycy9GUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9mci9wYXJzZXJzL0ZSV2Vla2RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvZnIvcmVmaW5lcnMvRlJNZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2ZyL3JlZmluZXJzL0ZSTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2phL2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvamEvaW5kZXguanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2phL3BhcnNlcnMvSlBDYXN1YWxEYXRlUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9qYS9wYXJzZXJzL0pQU3RhbmRhcmRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL2phL3JlZmluZXJzL0pQTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL2luZGV4LmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9wYXJzZXJzL05MQ2FzdWFsRGF0ZVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbERhdGVUaW1lUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9wYXJzZXJzL05MQ2FzdWFsVGltZVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTENhc3VhbFllYXJNb250aERheVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTE1vbnRoTmFtZVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTFNsYXNoTW9udGhGb3JtYXRQYXJzZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL3BhcnNlcnMvTkxUaW1lRXhwcmVzc2lvblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcGFyc2Vycy9OTFRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9ubC9wYXJzZXJzL05MV2Vla2RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvbmwvcmVmaW5lcnMvTkxNZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL25sL3JlZmluZXJzL05MTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L2NvbnN0YW50cy5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L3BhcnNlcnMvUFRDYXN1YWxEYXRlUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9wdC9wYXJzZXJzL1BUQ2FzdWFsVGltZVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcGFyc2Vycy9QVE1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcGFyc2Vycy9QVFRpbWVFeHByZXNzaW9uUGFyc2VyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvbG9jYWxlcy9wdC9wYXJzZXJzL1BUV2Vla2RheVBhcnNlci5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L2xvY2FsZXMvcHQvcmVmaW5lcnMvUFRNZXJnZURhdGVSYW5nZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9sb2NhbGVzL3B0L3JlZmluZXJzL1BUTWVyZ2VEYXRlVGltZVJlZmluZXIuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC9yZXN1bHRzLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nocm9uby1ub2RlL2Rpc3QvdGltZXpvbmUuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC91dGlscy9kYXlqcy5qcyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL25vZGVfbW9kdWxlcy9jaHJvbm8tbm9kZS9kaXN0L3V0aWxzL3BhdHRlcm4uanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY2hyb25vLW5vZGUvZGlzdC91dGlscy90aW1ldW5pdHMuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2Nzc1dpdGhNYXBwaW5nVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9ub2RlX21vZHVsZXMvZGF5anMvZGF5anMubWluLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL2RheWpzL3BsdWdpbi9xdWFydGVyT2ZZZWFyLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vc3JjL2RlYm91bmNlLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vc3JjL3N0YXR1cy5jc3MiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9zcmMvc3RhdHVzLmNzcz9lYjhiIiwid2VicGFjazovLzNjcC10YXBpLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzIiwid2VicGFjazovLzNjcC10YXBpLy4vc3JjL2NhbGwtaGlzdG9yeS50cyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL3NyYy9jYWxsLW5vdGlmaWNhdGlvbi50cyIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL3NyYy9zZWFyY2gudHMiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvLi9zcmMvc3RhdHVzLnRzIiwid2VicGFjazovLzNjcC10YXBpLy4vc3JjL3V0aWxzLnRzIiwid2VicGFjazovLzNjcC10YXBpL2V4dGVybmFsIFwiYXhpb3NcIiIsIndlYnBhY2s6Ly8zY3AtdGFwaS9leHRlcm5hbCBcImF4aW9zR214aHJBZGFwdGVyXCIiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovLzNjcC10YXBpL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vM2NwLXRhcGkvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8zY3AtdGFwaS8uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJPYmplY3QiLCJ2YWx1ZSIsImV4cG9ydHMiLCJpbmRleF8xIiwicmVxdWlyZSIsIm1lcmdlRGF0ZVRpbWVSZXN1bHQiLCJkYXRlUmVzdWx0IiwidGltZVJlc3VsdCIsInJlc3VsdCIsImNsb25lIiwiYmVnaW5EYXRlIiwic3RhcnQiLCJiZWdpblRpbWUiLCJtZXJnZURhdGVUaW1lQ29tcG9uZW50IiwiZW5kIiwiZW5kRGF0ZSIsImVuZFRpbWUiLCJlbmREYXRlVGltZSIsImRhdGUiLCJnZXRUaW1lIiwiaXNDZXJ0YWluIiwiYXNzaWduIiwiZ2V0IiwiaW1wbHkiLCJkYXRlQ29tcG9uZW50IiwidGltZUNvbXBvbmVudCIsImRhdGVUaW1lQ29tcG9uZW50IiwiTWVyaWRpZW0iLCJQTSIsIl9faW1wb3J0RGVmYXVsdCIsIm1vZCIsIl9fZXNNb2R1bGUiLCJkYXlqc18xIiwidG9EYXlKU1dlZWtkYXkiLCJyZWZEYXRlIiwib2Zmc2V0IiwibW9kaWZpZXIiLCJ0b0RheUpTQ2xvc2VzdFdlZWtkYXkiLCJkZWZhdWx0IiwiZGF5IiwicmVmT2Zmc2V0IiwiTWF0aCIsImFicyIsImZpbmRNb3N0TGlrZWx5QURZZWFyIiwieWVhck51bWJlciIsImZpbmRZZWFyQ2xvc2VzdFRvUmVmIiwibW9udGgiLCJyZWZNb21lbnQiLCJkYXRlTW9tZW50IiwieWVhciIsIm5leHRZZWFyIiwiYWRkIiwibGFzdFllYXIiLCJkaWZmIiwicmVzdWx0c18xIiwiZW5fMSIsIkNocm9ubyIsImNvbnN0cnVjdG9yIiwiY29uZmlndXJhdGlvbiIsImNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24iLCJwYXJzZXJzIiwicmVmaW5lcnMiLCJwYXJzZURhdGUiLCJ0ZXh0IiwicmVmZXJlbmNlRGF0ZSIsIm9wdGlvbiIsInJlc3VsdHMiLCJwYXJzZSIsImxlbmd0aCIsImNvbnRleHQiLCJQYXJzaW5nQ29udGV4dCIsImZvckVhY2giLCJwYXJzZXIiLCJwYXJzZWRSZXN1bHRzIiwiZXhlY3V0ZVBhcnNlciIsImNvbmNhdCIsInNvcnQiLCJhIiwiYiIsImluZGV4IiwicmVmaW5lciIsInJlZmluZSIsInBhdHRlcm4iLCJvcmlnaW5hbFRleHQiLCJyZW1haW5pbmdUZXh0IiwibWF0Y2giLCJleGVjIiwiZXh0cmFjdCIsInN1YnN0cmluZyIsInBhcnNlZFJlc3VsdCIsIlBhcnNpbmdSZXN1bHQiLCJQYXJzaW5nQ29tcG9uZW50cyIsImNyZWF0ZVBhcnNpbmdSZXN1bHQiLCJkZWJ1ZyIsImNvbnNvbGUiLCJsb2ciLCJuYW1lIiwicHVzaCIsInJlZmVyZW5jZSIsIlJlZmVyZW5jZVdpdGhUaW1lem9uZSIsImluc3RhbnQiLCJjcmVhdGVQYXJzaW5nQ29tcG9uZW50cyIsImNvbXBvbmVudHMiLCJ0ZXh0T3JFbmRJbmRleCIsInN0YXJ0Q29tcG9uZW50cyIsImVuZENvbXBvbmVudHMiLCJibG9jayIsIkZ1bmN0aW9uIiwiaGFuZGxlciIsIkZpbHRlciIsImZpbHRlciIsInIiLCJpc1ZhbGlkIiwiTWVyZ2luZ1JlZmluZXIiLCJtZXJnZWRSZXN1bHRzIiwiY3VyUmVzdWx0IiwibmV4dFJlc3VsdCIsImkiLCJ0ZXh0QmV0d2VlbiIsInNob3VsZE1lcmdlUmVzdWx0cyIsImxlZnQiLCJyaWdodCIsIm1lcmdlZFJlc3VsdCIsIm1lcmdlUmVzdWx0cyIsImRheWpzXzIiLCJub3ciLCJ0YXJnZXREYXRlIiwiY29tcG9uZW50IiwiYXNzaWduU2ltaWxhckRhdGUiLCJhc3NpZ25TaW1pbGFyVGltZSIsInV0Y09mZnNldCIsInRvZGF5IiwiaW1wbHlTaW1pbGFyVGltZSIsInllc3RlcmRheSIsInRvbW9ycm93IiwiYXNzaWduVGhlTmV4dERheSIsInRvbmlnaHQiLCJpbXBseUhvdXIiLCJBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyIsImNhY2hlZElubmVyUGF0dGVybiIsImNhY2hlZFBhdHRlcm4iLCJpbm5lclBhdHRlcm4iLCJSZWdFeHAiLCJzb3VyY2UiLCJmbGFncyIsImhlYWRlciIsImlubmVyRXh0cmFjdCIsInByaW1hcnlUaW1lUGF0dGVybiIsInByaW1hcnlQcmVmaXgiLCJwcmltYXJ5U3VmZml4IiwiZm9sbG93aW5nVGltZVBhdHRlbiIsImZvbGxvd2luZ1BoYXNlIiwiZm9sbG93aW5nU3VmZml4IiwiSE9VUl9HUk9VUCIsIk1JTlVURV9HUk9VUCIsIlNFQ09ORF9HUk9VUCIsIk1JTExJX1NFQ09ORF9HUk9VUCIsIkFNX1BNX0hPVVJfR1JPVVAiLCJBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyIiwic3RyaWN0TW9kZSIsImNhY2hlZFByaW1hcnlQcmVmaXgiLCJjYWNoZWRQcmltYXJ5U3VmZml4IiwiY2FjaGVkUHJpbWFyeVRpbWVQYXR0ZXJuIiwiY2FjaGVkRm9sbG93aW5nUGhhc2UiLCJjYWNoZWRGb2xsb3dpbmdTdWZmaXgiLCJjYWNoZWRGb2xsb3dpbmdUaW1lUGF0dGVuIiwiZ2V0UHJpbWFyeVRpbWVQYXR0ZXJuVGhyb3VnaENhY2hlIiwiZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyIsImZvbGxvd2luZ1BhdHRlcm4iLCJnZXRGb2xsb3dpbmdUaW1lUGF0dGVyblRocm91Z2hDYWNoZSIsImZvbGxvd2luZ01hdGNoIiwiY2hlY2tBbmRSZXR1cm5XaXRob3V0Rm9sbG93aW5nUGF0dGVybiIsImV4dHJhY3RGb2xsb3dpbmdUaW1lQ29tcG9uZW50cyIsImNoZWNrQW5kUmV0dXJuV2l0aEZvbGxvd2luZ1BhdHRlcm4iLCJzdHJpY3QiLCJtaW51dGUiLCJtZXJpZGllbSIsImhvdXIiLCJwYXJzZUludCIsImZsb29yIiwiYW1wbSIsInRvTG93ZXJDYXNlIiwiQU0iLCJtaWxsaXNlY29uZCIsInNlY29uZCIsInN0YXJ0QXRQTSIsImVuZGluZ1dpdGhOdW1iZXJzIiwiZW5kaW5nTnVtYmVycyIsImluY2x1ZGVzIiwiZW5kaW5nTnVtYmVyVmFsIiwic3RhcnRpbmdOdW1iZXJzIiwic3RhcnRpbmdOdW1iZXJWYWwiLCJBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSIsIlBBVFRFUk4iLCJZRUFSX05VTUJFUl9HUk9VUCIsIk1PTlRIX05VTUJFUl9HUk9VUCIsIkRBVEVfTlVNQkVSX0dST1VQIiwiSE9VUl9OVU1CRVJfR1JPVVAiLCJNSU5VVEVfTlVNQkVSX0dST1VQIiwiU0VDT05EX05VTUJFUl9HUk9VUCIsIk1JTExJU0VDT05EX05VTUJFUl9HUk9VUCIsIlRaRF9IT1VSX09GRlNFVF9HUk9VUCIsIlRaRF9NSU5VVEVfT0ZGU0VUX0dST1VQIiwiSVNPRm9ybWF0UGFyc2VyIiwiaG91ck9mZnNldCIsIm1pbnV0ZU9mZnNldCIsInllYXJzXzEiLCJPUEVOSU5HX0dST1VQIiwiRU5ESU5HX0dST1VQIiwiRklSU1RfTlVNQkVSU19HUk9VUCIsIlNFQ09ORF9OVU1CRVJTX0dST1VQIiwiWUVBUl9HUk9VUCIsIlNsYXNoRGF0ZUZvcm1hdFBhcnNlciIsImxpdHRsZUVuZGlhbiIsImdyb3VwTnVtYmVyTW9udGgiLCJncm91cE51bWJlckRheSIsInN1YnN0ciIsImluZGV4T2YiLCJyYXdZZWFyTnVtYmVyIiwiYWJzdHJhY3RSZWZpbmVyc18xIiwiQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXIiLCJjdXJyZW50UmVzdWx0IiwicGF0dGVybkJldHdlZW4iLCJmcm9tUmVzdWx0IiwidG9SZXN1bHQiLCJpc09ubHlXZWVrZGF5Q29tcG9uZW50IiwiZ2V0Q2VydGFpbkNvbXBvbmVudHMiLCJrZXkiLCJmcm9tTW9tZW50IiwiZGF5anMiLCJ0b01vbWVudCIsImlzQmVmb3JlIiwiaXNBZnRlciIsIm1pbiIsIm1lcmdpbmdDYWxjdWxhdGlvbl8xIiwiRU5NZXJnZURhdGVUaW1lUmVmaW5lciIsImlzT25seURhdGUiLCJpc09ubHlUaW1lIiwiVElNRVpPTkVfTkFNRV9QQVRURVJOIiwiREVGQVVMVF9USU1FWk9ORV9BQkJSX01BUCIsIkFDRFQiLCJBQ1NUIiwiQURUIiwiQUVEVCIsIkFFU1QiLCJBRlQiLCJBS0RUIiwiQUtTVCIsIkFMTVQiLCJBTVNUIiwiQU1UIiwiQU5BU1QiLCJBTkFUIiwiQVFUVCIsIkFSVCIsIkFTVCIsIkFXRFQiLCJBV1NUIiwiQVpPU1QiLCJBWk9UIiwiQVpTVCIsIkFaVCIsIkJOVCIsIkJPVCIsIkJSU1QiLCJCUlQiLCJCU1QiLCJCVFQiLCJDQVNUIiwiQ0FUIiwiQ0NUIiwiQ0RUIiwiQ0VTVCIsIkNFVCIsIkNIQURUIiwiQ0hBU1QiLCJDS1QiLCJDTFNUIiwiQ0xUIiwiQ09UIiwiQ1NUIiwiQ1ZUIiwiQ1hUIiwiQ2hTVCIsIkRBVlQiLCJFQVNTVCIsIkVBU1QiLCJFQVQiLCJFQ1QiLCJFRFQiLCJFRVNUIiwiRUVUIiwiRUdTVCIsIkVHVCIsIkVTVCIsIkVUIiwiRkpTVCIsIkZKVCIsIkZLU1QiLCJGS1QiLCJGTlQiLCJHQUxUIiwiR0FNVCIsIkdFVCIsIkdGVCIsIkdJTFQiLCJHTVQiLCJHU1QiLCJHWVQiLCJIQUEiLCJIQUMiLCJIQURUIiwiSEFFIiwiSEFQIiwiSEFSIiwiSEFTVCIsIkhBVCIsIkhBWSIsIkhLVCIsIkhMViIsIkhOQSIsIkhOQyIsIkhORSIsIkhOUCIsIkhOUiIsIkhOVCIsIkhOWSIsIkhPVlQiLCJJQ1QiLCJJRFQiLCJJT1QiLCJJUkRUIiwiSVJLU1QiLCJJUktUIiwiSVJTVCIsIklTVCIsIkpTVCIsIktHVCIsIktSQVNUIiwiS1JBVCIsIktTVCIsIktVWVQiLCJMSERUIiwiTEhTVCIsIkxJTlQiLCJNQUdTVCIsIk1BR1QiLCJNQVJUIiwiTUFXVCIsIk1EVCIsIk1FU1oiLCJNRVoiLCJNSFQiLCJNTVQiLCJNU0QiLCJNU0siLCJNU1QiLCJNVVQiLCJNVlQiLCJNWVQiLCJOQ1QiLCJORFQiLCJORlQiLCJOT1ZTVCIsIk5PVlQiLCJOUFQiLCJOU1QiLCJOVVQiLCJOWkRUIiwiTlpTVCIsIk9NU1NUIiwiT01TVCIsIlBEVCIsIlBFVCIsIlBFVFNUIiwiUEVUVCIsIlBHVCIsIlBIT1QiLCJQSFQiLCJQS1QiLCJQTURUIiwiUE1TVCIsIlBPTlQiLCJQU1QiLCJQVCIsIlBXVCIsIlBZU1QiLCJQWVQiLCJSRVQiLCJTQU1UIiwiU0FTVCIsIlNCVCIsIlNDVCIsIlNHVCIsIlNSVCIsIlNTVCIsIlRBSFQiLCJURlQiLCJUSlQiLCJUS1QiLCJUTFQiLCJUTVQiLCJUVlQiLCJVTEFUIiwiVVRDIiwiVVlTVCIsIlVZVCIsIlVaVCIsIlZFVCIsIlZMQVNUIiwiVkxBVCIsIlZVVCIsIldBU1QiLCJXQVQiLCJXRVNUIiwiV0VTWiIsIldFVCIsIldFWiIsIldGVCIsIldHU1QiLCJXR1QiLCJXSUIiLCJXSVQiLCJXSVRBIiwiV1NUIiwiV1QiLCJZQUtTVCIsIllBS1QiLCJZQVBUIiwiWUVLU1QiLCJZRUtUIiwiRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXIiLCJ0aW1lem9uZU92ZXJyaWRlcyIsInRpbWV6b25lIiwiX2EiLCJ0aW1lem9uZXMiLCJfYiIsInN1ZmZpeCIsInRpbWV6b25lQWJiciIsInRvVXBwZXJDYXNlIiwiZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQiLCJjdXJyZW50VGltZXpvbmVPZmZzZXQiLCJUSU1FWk9ORV9PRkZTRVRfUEFUVEVSTiIsIlRJTUVaT05FX09GRlNFVF9TSUdOX0dST1VQIiwiVElNRVpPTkVfT0ZGU0VUX0hPVVJfT0ZGU0VUX0dST1VQIiwiVElNRVpPTkVfT0ZGU0VUX01JTlVURV9PRkZTRVRfR1JPVVAiLCJFeHRyYWN0VGltZXpvbmVPZmZzZXRSZWZpbmVyIiwidGltZXpvbmVPZmZzZXQiLCJGb3J3YXJkRGF0ZVJlZmluZXIiLCJmb3J3YXJkRGF0ZSIsImlzT25seURheU1vbnRoQ29tcG9uZW50IiwiTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lciIsIm5ld1Jlc3VsdCIsIndlZWtkYXlUaGVuTm9ybWFsRGF0ZSIsIk92ZXJsYXBSZW1vdmFsUmVmaW5lciIsImZpbHRlcmVkUmVzdWx0cyIsInByZXZSZXN1bHQiLCJVbmxpa2VseUZvcm1hdEZpbHRlciIsInJlcGxhY2UiLCJpc1ZhbGlkRGF0ZSIsImlzU3RyaWN0TW9kZVZhbGlkIiwiRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXJfMSIsIkV4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXJfMSIsIk92ZXJsYXBSZW1vdmFsUmVmaW5lcl8xIiwiRm9yd2FyZERhdGVSZWZpbmVyXzEiLCJVbmxpa2VseUZvcm1hdEZpbHRlcl8xIiwiSVNPRm9ybWF0UGFyc2VyXzEiLCJNZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyXzEiLCJpbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbiIsInVuc2hpZnQiLCJfX2NyZWF0ZUJpbmRpbmciLCJjcmVhdGUiLCJvIiwibSIsImsiLCJrMiIsInVuZGVmaW5lZCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsIl9fc2V0TW9kdWxlRGVmYXVsdCIsInYiLCJfX2ltcG9ydFN0YXIiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJlbiIsImNocm9ub18xIiwiZGUiLCJmciIsImphIiwicHQiLCJubCIsImNhc3VhbCIsInJlZiIsInBhdHRlcm5fMSIsInNlYyIsInNlY29uZHMiLCJtaW5zIiwibWludXRlcyIsImgiLCJociIsImhycyIsImhvdXJzIiwiZGF5cyIsIndlZWsiLCJ3ZWVrcyIsIm1vbnRocyIsInkiLCJ5ciIsInllYXJzIiwibWF0Y2hBbnlQYXR0ZXJuIiwiSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkiLCJwYXJzZU51bWJlclBhdHRlcm4iLCJudW0iLCJwYXJzZUZsb2F0IiwicGFyc2VZZWFyIiwidGVzdCIsIlNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiIsIk5VTUJFUl9QQVRURVJOIiwiVElNRV9VTklUX0RJQ1RJT05BUlkiLCJTSU5HTEVfVElNRV9VTklUX1JFR0VYIiwicmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4iLCJwYXJzZVRpbWVVbml0cyIsInRpbWV1bml0VGV4dCIsImZyYWdtZW50cyIsImNvbGxlY3REYXRlVGltZUZyYWdtZW50IiwidW5pdCIsImNvbmZpZ3VyYXRpb25zXzEiLCJTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSIsIkRFVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIkRFV2Vla2RheVBhcnNlcl8xIiwiREVNZXJnZURhdGVSYW5nZVJlZmluZXJfMSIsIkRFTWVyZ2VEYXRlVGltZVJlZmluZXJfMSIsIkRFQ2FzdWFsRGF0ZVBhcnNlcl8xIiwiREVDYXN1YWxUaW1lUGFyc2VyXzEiLCJERU1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xIiwiY3JlYXRlQ29uZmlndXJhdGlvbiIsInJlZmVyZW5jZXMiLCJEQVRFX0dST1VQIiwiVElNRV9HUk9VUCIsIkRFQ2FzdWFsRGF0ZVBhcnNlciIsImRhdGVLZXl3b3JkIiwidGltZUtleXdvcmQiLCJleHRyYWN0VGltZUNvbXBvbmVudHMiLCJ0aW1ldW5pdHNfMSIsIkRFQ2FzdWFsVGltZVBhcnNlciIsInRpbWVLZXl3b3JkUGF0dGVybiIsImFkZEltcGxpZWRUaW1lVW5pdHMiLCJjb25zdGFudHNfMSIsImNvbnN0YW50c18yIiwiTU9OVEhfRElDVElPTkFSWSIsIllFQVJfUEFUVEVSTiIsIkRBVEVfVE9fR1JPVVAiLCJNT05USF9OQU1FX0dST1VQIiwiREVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIiLCJBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEiLCJERVRpbWVFeHByZXNzaW9uUGFyc2VyIiwiZW5kc1dpdGgiLCJ3ZWVrc18xIiwiV0VFS0RBWV9ESUNUSU9OQVJZIiwiUFJFRklYX0dST1VQIiwiU1VGRklYX0dST1VQIiwiV0VFS0RBWV9HUk9VUCIsIkRFV2Vla2RheVBhcnNlciIsImRheU9mV2VlayIsInByZWZpeCIsInBvc3RmaXgiLCJtb2RpZmllcldvcmQiLCJBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiREVNZXJnZURhdGVSYW5nZVJlZmluZXIiLCJBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEiLCJERU1lcmdlRGF0ZVRpbWVSZWZpbmVyIiwic3VuZGF5Iiwic3VuIiwibW9uZGF5IiwibW9uIiwidHVlc2RheSIsInR1ZSIsIndlZG5lc2RheSIsIndlZCIsInRodXJzZGF5IiwidGh1cnMiLCJ0aHVyIiwidGh1IiwiZnJpZGF5IiwiZnJpIiwic2F0dXJkYXkiLCJzYXQiLCJqYW51YXJ5IiwiZmVicnVhcnkiLCJtYXJjaCIsImFwcmlsIiwibWF5IiwianVuZSIsImp1bHkiLCJhdWd1c3QiLCJzZXB0ZW1iZXIiLCJvY3RvYmVyIiwibm92ZW1iZXIiLCJkZWNlbWJlciIsIkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZIiwiamFuIiwiZmViIiwibWFyIiwiYXByIiwianVuIiwianVsIiwiYXVnIiwic2VwIiwic2VwdCIsIm9jdCIsIm5vdiIsImRlYyIsIm9uZSIsInR3byIsInRocmVlIiwiZm91ciIsImZpdmUiLCJzaXgiLCJzZXZlbiIsImVpZ2h0IiwibmluZSIsInRlbiIsImVsZXZlbiIsInR3ZWx2ZSIsImZpcnN0IiwidGhpcmQiLCJmb3VydGgiLCJmaWZ0aCIsInNpeHRoIiwic2V2ZW50aCIsImVpZ2h0aCIsIm5pbnRoIiwidGVudGgiLCJlbGV2ZW50aCIsInR3ZWxmdGgiLCJ0aGlydGVlbnRoIiwiZm91cnRlZW50aCIsImZpZnRlZW50aCIsInNpeHRlZW50aCIsInNldmVudGVlbnRoIiwiZWlnaHRlZW50aCIsIm5pbmV0ZWVudGgiLCJ0d2VudGlldGgiLCJPUkRJTkFMX1dPUkRfRElDVElPTkFSWSIsInBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4iLCJFTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyXzEiLCJFTk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xIiwiRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSIsIkVOTW9udGhOYW1lUGFyc2VyXzEiLCJFTkNhc3VhbFllYXJNb250aERheVBhcnNlcl8xIiwiRU5TbGFzaE1vbnRoRm9ybWF0UGFyc2VyXzEiLCJFTlRpbWVFeHByZXNzaW9uUGFyc2VyXzEiLCJFTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEiLCJFTlRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXJfMSIsIkVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEiLCJFTk1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEiLCJFTkNhc3VhbERhdGVQYXJzZXJfMSIsIkVOQ2FzdWFsVGltZVBhcnNlcl8xIiwiRU5XZWVrZGF5UGFyc2VyXzEiLCJFTlJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlcl8xIiwiRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyXzEiLCJFTkNhc3VhbERhdGVQYXJzZXIiLCJsb3dlclRleHQiLCJFTkNhc3VhbFRpbWVQYXJzZXIiLCJFTkNhc3VhbFllYXJNb250aERheVBhcnNlciIsImNvbnN0YW50c18zIiwiT1JESU5BTF9OVU1CRVJfUEFUVEVSTiIsIkVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyIiwiRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXIiLCJFTk1vbnRoTmFtZVBhcnNlciIsIm1vbnRoTmFtZSIsIk1PRElGSUVSX1dPUkRfR1JPVVAiLCJSRUxBVElWRV9XT1JEX0dST1VQIiwiRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXIiLCJ1bml0V29yZCIsInRpbWV1bml0IiwidGltZVVuaXRzIiwiY3JlYXRlUmVsYXRpdmVGcm9tUmVmSW5zdGFudCIsIk1PTlRIX0dST1VQIiwiRU5TbGFzaE1vbnRoRm9ybWF0UGFyc2VyIiwiRU5UaW1lRXhwcmVzc2lvblBhcnNlciIsIlRJTUVfVU5JVFNfUEFUVEVSTiIsIlNUUklDVF9QQVRURVJOIiwiRU5UaW1lVW5pdEFnb0Zvcm1hdFBhcnNlciIsIm91dHB1dFRpbWVVbml0cyIsInJldmVyc2VUaW1lVW5pdHMiLCJFTlRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIiLCJHUk9VUF9OVU1fVElNRVVOSVRTIiwiRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyIiwiUEFUVEVSTl9XSVRIX1BSRUZJWCIsIlBBVFRFUk5fV0lUSE9VVF9QUkVGSVgiLCJFTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyIiwiUE9TVEZJWF9HUk9VUCIsIkVOV2Vla2RheVBhcnNlciIsIkVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIiwiRlJDYXN1YWxEYXRlUGFyc2VyXzEiLCJGUkNhc3VhbFRpbWVQYXJzZXJfMSIsIkZSVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIkZSTWVyZ2VEYXRlVGltZVJlZmluZXJfMSIsIkZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEiLCJGUldlZWtkYXlQYXJzZXJfMSIsIkZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlcl8xIiwiRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSIsIkZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXJfMSIsIkZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSIsIkZSVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xIiwiRlJDYXN1YWxEYXRlUGFyc2VyIiwiRlJDYXN1YWxUaW1lUGFyc2VyIiwic3VmZml4TG93ZXIiLCJGUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlciIsIkZJUlNUX1JFR19QQVRURVJOIiwiU0VDT05EX1JFR19QQVRURVJOIiwiRlJTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyIiwiZXh0cmFjdFRpbWVDb21wb25lbnQiLCJzZWNvbmRNYXRjaCIsImV4dHJhY3RpbmdDb21wb25lbnRzIiwiRlJUaW1lRXhwcmVzc2lvblBhcnNlciIsIkZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXIiLCJGUlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyIiwiRlJXZWVrZGF5UGFyc2VyIiwiRlJNZXJnZURhdGVSYW5nZVJlZmluZXIiLCJGUk1lcmdlRGF0ZVRpbWVSZWZpbmVyIiwidG9IYW5rYWt1IiwiU3RyaW5nIiwiYWxwaGFOdW0iLCJ0b2tlbiIsImZyb21DaGFyQ29kZSIsImNoYXJDb2RlQXQiLCJKUFN0YW5kYXJkUGFyc2VyXzEiLCJKUE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiSlBDYXN1YWxEYXRlUGFyc2VyXzEiLCJKUENhc3VhbERhdGVQYXJzZXIiLCJTUEVDSUFMX1lFQVJfR1JPVVAiLCJUWVBJQ0FMX1lFQVJfR1JPVVAiLCJFUkFfR1JPVVAiLCJEQVlfR1JPVVAiLCJKUFN0YW5kYXJkUGFyc2VyIiwibW9tZW50IiwieWVhck51bVRleHQiLCJKUE1lcmdlRGF0ZVJhbmdlUmVmaW5lciIsInpvbmRhZyIsInpvbiIsInpvIiwibWFhbmRhZyIsIm1hIiwiZGluc2RhZyIsImRpbiIsImRpIiwid29lbnNkYWciLCJ3b2UiLCJ3byIsImRvbmRlcmRhZyIsImRvbmQiLCJkbyIsInZyaWpkYWciLCJ2cmlqIiwidnIiLCJ6YXRlcmRhZyIsInphdCIsImphbnVhcmkiLCJmZWJydWFyaSIsIm1hYXJ0IiwibWVpIiwianVuaSIsImp1bGkiLCJhdWd1c3R1cyIsIm9rdG9iZXIiLCJva3QiLCJlZW4iLCJ0d2VlIiwiZHJpZSIsInZpZXIiLCJ2aWpmIiwiemVzIiwiemV2ZW4iLCJhY2h0IiwibmVnZW4iLCJ0aWVuIiwiZWxmIiwidHdhYWxmIiwiZWVyc3RlIiwidHdlZWRlIiwiZGVyZGUiLCJ2aWVyZGUiLCJ2aWpmZGUiLCJ6ZXNkZSIsInpldmVuZGUiLCJhY2h0c3RlIiwibmVnZW5kZSIsInRpZW5kZSIsImVsZmRlIiwidHdhYWxmZGUiLCJkZXJ0aWVuZGUiLCJ2ZWVydGllbmRlIiwidmlqZnRpZW5kZSIsInplc3RpZW5kZSIsInpldmVudGllbmRlIiwiYWNodHRpZW5kZSIsIm5lZ2VudGllbmRlIiwidHdpbnRpZ3N0ZSIsInNlY29uZGVuIiwibWludXRlbiIsInV1ciIsInVyZW4iLCJkYWciLCJkYWdlbiIsIndla2VuIiwibWFhbmQiLCJtYWFuZGVuIiwiamFhciIsImpyIiwiamFyZW4iLCJOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xIiwiTkxNZXJnZURhdGVUaW1lUmVmaW5lcl8xIiwiTkxDYXN1YWxEYXRlUGFyc2VyXzEiLCJOTENhc3VhbFRpbWVQYXJzZXJfMSIsIk5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSIsIk5MV2Vla2RheVBhcnNlcl8xIiwiTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSIsIk5MTW9udGhOYW1lUGFyc2VyXzEiLCJOTFNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMSIsIk5MVGltZUV4cHJlc3Npb25QYXJzZXJfMSIsIk5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyXzEiLCJOTENhc3VhbERhdGVUaW1lUGFyc2VyXzEiLCJOTENhc3VhbERhdGVQYXJzZXIiLCJUSU1FX09GX0RBWV9HUk9VUCIsIk5MQ2FzdWFsRGF0ZVRpbWVQYXJzZXIiLCJkYXRlVGV4dCIsInRpbWVUZXh0IiwiTU9NRU5UX0dST1VQIiwiTkxDYXN1YWxUaW1lUGFyc2VyIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJOTENhc3VhbFllYXJNb250aERheVBhcnNlciIsIk5MTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyIiwiTkxNb250aE5hbWVQYXJzZXIiLCJOTFNsYXNoTW9udGhGb3JtYXRQYXJzZXIiLCJOTFRpbWVFeHByZXNzaW9uUGFyc2VyIiwiTkxUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlciIsIk5MV2Vla2RheVBhcnNlciIsIk5MTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIiwiTkxNZXJnZURhdGVUaW1lUmVmaW5lciIsIlBUV2Vla2RheVBhcnNlcl8xIiwiUFRUaW1lRXhwcmVzc2lvblBhcnNlcl8xIiwiUFRNZXJnZURhdGVUaW1lUmVmaW5lcl8xIiwiUFRNZXJnZURhdGVSYW5nZVJlZmluZXJfMSIsIlBUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEiLCJQVENhc3VhbERhdGVQYXJzZXJfMSIsIlBUQ2FzdWFsVGltZVBhcnNlcl8xIiwiUFRDYXN1YWxEYXRlUGFyc2VyIiwiUFRDYXN1YWxUaW1lUGFyc2VyIiwiUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIiLCJQVFRpbWVFeHByZXNzaW9uUGFyc2VyIiwiUFRXZWVrZGF5UGFyc2VyIiwibm9ybSIsIlBUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIiwiUFRNZXJnZURhdGVUaW1lUmVmaW5lciIsInF1YXJ0ZXJPZlllYXJfMSIsInRpbWV6b25lXzEiLCJleHRlbmQiLCJpbnB1dCIsIkRhdGUiLCJnZXRUaW1lem9uZU9mZnNldCIsInRvVGltZXpvbmVPZmZzZXQiLCJrbm93bkNvbXBvbmVudHMiLCJrbm93blZhbHVlcyIsImltcGxpZWRWYWx1ZXMiLCJyZWZEYXlKcyIsImtleXMiLCJkZWxldGUiLCJkYXRlV2l0aG91dFRpbWV6b25lQWRqdXN0bWVudCIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsInRvU3RyaW5nIiwiSlNPTiIsInN0cmluZ2lmeSIsImdldFN5c3RlbVRpbWV6b25lQWRqdXN0bWVudE1pbnV0ZSIsInNldEZ1bGxZZWFyIiwidGFyZ2V0VGltZXpvbmVPZmZzZXQiLCJyZWZJbnN0YW50IiwidGltZXpvbmVJbnB1dCIsIlRJTUVaT05FX0FCQlJfTUFQIiwidGFyZ2V0RGF5SnMiLCJzaW5nbGVUaW1ldW5pdFBhdHRlcm4iLCJzaW5nbGVUaW1ldW5pdFBhdHRlcm5Ob0NhcHR1cmUiLCJleHRyYWN0VGVybXMiLCJkaWN0aW9uYXJ5IiwiQXJyYXkiLCJNYXAiLCJmcm9tIiwiam9pbmVkVGVybXMiLCJqb2luIiwicmV2ZXJzZWQiLCJvdXRwdXQiLCJtb2R1bGUiLCJjc3NXaXRoTWFwcGluZ1RvU3RyaW5nIiwibGlzdCIsIm1hcCIsIml0ZW0iLCJjb250ZW50IiwibW9kdWxlcyIsIm1lZGlhUXVlcnkiLCJkZWR1cGUiLCJhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzIiwiaWQiLCJfaSIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIlR5cGVFcnJvciIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInNsaWNlIiwibGVuIiwiYXJyMiIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiX2FyciIsIl9uIiwiX2QiLCJfcyIsIl9lIiwibmV4dCIsImRvbmUiLCJlcnIiLCJpc0FycmF5IiwiX2l0ZW0iLCJjc3NNYXBwaW5nIiwiYnRvYSIsImJhc2U2NCIsInVuZXNjYXBlIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZGF0YSIsInNvdXJjZU1hcHBpbmciLCJzb3VyY2VVUkxzIiwic291cmNlcyIsInNvdXJjZVJvb3QiLCJ0IiwiZSIsInMiLCJ1IiwiZiIsImMiLCJkIiwiJCIsImwiLCJNIiwid2Vla2RheXMiLCJzcGxpdCIsImciLCJ6IiwiY2VpbCIsInAiLCJ3IiwiRCIsIm1zIiwiUSIsIl8iLCJTIiwiYXJncyIsImFyZ3VtZW50cyIsIk8iLCJsb2NhbGUiLCIkTCIsInV0YyIsIiR1IiwieCIsIiR4IiwiJG9mZnNldCIsIiRkIiwiTmFOIiwiaW5pdCIsIiR5IiwiJE0iLCIkRCIsIiRXIiwiZ2V0RGF5IiwiJEgiLCIkbSIsIiRzIiwiZ2V0U2Vjb25kcyIsIiRtcyIsImdldE1pbGxpc2Vjb25kcyIsIiR1dGlscyIsImlzU2FtZSIsInN0YXJ0T2YiLCJlbmRPZiIsIiRnIiwic2V0IiwidW5peCIsInZhbHVlT2YiLCJ0b0RhdGUiLCJhcHBseSIsIiRsb2NhbGUiLCJ3ZWVrU3RhcnQiLCIkc2V0IiwiZGF5c0luTW9udGgiLCJOdW1iZXIiLCJyb3VuZCIsInN1YnRyYWN0IiwiZm9ybWF0IiwiWVkiLCJZWVlZIiwiTU0iLCJNTU0iLCJtb250aHNTaG9ydCIsIk1NTU0iLCJERCIsImRkIiwid2Vla2RheXNNaW4iLCJkZGQiLCJ3ZWVrZGF5c1Nob3J0IiwiZGRkZCIsIkgiLCJISCIsImhoIiwiQSIsIm1tIiwic3MiLCJTU1MiLCJaIiwidG9KU09OIiwidG9JU09TdHJpbmciLCJ0b1VUQ1N0cmluZyIsIiRpIiwiaXNEYXlqcyIsIkxzIiwicXVhcnRlciIsImJpbmQiLCJkZWJvdW5jZSIsImZ1bmMiLCJ3YWl0IiwidGltZW91dCIsImV4ZWN1dGVkRnVuY3Rpb24iLCJsYXRlciIsImNsZWFyVGltZW91dCIsInNldFRpbWVvdXQiLCJzZWFyY2giLCJTZWFyY2giLCJ3YWl0Rm9yS2V5RWxlbWVudHMiLCJlbGVtZW50IiwiY3JlYXRlU2VhcmNoV2luZG93IiwiY2FsbE5vdGlmaWNhdGlvbiIsIkNhbGxOb3RpZmljYXRpb24iLCJzaG93Q2FsbE5vdGlmaWNhdGlvbiIsImNhbGxIaXN0b3J5IiwiQ2FsbEhpc3RvcnkiLCJzaG93Q2FsbEhpc3RvcnkiLCJzdGF0dXMiLCJTdGF0dXMiLCJzaG93U3RhdHVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBYTs7QUFDYkEsOENBQTZDO0FBQUVDLE9BQUssRUFBRTtBQUFULENBQTdDO0FBQ0FDLDhCQUFBLEdBQWlD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QU0sQ0FBQ0ksa0JBQVAsQ0FBMEJELE9BQTFCO0FBQW9DLENBQXRFLEVBQXdFLElBQXhFLENBQWxCO0FBRUEsTUFBTUUsZ0JBQWdCLEdBQUcsSUFBSUMsZ0VBQUosRUFBekIsQyxDQUNBOztBQUNBSixrQkFBa0IsQ0FBQyxXQUFELEVBQWVDLE9BQUQsSUFBYTtBQUFFRSxrQkFBZ0IsQ0FBQ0Usb0JBQWpCLENBQXNDSixPQUF0QztBQUFnRCxDQUE3RSxFQUErRSxLQUEvRSxDQUFsQjtBQUVBLE1BQU1LLFdBQVcsR0FBRyxJQUFJQyxzREFBSixFQUFwQixDLENBQ0E7O0FBQ0FQLGtCQUFrQixDQUFDLHlCQUFELEVBQTZCQyxPQUFELElBQWE7QUFBRUssYUFBVyxDQUFDRSxlQUFaLENBQTRCUCxPQUE1QjtBQUFzQyxDQUFqRixFQUFtRixLQUFuRixDQUFsQjtBQUVBLE1BQU1RLE1BQU0sR0FBRyxJQUFJQywyQ0FBSixFQUFmLEMsQ0FDQTs7QUFDQVYsa0JBQWtCLENBQUMsZ0JBQUQsRUFBb0JDLE9BQUQsSUFBYTtBQUFFUSxRQUFNLENBQUNFLFVBQVAsQ0FBa0JWLE9BQWxCO0FBQTRCLENBQTlELEVBQWdFLEtBQWhFLENBQWxCLEMiLCJmaWxlIjoiaW5kZXgucHJvZC51c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLm1lcmdlRGF0ZVRpbWVDb21wb25lbnQgPSBleHBvcnRzLm1lcmdlRGF0ZVRpbWVSZXN1bHQgPSB2b2lkIDA7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuZnVuY3Rpb24gbWVyZ2VEYXRlVGltZVJlc3VsdChkYXRlUmVzdWx0LCB0aW1lUmVzdWx0KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZGF0ZVJlc3VsdC5jbG9uZSgpO1xuICAgIGNvbnN0IGJlZ2luRGF0ZSA9IGRhdGVSZXN1bHQuc3RhcnQ7XG4gICAgY29uc3QgYmVnaW5UaW1lID0gdGltZVJlc3VsdC5zdGFydDtcbiAgICByZXN1bHQuc3RhcnQgPSBtZXJnZURhdGVUaW1lQ29tcG9uZW50KGJlZ2luRGF0ZSwgYmVnaW5UaW1lKTtcbiAgICBpZiAoZGF0ZVJlc3VsdC5lbmQgIT0gbnVsbCB8fCB0aW1lUmVzdWx0LmVuZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXRlUmVzdWx0LmVuZCA9PSBudWxsID8gZGF0ZVJlc3VsdC5zdGFydCA6IGRhdGVSZXN1bHQuZW5kO1xuICAgICAgICBjb25zdCBlbmRUaW1lID0gdGltZVJlc3VsdC5lbmQgPT0gbnVsbCA/IHRpbWVSZXN1bHQuc3RhcnQgOiB0aW1lUmVzdWx0LmVuZDtcbiAgICAgICAgY29uc3QgZW5kRGF0ZVRpbWUgPSBtZXJnZURhdGVUaW1lQ29tcG9uZW50KGVuZERhdGUsIGVuZFRpbWUpO1xuICAgICAgICBpZiAoZGF0ZVJlc3VsdC5lbmQgPT0gbnVsbCAmJiBlbmREYXRlVGltZS5kYXRlKCkuZ2V0VGltZSgpIDwgcmVzdWx0LnN0YXJ0LmRhdGUoKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIGlmIChlbmREYXRlVGltZS5pc0NlcnRhaW4oXCJkYXlcIikpIHtcbiAgICAgICAgICAgICAgICBlbmREYXRlVGltZS5hc3NpZ24oXCJkYXlcIiwgZW5kRGF0ZVRpbWUuZ2V0KFwiZGF5XCIpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbmREYXRlVGltZS5pbXBseShcImRheVwiLCBlbmREYXRlVGltZS5nZXQoXCJkYXlcIikgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuZW5kID0gZW5kRGF0ZVRpbWU7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLm1lcmdlRGF0ZVRpbWVSZXN1bHQgPSBtZXJnZURhdGVUaW1lUmVzdWx0O1xuZnVuY3Rpb24gbWVyZ2VEYXRlVGltZUNvbXBvbmVudChkYXRlQ29tcG9uZW50LCB0aW1lQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZGF0ZVRpbWVDb21wb25lbnQgPSBkYXRlQ29tcG9uZW50LmNsb25lKCk7XG4gICAgaWYgKHRpbWVDb21wb25lbnQuaXNDZXJ0YWluKFwiaG91clwiKSkge1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5hc3NpZ24oXCJob3VyXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwiaG91clwiKSk7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmFzc2lnbihcIm1pbnV0ZVwiLCB0aW1lQ29tcG9uZW50LmdldChcIm1pbnV0ZVwiKSk7XG4gICAgICAgIGlmICh0aW1lQ29tcG9uZW50LmlzQ2VydGFpbihcInNlY29uZFwiKSkge1xuICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwic2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwic2Vjb25kXCIpKTtcbiAgICAgICAgICAgIGlmICh0aW1lQ29tcG9uZW50LmlzQ2VydGFpbihcIm1pbGxpc2Vjb25kXCIpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwibWlsbGlzZWNvbmRcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJtaWxsaXNlY29uZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5pbXBseShcIm1pbGxpc2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWlsbGlzZWNvbmRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJzZWNvbmRcIikpO1xuICAgICAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJtaWxsaXNlY29uZFwiLCB0aW1lQ29tcG9uZW50LmdldChcIm1pbGxpc2Vjb25kXCIpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwiaG91clwiKSk7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWludXRlXCIpKTtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgdGltZUNvbXBvbmVudC5nZXQoXCJzZWNvbmRcIikpO1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5pbXBseShcIm1pbGxpc2Vjb25kXCIsIHRpbWVDb21wb25lbnQuZ2V0KFwibWlsbGlzZWNvbmRcIikpO1xuICAgIH1cbiAgICBpZiAodGltZUNvbXBvbmVudC5pc0NlcnRhaW4oXCJ0aW1lem9uZU9mZnNldFwiKSkge1xuICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5hc3NpZ24oXCJ0aW1lem9uZU9mZnNldFwiLCB0aW1lQ29tcG9uZW50LmdldChcInRpbWV6b25lT2Zmc2V0XCIpKTtcbiAgICB9XG4gICAgaWYgKHRpbWVDb21wb25lbnQuaXNDZXJ0YWluKFwibWVyaWRpZW1cIikpIHtcbiAgICAgICAgZGF0ZVRpbWVDb21wb25lbnQuYXNzaWduKFwibWVyaWRpZW1cIiwgdGltZUNvbXBvbmVudC5nZXQoXCJtZXJpZGllbVwiKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRpbWVDb21wb25lbnQuZ2V0KFwibWVyaWRpZW1cIikgIT0gbnVsbCAmJiBkYXRlVGltZUNvbXBvbmVudC5nZXQoXCJtZXJpZGllbVwiKSA9PSBudWxsKSB7XG4gICAgICAgIGRhdGVUaW1lQ29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgdGltZUNvbXBvbmVudC5nZXQoXCJtZXJpZGllbVwiKSk7XG4gICAgfVxuICAgIGlmIChkYXRlVGltZUNvbXBvbmVudC5nZXQoXCJtZXJpZGllbVwiKSA9PSBpbmRleF8xLk1lcmlkaWVtLlBNICYmIGRhdGVUaW1lQ29tcG9uZW50LmdldChcImhvdXJcIikgPCAxMikge1xuICAgICAgICBpZiAodGltZUNvbXBvbmVudC5pc0NlcnRhaW4oXCJob3VyXCIpKSB7XG4gICAgICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5hc3NpZ24oXCJob3VyXCIsIGRhdGVUaW1lQ29tcG9uZW50LmdldChcImhvdXJcIikgKyAxMik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkYXRlVGltZUNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgZGF0ZVRpbWVDb21wb25lbnQuZ2V0KFwiaG91clwiKSArIDEyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0ZVRpbWVDb21wb25lbnQ7XG59XG5leHBvcnRzLm1lcmdlRGF0ZVRpbWVDb21wb25lbnQgPSBtZXJnZURhdGVUaW1lQ29tcG9uZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvRGF5SlNDbG9zZXN0V2Vla2RheSA9IGV4cG9ydHMudG9EYXlKU1dlZWtkYXkgPSB2b2lkIDA7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5mdW5jdGlvbiB0b0RheUpTV2Vla2RheShyZWZEYXRlLCBvZmZzZXQsIG1vZGlmaWVyKSB7XG4gICAgaWYgKCFtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gdG9EYXlKU0Nsb3Nlc3RXZWVrZGF5KHJlZkRhdGUsIG9mZnNldCk7XG4gICAgfVxuICAgIGxldCBkYXRlID0gZGF5anNfMS5kZWZhdWx0KHJlZkRhdGUpO1xuICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSBcInRoaXNcIjpcbiAgICAgICAgICAgIGRhdGUgPSBkYXRlLmRheShvZmZzZXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJuZXh0XCI6XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5kYXkob2Zmc2V0ICsgNyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxhc3RcIjpcbiAgICAgICAgICAgIGRhdGUgPSBkYXRlLmRheShvZmZzZXQgLSA3KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cbmV4cG9ydHMudG9EYXlKU1dlZWtkYXkgPSB0b0RheUpTV2Vla2RheTtcbmZ1bmN0aW9uIHRvRGF5SlNDbG9zZXN0V2Vla2RheShyZWZEYXRlLCBvZmZzZXQpIHtcbiAgICBsZXQgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZEYXRlKTtcbiAgICBjb25zdCByZWZPZmZzZXQgPSBkYXRlLmRheSgpO1xuICAgIGlmIChNYXRoLmFicyhvZmZzZXQgLSA3IC0gcmVmT2Zmc2V0KSA8IE1hdGguYWJzKG9mZnNldCAtIHJlZk9mZnNldCkpIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUuZGF5KG9mZnNldCAtIDcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChNYXRoLmFicyhvZmZzZXQgKyA3IC0gcmVmT2Zmc2V0KSA8IE1hdGguYWJzKG9mZnNldCAtIHJlZk9mZnNldCkpIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUuZGF5KG9mZnNldCArIDcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUuZGF5KG9mZnNldCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xufVxuZXhwb3J0cy50b0RheUpTQ2xvc2VzdFdlZWtkYXkgPSB0b0RheUpTQ2xvc2VzdFdlZWtkYXk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZmluZFllYXJDbG9zZXN0VG9SZWYgPSBleHBvcnRzLmZpbmRNb3N0TGlrZWx5QURZZWFyID0gdm9pZCAwO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuZnVuY3Rpb24gZmluZE1vc3RMaWtlbHlBRFllYXIoeWVhck51bWJlcikge1xuICAgIGlmICh5ZWFyTnVtYmVyIDwgMTAwKSB7XG4gICAgICAgIGlmICh5ZWFyTnVtYmVyID4gNTApIHtcbiAgICAgICAgICAgIHllYXJOdW1iZXIgPSB5ZWFyTnVtYmVyICsgMTkwMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHllYXJOdW1iZXIgPSB5ZWFyTnVtYmVyICsgMjAwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geWVhck51bWJlcjtcbn1cbmV4cG9ydHMuZmluZE1vc3RMaWtlbHlBRFllYXIgPSBmaW5kTW9zdExpa2VseUFEWWVhcjtcbmZ1bmN0aW9uIGZpbmRZZWFyQ2xvc2VzdFRvUmVmKHJlZkRhdGUsIGRheSwgbW9udGgpIHtcbiAgICBjb25zdCByZWZNb21lbnQgPSBkYXlqc18xLmRlZmF1bHQocmVmRGF0ZSk7XG4gICAgbGV0IGRhdGVNb21lbnQgPSByZWZNb21lbnQ7XG4gICAgZGF0ZU1vbWVudCA9IGRhdGVNb21lbnQubW9udGgobW9udGggLSAxKTtcbiAgICBkYXRlTW9tZW50ID0gZGF0ZU1vbWVudC5kYXRlKGRheSk7XG4gICAgZGF0ZU1vbWVudCA9IGRhdGVNb21lbnQueWVhcihyZWZNb21lbnQueWVhcigpKTtcbiAgICBjb25zdCBuZXh0WWVhciA9IGRhdGVNb21lbnQuYWRkKDEsIFwieVwiKTtcbiAgICBjb25zdCBsYXN0WWVhciA9IGRhdGVNb21lbnQuYWRkKC0xLCBcInlcIik7XG4gICAgaWYgKE1hdGguYWJzKG5leHRZZWFyLmRpZmYocmVmTW9tZW50KSkgPCBNYXRoLmFicyhkYXRlTW9tZW50LmRpZmYocmVmTW9tZW50KSkpIHtcbiAgICAgICAgZGF0ZU1vbWVudCA9IG5leHRZZWFyO1xuICAgIH1cbiAgICBlbHNlIGlmIChNYXRoLmFicyhsYXN0WWVhci5kaWZmKHJlZk1vbWVudCkpIDwgTWF0aC5hYnMoZGF0ZU1vbWVudC5kaWZmKHJlZk1vbWVudCkpKSB7XG4gICAgICAgIGRhdGVNb21lbnQgPSBsYXN0WWVhcjtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVNb21lbnQueWVhcigpO1xufVxuZXhwb3J0cy5maW5kWWVhckNsb3Nlc3RUb1JlZiA9IGZpbmRZZWFyQ2xvc2VzdFRvUmVmO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlBhcnNpbmdDb250ZXh0ID0gZXhwb3J0cy5DaHJvbm8gPSB2b2lkIDA7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi9yZXN1bHRzXCIpO1xuY29uc3QgZW5fMSA9IHJlcXVpcmUoXCIuL2xvY2FsZXMvZW5cIik7XG5jbGFzcyBDaHJvbm8ge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb24gfHwgZW5fMS5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIHRoaXMucGFyc2VycyA9IFsuLi5jb25maWd1cmF0aW9uLnBhcnNlcnNdO1xuICAgICAgICB0aGlzLnJlZmluZXJzID0gWy4uLmNvbmZpZ3VyYXRpb24ucmVmaW5lcnNdO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDaHJvbm8oe1xuICAgICAgICAgICAgcGFyc2VyczogWy4uLnRoaXMucGFyc2Vyc10sXG4gICAgICAgICAgICByZWZpbmVyczogWy4uLnRoaXMucmVmaW5lcnNdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFyc2VEYXRlKHRleHQsIHJlZmVyZW5jZURhdGUsIG9wdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5wYXJzZSh0ZXh0LCByZWZlcmVuY2VEYXRlLCBvcHRpb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0cy5sZW5ndGggPiAwID8gcmVzdWx0c1swXS5zdGFydC5kYXRlKCkgOiBudWxsO1xuICAgIH1cbiAgICBwYXJzZSh0ZXh0LCByZWZlcmVuY2VEYXRlLCBvcHRpb24pIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBQYXJzaW5nQ29udGV4dCh0ZXh0LCByZWZlcmVuY2VEYXRlLCBvcHRpb24pO1xuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICB0aGlzLnBhcnNlcnMuZm9yRWFjaCgocGFyc2VyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRSZXN1bHRzID0gQ2hyb25vLmV4ZWN1dGVQYXJzZXIoY29udGV4dCwgcGFyc2VyKTtcbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChwYXJzZWRSZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggLSBiLmluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWZpbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChyZWZpbmVyKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gcmVmaW5lci5yZWZpbmUoY29udGV4dCwgcmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG4gICAgc3RhdGljIGV4ZWN1dGVQYXJzZXIoY29udGV4dCwgcGFyc2VyKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhcnNlci5wYXR0ZXJuKGNvbnRleHQpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBjb250ZXh0LnRleHQ7XG4gICAgICAgIGxldCByZW1haW5pbmdUZXh0ID0gY29udGV4dC50ZXh0O1xuICAgICAgICBsZXQgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaC5pbmRleCArIG9yaWdpbmFsVGV4dC5sZW5ndGggLSByZW1haW5pbmdUZXh0Lmxlbmd0aDtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIuZXh0cmFjdChjb250ZXh0LCBtYXRjaCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlbWFpbmluZ1RleHQgPSBvcmlnaW5hbFRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcGFyc2VkUmVzdWx0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiByZXN1bHRzXzEuUGFyc2luZ1Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCwgbWF0Y2hbMF0pO1xuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3VsdC5zdGFydCA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhcnNlZFJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCwgbWF0Y2hbMF0sIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IGNvbnNvbGUubG9nKGAke3BhcnNlci5jb25zdHJ1Y3Rvci5uYW1lfSBleHRyYWN0ZWQgcmVzdWx0ICR7cGFyc2VkUmVzdWx0fWApKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChwYXJzZWRSZXN1bHQpO1xuICAgICAgICAgICAgcmVtYWluaW5nVGV4dCA9IG9yaWdpbmFsVGV4dC5zdWJzdHJpbmcoaW5kZXggKyBwYXJzZWRSZXN1bHQudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuZXhwb3J0cy5DaHJvbm8gPSBDaHJvbm87XG5jbGFzcyBQYXJzaW5nQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IodGV4dCwgcmVmRGF0ZSwgb3B0aW9uKSB7XG4gICAgICAgIHRoaXMudGV4dCA9IHRleHQ7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gbmV3IHJlc3VsdHNfMS5SZWZlcmVuY2VXaXRoVGltZXpvbmUocmVmRGF0ZSk7XG4gICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdm9pZCAwID8gb3B0aW9uIDoge307XG4gICAgICAgIHRoaXMucmVmRGF0ZSA9IHRoaXMucmVmZXJlbmNlLmluc3RhbnQ7XG4gICAgfVxuICAgIGNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKGNvbXBvbmVudHMpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudHMgaW5zdGFuY2VvZiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzKHRoaXMucmVmZXJlbmNlLCBjb21wb25lbnRzKTtcbiAgICB9XG4gICAgY3JlYXRlUGFyc2luZ1Jlc3VsdChpbmRleCwgdGV4dE9yRW5kSW5kZXgsIHN0YXJ0Q29tcG9uZW50cywgZW5kQ29tcG9uZW50cykge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIHRleHRPckVuZEluZGV4ID09PSBcInN0cmluZ1wiID8gdGV4dE9yRW5kSW5kZXggOiB0aGlzLnRleHQuc3Vic3RyaW5nKGluZGV4LCB0ZXh0T3JFbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRDb21wb25lbnRzID8gdGhpcy5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cyhzdGFydENvbXBvbmVudHMpIDogbnVsbDtcbiAgICAgICAgY29uc3QgZW5kID0gZW5kQ29tcG9uZW50cyA/IHRoaXMuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoZW5kQ29tcG9uZW50cykgOiBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IHJlc3VsdHNfMS5QYXJzaW5nUmVzdWx0KHRoaXMucmVmZXJlbmNlLCBpbmRleCwgdGV4dCwgc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIGRlYnVnKGJsb2NrKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbi5kZWJ1Zykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uLmRlYnVnIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbi5kZWJ1ZyhibG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vcHRpb24uZGVidWc7XG4gICAgICAgICAgICAgICAgaGFuZGxlci5kZWJ1ZyhibG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlBhcnNpbmdDb250ZXh0ID0gUGFyc2luZ0NvbnRleHQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWVyZ2luZ1JlZmluZXIgPSBleHBvcnRzLkZpbHRlciA9IHZvaWQgMDtcbmNsYXNzIEZpbHRlciB7XG4gICAgcmVmaW5lKGNvbnRleHQsIHJlc3VsdHMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChyKSA9PiB0aGlzLmlzVmFsaWQoY29udGV4dCwgcikpO1xuICAgIH1cbn1cbmV4cG9ydHMuRmlsdGVyID0gRmlsdGVyO1xuY2xhc3MgTWVyZ2luZ1JlZmluZXIge1xuICAgIHJlZmluZShjb250ZXh0LCByZXN1bHRzKSB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lcmdlZFJlc3VsdHMgPSBbXTtcbiAgICAgICAgbGV0IGN1clJlc3VsdCA9IHJlc3VsdHNbMF07XG4gICAgICAgIGxldCBuZXh0UmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBuZXh0UmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRCZXR3ZWVuID0gY29udGV4dC50ZXh0LnN1YnN0cmluZyhjdXJSZXN1bHQuaW5kZXggKyBjdXJSZXN1bHQudGV4dC5sZW5ndGgsIG5leHRSZXN1bHQuaW5kZXgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZE1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VyUmVzdWx0LCBuZXh0UmVzdWx0LCBjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1lcmdlZFJlc3VsdHMucHVzaChjdXJSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGN1clJlc3VsdCA9IG5leHRSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gY3VyUmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbmV4dFJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRSZXN1bHQgPSB0aGlzLm1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgbGVmdCwgcmlnaHQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IG1lcmdlZCAke2xlZnR9IGFuZCAke3JpZ2h0fSBpbnRvICR7bWVyZ2VkUmVzdWx0fWApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1clJlc3VsdCA9IG1lcmdlZFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3VyUmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1lcmdlZFJlc3VsdHMucHVzaChjdXJSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXJnZWRSZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuTWVyZ2luZ1JlZmluZXIgPSBNZXJnaW5nUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b25pZ2h0ID0gZXhwb3J0cy50b21vcnJvdyA9IGV4cG9ydHMueWVzdGVyZGF5ID0gZXhwb3J0cy50b2RheSA9IGV4cG9ydHMubm93ID0gdm9pZCAwO1xuY29uc3QgcmVzdWx0c18xID0gcmVxdWlyZShcIi4uL3Jlc3VsdHNcIik7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBkYXlqc18yID0gcmVxdWlyZShcIi4uL3V0aWxzL2RheWpzXCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcbmZ1bmN0aW9uIG5vdyhyZWZlcmVuY2UpIHtcbiAgICBjb25zdCB0YXJnZXREYXRlID0gZGF5anNfMS5kZWZhdWx0KHJlZmVyZW5jZS5pbnN0YW50KTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzKHJlZmVyZW5jZSwge30pO1xuICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJUaW1lKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgY29tcG9uZW50LmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIHRhcmdldERhdGUudXRjT2Zmc2V0KCkpO1xuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5leHBvcnRzLm5vdyA9IG5vdztcbmZ1bmN0aW9uIHRvZGF5KHJlZmVyZW5jZSkge1xuICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmZXJlbmNlLmluc3RhbnQpO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMocmVmZXJlbmNlLCB7fSk7XG4gICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgIGRheWpzXzIuaW1wbHlTaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5leHBvcnRzLnRvZGF5ID0gdG9kYXk7XG5mdW5jdGlvbiB5ZXN0ZXJkYXkocmVmZXJlbmNlKSB7XG4gICAgbGV0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmZXJlbmNlLmluc3RhbnQpO1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMocmVmZXJlbmNlLCB7fSk7XG4gICAgdGFyZ2V0RGF0ZSA9IHRhcmdldERhdGUuYWRkKC0xLCBcImRheVwiKTtcbiAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgZGF5anNfMi5pbXBseVNpbWlsYXJUaW1lKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbn1cbmV4cG9ydHMueWVzdGVyZGF5ID0geWVzdGVyZGF5O1xuZnVuY3Rpb24gdG9tb3Jyb3cocmVmZXJlbmNlKSB7XG4gICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZlcmVuY2UuaW5zdGFudCk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cyhyZWZlcmVuY2UsIHt9KTtcbiAgICBkYXlqc18yLmFzc2lnblRoZU5leHREYXkoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICByZXR1cm4gY29tcG9uZW50O1xufVxuZXhwb3J0cy50b21vcnJvdyA9IHRvbW9ycm93O1xuZnVuY3Rpb24gdG9uaWdodChyZWZlcmVuY2UsIGltcGx5SG91ciA9IDIyKSB7XG4gICAgY29uc3QgdGFyZ2V0RGF0ZSA9IGRheWpzXzEuZGVmYXVsdChyZWZlcmVuY2UuaW5zdGFudCk7XG4gICAgY29uc3QgY29tcG9uZW50ID0gbmV3IHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cyhyZWZlcmVuY2UsIHt9KTtcbiAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIGltcGx5SG91cik7XG4gICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgIHJldHVybiBjb21wb25lbnQ7XG59XG5leHBvcnRzLnRvbmlnaHQgPSB0b25pZ2h0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nID0gdm9pZCAwO1xuY2xhc3MgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmNhY2hlZElubmVyUGF0dGVybiA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVkUGF0dGVybiA9IG51bGw7XG4gICAgfVxuICAgIHBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICBjb25zdCBpbm5lclBhdHRlcm4gPSB0aGlzLmlubmVyUGF0dGVybihjb250ZXh0KTtcbiAgICAgICAgaWYgKGlubmVyUGF0dGVybiA9PSB0aGlzLmNhY2hlZElubmVyUGF0dGVybikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUGF0dGVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlZFBhdHRlcm4gPSBuZXcgUmVnRXhwKGAoXFxcXFd8Xikke2lubmVyUGF0dGVybi5zb3VyY2V9YCwgaW5uZXJQYXR0ZXJuLmZsYWdzKTtcbiAgICAgICAgdGhpcy5jYWNoZWRJbm5lclBhdHRlcm4gPSBpbm5lclBhdHRlcm47XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlZFBhdHRlcm47XG4gICAgfVxuICAgIGV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gbWF0Y2hbMV07XG4gICAgICAgIG1hdGNoLmluZGV4ID0gbWF0Y2guaW5kZXggKyBoZWFkZXIubGVuZ3RoO1xuICAgICAgICBtYXRjaFswXSA9IG1hdGNoWzBdLnN1YnN0cmluZyhoZWFkZXIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBtYXRjaC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbWF0Y2hbaSAtIDFdID0gbWF0Y2hbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKTtcbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nID0gQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmc7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciA9IHZvaWQgMDtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5mdW5jdGlvbiBwcmltYXJ5VGltZVBhdHRlcm4ocHJpbWFyeVByZWZpeCwgcHJpbWFyeVN1ZmZpeCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKF58XFxcXHN8VHxcXFxcYilcIiArXG4gICAgICAgIGAke3ByaW1hcnlQcmVmaXh9YCArXG4gICAgICAgIFwiKFxcXFxkezEsNH0pXCIgK1xuICAgICAgICBcIig/OlwiICtcbiAgICAgICAgXCIoPzpcXFxcLnxcXFxcOnxcXFxc77yaKVwiICtcbiAgICAgICAgXCIoXFxcXGR7MSwyfSlcIiArXG4gICAgICAgIFwiKD86XCIgK1xuICAgICAgICBcIig/OlxcXFw6fFxcXFzvvJopXCIgK1xuICAgICAgICBcIihcXFxcZHsyfSlcIiArXG4gICAgICAgIFwiKD86XFxcXC4oXFxcXGR7MSw2fSkpP1wiICtcbiAgICAgICAgXCIpP1wiICtcbiAgICAgICAgXCIpP1wiICtcbiAgICAgICAgXCIoPzpcXFxccyooYVxcXFwubVxcXFwufHBcXFxcLm1cXFxcLnxhbT98cG0/KSk/XCIgK1xuICAgICAgICBgJHtwcmltYXJ5U3VmZml4fWAsIFwiaVwiKTtcbn1cbmZ1bmN0aW9uIGZvbGxvd2luZ1RpbWVQYXR0ZW4oZm9sbG93aW5nUGhhc2UsIGZvbGxvd2luZ1N1ZmZpeCkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGBeKCR7Zm9sbG93aW5nUGhhc2V9KWAgK1xuICAgICAgICBcIihcXFxcZHsxLDR9KVwiICtcbiAgICAgICAgXCIoPzpcIiArXG4gICAgICAgIFwiKD86XFxcXC58XFxcXDp8XFxcXO+8milcIiArXG4gICAgICAgIFwiKFxcXFxkezEsMn0pXCIgK1xuICAgICAgICBcIig/OlwiICtcbiAgICAgICAgXCIoPzpcXFxcLnxcXFxcOnxcXFxc77yaKVwiICtcbiAgICAgICAgXCIoXFxcXGR7MSwyfSkoPzpcXFxcLihcXFxcZHsxLDZ9KSk/XCIgK1xuICAgICAgICBcIik/XCIgK1xuICAgICAgICBcIik/XCIgK1xuICAgICAgICBcIig/OlxcXFxzKihhXFxcXC5tXFxcXC58cFxcXFwubVxcXFwufGFtP3xwbT8pKT9cIiArXG4gICAgICAgIGAke2ZvbGxvd2luZ1N1ZmZpeH1gLCBcImlcIik7XG59XG5jb25zdCBIT1VSX0dST1VQID0gMjtcbmNvbnN0IE1JTlVURV9HUk9VUCA9IDM7XG5jb25zdCBTRUNPTkRfR1JPVVAgPSA0O1xuY29uc3QgTUlMTElfU0VDT05EX0dST1VQID0gNTtcbmNvbnN0IEFNX1BNX0hPVVJfR1JPVVAgPSA2O1xuY2xhc3MgQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuY2FjaGVkUHJpbWFyeVByZWZpeCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVkUHJpbWFyeVN1ZmZpeCA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVkUHJpbWFyeVRpbWVQYXR0ZXJuID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdQaGFzZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGVkRm9sbG93aW5nU3VmZml4ID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdUaW1lUGF0dGVuID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdHJpY3RNb2RlID0gc3RyaWN0TW9kZTtcbiAgICB9XG4gICAgcHJpbWFyeVN1ZmZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD89XFxcXFd8JClcIjtcbiAgICB9XG4gICAgZm9sbG93aW5nU3VmZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPz1cXFxcV3wkKVwiO1xuICAgIH1cbiAgICBwYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeVRpbWVQYXR0ZXJuVGhyb3VnaENhY2hlKCk7XG4gICAgfVxuICAgIGV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDb21wb25lbnRzID0gdGhpcy5leHRyYWN0UHJpbWFyeVRpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoKTtcbiAgICAgICAgaWYgKCFzdGFydENvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFsxXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFswXS5zdWJzdHJpbmcobWF0Y2hbMV0ubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KGluZGV4LCB0ZXh0LCBzdGFydENvbXBvbmVudHMpO1xuICAgICAgICBtYXRjaC5pbmRleCArPSBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ1RleHQgPSBjb250ZXh0LnRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4KTtcbiAgICAgICAgY29uc3QgZm9sbG93aW5nUGF0dGVybiA9IHRoaXMuZ2V0Rm9sbG93aW5nVGltZVBhdHRlcm5UaHJvdWdoQ2FjaGUoKTtcbiAgICAgICAgY29uc3QgZm9sbG93aW5nTWF0Y2ggPSBmb2xsb3dpbmdQYXR0ZXJuLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgICAgIGlmICghZm9sbG93aW5nTWF0Y2ggfHxcbiAgICAgICAgICAgIGZvbGxvd2luZ01hdGNoWzBdLm1hdGNoKC9eXFxzKihbKy1dKVxccypcXGR7Myw0fSQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tBbmRSZXR1cm5XaXRob3V0Rm9sbG93aW5nUGF0dGVybihyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5lbmQgPSB0aGlzLmV4dHJhY3RGb2xsb3dpbmdUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBmb2xsb3dpbmdNYXRjaCwgcmVzdWx0KTtcbiAgICAgICAgaWYgKHJlc3VsdC5lbmQpIHtcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ICs9IGZvbGxvd2luZ01hdGNoWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrQW5kUmV0dXJuV2l0aEZvbGxvd2luZ1BhdHRlcm4ocmVzdWx0KTtcbiAgICB9XG4gICAgZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCwgc3RyaWN0ID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgbGV0IG1pbnV0ZSA9IDA7XG4gICAgICAgIGxldCBtZXJpZGllbSA9IG51bGw7XG4gICAgICAgIGxldCBob3VyID0gcGFyc2VJbnQobWF0Y2hbSE9VUl9HUk9VUF0pO1xuICAgICAgICBpZiAoaG91ciA+IDEwMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaWN0TW9kZSB8fCBtYXRjaFtNSU5VVEVfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pbnV0ZSA9IGhvdXIgJSAxMDA7XG4gICAgICAgICAgICBob3VyID0gTWF0aC5mbG9vcihob3VyIC8gMTAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG91ciA+IDI0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbTUlOVVRFX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hbTUlOVVRFX0dST1VQXS5sZW5ndGggPT0gMSAmJiAhbWF0Y2hbQU1fUE1fSE9VUl9HUk9VUF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pbnV0ZSA9IHBhcnNlSW50KG1hdGNoW01JTlVURV9HUk9VUF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW51dGUgPj0gNjApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChob3VyID4gMTIpIHtcbiAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5QTTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbQU1fUE1fSE9VUl9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPiAxMilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFtcG0gPSBtYXRjaFtBTV9QTV9IT1VSX0dST1VQXVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJhXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uQU07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJwXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uUE07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgIT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGhvdXIpO1xuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1pbnV0ZVwiLCBtaW51dGUpO1xuICAgICAgICBpZiAobWVyaWRpZW0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgbWVyaWRpZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbTUlMTElfU0VDT05EX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBtaWxsaXNlY29uZCA9IHBhcnNlSW50KG1hdGNoW01JTExJX1NFQ09ORF9HUk9VUF0uc3Vic3RyaW5nKDAsIDMpKTtcbiAgICAgICAgICAgIGlmIChtaWxsaXNlY29uZCA+PSAxMDAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtaWxsaXNlY29uZFwiLCBtaWxsaXNlY29uZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW1NFQ09ORF9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2Vjb25kID0gcGFyc2VJbnQobWF0Y2hbU0VDT05EX0dST1VQXSk7XG4gICAgICAgICAgICBpZiAoc2Vjb25kID49IDYwKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJzZWNvbmRcIiwgc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG4gICAgZXh0cmFjdEZvbGxvd2luZ1RpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoLCByZXN1bHQpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgaWYgKG1hdGNoW01JTExJX1NFQ09ORF9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbWlsbGlzZWNvbmQgPSBwYXJzZUludChtYXRjaFtNSUxMSV9TRUNPTkRfR1JPVVBdLnN1YnN0cmluZygwLCAzKSk7XG4gICAgICAgICAgICBpZiAobWlsbGlzZWNvbmQgPj0gMTAwMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWlsbGlzZWNvbmRcIiwgbWlsbGlzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtTRUNPTkRfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoW1NFQ09ORF9HUk9VUF0pO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSA2MClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwic2Vjb25kXCIsIHNlY29uZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhvdXIgPSBwYXJzZUludChtYXRjaFtIT1VSX0dST1VQXSk7XG4gICAgICAgIGxldCBtaW51dGUgPSAwO1xuICAgICAgICBsZXQgbWVyaWRpZW0gPSAtMTtcbiAgICAgICAgaWYgKG1hdGNoW01JTlVURV9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgbWludXRlID0gcGFyc2VJbnQobWF0Y2hbTUlOVVRFX0dST1VQXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaG91ciA+IDEwMCkge1xuICAgICAgICAgICAgbWludXRlID0gaG91ciAlIDEwMDtcbiAgICAgICAgICAgIGhvdXIgPSBNYXRoLmZsb29yKGhvdXIgLyAxMDApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW51dGUgPj0gNjAgfHwgaG91ciA+IDI0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaG91ciA+PSAxMikge1xuICAgICAgICAgICAgbWVyaWRpZW0gPSBpbmRleF8xLk1lcmlkaWVtLlBNO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtBTV9QTV9IT1VSX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoaG91ciA+IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbXBtID0gbWF0Y2hbQU1fUE1fSE9VUl9HUk9VUF1bMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChhbXBtID09IFwiYVwiKSB7XG4gICAgICAgICAgICAgICAgbWVyaWRpZW0gPSBpbmRleF8xLk1lcmlkaWVtLkFNO1xuICAgICAgICAgICAgICAgIGlmIChob3VyID09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuaXNDZXJ0YWluKFwiZGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiZGF5XCIsIGNvbXBvbmVudHMuZ2V0KFwiZGF5XCIpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYW1wbSA9PSBcInBcIikge1xuICAgICAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5QTTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciAhPSAxMilcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcIm1lcmlkaWVtXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lcmlkaWVtID09IGluZGV4XzEuTWVyaWRpZW0uQU0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhcnQuZ2V0KFwiaG91clwiKSA9PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmdldChcImhvdXJcIikgIT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJob3VyXCIsIHJlc3VsdC5zdGFydC5nZXQoXCJob3VyXCIpICsgMTIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBob3VyKTtcbiAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtaW51dGVcIiwgbWludXRlKTtcbiAgICAgICAgaWYgKG1lcmlkaWVtID49IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgbWVyaWRpZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRBdFBNID0gcmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcIm1lcmlkaWVtXCIpICYmIHJlc3VsdC5zdGFydC5nZXQoXCJob3VyXCIpID4gMTI7XG4gICAgICAgICAgICBpZiAoc3RhcnRBdFBNKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5nZXQoXCJob3VyXCIpIC0gMTIgPiBob3VyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaG91ciA8PSAxMikge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcImhvdXJcIiwgaG91ciArIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChob3VyID4gMTIpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChob3VyIDw9IDEyKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRzLmRhdGUoKS5nZXRUaW1lKCkgPCByZXN1bHQuc3RhcnQuZGF0ZSgpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcImRheVwiLCBjb21wb25lbnRzLmdldChcImRheVwiKSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbiAgICBjaGVja0FuZFJldHVybldpdGhvdXRGb2xsb3dpbmdQYXR0ZXJuKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LnRleHQubWF0Y2goL15cXGQkLykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQudGV4dC5tYXRjaCgvXFxkW2FwQVBdJC8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmRpbmdXaXRoTnVtYmVycyA9IHJlc3VsdC50ZXh0Lm1hdGNoKC9bXlxcZDouXShcXGRbXFxkLl0rKSQvKTtcbiAgICAgICAgaWYgKGVuZGluZ1dpdGhOdW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRpbmdOdW1iZXJzID0gZW5kaW5nV2l0aE51bWJlcnNbMV07XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW5kaW5nTnVtYmVycy5pbmNsdWRlcyhcIi5cIikgJiYgIWVuZGluZ051bWJlcnMubWF0Y2goL1xcZChcXC5cXGR7Mn0pKyQvKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZW5kaW5nTnVtYmVyVmFsID0gcGFyc2VJbnQoZW5kaW5nTnVtYmVycyk7XG4gICAgICAgICAgICBpZiAoZW5kaW5nTnVtYmVyVmFsID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjaGVja0FuZFJldHVybldpdGhGb2xsb3dpbmdQYXR0ZXJuKHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LnRleHQubWF0Y2goL15cXGQrLVxcZCskLykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZGluZ1dpdGhOdW1iZXJzID0gcmVzdWx0LnRleHQubWF0Y2goL1teXFxkOi5dKFxcZFtcXGQuXSspXFxzKi1cXHMqKFxcZFtcXGQuXSspJC8pO1xuICAgICAgICBpZiAoZW5kaW5nV2l0aE51bWJlcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nTnVtYmVycyA9IGVuZGluZ1dpdGhOdW1iZXJzWzFdO1xuICAgICAgICAgICAgY29uc3QgZW5kaW5nTnVtYmVycyA9IGVuZGluZ1dpdGhOdW1iZXJzWzJdO1xuICAgICAgICAgICAgaWYgKGVuZGluZ051bWJlcnMuaW5jbHVkZXMoXCIuXCIpICYmICFlbmRpbmdOdW1iZXJzLm1hdGNoKC9cXGQoXFwuXFxkezJ9KSskLykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVuZGluZ051bWJlclZhbCA9IHBhcnNlSW50KGVuZGluZ051bWJlcnMpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdOdW1iZXJWYWwgPSBwYXJzZUludChzdGFydGluZ051bWJlcnMpO1xuICAgICAgICAgICAgaWYgKGVuZGluZ051bWJlclZhbCA+IDI0IHx8IHN0YXJ0aW5nTnVtYmVyVmFsID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBnZXRQcmltYXJ5VGltZVBhdHRlcm5UaHJvdWdoQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlQcmVmaXggPSB0aGlzLnByaW1hcnlQcmVmaXgoKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVN1ZmZpeCA9IHRoaXMucHJpbWFyeVN1ZmZpeCgpO1xuICAgICAgICBpZiAodGhpcy5jYWNoZWRQcmltYXJ5UHJlZml4ID09PSBwcmltYXJ5UHJlZml4ICYmIHRoaXMuY2FjaGVkUHJpbWFyeVN1ZmZpeCA9PT0gcHJpbWFyeVN1ZmZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkUHJpbWFyeVRpbWVQYXR0ZXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FjaGVkUHJpbWFyeVRpbWVQYXR0ZXJuID0gcHJpbWFyeVRpbWVQYXR0ZXJuKHByaW1hcnlQcmVmaXgsIHByaW1hcnlTdWZmaXgpO1xuICAgICAgICB0aGlzLmNhY2hlZFByaW1hcnlQcmVmaXggPSBwcmltYXJ5UHJlZml4O1xuICAgICAgICB0aGlzLmNhY2hlZFByaW1hcnlTdWZmaXggPSBwcmltYXJ5U3VmZml4O1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRQcmltYXJ5VGltZVBhdHRlcm47XG4gICAgfVxuICAgIGdldEZvbGxvd2luZ1RpbWVQYXR0ZXJuVGhyb3VnaENhY2hlKCkge1xuICAgICAgICBjb25zdCBmb2xsb3dpbmdQaGFzZSA9IHRoaXMuZm9sbG93aW5nUGhhc2UoKTtcbiAgICAgICAgY29uc3QgZm9sbG93aW5nU3VmZml4ID0gdGhpcy5mb2xsb3dpbmdTdWZmaXgoKTtcbiAgICAgICAgaWYgKHRoaXMuY2FjaGVkRm9sbG93aW5nUGhhc2UgPT09IGZvbGxvd2luZ1BoYXNlICYmIHRoaXMuY2FjaGVkRm9sbG93aW5nU3VmZml4ID09PSBmb2xsb3dpbmdTdWZmaXgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlZEZvbGxvd2luZ1RpbWVQYXR0ZW47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdUaW1lUGF0dGVuID0gZm9sbG93aW5nVGltZVBhdHRlbihmb2xsb3dpbmdQaGFzZSwgZm9sbG93aW5nU3VmZml4KTtcbiAgICAgICAgdGhpcy5jYWNoZWRGb2xsb3dpbmdQaGFzZSA9IGZvbGxvd2luZ1BoYXNlO1xuICAgICAgICB0aGlzLmNhY2hlZEZvbGxvd2luZ1N1ZmZpeCA9IGZvbGxvd2luZ1N1ZmZpeDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkRm9sbG93aW5nVGltZVBhdHRlbjtcbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXIgPSBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKFswLTldezR9KVxcXFwtKFswLTldezEsMn0pXFxcXC0oWzAtOV17MSwyfSlcIiArXG4gICAgXCIoPzpUXCIgK1xuICAgIFwiKFswLTldezEsMn0pOihbMC05XXsxLDJ9KVwiICtcbiAgICBcIig/OlwiICtcbiAgICBcIjooWzAtOV17MSwyfSkoPzpcXFxcLihcXFxcZHsxLDR9KSk/XCIgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPzpcIiArXG4gICAgXCJafChbKy1dXFxcXGR7Mn0pOj8oXFxcXGR7Mn0pP1wiICtcbiAgICBcIik/XCIgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPz1cXFxcV3wkKVwiLCBcImlcIik7XG5jb25zdCBZRUFSX05VTUJFUl9HUk9VUCA9IDE7XG5jb25zdCBNT05USF9OVU1CRVJfR1JPVVAgPSAyO1xuY29uc3QgREFURV9OVU1CRVJfR1JPVVAgPSAzO1xuY29uc3QgSE9VUl9OVU1CRVJfR1JPVVAgPSA0O1xuY29uc3QgTUlOVVRFX05VTUJFUl9HUk9VUCA9IDU7XG5jb25zdCBTRUNPTkRfTlVNQkVSX0dST1VQID0gNjtcbmNvbnN0IE1JTExJU0VDT05EX05VTUJFUl9HUk9VUCA9IDc7XG5jb25zdCBUWkRfSE9VUl9PRkZTRVRfR1JPVVAgPSA4O1xuY29uc3QgVFpEX01JTlVURV9PRkZTRVRfR1JPVVAgPSA5O1xuY2xhc3MgSVNPRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0ge307XG4gICAgICAgIGNvbXBvbmVudHNbXCJ5ZWFyXCJdID0gcGFyc2VJbnQobWF0Y2hbWUVBUl9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgY29tcG9uZW50c1tcIm1vbnRoXCJdID0gcGFyc2VJbnQobWF0Y2hbTU9OVEhfTlVNQkVSX0dST1VQXSk7XG4gICAgICAgIGNvbXBvbmVudHNbXCJkYXlcIl0gPSBwYXJzZUludChtYXRjaFtEQVRFX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICBpZiAobWF0Y2hbSE9VUl9OVU1CRVJfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbXCJob3VyXCJdID0gcGFyc2VJbnQobWF0Y2hbSE9VUl9OVU1CRVJfR1JPVVBdKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHNbXCJtaW51dGVcIl0gPSBwYXJzZUludChtYXRjaFtNSU5VVEVfTlVNQkVSX0dST1VQXSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hbU0VDT05EX05VTUJFUl9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbXCJzZWNvbmRcIl0gPSBwYXJzZUludChtYXRjaFtTRUNPTkRfTlVNQkVSX0dST1VQXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbTUlMTElTRUNPTkRfTlVNQkVSX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50c1tcIm1pbGxpc2Vjb25kXCJdID0gcGFyc2VJbnQobWF0Y2hbTUlMTElTRUNPTkRfTlVNQkVSX0dST1VQXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbVFpEX0hPVVJfT0ZGU0VUX0dST1VQXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50c1tcInRpbWV6b25lT2Zmc2V0XCJdID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXJPZmZzZXQgPSBwYXJzZUludChtYXRjaFtUWkRfSE9VUl9PRkZTRVRfR1JPVVBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbWludXRlT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbVFpEX01JTlVURV9PRkZTRVRfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbWludXRlT2Zmc2V0ID0gcGFyc2VJbnQobWF0Y2hbVFpEX01JTlVURV9PRkZTRVRfR1JPVVBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IGhvdXJPZmZzZXQgKiA2MDtcbiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gbWludXRlT2Zmc2V0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG1pbnV0ZU9mZnNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tcG9uZW50c1tcInRpbWV6b25lT2Zmc2V0XCJdID0gb2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IElTT0Zvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKFteXFxcXGRdfF4pXCIgK1xuICAgIFwiKFswLTNdezAsMX1bMC05XXsxfSlbXFxcXC9cXFxcLlxcXFwtXShbMC0zXXswLDF9WzAtOV17MX0pXCIgK1xuICAgIFwiKD86W1xcXFwvXFxcXC5cXFxcLV0oWzAtOV17NH18WzAtOV17Mn0pKT9cIiArXG4gICAgXCIoXFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgT1BFTklOR19HUk9VUCA9IDE7XG5jb25zdCBFTkRJTkdfR1JPVVAgPSA1O1xuY29uc3QgRklSU1RfTlVNQkVSU19HUk9VUCA9IDI7XG5jb25zdCBTRUNPTkRfTlVNQkVSU19HUk9VUCA9IDM7XG5jb25zdCBZRUFSX0dST1VQID0gNDtcbmNsYXNzIFNsYXNoRGF0ZUZvcm1hdFBhcnNlciB7XG4gICAgY29uc3RydWN0b3IobGl0dGxlRW5kaWFuKSB7XG4gICAgICAgIHRoaXMuZ3JvdXBOdW1iZXJNb250aCA9IGxpdHRsZUVuZGlhbiA/IFNFQ09ORF9OVU1CRVJTX0dST1VQIDogRklSU1RfTlVNQkVSU19HUk9VUDtcbiAgICAgICAgdGhpcy5ncm91cE51bWJlckRheSA9IGxpdHRsZUVuZGlhbiA/IEZJUlNUX05VTUJFUlNfR1JPVVAgOiBTRUNPTkRfTlVNQkVSU19HUk9VUDtcbiAgICB9XG4gICAgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgaWYgKG1hdGNoW09QRU5JTkdfR1JPVVBdID09IFwiL1wiIHx8IG1hdGNoW0VORElOR19HUk9VUF0gPT0gXCIvXCIpIHtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbT1BFTklOR19HUk9VUF0ubGVuZ3RoO1xuICAgICAgICBjb25zdCB0ZXh0ID0gbWF0Y2hbMF0uc3Vic3RyKG1hdGNoW09QRU5JTkdfR1JPVVBdLmxlbmd0aCwgbWF0Y2hbMF0ubGVuZ3RoIC0gbWF0Y2hbT1BFTklOR19HUk9VUF0ubGVuZ3RoIC0gbWF0Y2hbRU5ESU5HX0dST1VQXS5sZW5ndGgpO1xuICAgICAgICBpZiAodGV4dC5tYXRjaCgvXlxcZFxcLlxcZCQvKSB8fCB0ZXh0Lm1hdGNoKC9eXFxkXFwuXFxkezEsMn1cXC5cXGR7MSwyfVxccyokLykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1hdGNoW1lFQVJfR1JPVVBdICYmIG1hdGNoWzBdLmluZGV4T2YoXCIvXCIpIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChpbmRleCwgdGV4dCk7XG4gICAgICAgIGxldCBtb250aCA9IHBhcnNlSW50KG1hdGNoW3RoaXMuZ3JvdXBOdW1iZXJNb250aF0pO1xuICAgICAgICBsZXQgZGF5ID0gcGFyc2VJbnQobWF0Y2hbdGhpcy5ncm91cE51bWJlckRheV0pO1xuICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgICAgICAgIGlmIChtb250aCA+IDEyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRheSA+PSAxICYmIGRheSA8PSAxMiAmJiBtb250aCA8PSAzMSkge1xuICAgICAgICAgICAgICAgICAgICBbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gMzEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJkYXlcIiwgZGF5KTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCByYXdZZWFyTnVtYmVyID0gcGFyc2VJbnQobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZE1vc3RMaWtlbHlBRFllYXIocmF3WWVhck51bWJlcik7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSB5ZWFyc18xLmZpbmRZZWFyQ2xvc2VzdFRvUmVmKGNvbnRleHQucmVmRGF0ZSwgZGF5LCBtb250aCk7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gU2xhc2hEYXRlRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBhYnN0cmFjdFJlZmluZXJzXzEgPSByZXF1aXJlKFwiLi4vYWJzdHJhY3RSZWZpbmVyc1wiKTtcbmNsYXNzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIGV4dGVuZHMgYWJzdHJhY3RSZWZpbmVyc18xLk1lcmdpbmdSZWZpbmVyIHtcbiAgICBzaG91bGRNZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuICFjdXJyZW50UmVzdWx0LmVuZCAmJiAhbmV4dFJlc3VsdC5lbmQgJiYgdGV4dEJldHdlZW4ubWF0Y2godGhpcy5wYXR0ZXJuQmV0d2VlbigpKSAhPSBudWxsO1xuICAgIH1cbiAgICBtZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGZyb21SZXN1bHQsIHRvUmVzdWx0KSB7XG4gICAgICAgIGlmICghZnJvbVJlc3VsdC5zdGFydC5pc09ubHlXZWVrZGF5Q29tcG9uZW50KCkgJiYgIXRvUmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgdG9SZXN1bHQuc3RhcnQuZ2V0Q2VydGFpbkNvbXBvbmVudHMoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZyb21SZXN1bHQuc3RhcnQuaXNDZXJ0YWluKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbVJlc3VsdC5zdGFydC5hc3NpZ24oa2V5LCB0b1Jlc3VsdC5zdGFydC5nZXQoa2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBmcm9tUmVzdWx0LnN0YXJ0LmdldENlcnRhaW5Db21wb25lbnRzKCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0b1Jlc3VsdC5zdGFydC5pc0NlcnRhaW4oa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB0b1Jlc3VsdC5zdGFydC5hc3NpZ24oa2V5LCBmcm9tUmVzdWx0LnN0YXJ0LmdldChrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZnJvbVJlc3VsdC5zdGFydC5kYXRlKCkuZ2V0VGltZSgpID4gdG9SZXN1bHQuc3RhcnQuZGF0ZSgpLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgbGV0IGZyb21Nb21lbnQgPSBmcm9tUmVzdWx0LnN0YXJ0LmRheWpzKCk7XG4gICAgICAgICAgICBsZXQgdG9Nb21lbnQgPSB0b1Jlc3VsdC5zdGFydC5kYXlqcygpO1xuICAgICAgICAgICAgaWYgKGZyb21SZXN1bHQuc3RhcnQuaXNPbmx5V2Vla2RheUNvbXBvbmVudCgpICYmIGZyb21Nb21lbnQuYWRkKC03LCBcImRheXNcIikuaXNCZWZvcmUodG9Nb21lbnQpKSB7XG4gICAgICAgICAgICAgICAgZnJvbU1vbWVudCA9IGZyb21Nb21lbnQuYWRkKC03LCBcImRheXNcIik7XG4gICAgICAgICAgICAgICAgZnJvbVJlc3VsdC5zdGFydC5pbXBseShcImRheVwiLCBmcm9tTW9tZW50LmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgZnJvbVJlc3VsdC5zdGFydC5pbXBseShcIm1vbnRoXCIsIGZyb21Nb21lbnQubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgIGZyb21SZXN1bHQuc3RhcnQuaW1wbHkoXCJ5ZWFyXCIsIGZyb21Nb21lbnQueWVhcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRvUmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSAmJiB0b01vbWVudC5hZGQoNywgXCJkYXlzXCIpLmlzQWZ0ZXIoZnJvbU1vbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0b01vbWVudCA9IHRvTW9tZW50LmFkZCg3LCBcImRheXNcIik7XG4gICAgICAgICAgICAgICAgdG9SZXN1bHQuc3RhcnQuaW1wbHkoXCJkYXlcIiwgdG9Nb21lbnQuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICB0b1Jlc3VsdC5zdGFydC5pbXBseShcIm1vbnRoXCIsIHRvTW9tZW50Lm1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICB0b1Jlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgdG9Nb21lbnQueWVhcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIFt0b1Jlc3VsdCwgZnJvbVJlc3VsdF0gPSBbZnJvbVJlc3VsdCwgdG9SZXN1bHRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGZyb21SZXN1bHQuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0ID0gZnJvbVJlc3VsdC5zdGFydDtcbiAgICAgICAgcmVzdWx0LmVuZCA9IHRvUmVzdWx0LnN0YXJ0O1xuICAgICAgICByZXN1bHQuaW5kZXggPSBNYXRoLm1pbihmcm9tUmVzdWx0LmluZGV4LCB0b1Jlc3VsdC5pbmRleCk7XG4gICAgICAgIGlmIChmcm9tUmVzdWx0LmluZGV4IDwgdG9SZXN1bHQuaW5kZXgpIHtcbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ID0gZnJvbVJlc3VsdC50ZXh0ICsgdGV4dEJldHdlZW4gKyB0b1Jlc3VsdC50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnRleHQgPSB0b1Jlc3VsdC50ZXh0ICsgdGV4dEJldHdlZW4gKyBmcm9tUmVzdWx0LnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYWJzdHJhY3RSZWZpbmVyc18xID0gcmVxdWlyZShcIi4uL2Fic3RyYWN0UmVmaW5lcnNcIik7XG5jb25zdCBtZXJnaW5nQ2FsY3VsYXRpb25fMSA9IHJlcXVpcmUoXCIuLi8uLi9jYWxjdWxhdGlvbi9tZXJnaW5nQ2FsY3VsYXRpb25cIik7XG5jbGFzcyBFTk1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgYWJzdHJhY3RSZWZpbmVyc18xLk1lcmdpbmdSZWZpbmVyIHtcbiAgICBzaG91bGRNZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuICgoKGN1cnJlbnRSZXN1bHQuc3RhcnQuaXNPbmx5RGF0ZSgpICYmIG5leHRSZXN1bHQuc3RhcnQuaXNPbmx5VGltZSgpKSB8fFxuICAgICAgICAgICAgKG5leHRSZXN1bHQuc3RhcnQuaXNPbmx5RGF0ZSgpICYmIGN1cnJlbnRSZXN1bHQuc3RhcnQuaXNPbmx5VGltZSgpKSkgJiZcbiAgICAgICAgICAgIHRleHRCZXR3ZWVuLm1hdGNoKHRoaXMucGF0dGVybkJldHdlZW4oKSkgIT0gbnVsbCk7XG4gICAgfVxuICAgIG1lcmdlUmVzdWx0cyh0ZXh0QmV0d2VlbiwgY3VycmVudFJlc3VsdCwgbmV4dFJlc3VsdCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjdXJyZW50UmVzdWx0LnN0YXJ0LmlzT25seURhdGUoKVxuICAgICAgICAgICAgPyBtZXJnaW5nQ2FsY3VsYXRpb25fMS5tZXJnZURhdGVUaW1lUmVzdWx0KGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpXG4gICAgICAgICAgICA6IG1lcmdpbmdDYWxjdWxhdGlvbl8xLm1lcmdlRGF0ZVRpbWVSZXN1bHQobmV4dFJlc3VsdCwgY3VycmVudFJlc3VsdCk7XG4gICAgICAgIHJlc3VsdC5pbmRleCA9IGN1cnJlbnRSZXN1bHQuaW5kZXg7XG4gICAgICAgIHJlc3VsdC50ZXh0ID0gY3VycmVudFJlc3VsdC50ZXh0ICsgdGV4dEJldHdlZW4gKyBuZXh0UmVzdWx0LnRleHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5NZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgVElNRVpPTkVfTkFNRV9QQVRURVJOID0gbmV3IFJlZ0V4cChcIl5cXFxccyosP1xcXFxzKlxcXFwoPyhbQS1aXXsyLDR9KVxcXFwpPyg/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IERFRkFVTFRfVElNRVpPTkVfQUJCUl9NQVAgPSB7XG4gICAgQUNEVDogNjMwLFxuICAgIEFDU1Q6IDU3MCxcbiAgICBBRFQ6IC0xODAsXG4gICAgQUVEVDogNjYwLFxuICAgIEFFU1Q6IDYwMCxcbiAgICBBRlQ6IDI3MCxcbiAgICBBS0RUOiAtNDgwLFxuICAgIEFLU1Q6IC01NDAsXG4gICAgQUxNVDogMzYwLFxuICAgIEFNU1Q6IC0xODAsXG4gICAgQU1UOiAtMjQwLFxuICAgIEFOQVNUOiA3MjAsXG4gICAgQU5BVDogNzIwLFxuICAgIEFRVFQ6IDMwMCxcbiAgICBBUlQ6IC0xODAsXG4gICAgQVNUOiAtMjQwLFxuICAgIEFXRFQ6IDU0MCxcbiAgICBBV1NUOiA0ODAsXG4gICAgQVpPU1Q6IDAsXG4gICAgQVpPVDogLTYwLFxuICAgIEFaU1Q6IDMwMCxcbiAgICBBWlQ6IDI0MCxcbiAgICBCTlQ6IDQ4MCxcbiAgICBCT1Q6IC0yNDAsXG4gICAgQlJTVDogLTEyMCxcbiAgICBCUlQ6IC0xODAsXG4gICAgQlNUOiA2MCxcbiAgICBCVFQ6IDM2MCxcbiAgICBDQVNUOiA0ODAsXG4gICAgQ0FUOiAxMjAsXG4gICAgQ0NUOiAzOTAsXG4gICAgQ0RUOiAtMzAwLFxuICAgIENFU1Q6IDEyMCxcbiAgICBDRVQ6IDYwLFxuICAgIENIQURUOiA4MjUsXG4gICAgQ0hBU1Q6IDc2NSxcbiAgICBDS1Q6IC02MDAsXG4gICAgQ0xTVDogLTE4MCxcbiAgICBDTFQ6IC0yNDAsXG4gICAgQ09UOiAtMzAwLFxuICAgIENTVDogLTM2MCxcbiAgICBDVlQ6IC02MCxcbiAgICBDWFQ6IDQyMCxcbiAgICBDaFNUOiA2MDAsXG4gICAgREFWVDogNDIwLFxuICAgIEVBU1NUOiAtMzAwLFxuICAgIEVBU1Q6IC0zNjAsXG4gICAgRUFUOiAxODAsXG4gICAgRUNUOiAtMzAwLFxuICAgIEVEVDogLTI0MCxcbiAgICBFRVNUOiAxODAsXG4gICAgRUVUOiAxMjAsXG4gICAgRUdTVDogMCxcbiAgICBFR1Q6IC02MCxcbiAgICBFU1Q6IC0zMDAsXG4gICAgRVQ6IC0zMDAsXG4gICAgRkpTVDogNzgwLFxuICAgIEZKVDogNzIwLFxuICAgIEZLU1Q6IC0xODAsXG4gICAgRktUOiAtMjQwLFxuICAgIEZOVDogLTEyMCxcbiAgICBHQUxUOiAtMzYwLFxuICAgIEdBTVQ6IC01NDAsXG4gICAgR0VUOiAyNDAsXG4gICAgR0ZUOiAtMTgwLFxuICAgIEdJTFQ6IDcyMCxcbiAgICBHTVQ6IDAsXG4gICAgR1NUOiAyNDAsXG4gICAgR1lUOiAtMjQwLFxuICAgIEhBQTogLTE4MCxcbiAgICBIQUM6IC0zMDAsXG4gICAgSEFEVDogLTU0MCxcbiAgICBIQUU6IC0yNDAsXG4gICAgSEFQOiAtNDIwLFxuICAgIEhBUjogLTM2MCxcbiAgICBIQVNUOiAtNjAwLFxuICAgIEhBVDogLTkwLFxuICAgIEhBWTogLTQ4MCxcbiAgICBIS1Q6IDQ4MCxcbiAgICBITFY6IC0yMTAsXG4gICAgSE5BOiAtMjQwLFxuICAgIEhOQzogLTM2MCxcbiAgICBITkU6IC0zMDAsXG4gICAgSE5QOiAtNDgwLFxuICAgIEhOUjogLTQyMCxcbiAgICBITlQ6IC0xNTAsXG4gICAgSE5ZOiAtNTQwLFxuICAgIEhPVlQ6IDQyMCxcbiAgICBJQ1Q6IDQyMCxcbiAgICBJRFQ6IDE4MCxcbiAgICBJT1Q6IDM2MCxcbiAgICBJUkRUOiAyNzAsXG4gICAgSVJLU1Q6IDU0MCxcbiAgICBJUktUOiA1NDAsXG4gICAgSVJTVDogMjEwLFxuICAgIElTVDogMzMwLFxuICAgIEpTVDogNTQwLFxuICAgIEtHVDogMzYwLFxuICAgIEtSQVNUOiA0ODAsXG4gICAgS1JBVDogNDgwLFxuICAgIEtTVDogNTQwLFxuICAgIEtVWVQ6IDI0MCxcbiAgICBMSERUOiA2NjAsXG4gICAgTEhTVDogNjMwLFxuICAgIExJTlQ6IDg0MCxcbiAgICBNQUdTVDogNzIwLFxuICAgIE1BR1Q6IDcyMCxcbiAgICBNQVJUOiAtNTEwLFxuICAgIE1BV1Q6IDMwMCxcbiAgICBNRFQ6IC0zNjAsXG4gICAgTUVTWjogMTIwLFxuICAgIE1FWjogNjAsXG4gICAgTUhUOiA3MjAsXG4gICAgTU1UOiAzOTAsXG4gICAgTVNEOiAyNDAsXG4gICAgTVNLOiAyNDAsXG4gICAgTVNUOiAtNDIwLFxuICAgIE1VVDogMjQwLFxuICAgIE1WVDogMzAwLFxuICAgIE1ZVDogNDgwLFxuICAgIE5DVDogNjYwLFxuICAgIE5EVDogLTkwLFxuICAgIE5GVDogNjkwLFxuICAgIE5PVlNUOiA0MjAsXG4gICAgTk9WVDogMzYwLFxuICAgIE5QVDogMzQ1LFxuICAgIE5TVDogLTE1MCxcbiAgICBOVVQ6IC02NjAsXG4gICAgTlpEVDogNzgwLFxuICAgIE5aU1Q6IDcyMCxcbiAgICBPTVNTVDogNDIwLFxuICAgIE9NU1Q6IDQyMCxcbiAgICBQRFQ6IC00MjAsXG4gICAgUEVUOiAtMzAwLFxuICAgIFBFVFNUOiA3MjAsXG4gICAgUEVUVDogNzIwLFxuICAgIFBHVDogNjAwLFxuICAgIFBIT1Q6IDc4MCxcbiAgICBQSFQ6IDQ4MCxcbiAgICBQS1Q6IDMwMCxcbiAgICBQTURUOiAtMTIwLFxuICAgIFBNU1Q6IC0xODAsXG4gICAgUE9OVDogNjYwLFxuICAgIFBTVDogLTQ4MCxcbiAgICBQVDogLTQ4MCxcbiAgICBQV1Q6IDU0MCxcbiAgICBQWVNUOiAtMTgwLFxuICAgIFBZVDogLTI0MCxcbiAgICBSRVQ6IDI0MCxcbiAgICBTQU1UOiAyNDAsXG4gICAgU0FTVDogMTIwLFxuICAgIFNCVDogNjYwLFxuICAgIFNDVDogMjQwLFxuICAgIFNHVDogNDgwLFxuICAgIFNSVDogLTE4MCxcbiAgICBTU1Q6IC02NjAsXG4gICAgVEFIVDogLTYwMCxcbiAgICBURlQ6IDMwMCxcbiAgICBUSlQ6IDMwMCxcbiAgICBUS1Q6IDc4MCxcbiAgICBUTFQ6IDU0MCxcbiAgICBUTVQ6IDMwMCxcbiAgICBUVlQ6IDcyMCxcbiAgICBVTEFUOiA0ODAsXG4gICAgVVRDOiAwLFxuICAgIFVZU1Q6IC0xMjAsXG4gICAgVVlUOiAtMTgwLFxuICAgIFVaVDogMzAwLFxuICAgIFZFVDogLTIxMCxcbiAgICBWTEFTVDogNjYwLFxuICAgIFZMQVQ6IDY2MCxcbiAgICBWVVQ6IDY2MCxcbiAgICBXQVNUOiAxMjAsXG4gICAgV0FUOiA2MCxcbiAgICBXRVNUOiA2MCxcbiAgICBXRVNaOiA2MCxcbiAgICBXRVQ6IDAsXG4gICAgV0VaOiAwLFxuICAgIFdGVDogNzIwLFxuICAgIFdHU1Q6IC0xMjAsXG4gICAgV0dUOiAtMTgwLFxuICAgIFdJQjogNDIwLFxuICAgIFdJVDogNTQwLFxuICAgIFdJVEE6IDQ4MCxcbiAgICBXU1Q6IDc4MCxcbiAgICBXVDogMCxcbiAgICBZQUtTVDogNjAwLFxuICAgIFlBS1Q6IDYwMCxcbiAgICBZQVBUOiA2MDAsXG4gICAgWUVLU1Q6IDM2MCxcbiAgICBZRUtUOiAzNjAsXG59O1xuY2xhc3MgRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXIge1xuICAgIGNvbnN0cnVjdG9yKHRpbWV6b25lT3ZlcnJpZGVzKSB7XG4gICAgICAgIHRoaXMudGltZXpvbmUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfVElNRVpPTkVfQUJCUl9NQVApLCB0aW1lem9uZU92ZXJyaWRlcyk7XG4gICAgfVxuICAgIHJlZmluZShjb250ZXh0LCByZXN1bHRzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgdGltZXpvbmVPdmVycmlkZXMgPSAoX2EgPSBjb250ZXh0Lm9wdGlvbi50aW1lem9uZXMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgICAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcocmVzdWx0LmluZGV4ICsgcmVzdWx0LnRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gVElNRVpPTkVfTkFNRV9QQVRURVJOLmV4ZWMoc3VmZml4KTtcbiAgICAgICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0aW1lem9uZUFiYnIgPSBtYXRjaFsxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQgPSAoX2IgPSAoX2EgPSB0aW1lem9uZU92ZXJyaWRlc1t0aW1lem9uZUFiYnJdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnRpbWV6b25lW3RpbWV6b25lQWJicl0pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGw7XG4gICAgICAgICAgICBpZiAoZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXh0cmFjdGluZyB0aW1lem9uZTogJyR7dGltZXpvbmVBYmJyfScgaW50byA6ICR7ZXh0cmFjdGVkVGltZXpvbmVPZmZzZXR9YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lem9uZU9mZnNldCA9IHJlc3VsdC5zdGFydC5nZXQoXCJ0aW1lem9uZU9mZnNldFwiKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50VGltZXpvbmVPZmZzZXQgIT09IG51bGwgJiYgZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQgIT0gY3VycmVudFRpbWV6b25lT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGFydC5pc0NlcnRhaW4oXCJ0aW1lem9uZU9mZnNldFwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZUFiYnIgIT0gbWF0Y2hbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC50ZXh0ICs9IG1hdGNoWzBdO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwidGltZXpvbmVPZmZzZXRcIikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwidGltZXpvbmVPZmZzZXRcIiwgZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5lbmQgIT0gbnVsbCAmJiAhcmVzdWx0LmVuZC5pc0NlcnRhaW4oXCJ0aW1lem9uZU9mZnNldFwiKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwidGltZXpvbmVPZmZzZXRcIiwgZXh0cmFjdGVkVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IFRJTUVaT05FX09GRlNFVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIl5cXFxccyooPzooPzpHTVR8VVRDKVxcXFxzPyk/KFsrLV0pKFxcXFxkezEsMn0pKD86Oj8oXFxcXGR7Mn0pKT9cIiwgXCJpXCIpO1xuY29uc3QgVElNRVpPTkVfT0ZGU0VUX1NJR05fR1JPVVAgPSAxO1xuY29uc3QgVElNRVpPTkVfT0ZGU0VUX0hPVVJfT0ZGU0VUX0dST1VQID0gMjtcbmNvbnN0IFRJTUVaT05FX09GRlNFVF9NSU5VVEVfT0ZGU0VUX0dST1VQID0gMztcbmNsYXNzIEV4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXIge1xuICAgIHJlZmluZShjb250ZXh0LCByZXN1bHRzKSB7XG4gICAgICAgIHJlc3VsdHMuZm9yRWFjaChmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcInRpbWV6b25lT2Zmc2V0XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gY29udGV4dC50ZXh0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXggKyByZXN1bHQudGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBUSU1FWk9ORV9PRkZTRVRfUEFUVEVSTi5leGVjKHN1ZmZpeCk7XG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEV4dHJhY3RpbmcgdGltZXpvbmU6ICcke21hdGNoWzBdfScgaW50byA6ICR7cmVzdWx0fWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBob3VyT2Zmc2V0ID0gcGFyc2VJbnQobWF0Y2hbVElNRVpPTkVfT0ZGU0VUX0hPVVJfT0ZGU0VUX0dST1VQXSk7XG4gICAgICAgICAgICBjb25zdCBtaW51dGVPZmZzZXQgPSBwYXJzZUludChtYXRjaFtUSU1FWk9ORV9PRkZTRVRfTUlOVVRFX09GRlNFVF9HUk9VUF0gfHwgXCIwXCIpO1xuICAgICAgICAgICAgbGV0IHRpbWV6b25lT2Zmc2V0ID0gaG91ck9mZnNldCAqIDYwICsgbWludXRlT2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG1hdGNoW1RJTUVaT05FX09GRlNFVF9TSUdOX0dST1VQXSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgICAgICB0aW1lem9uZU9mZnNldCA9IC10aW1lem9uZU9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIHRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ0aW1lem9uZU9mZnNldFwiLCB0aW1lem9uZU9mZnNldCk7XG4gICAgICAgICAgICByZXN1bHQudGV4dCArPSBtYXRjaFswXTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEV4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGRheWpzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRheWpzXCIpKTtcbmNsYXNzIEZvcndhcmREYXRlUmVmaW5lciB7XG4gICAgcmVmaW5lKGNvbnRleHQsIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKCFjb250ZXh0Lm9wdGlvbi5mb3J3YXJkRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGxldCByZWZNb21lbnQgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhcnQuaXNPbmx5RGF5TW9udGhDb21wb25lbnQoKSAmJiByZWZNb21lbnQuaXNBZnRlcihyZXN1bHQuc3RhcnQuZGF5anMoKSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMgJiYgcmVmTW9tZW50LmlzQWZ0ZXIocmVzdWx0LnN0YXJ0LmRheWpzKCkpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCByZXN1bHQuc3RhcnQuZ2V0KFwieWVhclwiKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3J3YXJkIHllYXJseSBhZGp1c3RlZCBmb3IgJHtyZXN1bHR9ICgke3Jlc3VsdC5zdGFydH0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVuZCAmJiAhcmVzdWx0LmVuZC5pc0NlcnRhaW4oXCJ5ZWFyXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmltcGx5KFwieWVhclwiLCByZXN1bHQuZW5kLmdldChcInllYXJcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3J3YXJkIHllYXJseSBhZGp1c3RlZCBmb3IgJHtyZXN1bHR9ICgke3Jlc3VsdC5lbmR9KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSAmJiByZWZNb21lbnQuaXNBZnRlcihyZXN1bHQuc3RhcnQuZGF5anMoKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVmTW9tZW50LmRheSgpID4gcmVzdWx0LnN0YXJ0LmdldChcIndlZWtkYXlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmTW9tZW50ID0gcmVmTW9tZW50LmRheShyZXN1bHQuc3RhcnQuZ2V0KFwid2Vla2RheVwiKSArIDcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmTW9tZW50ID0gcmVmTW9tZW50LmRheShyZXN1bHQuc3RhcnQuZ2V0KFwid2Vla2RheVwiKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcImRheVwiLCByZWZNb21lbnQuZGF0ZSgpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJtb250aFwiLCByZWZNb21lbnQubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgcmVmTW9tZW50LnllYXIoKSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3J3YXJkIHdlZWtseSBhZGp1c3RlZCBmb3IgJHtyZXN1bHR9ICgke3Jlc3VsdC5zdGFydH0pYCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5lbmQgJiYgcmVzdWx0LmVuZC5pc09ubHlXZWVrZGF5Q29tcG9uZW50KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk1vbWVudC5kYXkoKSA+IHJlc3VsdC5lbmQuZ2V0KFwid2Vla2RheVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmTW9tZW50ID0gcmVmTW9tZW50LmRheShyZXN1bHQuZW5kLmdldChcIndlZWtkYXlcIikgKyA3KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZk1vbWVudCA9IHJlZk1vbWVudC5kYXkocmVzdWx0LmVuZC5nZXQoXCJ3ZWVrZGF5XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmltcGx5KFwiZGF5XCIsIHJlZk1vbWVudC5kYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5kLmltcGx5KFwibW9udGhcIiwgcmVmTW9tZW50Lm1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmVuZC5pbXBseShcInllYXJcIiwgcmVmTW9tZW50LnllYXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZvcndhcmQgd2Vla2x5IGFkanVzdGVkIGZvciAke3Jlc3VsdH0gKCR7cmVzdWx0LmVuZH0pYCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZvcndhcmREYXRlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYWJzdHJhY3RSZWZpbmVyc18xID0gcmVxdWlyZShcIi4uL2Fic3RyYWN0UmVmaW5lcnNcIik7XG5jbGFzcyBNZXJnZVdlZWtkYXlDb21wb25lbnRSZWZpbmVyIGV4dGVuZHMgYWJzdHJhY3RSZWZpbmVyc18xLk1lcmdpbmdSZWZpbmVyIHtcbiAgICBtZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpIHtcbiAgICAgICAgY29uc3QgbmV3UmVzdWx0ID0gbmV4dFJlc3VsdC5jbG9uZSgpO1xuICAgICAgICBuZXdSZXN1bHQuaW5kZXggPSBjdXJyZW50UmVzdWx0LmluZGV4O1xuICAgICAgICBuZXdSZXN1bHQudGV4dCA9IGN1cnJlbnRSZXN1bHQudGV4dCArIHRleHRCZXR3ZWVuICsgbmV3UmVzdWx0LnRleHQ7XG4gICAgICAgIG5ld1Jlc3VsdC5zdGFydC5hc3NpZ24oXCJ3ZWVrZGF5XCIsIGN1cnJlbnRSZXN1bHQuc3RhcnQuZ2V0KFwid2Vla2RheVwiKSk7XG4gICAgICAgIGlmIChuZXdSZXN1bHQuZW5kKSB7XG4gICAgICAgICAgICBuZXdSZXN1bHQuZW5kLmFzc2lnbihcIndlZWtkYXlcIiwgY3VycmVudFJlc3VsdC5zdGFydC5nZXQoXCJ3ZWVrZGF5XCIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3UmVzdWx0O1xuICAgIH1cbiAgICBzaG91bGRNZXJnZVJlc3VsdHModGV4dEJldHdlZW4sIGN1cnJlbnRSZXN1bHQsIG5leHRSZXN1bHQpIHtcbiAgICAgICAgY29uc3Qgd2Vla2RheVRoZW5Ob3JtYWxEYXRlID0gY3VycmVudFJlc3VsdC5zdGFydC5pc09ubHlXZWVrZGF5Q29tcG9uZW50KCkgJiZcbiAgICAgICAgICAgICFjdXJyZW50UmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcImhvdXJcIikgJiZcbiAgICAgICAgICAgIG5leHRSZXN1bHQuc3RhcnQuaXNDZXJ0YWluKFwiZGF5XCIpO1xuICAgICAgICByZXR1cm4gd2Vla2RheVRoZW5Ob3JtYWxEYXRlICYmIHRleHRCZXR3ZWVuLm1hdGNoKC9eLD9cXHMqJC8pICE9IG51bGw7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgT3ZlcmxhcFJlbW92YWxSZWZpbmVyIHtcbiAgICByZWZpbmUoY29udGV4dCwgcmVzdWx0cykge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaWx0ZXJlZFJlc3VsdHMgPSBbXTtcbiAgICAgICAgbGV0IHByZXZSZXN1bHQgPSByZXN1bHRzWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICBpZiAocmVzdWx0LmluZGV4IDwgcHJldlJlc3VsdC5pbmRleCArIHByZXZSZXN1bHQudGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnRleHQubGVuZ3RoID4gcHJldlJlc3VsdC50ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkUmVzdWx0cy5wdXNoKHByZXZSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmlsdGVyZWRSZXN1bHRzLnB1c2gocHJldlJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkUmVzdWx0cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBPdmVybGFwUmVtb3ZhbFJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFic3RyYWN0UmVmaW5lcnNfMSA9IHJlcXVpcmUoXCIuLi9hYnN0cmFjdFJlZmluZXJzXCIpO1xuY2xhc3MgVW5saWtlbHlGb3JtYXRGaWx0ZXIgZXh0ZW5kcyBhYnN0cmFjdFJlZmluZXJzXzEuRmlsdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJpY3RNb2RlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RyaWN0TW9kZSA9IHN0cmljdE1vZGU7XG4gICAgfVxuICAgIGlzVmFsaWQoY29udGV4dCwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQudGV4dC5yZXBsYWNlKFwiIFwiLCBcIlwiKS5tYXRjaCgvXlxcZCooXFwuXFxkKik/JC8pKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgdW5saWtlbHkgcmVzdWx0ICcke3Jlc3VsdC50ZXh0fSdgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVzdWx0LnN0YXJ0LmlzVmFsaWREYXRlKCkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZGVidWcoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSZW1vdmluZyBpbnZhbGlkIHJlc3VsdDogJHtyZXN1bHR9ICgke3Jlc3VsdC5zdGFydH0pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmVuZCAmJiAhcmVzdWx0LmVuZC5pc1ZhbGlkRGF0ZSgpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUmVtb3ZpbmcgaW52YWxpZCByZXN1bHQ6ICR7cmVzdWx0fSAoJHtyZXN1bHQuZW5kfSlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RyaWN0TW9kZVZhbGlkKGNvbnRleHQsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzU3RyaWN0TW9kZVZhbGlkKGNvbnRleHQsIHJlc3VsdCkge1xuICAgICAgICBpZiAocmVzdWx0LnN0YXJ0LmlzT25seVdlZWtkYXlDb21wb25lbnQoKSkge1xuICAgICAgICAgICAgY29udGV4dC5kZWJ1ZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYChTdHJpY3QpIFJlbW92aW5nIHdlZWtkYXkgb25seSBjb21wb25lbnQ6ICR7cmVzdWx0fSAoJHtyZXN1bHQuZW5kfSlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuc3RhcnQuaXNPbmx5VGltZSgpICYmICghcmVzdWx0LnN0YXJ0LmlzQ2VydGFpbihcImhvdXJcIikgfHwgIXJlc3VsdC5zdGFydC5pc0NlcnRhaW4oXCJtaW51dGVcIikpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgKFN0cmljdCkgUmVtb3ZpbmcgdW5jZXJ0YWluIHRpbWUgY29tcG9uZW50OiAke3Jlc3VsdH0gKCR7cmVzdWx0LmVuZH0pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBVbmxpa2VseUZvcm1hdEZpbHRlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbiA9IHZvaWQgMDtcbmNvbnN0IEV4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vY29tbW9uL3JlZmluZXJzL0V4dHJhY3RUaW1lem9uZUFiYnJSZWZpbmVyXCIpKTtcbmNvbnN0IEV4dHJhY3RUaW1lem9uZU9mZnNldFJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcmVmaW5lcnMvRXh0cmFjdFRpbWV6b25lT2Zmc2V0UmVmaW5lclwiKSk7XG5jb25zdCBPdmVybGFwUmVtb3ZhbFJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcmVmaW5lcnMvT3ZlcmxhcFJlbW92YWxSZWZpbmVyXCIpKTtcbmNvbnN0IEZvcndhcmREYXRlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL2NvbW1vbi9yZWZpbmVycy9Gb3J3YXJkRGF0ZVJlZmluZXJcIikpO1xuY29uc3QgVW5saWtlbHlGb3JtYXRGaWx0ZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcmVmaW5lcnMvVW5saWtlbHlGb3JtYXRGaWx0ZXJcIikpO1xuY29uc3QgSVNPRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vY29tbW9uL3BhcnNlcnMvSVNPRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IE1lcmdlV2Vla2RheUNvbXBvbmVudFJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9jb21tb24vcmVmaW5lcnMvTWVyZ2VXZWVrZGF5Q29tcG9uZW50UmVmaW5lclwiKSk7XG5mdW5jdGlvbiBpbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uLCBzdHJpY3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25maWd1cmF0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgSVNPRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBjb25maWd1cmF0aW9uLnJlZmluZXJzLnVuc2hpZnQobmV3IE1lcmdlV2Vla2RheUNvbXBvbmVudFJlZmluZXJfMS5kZWZhdWx0KCkpO1xuICAgIGNvbmZpZ3VyYXRpb24ucmVmaW5lcnMudW5zaGlmdChuZXcgRXh0cmFjdFRpbWV6b25lQWJiclJlZmluZXJfMS5kZWZhdWx0KCkpO1xuICAgIGNvbmZpZ3VyYXRpb24ucmVmaW5lcnMudW5zaGlmdChuZXcgRXh0cmFjdFRpbWV6b25lT2Zmc2V0UmVmaW5lcl8xLmRlZmF1bHQoKSk7XG4gICAgY29uZmlndXJhdGlvbi5yZWZpbmVycy51bnNoaWZ0KG5ldyBPdmVybGFwUmVtb3ZhbFJlZmluZXJfMS5kZWZhdWx0KCkpO1xuICAgIGNvbmZpZ3VyYXRpb24ucmVmaW5lcnMucHVzaChuZXcgT3ZlcmxhcFJlbW92YWxSZWZpbmVyXzEuZGVmYXVsdCgpKTtcbiAgICBjb25maWd1cmF0aW9uLnJlZmluZXJzLnB1c2gobmV3IEZvcndhcmREYXRlUmVmaW5lcl8xLmRlZmF1bHQoKSk7XG4gICAgY29uZmlndXJhdGlvbi5yZWZpbmVycy5wdXNoKG5ldyBVbmxpa2VseUZvcm1hdEZpbHRlcl8xLmRlZmF1bHQoc3RyaWN0TW9kZSkpO1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uO1xufVxuZXhwb3J0cy5pbmNsdWRlQ29tbW9uQ29uZmlndXJhdGlvbiA9IGluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuY2FzdWFsID0gZXhwb3J0cy5zdHJpY3QgPSBleHBvcnRzLm5sID0gZXhwb3J0cy5wdCA9IGV4cG9ydHMuamEgPSBleHBvcnRzLmZyID0gZXhwb3J0cy5kZSA9IGV4cG9ydHMuTWVyaWRpZW0gPSBleHBvcnRzLkNocm9ubyA9IGV4cG9ydHMuZW4gPSB2b2lkIDA7XG5jb25zdCBlbiA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9sb2NhbGVzL2VuXCIpKTtcbmV4cG9ydHMuZW4gPSBlbjtcbmNvbnN0IGNocm9ub18xID0gcmVxdWlyZShcIi4vY2hyb25vXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2hyb25vXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjaHJvbm9fMS5DaHJvbm87IH0gfSk7XG52YXIgTWVyaWRpZW07XG4oZnVuY3Rpb24gKE1lcmlkaWVtKSB7XG4gICAgTWVyaWRpZW1bTWVyaWRpZW1bXCJBTVwiXSA9IDBdID0gXCJBTVwiO1xuICAgIE1lcmlkaWVtW01lcmlkaWVtW1wiUE1cIl0gPSAxXSA9IFwiUE1cIjtcbn0pKE1lcmlkaWVtID0gZXhwb3J0cy5NZXJpZGllbSB8fCAoZXhwb3J0cy5NZXJpZGllbSA9IHt9KSk7XG5jb25zdCBkZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9sb2NhbGVzL2RlXCIpKTtcbmV4cG9ydHMuZGUgPSBkZTtcbmNvbnN0IGZyID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xvY2FsZXMvZnJcIikpO1xuZXhwb3J0cy5mciA9IGZyO1xuY29uc3QgamEgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vbG9jYWxlcy9qYVwiKSk7XG5leHBvcnRzLmphID0gamE7XG5jb25zdCBwdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9sb2NhbGVzL3B0XCIpKTtcbmV4cG9ydHMucHQgPSBwdDtcbmNvbnN0IG5sID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xvY2FsZXMvbmxcIikpO1xuZXhwb3J0cy5ubCA9IG5sO1xuZXhwb3J0cy5zdHJpY3QgPSBlbi5zdHJpY3Q7XG5leHBvcnRzLmNhc3VhbCA9IGVuLmNhc3VhbDtcbmZ1bmN0aW9uIHBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKTtcbn1cbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbikge1xuICAgIHJldHVybiBleHBvcnRzLmNhc3VhbC5wYXJzZURhdGUodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZURhdGUgPSBwYXJzZURhdGU7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VUaW1lVW5pdHMgPSBleHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VZZWFyID0gZXhwb3J0cy5ZRUFSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0gZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSA9IGV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IGV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0gdm9pZCAwO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJzb25udGFnXCI6IDAsXG4gICAgXCJzb1wiOiAwLFxuICAgIFwibW9udGFnXCI6IDEsXG4gICAgXCJtb1wiOiAxLFxuICAgIFwiZGllbnN0YWdcIjogMixcbiAgICBcImRpXCI6IDIsXG4gICAgXCJtaXR0d29jaFwiOiAzLFxuICAgIFwibWlcIjogMyxcbiAgICBcImRvbm5lcnN0YWdcIjogNCxcbiAgICBcImRvXCI6IDQsXG4gICAgXCJmcmVpdGFnXCI6IDUsXG4gICAgXCJmclwiOiA1LFxuICAgIFwic2Ftc3RhZ1wiOiA2LFxuICAgIFwic2FcIjogNixcbn07XG5leHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJqYW51YXJcIjogMSxcbiAgICBcImphblwiOiAxLFxuICAgIFwiamFuLlwiOiAxLFxuICAgIFwiZmVicnVhclwiOiAyLFxuICAgIFwiZmViXCI6IDIsXG4gICAgXCJmZWIuXCI6IDIsXG4gICAgXCJtw6RyelwiOiAzLFxuICAgIFwibWFlcnpcIjogMyxcbiAgICBcIm3DpHJcIjogMyxcbiAgICBcIm3DpHIuXCI6IDMsXG4gICAgXCJtcnpcIjogMyxcbiAgICBcIm1yei5cIjogMyxcbiAgICBcImFwcmlsXCI6IDQsXG4gICAgXCJhcHJcIjogNCxcbiAgICBcImFwci5cIjogNCxcbiAgICBcIm1haVwiOiA1LFxuICAgIFwianVuaVwiOiA2LFxuICAgIFwianVuXCI6IDYsXG4gICAgXCJqdW4uXCI6IDYsXG4gICAgXCJqdWxpXCI6IDcsXG4gICAgXCJqdWxcIjogNyxcbiAgICBcImp1bC5cIjogNyxcbiAgICBcImF1Z3VzdFwiOiA4LFxuICAgIFwiYXVnXCI6IDgsXG4gICAgXCJhdWcuXCI6IDgsXG4gICAgXCJzZXB0ZW1iZXJcIjogOSxcbiAgICBcInNlcFwiOiA5LFxuICAgIFwic2VwLlwiOiA5LFxuICAgIFwic2VwdFwiOiA5LFxuICAgIFwic2VwdC5cIjogOSxcbiAgICBcIm9rdG9iZXJcIjogMTAsXG4gICAgXCJva3RcIjogMTAsXG4gICAgXCJva3QuXCI6IDEwLFxuICAgIFwibm92ZW1iZXJcIjogMTEsXG4gICAgXCJub3ZcIjogMTEsXG4gICAgXCJub3YuXCI6IDExLFxuICAgIFwiZGV6ZW1iZXJcIjogMTIsXG4gICAgXCJkZXpcIjogMTIsXG4gICAgXCJkZXouXCI6IDEyLFxufTtcbmV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJlaW5zXCI6IDEsXG4gICAgXCJ6d2VpXCI6IDIsXG4gICAgXCJkcmVpXCI6IDMsXG4gICAgXCJ2aWVyXCI6IDQsXG4gICAgXCJmw7xuZlwiOiA1LFxuICAgIFwiZnVlbmZcIjogNSxcbiAgICBcInNlY2hzXCI6IDYsXG4gICAgXCJzaWViZW5cIjogNyxcbiAgICBcImFjaHRcIjogOCxcbiAgICBcIm5ldW5cIjogOSxcbiAgICBcInplaG5cIjogMTAsXG4gICAgXCJlbGZcIjogMTEsXG4gICAgXCJ6d8O2bGZcIjogMTIsXG4gICAgXCJ6d29lbGZcIjogMTIsXG59O1xuZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IHtcbiAgICBzZWM6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWluOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnM6IFwibWludXRlXCIsXG4gICAgbWludXRlOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZXM6IFwibWludXRlXCIsXG4gICAgaDogXCJob3VyXCIsXG4gICAgaHI6IFwiaG91clwiLFxuICAgIGhyczogXCJob3VyXCIsXG4gICAgaG91cjogXCJob3VyXCIsXG4gICAgaG91cnM6IFwiaG91clwiLFxuICAgIGRheTogXCJkXCIsXG4gICAgZGF5czogXCJkXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgd2Vla3M6IFwid2Vla1wiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbW9udGhzOiBcIm1vbnRoXCIsXG4gICAgeTogXCJ5ZWFyXCIsXG4gICAgeXI6IFwieWVhclwiLFxuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbn07XG5leHBvcnRzLk5VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZKX18WzAtOV0rfFswLTldK1xcXFwuWzAtOV0rfGhhbGYoPzpcXFxccyphbj8pP3xhbj8oPzpcXFxccypmZXcpP3xmZXd8c2V2ZXJhbHxhP1xcXFxzKmNvdXBsZVxcXFxzKig/Om9mKT8pYDtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IG1hdGNoLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZW251bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bSA9PT0gXCJhXCIgfHwgbnVtID09PSBcImFuXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvZmV3LykpIHtcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvaGFsZi8pKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvY291cGxlLykpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvc2V2ZXJhbC8pKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW0pO1xufVxuZXhwb3J0cy5wYXJzZU51bWJlclBhdHRlcm4gPSBwYXJzZU51bWJlclBhdHRlcm47XG5leHBvcnRzLllFQVJfUEFUVEVSTiA9IGAoPzpbMC05XXsxLDR9KD86XFxcXHMqW3ZuXVxcXFwuP1xcXFxzKkMoPzpocik/XFxcXC4/KT8pYDtcbmZ1bmN0aW9uIHBhcnNlWWVhcihtYXRjaCkge1xuICAgIGlmICgvdi9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIHJldHVybiAtcGFyc2VJbnQobWF0Y2gucmVwbGFjZSgvW14wLTldKy9naSwgXCJcIikpO1xuICAgIH1cbiAgICBpZiAoL24vaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQobWF0Y2gucmVwbGFjZSgvW14wLTldKy9naSwgXCJcIikpO1xuICAgIH1cbiAgICBjb25zdCByYXdZZWFyTnVtYmVyID0gcGFyc2VJbnQobWF0Y2gpO1xuICAgIHJldHVybiB5ZWFyc18xLmZpbmRNb3N0TGlrZWx5QURZZWFyKHJhd1llYXJOdW1iZXIpO1xufVxuZXhwb3J0cy5wYXJzZVllYXIgPSBwYXJzZVllYXI7XG5jb25zdCBTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4gPSBgKCR7ZXhwb3J0cy5OVU1CRVJfUEFUVEVSTn0pXFxcXHN7MCw1fSgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSl9KVxcXFxzezAsNX1gO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9SRUdFWCA9IG5ldyBSZWdFeHAoU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOLCBcImlcIik7XG5leHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IHBhdHRlcm5fMS5yZXBlYXRlZFRpbWV1bml0UGF0dGVybihcIlwiLCBTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4pO1xuZnVuY3Rpb24gcGFyc2VUaW1lVW5pdHModGltZXVuaXRUZXh0KSB7XG4gICAgY29uc3QgZnJhZ21lbnRzID0ge307XG4gICAgbGV0IHJlbWFpbmluZ1RleHQgPSB0aW1ldW5pdFRleHQ7XG4gICAgbGV0IG1hdGNoID0gU0lOR0xFX1RJTUVfVU5JVF9SRUdFWC5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgIHdoaWxlIChtYXRjaCkge1xuICAgICAgICBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKTtcbiAgICAgICAgcmVtYWluaW5nVGV4dCA9IHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aCk7XG4gICAgICAgIG1hdGNoID0gU0lOR0xFX1RJTUVfVU5JVF9SRUdFWC5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRzO1xufVxuZXhwb3J0cy5wYXJzZVRpbWVVbml0cyA9IHBhcnNlVGltZVVuaXRzO1xuZnVuY3Rpb24gY29sbGVjdERhdGVUaW1lRnJhZ21lbnQoZnJhZ21lbnRzLCBtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaFsxXSk7XG4gICAgY29uc3QgdW5pdCA9IGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUllbbWF0Y2hbMl0udG9Mb3dlckNhc2UoKV07XG4gICAgZnJhZ21lbnRzW3VuaXRdID0gbnVtO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZUNvbmZpZ3VyYXRpb24gPSBleHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBleHBvcnRzLnBhcnNlRGF0ZSA9IGV4cG9ydHMucGFyc2UgPSBleHBvcnRzLnN0cmljdCA9IGV4cG9ydHMuY2FzdWFsID0gdm9pZCAwO1xuY29uc3QgY29uZmlndXJhdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWd1cmF0aW9uc1wiKTtcbmNvbnN0IGNocm9ub18xID0gcmVxdWlyZShcIi4uLy4uL2Nocm9ub1wiKTtcbmNvbnN0IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9jb21tb24vcGFyc2Vycy9TbGFzaERhdGVGb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgSVNPRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NvbW1vbi9wYXJzZXJzL0lTT0Zvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBERVRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9ERVRpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IERFV2Vla2RheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvREVXZWVrZGF5UGFyc2VyXCIpKTtcbmNvbnN0IERFTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvREVNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY29uc3QgREVNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL0RFTWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY29uc3QgREVDYXN1YWxEYXRlUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9ERUNhc3VhbERhdGVQYXJzZXJcIikpO1xuY29uc3QgREVDYXN1YWxUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9ERUNhc3VhbFRpbWVQYXJzZXJcIikpO1xuY29uc3QgREVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0RFTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKCkpO1xuZXhwb3J0cy5zdHJpY3QgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNvbmZpZ3VyYXRpb24odHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oZmFsc2UsIGxpdHRsZUVuZGlhbik7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgREVDYXN1YWxUaW1lUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBERUNhc3VhbERhdGVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIHJldHVybiBvcHRpb247XG59XG5leHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uO1xuZnVuY3Rpb24gY3JlYXRlQ29uZmlndXJhdGlvbihzdHJpY3RNb2RlID0gdHJ1ZSwgbGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IElTT0Zvcm1hdFBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KGxpdHRsZUVuZGlhbiksXG4gICAgICAgICAgICBuZXcgREVUaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBERU1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBERVdlZWtkYXlQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgIF0sXG4gICAgICAgIHJlZmluZXJzOiBbbmV3IERFTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpLCBuZXcgREVNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKV0sXG4gICAgfSwgc3RyaWN0TW9kZSk7XG59XG5leHBvcnRzLmNyZWF0ZUNvbmZpZ3VyYXRpb24gPSBjcmVhdGVDb25maWd1cmF0aW9uO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGRheWpzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRheWpzXCIpKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IGRheWpzXzIgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCBERUNhc3VhbFRpbWVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9ERUNhc3VhbFRpbWVQYXJzZXJcIikpO1xuY29uc3QgcmVmZXJlbmNlcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL2Nhc3VhbFJlZmVyZW5jZXNcIikpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYChqZXR6dHxoZXV0ZXxtb3JnZW58w7xiZXJtb3JnZW58dWViZXJtb3JnZW58Z2VzdGVybnx2b3JnZXN0ZXJufGxldHp0ZVxcXFxzKm5hY2h0KWAgK1xuICAgIGAoPzpcXFxccyoobW9yZ2VufHZvcm1pdHRhZ3xtaXR0YWdzP3xuYWNobWl0dGFnfGFiZW5kfG5hY2h0fG1pdHRlcm5hY2h0KSk/YCArXG4gICAgYCg/PVxcXFxXfCQpYCwgXCJpXCIpO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBUSU1FX0dST1VQID0gMjtcbmNsYXNzIERFQ2FzdWFsRGF0ZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGxldCB0YXJnZXREYXRlID0gZGF5anNfMS5kZWZhdWx0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVLZXl3b3JkID0gKG1hdGNoW0RBVEVfR1JPVVBdIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVLZXl3b3JkID0gKG1hdGNoW1RJTUVfR1JPVVBdIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIHN3aXRjaCAoZGF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJqZXR6dFwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHJlZmVyZW5jZXMubm93KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJoZXV0ZVwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHJlZmVyZW5jZXMudG9kYXkoY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vcmdlblwiOlxuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduVGhlTmV4dERheShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIsO8YmVybW9yZ2VuXCI6XG4gICAgICAgICAgICBjYXNlIFwidWViZXJtb3JnZW5cIjpcbiAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ2VzdGVyblwiOlxuICAgICAgICAgICAgICAgIHRhcmdldERhdGUgPSB0YXJnZXREYXRlLmFkZCgtMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGRheWpzXzIuaW1wbHlTaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZvcmdlc3Rlcm5cIjpcbiAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTIsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICBkYXlqc18yLmltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVLZXl3b3JkLm1hdGNoKC9sZXR6dGVcXHMqbmFjaHQvKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0RGF0ZS5ob3VyKCkgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRlID0gdGFyZ2V0RGF0ZS5hZGQoLTEsIFwiZGF5XCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVLZXl3b3JkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQgPSBERUNhc3VhbFRpbWVQYXJzZXJfMS5kZWZhdWx0LmV4dHJhY3RUaW1lQ29tcG9uZW50cyhjb21wb25lbnQsIHRpbWVLZXl3b3JkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERFQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IGRheWpzXzIgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCB0aW1ldW5pdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy90aW1ldW5pdHNcIik7XG5jbGFzcyBERUNhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8oZGllc2VuKT9cXHMqKG1vcmdlbnx2b3JtaXR0YWd8bWl0dGFncz98bmFjaG1pdHRhZ3xhYmVuZHxuYWNodHxtaXR0ZXJuYWNodCkoPz1cXFd8JCkvaTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgdGltZUtleXdvcmRQYXR0ZXJuID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBkYXlqc18yLmltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgcmV0dXJuIERFQ2FzdWFsVGltZVBhcnNlci5leHRyYWN0VGltZUNvbXBvbmVudHMoY29tcG9uZW50LCB0aW1lS2V5d29yZFBhdHRlcm4pO1xuICAgIH1cbiAgICBzdGF0aWMgZXh0cmFjdFRpbWVDb21wb25lbnRzKGNvbXBvbmVudCwgdGltZUtleXdvcmRQYXR0ZXJuKSB7XG4gICAgICAgIHN3aXRjaCAodGltZUtleXdvcmRQYXR0ZXJuKSB7XG4gICAgICAgICAgICBjYXNlIFwibW9yZ2VuXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZvcm1pdHRhZ1wiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgOSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtaXR0YWdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtaXR0YWdzXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJuYWNobWl0dGFnXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxNSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhYmVuZFwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTgpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibmFjaHRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDIyKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1pdHRlcm5hY2h0XCI6XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5nZXQoXCJob3VyXCIpID4gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSB0aW1ldW5pdHNfMS5hZGRJbXBsaWVkVGltZVVuaXRzKGNvbXBvbmVudCwgeyBcImRheVwiOiAxIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBERUNhc3VhbFRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKD86YW1cXFxccyo/KT9cIiArXG4gICAgXCIoPzpkZW5cXFxccyo/KT9cIiArXG4gICAgYChbMC05XXsxLDJ9KVxcXFwuYCArXG4gICAgYCg/OlxcXFxzKig/OmJpcyg/OlxcXFxzKig/OmFtfHp1bSkpP3xcXFxcLXxcXFxc4oCTfFxcXFxzKVxcXFxzKihbMC05XXsxLDJ9KVxcXFwuPyk/XFxcXHMqYCArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSl9KWAgK1xuICAgIGAoPzooPzotfC98LD9cXFxccyopKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSg/IVteXFxcXHNdXFxcXGQpKSk/YCArXG4gICAgYCg/PVxcXFxXfCQpYCwgXCJpXCIpO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBEQVRFX1RPX0dST1VQID0gMjtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAzO1xuY29uc3QgWUVBUl9HUk9VUCA9IDQ7XG5jbGFzcyBERU1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KG1hdGNoLmluZGV4LCBtYXRjaFswXSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQobWF0Y2hbREFURV9HUk9VUF0pO1xuICAgICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFtEQVRFX0dST1VQXS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwibW9udGhcIiwgbW9udGgpO1xuICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwiZGF5XCIsIGRheSk7XG4gICAgICAgIGlmIChtYXRjaFtZRUFSX0dST1VQXSkge1xuICAgICAgICAgICAgY29uc3QgeWVhck51bWJlciA9IGNvbnN0YW50c18yLnBhcnNlWWVhcihtYXRjaFtZRUFSX0dST1VQXSk7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwieWVhclwiLCB5ZWFyTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSB5ZWFyc18xLmZpbmRZZWFyQ2xvc2VzdFRvUmVmKGNvbnRleHQucmVmRGF0ZSwgZGF5LCBtb250aCk7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtEQVRFX1RPX0dST1VQXSkge1xuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IHBhcnNlSW50KG1hdGNoW0RBVEVfVE9fR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSByZXN1bHQuc3RhcnQuY2xvbmUoKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwiZGF5XCIsIGVuZERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gREVNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNsYXNzIERFVGltZUV4cHJlc3Npb25QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgcHJpbWFyeVByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86KD86dW18dm9uKVxcXFxzKik/XCI7XG4gICAgfVxuICAgIGZvbGxvd2luZ1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gXCJcXFxccyooPzpcXFxcLXxcXFxc4oCTfFxcXFx+fFxcXFzjgJx8YmlzKVxcXFxzKlwiO1xuICAgIH1cbiAgICBwcmltYXJ5U3VmZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPzpcXFxccyp1aHIpPyg/OlxcXFxzKig/Om1vcmdlbnN8dm9ybWl0dGFnc3xuYWNobWl0dGFnc3xhYmVuZHN8bmFjaHRzKSk/KD89XFxcXFd8JClcIjtcbiAgICB9XG4gICAgZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gc3VwZXIuZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCk7XG4gICAgICAgIGlmIChjb21wb25lbnRzKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hbMF0uZW5kc1dpdGgoXCJtb3JnZW5zXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwidm9ybWl0dGFnc1wiKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBjb21wb25lbnRzLmdldChcImhvdXJcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFswXS5lbmRzV2l0aChcIm5hY2htaXR0YWdzXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwiYWJlbmRzXCIpIHx8IG1hdGNoWzBdLmVuZHNXaXRoKFwibmFjaHRzXCIpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3VyID0gY29tcG9uZW50cy5nZXQoXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGlmIChob3VyIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJob3VyXCIsIGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKSArIDEyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gREVUaW1lRXhwcmVzc2lvblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCB3ZWVrc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3dlZWtzXCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzooPzpcXFxcLHxcXFxcKHxcXFxc77yIKVxcXFxzKik/XCIgK1xuICAgIFwiKD86YVttbl1cXFxccyo/KT9cIiArXG4gICAgXCIoPzooZGllc2VbbW5dfGxldHp0ZVttbl18big/OsOkfGFlKWNoc3RlW21uXSlcXFxccyopP1wiICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5XRUVLREFZX0RJQ1RJT05BUlkpfSlgICtcbiAgICBcIig/OlxcXFxzKig/OlxcXFwsfFxcXFwpfFxcXFzvvIkpKT9cIiArXG4gICAgXCIoPzpcXFxccyooZGllc2V8bGV0enRlfG4oPzrDpHxhZSljaHN0ZSlcXFxccyp3b2NoZSk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgUFJFRklYX0dST1VQID0gMTtcbmNvbnN0IFNVRkZJWF9HUk9VUCA9IDM7XG5jb25zdCBXRUVLREFZX0dST1VQID0gMjtcbmNsYXNzIERFV2Vla2RheVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gbWF0Y2hbV0VFS0RBWV9HUk9VUF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZW2RheU9mV2Vla107XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoW1BSRUZJWF9HUk9VUF07XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSBtYXRjaFtTVUZGSVhfR1JPVVBdO1xuICAgICAgICBsZXQgbW9kaWZpZXJXb3JkID0gcHJlZml4IHx8IHBvc3RmaXg7XG4gICAgICAgIG1vZGlmaWVyV29yZCA9IG1vZGlmaWVyV29yZCB8fCBcIlwiO1xuICAgICAgICBtb2RpZmllcldvcmQgPSBtb2RpZmllcldvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gbnVsbDtcbiAgICAgICAgaWYgKG1vZGlmaWVyV29yZC5tYXRjaCgvbGV0enRlLykpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJsYXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kaWZpZXJXb3JkLm1hdGNoKC9jaHN0ZS8pKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibmV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyV29yZC5tYXRjaCgvZGllc2UvKSkge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcInRoaXNcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gd2Vla3NfMS50b0RheUpTV2Vla2RheShjb250ZXh0LnJlZkRhdGUsIG9mZnNldCwgbW9kaWZpZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKClcbiAgICAgICAgICAgIC5hc3NpZ24oXCJ3ZWVrZGF5XCIsIG9mZnNldClcbiAgICAgICAgICAgIC5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSlcbiAgICAgICAgICAgIC5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpXG4gICAgICAgICAgICAuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBERVdlZWtkYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBERU1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyooYmlzKD86XFxzKig/OmFtfHp1bSkpP3wtKVxccyokL2k7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gREVNZXJnZURhdGVSYW5nZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY2xhc3MgREVNZXJnZURhdGVUaW1lUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXFxcXHMqKFR8dW18YW18LHwtKT9cXFxccyokXCIpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IERFTWVyZ2VEYXRlVGltZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VUaW1lVW5pdHMgPSBleHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VZZWFyID0gZXhwb3J0cy5ZRUFSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSBleHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWSA9IGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSBleHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSBleHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZID0gZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB2b2lkIDA7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5leHBvcnRzLldFRUtEQVlfRElDVElPTkFSWSA9IHtcbiAgICBzdW5kYXk6IDAsXG4gICAgc3VuOiAwLFxuICAgIFwic3VuLlwiOiAwLFxuICAgIG1vbmRheTogMSxcbiAgICBtb246IDEsXG4gICAgXCJtb24uXCI6IDEsXG4gICAgdHVlc2RheTogMixcbiAgICB0dWU6IDIsXG4gICAgXCJ0dWUuXCI6IDIsXG4gICAgd2VkbmVzZGF5OiAzLFxuICAgIHdlZDogMyxcbiAgICBcIndlZC5cIjogMyxcbiAgICB0aHVyc2RheTogNCxcbiAgICB0aHVyczogNCxcbiAgICBcInRodXJzLlwiOiA0LFxuICAgIHRodXI6IDQsXG4gICAgXCJ0aHVyLlwiOiA0LFxuICAgIHRodTogNCxcbiAgICBcInRodS5cIjogNCxcbiAgICBmcmlkYXk6IDUsXG4gICAgZnJpOiA1LFxuICAgIFwiZnJpLlwiOiA1LFxuICAgIHNhdHVyZGF5OiA2LFxuICAgIHNhdDogNixcbiAgICBcInNhdC5cIjogNixcbn07XG5leHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZID0ge1xuICAgIGphbnVhcnk6IDEsXG4gICAgZmVicnVhcnk6IDIsXG4gICAgbWFyY2g6IDMsXG4gICAgYXByaWw6IDQsXG4gICAgbWF5OiA1LFxuICAgIGp1bmU6IDYsXG4gICAganVseTogNyxcbiAgICBhdWd1c3Q6IDgsXG4gICAgc2VwdGVtYmVyOiA5LFxuICAgIG9jdG9iZXI6IDEwLFxuICAgIG5vdmVtYmVyOiAxMSxcbiAgICBkZWNlbWJlcjogMTIsXG59O1xuZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleHBvcnRzLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZKSwgeyBqYW46IDEsIFwiamFuLlwiOiAxLCBmZWI6IDIsIFwiZmViLlwiOiAyLCBtYXI6IDMsIFwibWFyLlwiOiAzLCBhcHI6IDQsIFwiYXByLlwiOiA0LCBqdW46IDYsIFwianVuLlwiOiA2LCBqdWw6IDcsIFwianVsLlwiOiA3LCBhdWc6IDgsIFwiYXVnLlwiOiA4LCBzZXA6IDksIFwic2VwLlwiOiA5LCBzZXB0OiA5LCBcInNlcHQuXCI6IDksIG9jdDogMTAsIFwib2N0LlwiOiAxMCwgbm92OiAxMSwgXCJub3YuXCI6IDExLCBkZWM6IDEyLCBcImRlYy5cIjogMTIgfSk7XG5leHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZID0ge1xuICAgIG9uZTogMSxcbiAgICB0d286IDIsXG4gICAgdGhyZWU6IDMsXG4gICAgZm91cjogNCxcbiAgICBmaXZlOiA1LFxuICAgIHNpeDogNixcbiAgICBzZXZlbjogNyxcbiAgICBlaWdodDogOCxcbiAgICBuaW5lOiA5LFxuICAgIHRlbjogMTAsXG4gICAgZWxldmVuOiAxMSxcbiAgICB0d2VsdmU6IDEyLFxufTtcbmV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUlkgPSB7XG4gICAgZmlyc3Q6IDEsXG4gICAgc2Vjb25kOiAyLFxuICAgIHRoaXJkOiAzLFxuICAgIGZvdXJ0aDogNCxcbiAgICBmaWZ0aDogNSxcbiAgICBzaXh0aDogNixcbiAgICBzZXZlbnRoOiA3LFxuICAgIGVpZ2h0aDogOCxcbiAgICBuaW50aDogOSxcbiAgICB0ZW50aDogMTAsXG4gICAgZWxldmVudGg6IDExLFxuICAgIHR3ZWxmdGg6IDEyLFxuICAgIHRoaXJ0ZWVudGg6IDEzLFxuICAgIGZvdXJ0ZWVudGg6IDE0LFxuICAgIGZpZnRlZW50aDogMTUsXG4gICAgc2l4dGVlbnRoOiAxNixcbiAgICBzZXZlbnRlZW50aDogMTcsXG4gICAgZWlnaHRlZW50aDogMTgsXG4gICAgbmluZXRlZW50aDogMTksXG4gICAgdHdlbnRpZXRoOiAyMCxcbiAgICBcInR3ZW50eSBmaXJzdFwiOiAyMSxcbiAgICBcInR3ZW50eS1maXJzdFwiOiAyMSxcbiAgICBcInR3ZW50eSBzZWNvbmRcIjogMjIsXG4gICAgXCJ0d2VudHktc2Vjb25kXCI6IDIyLFxuICAgIFwidHdlbnR5IHRoaXJkXCI6IDIzLFxuICAgIFwidHdlbnR5LXRoaXJkXCI6IDIzLFxuICAgIFwidHdlbnR5IGZvdXJ0aFwiOiAyNCxcbiAgICBcInR3ZW50eS1mb3VydGhcIjogMjQsXG4gICAgXCJ0d2VudHkgZmlmdGhcIjogMjUsXG4gICAgXCJ0d2VudHktZmlmdGhcIjogMjUsXG4gICAgXCJ0d2VudHkgc2l4dGhcIjogMjYsXG4gICAgXCJ0d2VudHktc2l4dGhcIjogMjYsXG4gICAgXCJ0d2VudHkgc2V2ZW50aFwiOiAyNyxcbiAgICBcInR3ZW50eS1zZXZlbnRoXCI6IDI3LFxuICAgIFwidHdlbnR5IGVpZ2h0aFwiOiAyOCxcbiAgICBcInR3ZW50eS1laWdodGhcIjogMjgsXG4gICAgXCJ0d2VudHkgbmludGhcIjogMjksXG4gICAgXCJ0d2VudHktbmludGhcIjogMjksXG4gICAgXCJ0aGlydGlldGhcIjogMzAsXG4gICAgXCJ0aGlydHkgZmlyc3RcIjogMzEsXG4gICAgXCJ0aGlydHktZmlyc3RcIjogMzEsXG59O1xuZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IHtcbiAgICBzZWM6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZHM6IFwic2Vjb25kXCIsXG4gICAgbWluOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnM6IFwibWludXRlXCIsXG4gICAgbWludXRlOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZXM6IFwibWludXRlXCIsXG4gICAgaDogXCJob3VyXCIsXG4gICAgaHI6IFwiaG91clwiLFxuICAgIGhyczogXCJob3VyXCIsXG4gICAgaG91cjogXCJob3VyXCIsXG4gICAgaG91cnM6IFwiaG91clwiLFxuICAgIGRheTogXCJkXCIsXG4gICAgZGF5czogXCJkXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgd2Vla3M6IFwid2Vla1wiLFxuICAgIG1vbnRoOiBcIm1vbnRoXCIsXG4gICAgbW9udGhzOiBcIm1vbnRoXCIsXG4gICAgeTogXCJ5ZWFyXCIsXG4gICAgeXI6IFwieWVhclwiLFxuICAgIHllYXI6IFwieWVhclwiLFxuICAgIHllYXJzOiBcInllYXJcIixcbn07XG5leHBvcnRzLk5VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZKX18WzAtOV0rfFswLTldK1xcXFwuWzAtOV0rfGhhbGYoPzpcXFxccyphbj8pP3xhbj8oPzpcXFxccypmZXcpP3xmZXd8c2V2ZXJhbHxhP1xcXFxzKmNvdXBsZVxcXFxzKig/Om9mKT8pYDtcbmZ1bmN0aW9uIHBhcnNlTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGNvbnN0IG51bSA9IG1hdGNoLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZW251bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bSA9PT0gXCJhXCIgfHwgbnVtID09PSBcImFuXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvZmV3LykpIHtcbiAgICAgICAgcmV0dXJuIDM7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvaGFsZi8pKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvY291cGxlLykpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIGVsc2UgaWYgKG51bS5tYXRjaCgvc2V2ZXJhbC8pKSB7XG4gICAgICAgIHJldHVybiA3O1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW0pO1xufVxuZXhwb3J0cy5wYXJzZU51bWJlclBhdHRlcm4gPSBwYXJzZU51bWJlclBhdHRlcm47XG5leHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBgKD86JHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuT1JESU5BTF9XT1JEX0RJQ1RJT05BUlkpfXxbMC05XXsxLDJ9KD86c3R8bmR8cmR8dGgpPylgO1xuZnVuY3Rpb24gcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGxldCBudW0gPSBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZW251bV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWVtudW1dO1xuICAgIH1cbiAgICBudW0gPSBudW0ucmVwbGFjZSgvKD86c3R8bmR8cmR8dGgpJC9pLCBcIlwiKTtcbiAgICByZXR1cm4gcGFyc2VJbnQobnVtKTtcbn1cbmV4cG9ydHMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybiA9IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm47XG5leHBvcnRzLllFQVJfUEFUVEVSTiA9IGAoPzpbMS05XVswLTldezAsM31cXFxccyooPzpCRXxBRHxCQ3xCQ0V8Q0UpfFsxLTJdWzAtOV17M318WzUtOV1bMC05XSlgO1xuZnVuY3Rpb24gcGFyc2VZZWFyKG1hdGNoKSB7XG4gICAgaWYgKC9CRS9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvQkUvaSwgXCJcIik7XG4gICAgICAgIHJldHVybiBwYXJzZUludChtYXRjaCkgLSA1NDM7XG4gICAgfVxuICAgIGlmICgvQkNFPy9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvQkNFPy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaCk7XG4gICAgfVxuICAgIGlmICgvKEFEfENFKS9pLnRlc3QobWF0Y2gpKSB7XG4gICAgICAgIG1hdGNoID0gbWF0Y2gucmVwbGFjZSgvKEFEfENFKS9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoKTtcbiAgICB9XG4gICAgY29uc3QgcmF3WWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICByZXR1cm4geWVhcnNfMS5maW5kTW9zdExpa2VseUFEWWVhcihyYXdZZWFyTnVtYmVyKTtcbn1cbmV4cG9ydHMucGFyc2VZZWFyID0gcGFyc2VZZWFyO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOID0gYCgke2V4cG9ydHMuTlVNQkVSX1BBVFRFUk59KVxcXFxzezAsNX0oJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkpfSlcXFxcc3swLDV9YDtcbmNvbnN0IFNJTkdMRV9USU1FX1VOSVRfUkVHRVggPSBuZXcgUmVnRXhwKFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiwgXCJpXCIpO1xuZXhwb3J0cy5USU1FX1VOSVRTX1BBVFRFUk4gPSBwYXR0ZXJuXzEucmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4oYCg/Oig/OmFib3V0fGFyb3VuZClcXFxccyopP2AsIFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTik7XG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0cyh0aW1ldW5pdFRleHQpIHtcbiAgICBjb25zdCBmcmFnbWVudHMgPSB7fTtcbiAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRpbWV1bml0VGV4dDtcbiAgICBsZXQgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpO1xuICAgICAgICByZW1haW5pbmdUZXh0ID0gcmVtYWluaW5nVGV4dC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudHM7XG59XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gcGFyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKTtcbiAgICBjb25zdCB1bml0ID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFsyXS50b0xvd2VyQ2FzZSgpXTtcbiAgICBmcmFnbWVudHNbdW5pdF0gPSBudW07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuR0IgPSBleHBvcnRzLnN0cmljdCA9IGV4cG9ydHMuY2FzdWFsID0gdm9pZCAwO1xuY29uc3QgRU5UaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBFTk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5Nb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJcIikpO1xuY29uc3QgRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0VOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IEVOTW9udGhOYW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTk1vbnRoTmFtZVBhcnNlclwiKSk7XG5jb25zdCBFTkNhc3VhbFllYXJNb250aERheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxZZWFyTW9udGhEYXlQYXJzZXJcIikpO1xuY29uc3QgRU5TbGFzaE1vbnRoRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlNsYXNoTW9udGhGb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgRU5UaW1lRXhwcmVzc2lvblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lRXhwcmVzc2lvblBhcnNlclwiKSk7XG5jb25zdCBFTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOVGltZVVuaXRMYXRlckZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvRU5NZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY29uc3QgRU5NZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL0VOTWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY29uc3QgY29uZmlndXJhdGlvbnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWd1cmF0aW9uc1wiKTtcbmNvbnN0IEVOQ2FzdWFsRGF0ZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxEYXRlUGFyc2VyXCIpKTtcbmNvbnN0IEVOQ2FzdWFsVGltZVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5DYXN1YWxUaW1lUGFyc2VyXCIpKTtcbmNvbnN0IEVOV2Vla2RheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5XZWVrZGF5UGFyc2VyXCIpKTtcbmNvbnN0IEVOUmVsYXRpdmVEYXRlRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9FTlJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IEVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKGZhbHNlKSk7XG5leHBvcnRzLnN0cmljdCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbih0cnVlLCBmYWxzZSkpO1xuZXhwb3J0cy5HQiA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbihmYWxzZSwgdHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBvcHRpb24gPSBjcmVhdGVDb25maWd1cmF0aW9uKGZhbHNlLCBsaXR0bGVFbmRpYW4pO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEVOQ2FzdWFsRGF0ZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRU5DYXN1YWxUaW1lUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBFTk1vbnRoTmFtZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRU5SZWxhdGl2ZURhdGVGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEVOVGltZVVuaXRDYXN1YWxSZWxhdGl2ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb247XG5mdW5jdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKHN0cmljdE1vZGUgPSB0cnVlLCBsaXR0bGVFbmRpYW4gPSBmYWxzZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBFTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEVOV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBFTkNhc3VhbFllYXJNb250aERheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBFTlNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgRU5UaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoc3RyaWN0TW9kZSksXG4gICAgICAgICAgICBuZXcgRU5UaW1lVW5pdEFnb0Zvcm1hdFBhcnNlcl8xLmRlZmF1bHQoc3RyaWN0TW9kZSksXG4gICAgICAgICAgICBuZXcgRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyXzEuZGVmYXVsdChzdHJpY3RNb2RlKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgRU5NZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IEVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNvbnN0IFBBVFRFUk4gPSAvKG5vd3x0b2RheXx0b25pZ2h0fHRvbW9ycm93fHRtcnx0bXJ3fHllc3RlcmRheXxsYXN0XFxzKm5pZ2h0KSg/PVxcV3wkKS9pO1xuY2xhc3MgRU5DYXN1YWxEYXRlUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybihjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgbGV0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgbG93ZXJUZXh0ID0gbWF0Y2hbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKGxvd2VyVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcIm5vd1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLm5vdyhjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjYXNlIFwidG9kYXlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b2RheShjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjYXNlIFwieWVzdGVyZGF5XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMueWVzdGVyZGF5KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0b21vcnJvd1wiOlxuICAgICAgICAgICAgY2FzZSBcInRtclwiOlxuICAgICAgICAgICAgY2FzZSBcInRtcndcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b21vcnJvdyhjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjYXNlIFwidG9uaWdodFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbmlnaHQoY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAobG93ZXJUZXh0Lm1hdGNoKC9sYXN0XFxzKm5pZ2h0LykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldERhdGUuaG91cigpID4gNikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0ZSA9IHRhcmdldERhdGUuYWRkKC0xLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkYXlqc18yLmFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5DYXN1YWxEYXRlUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IFBBVFRFUk4gPSAvKD86dGhpcyk/XFxzKihtb3JuaW5nfGFmdGVybm9vbnxldmVuaW5nfG5pZ2h0fG1pZG5pZ2h0fG5vb24pKD89XFxXfCQpL2k7XG5jbGFzcyBFTkNhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKG1hdGNoWzFdLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZnRlcm5vb25cIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE1KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJldmVuaW5nXCI6XG4gICAgICAgICAgICBjYXNlIFwibmlnaHRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDIwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtaWRuaWdodFwiOlxuICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduVGhlTmV4dERheShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcInNlY29uZFwiLCAwKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtb3JuaW5nXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub29uXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTkNhc3VhbFRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYChbMC05XXs0fSlbXFxcXC5cXFxcL1xcXFxzXWAgK1xuICAgIGAoPzooJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSl8KFswLTldezEsMn0pKVtcXFxcLlxcXFwvXFxcXHNdYCArXG4gICAgYChbMC05XXsxLDJ9KWAgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgWUVBUl9OVU1CRVJfR1JPVVAgPSAxO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDI7XG5jb25zdCBNT05USF9OVU1CRVJfR1JPVVAgPSAzO1xuY29uc3QgREFURV9OVU1CRVJfR1JPVVAgPSA0O1xuY2xhc3MgRU5DYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbWF0Y2hbTU9OVEhfTlVNQkVSX0dST1VQXVxuICAgICAgICAgICAgPyBwYXJzZUludChtYXRjaFtNT05USF9OVU1CRVJfR1JPVVBdKVxuICAgICAgICAgICAgOiBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtZRUFSX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtEQVRFX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Om9uXFxcXHMqPyk/XCIgK1xuICAgIGAoJHtjb25zdGFudHNfMy5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSlgICtcbiAgICBcIig/OlxcXFxzKlwiICtcbiAgICBcIig/OnRvfFxcXFwtfFxcXFzigJN8dW50aWx8dGhyb3VnaHx0aWxsfFxcXFxzKVxcXFxzKlwiICtcbiAgICBgKCR7Y29uc3RhbnRzXzMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTn0pYCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/Oi18L3xcXFxccyooPzpvZik/XFxcXHMqKVwiICtcbiAgICBcIihcIiArXG4gICAgcGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKSArXG4gICAgXCIpXCIgK1xuICAgIFwiKD86XCIgK1xuICAgIFwiKD86LXwvfCw/XFxcXHMqKVwiICtcbiAgICBgKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSg/IVteXFxcXHNdXFxcXGQpKWAgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPz1cXFxcV3wkKVwiLCBcImlcIik7XG5jb25zdCBEQVRFX0dST1VQID0gMTtcbmNvbnN0IERBVEVfVE9fR1JPVVAgPSAyO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDM7XG5jb25zdCBZRUFSX0dST1VQID0gNDtcbmNsYXNzIEVOTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb25zdCBkYXkgPSBjb25zdGFudHNfMy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbREFURV9HUk9VUF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImRheVwiLCBkYXkpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJOdW1iZXIgPSBjb25zdGFudHNfMi5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInllYXJcIiwgeWVhck51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBjb25zdGFudHNfMy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfVE9fR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSByZXN1bHQuc3RhcnQuY2xvbmUoKTtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwiZGF5XCIsIGVuZERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5Nb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMyA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSlgICtcbiAgICBcIig/Oi18L3xcXFxccyosP1xcXFxzKilcIiArXG4gICAgYCgke2NvbnN0YW50c18yLk9SRElOQUxfTlVNQkVSX1BBVFRFUk59KSg/IVxcXFxzKig/OmFtfHBtKSlcXFxccypgICtcbiAgICBcIig/OlwiICtcbiAgICBcIig/OnRvfFxcXFwtKVxcXFxzKlwiICtcbiAgICBgKCR7Y29uc3RhbnRzXzIuT1JESU5BTF9OVU1CRVJfUEFUVEVSTn0pXFxcXHMqYCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/OlwiICtcbiAgICBcIig/Oi18L3xcXFxccyosP1xcXFxzKilcIiArXG4gICAgYCgke2NvbnN0YW50c18zLllFQVJfUEFUVEVSTn0pYCArXG4gICAgXCIpP1wiICtcbiAgICBcIig/PVxcXFxXfCQpKD8hXFxcXDpcXFxcZClcIiwgXCJpXCIpO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDE7XG5jb25zdCBEQVRFX0dST1VQID0gMjtcbmNvbnN0IERBVEVfVE9fR1JPVVAgPSAzO1xuY29uc3QgWUVBUl9HUk9VUCA9IDQ7XG5jbGFzcyBFTk1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb25zdCBkYXkgPSBjb25zdGFudHNfMi5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cyh7XG4gICAgICAgICAgICBkYXk6IGRheSxcbiAgICAgICAgICAgIG1vbnRoOiBtb250aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChtYXRjaFtZRUFSX0dST1VQXSkge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IGNvbnN0YW50c18zLnBhcnNlWWVhcihtYXRjaFtZRUFSX0dST1VQXSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtYXRjaFtEQVRFX1RPX0dST1VQXSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IGNvbnN0YW50c18yLnBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4obWF0Y2hbREFURV9UT19HUk9VUF0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdSZXN1bHQobWF0Y2guaW5kZXgsIG1hdGNoWzBdKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0ID0gY29tcG9uZW50cztcbiAgICAgICAgcmVzdWx0LmVuZCA9IGNvbXBvbmVudHMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0LmVuZC5hc3NpZ24oXCJkYXlcIiwgZW5kRGF0ZSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5Nb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IGNvbnN0YW50c18yID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoKD86aW4pXFxcXHMqKT9gICtcbiAgICBgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pYCArXG4gICAgYFxcXFxzKmAgK1xuICAgIGAoPzpgICtcbiAgICBgWywtXT9cXFxccyooJHtjb25zdGFudHNfMi5ZRUFSX1BBVFRFUk59KT9gICtcbiAgICBcIik/XCIgK1xuICAgIFwiKD89W15cXFxcc1xcXFx3XXxcXFxccytbXjAtOV18XFxcXHMrJHwkKVwiLCBcImlcIik7XG5jb25zdCBQUkVGSVhfR1JPVVAgPSAxO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDI7XG5jb25zdCBZRUFSX0dST1VQID0gMztcbmNsYXNzIEVOTW9udGhOYW1lUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBtb250aE5hbWUgPSBtYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobWF0Y2hbMF0ubGVuZ3RoIDw9IDMgJiYgIWNvbnN0YW50c18xLkZVTExfTU9OVEhfTkFNRV9ESUNUSU9OQVJZW21vbnRoTmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCArIChtYXRjaFtQUkVGSVhfR1JPVVBdIHx8IFwiXCIpLmxlbmd0aCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICByZXN1bHQuc3RhcnQuaW1wbHkoXCJkYXlcIiwgMSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttb250aE5hbWVdO1xuICAgICAgICByZXN1bHQuc3RhcnQuYXNzaWduKFwibW9udGhcIiwgbW9udGgpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSBjb25zdGFudHNfMi5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIDEsIG1vbnRoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTk1vbnRoTmFtZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcmVzdWx0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3Jlc3VsdHNcIik7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAodGhpc3xuZXh0fGxhc3R8cGFzdClcXFxccyooJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLlRJTUVfVU5JVF9ESUNUSU9OQVJZKX0pKD89XFxcXHMqKWAgKyBcIig/PVxcXFxXfCQpXCIsIFwiaVwiKTtcbmNvbnN0IE1PRElGSUVSX1dPUkRfR1JPVVAgPSAxO1xuY29uc3QgUkVMQVRJVkVfV09SRF9HUk9VUCA9IDI7XG5jbGFzcyBFTlJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbW9kaWZpZXIgPSBtYXRjaFtNT0RJRklFUl9XT1JEX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB1bml0V29yZCA9IG1hdGNoW1JFTEFUSVZFX1dPUkRfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IHRpbWV1bml0ID0gY29uc3RhbnRzXzEuVElNRV9VTklUX0RJQ1RJT05BUllbdW5pdFdvcmRdO1xuICAgICAgICBpZiAobW9kaWZpZXIgPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVVbml0cyA9IHt9O1xuICAgICAgICAgICAgdGltZVVuaXRzW3RpbWV1bml0XSA9IDE7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCB0aW1lVW5pdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RpZmllciA9PSBcImxhc3RcIiB8fCBtb2RpZmllciA9PSBcInBhc3RcIikge1xuICAgICAgICAgICAgY29uc3QgdGltZVVuaXRzID0ge307XG4gICAgICAgICAgICB0aW1lVW5pdHNbdGltZXVuaXRdID0gLTE7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCB0aW1lVW5pdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIGxldCBkYXRlID0gZGF5anNfMS5kZWZhdWx0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIGlmICh1bml0V29yZC5tYXRjaCgvd2Vlay9pKSkge1xuICAgICAgICAgICAgZGF0ZSA9IGRhdGUuYWRkKC1kYXRlLmdldChcImRcIiksIFwiZFwiKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHVuaXRXb3JkLm1hdGNoKC9tb250aC9pKSkge1xuICAgICAgICAgICAgZGF0ZSA9IGRhdGUuYWRkKC1kYXRlLmRhdGUoKSArIDEsIFwiZFwiKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5pdFdvcmQubWF0Y2goL3llYXIvaSkpIHtcbiAgICAgICAgICAgIGRhdGUgPSBkYXRlLmFkZCgtZGF0ZS5kYXRlKCkgKyAxLCBcImRcIik7XG4gICAgICAgICAgICBkYXRlID0gZGF0ZS5hZGQoLWRhdGUubW9udGgoKSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlJlbGF0aXZlRGF0ZUZvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoWzAtOV18MFsxLTldfDFbMDEyXSkvKFswLTldezR9KVwiICsgXCJcIiwgXCJpXCIpO1xuY29uc3QgTU9OVEhfR1JPVVAgPSAxO1xuY29uc3QgWUVBUl9HUk9VUCA9IDI7XG5jbGFzcyBFTlNsYXNoTW9udGhGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtZRUFSX0dST1VQXSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQobWF0Y2hbTU9OVEhfR1JPVVBdKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKS5pbXBseShcImRheVwiLCAxKS5hc3NpZ24oXCJtb250aFwiLCBtb250aCkuYXNzaWduKFwieWVhclwiLCB5ZWFyKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlNsYXNoTW9udGhGb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlclwiKTtcbmNsYXNzIEVOVGltZUV4cHJlc3Npb25QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcihzdHJpY3RNb2RlKTtcbiAgICB9XG4gICAgZm9sbG93aW5nUGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBcIlxcXFxzKig/OlxcXFwtfFxcXFzigJN8XFxcXH58XFxcXOOAnHx0b3xcXFxcPylcXFxccypcIjtcbiAgICB9XG4gICAgcHJpbWFyeVByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86KD86YXR8ZnJvbSlcXFxccyopPz9cIjtcbiAgICB9XG4gICAgcHJpbWFyeVN1ZmZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86XFxcXHMqKD86b1xcXFxXKmNsb2NrfGF0XFxcXHMqbmlnaHR8aW5cXFxccyp0aGVcXFxccyooPzptb3JuaW5nfGFmdGVybm9vbikpKT8oPyEvKSg/PVxcXFxXfCQpXCI7XG4gICAgfVxuICAgIGV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHN1cGVyLmV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpO1xuICAgICAgICBpZiAoY29tcG9uZW50cykge1xuICAgICAgICAgICAgaWYgKG1hdGNoWzBdLmVuZHNXaXRoKFwibmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3VyID0gY29tcG9uZW50cy5nZXQoXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGlmIChob3VyID49IDYgJiYgaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBjb21wb25lbnRzLmdldChcImhvdXJcIikgKyAxMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhvdXIgPCA2KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzBdLmVuZHNXaXRoKFwiYWZ0ZXJub29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb25zdCBob3VyID0gY29tcG9uZW50cy5nZXQoXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGlmIChob3VyID49IDAgJiYgaG91ciA8PSA2KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBjb21wb25lbnRzLmdldChcImhvdXJcIikgKyAxMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzBdLmVuZHNXaXRoKFwibW9ybmluZ1wiKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IGNvbXBvbmVudHMuZ2V0KFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaG91ciA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBjb21wb25lbnRzLmdldChcImhvdXJcIikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlRpbWVFeHByZXNzaW9uUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHRpbWV1bml0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3RpbWV1bml0c1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiXCIgKyBcIihcIiArIGNvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTiArIFwiKVwiICsgXCIoPzphZ298YmVmb3JlfGVhcmxpZXIpKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNvbnN0IFNUUklDVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIlwiICsgXCIoXCIgKyBjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk4gKyBcIilcIiArIFwiYWdvKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNsYXNzIEVOVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmljdE1vZGUgPyBTVFJJQ1RfUEFUVEVSTiA6IFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsxXSk7XG4gICAgICAgIGNvbnN0IG91dHB1dFRpbWVVbml0cyA9IHRpbWV1bml0c18xLnJldmVyc2VUaW1lVW5pdHModGltZVVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHNfMS5QYXJzaW5nQ29tcG9uZW50cy5jcmVhdGVSZWxhdGl2ZUZyb21SZWZJbnN0YW50KGNvbnRleHQucmVmRGF0ZSwgb3V0cHV0VGltZVVuaXRzKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHRpbWV1bml0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3RpbWV1bml0c1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAodGhpc3xsYXN0fHBhc3R8bmV4dHxcXFxcK3wtKVxcXFxzKigke2NvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTn0pKD89XFxcXFd8JClgLCBcImlcIik7XG5jbGFzcyBFTlRpbWVVbml0Q2FzdWFsUmVsYXRpdmVGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsyXSk7XG4gICAgICAgIHN3aXRjaCAocHJlZml4KSB7XG4gICAgICAgICAgICBjYXNlIFwibGFzdFwiOlxuICAgICAgICAgICAgY2FzZSBcInBhc3RcIjpcbiAgICAgICAgICAgIGNhc2UgXCItXCI6XG4gICAgICAgICAgICAgICAgdGltZVVuaXRzID0gdGltZXVuaXRzXzEucmV2ZXJzZVRpbWVVbml0cyh0aW1lVW5pdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMuY3JlYXRlUmVsYXRpdmVGcm9tUmVmSW5zdGFudChjb250ZXh0LnJlZkRhdGUsIHRpbWVVbml0cyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5UaW1lVW5pdENhc3VhbFJlbGF0aXZlRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiXCIgKyBcIihcIiArIGNvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTiArIFwiKVwiICsgXCIobGF0ZXJ8YWZ0ZXJ8ZnJvbSBub3d8aGVuY2Vmb3J0aHxmb3J3YXJkfG91dClcIiArIFwiKD89KD86XFxcXFd8JCkpXCIsIFwiaVwiKTtcbmNvbnN0IFNUUklDVF9QQVRURVJOID0gbmV3IFJlZ0V4cChcIlwiICsgXCIoXCIgKyBjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk4gKyBcIilcIiArIFwiKGxhdGVyfGZyb20gbm93KVwiICsgXCIoPz0oPzpcXFxcV3wkKSlcIiwgXCJpXCIpO1xuY29uc3QgR1JPVVBfTlVNX1RJTUVVTklUUyA9IDE7XG5jbGFzcyBFTlRpbWVVbml0TGF0ZXJGb3JtYXRQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgY29uc3RydWN0b3Ioc3RyaWN0TW9kZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnN0cmljdE1vZGUgPSBzdHJpY3RNb2RlO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0cmljdE1vZGUgPyBTVFJJQ1RfUEFUVEVSTiA6IFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBmcmFnbWVudHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFtHUk9VUF9OVU1fVElNRVVOSVRTXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMuY3JlYXRlUmVsYXRpdmVGcm9tUmVmSW5zdGFudChjb250ZXh0LnJlZkRhdGUsIGZyYWdtZW50cyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5UaW1lVW5pdExhdGVyRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCByZXN1bHRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vcmVzdWx0c1wiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk5fV0lUSF9QUkVGSVggPSBuZXcgUmVnRXhwKGAoPzp3aXRoaW58aW58Zm9yKVxcXFxzKmAgK1xuICAgIGAoPzooPzphYm91dHxhcm91bmR8cm91Z2hseXxhcHByb3hpbWF0ZWx5fGp1c3QpXFxcXHMqKD86flxcXFxzKik/KT8oJHtjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk59KSg/PVxcXFxXfCQpYCwgXCJpXCIpO1xuY29uc3QgUEFUVEVSTl9XSVRIT1VUX1BSRUZJWCA9IG5ldyBSZWdFeHAoYCg/Oig/OmFib3V0fGFyb3VuZHxyb3VnaGx5fGFwcHJveGltYXRlbHl8anVzdClcXFxccyooPzp+XFxcXHMqKT8pPygke2NvbnN0YW50c18xLlRJTUVfVU5JVFNfUEFUVEVSTn0pKD89XFxcXFd8JClgLCBcImlcIik7XG5jbGFzcyBFTlRpbWVVbml0V2l0aGluRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybihjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0Lm9wdGlvbi5mb3J3YXJkRGF0ZSA/IFBBVFRFUk5fV0lUSE9VVF9QUkVGSVggOiBQQVRURVJOX1dJVEhfUFJFRklYO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGltZVVuaXRzID0gY29uc3RhbnRzXzEucGFyc2VUaW1lVW5pdHMobWF0Y2hbMV0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCB0aW1lVW5pdHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3Qgd2Vla3NfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi93ZWVrc1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKD86KD86XFxcXCx8XFxcXCh8XFxcXO+8iClcXFxccyopP1wiICtcbiAgICBcIig/Om9uXFxcXHMqPyk/XCIgK1xuICAgIFwiKD86KHRoaXN8bGFzdHxwYXN0fG5leHQpXFxcXHMqKT9cIiArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZKX0pYCArXG4gICAgXCIoPzpcXFxccyooPzpcXFxcLHxcXFxcKXxcXFxc77yJKSk/XCIgK1xuICAgIFwiKD86XFxcXHMqKHRoaXN8bGFzdHxwYXN0fG5leHQpXFxcXHMqd2Vlayk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgUFJFRklYX0dST1VQID0gMTtcbmNvbnN0IFdFRUtEQVlfR1JPVVAgPSAyO1xuY29uc3QgUE9TVEZJWF9HUk9VUCA9IDM7XG5jbGFzcyBFTldlZWtkYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG1hdGNoW1dFRUtEQVlfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWVtkYXlPZldlZWtdO1xuICAgICAgICBjb25zdCBwcmVmaXggPSBtYXRjaFtQUkVGSVhfR1JPVVBdO1xuICAgICAgICBjb25zdCBwb3N0Zml4ID0gbWF0Y2hbUE9TVEZJWF9HUk9VUF07XG4gICAgICAgIGxldCBtb2RpZmllcldvcmQgPSBwcmVmaXggfHwgcG9zdGZpeDtcbiAgICAgICAgbW9kaWZpZXJXb3JkID0gbW9kaWZpZXJXb3JkIHx8IFwiXCI7XG4gICAgICAgIG1vZGlmaWVyV29yZCA9IG1vZGlmaWVyV29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgbW9kaWZpZXIgPSBudWxsO1xuICAgICAgICBpZiAobW9kaWZpZXJXb3JkID09IFwibGFzdFwiIHx8IG1vZGlmaWVyV29yZCA9PSBcInBhc3RcIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcImxhc3RcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RpZmllcldvcmQgPT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJuZXh0XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobW9kaWZpZXJXb3JkID09IFwidGhpc1wiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwidGhpc1wiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGUgPSB3ZWVrc18xLnRvRGF5SlNXZWVrZGF5KGNvbnRleHQucmVmRGF0ZSwgb2Zmc2V0LCBtb2RpZmllcik7XG4gICAgICAgIHJldHVybiBjb250ZXh0XG4gICAgICAgICAgICAuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKVxuICAgICAgICAgICAgLmFzc2lnbihcIndlZWtkYXlcIiwgb2Zmc2V0KVxuICAgICAgICAgICAgLmltcGx5KFwiZGF5XCIsIGRhdGUuZGF0ZSgpKVxuICAgICAgICAgICAgLmltcGx5KFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSlcbiAgICAgICAgICAgIC5pbXBseShcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEVOV2Vla2RheVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXCIpKTtcbmNsYXNzIEVOTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIC9eXFxzKih0b3wtKVxccyokL2k7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRU5NZXJnZURhdGVSYW5nZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY2xhc3MgRU5NZXJnZURhdGVUaW1lUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXFxcXHMqKFR8YXR8YWZ0ZXJ8YmVmb3JlfG9ufG9mfCx8LSk/XFxcXHMqJFwiKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBFTk1lcmdlRGF0ZVRpbWVSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gZXhwb3J0cy5USU1FX1VOSVRTX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlWWVhciA9IGV4cG9ydHMuWUVBUl9QQVRURVJOID0gZXhwb3J0cy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gZXhwb3J0cy5PUkRJTkFMX05VTUJFUl9QQVRURVJOID0gZXhwb3J0cy5wYXJzZU51bWJlclBhdHRlcm4gPSBleHBvcnRzLk5VTUJFUl9QQVRURVJOID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSBleHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSBleHBvcnRzLldFRUtEQVlfRElDVElPTkFSWSA9IHZvaWQgMDtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJkaW1hbmNoZVwiOiAwLFxuICAgIFwiZGltXCI6IDAsXG4gICAgXCJsdW5kaVwiOiAxLFxuICAgIFwibHVuXCI6IDEsXG4gICAgXCJtYXJkaVwiOiAyLFxuICAgIFwibWFyXCI6IDIsXG4gICAgXCJtZXJjcmVkaVwiOiAzLFxuICAgIFwibWVyXCI6IDMsXG4gICAgXCJqZXVkaVwiOiA0LFxuICAgIFwiamV1XCI6IDQsXG4gICAgXCJ2ZW5kcmVkaVwiOiA1LFxuICAgIFwidmVuXCI6IDUsXG4gICAgXCJzYW1lZGlcIjogNixcbiAgICBcInNhbVwiOiA2LFxufTtcbmV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IHtcbiAgICBcImphbnZpZXJcIjogMSxcbiAgICBcImphblwiOiAxLFxuICAgIFwiamFuLlwiOiAxLFxuICAgIFwiZsOpdnJpZXJcIjogMixcbiAgICBcImbDqXZcIjogMixcbiAgICBcImbDqXYuXCI6IDIsXG4gICAgXCJmZXZyaWVyXCI6IDIsXG4gICAgXCJmZXZcIjogMixcbiAgICBcImZldi5cIjogMixcbiAgICBcIm1hcnNcIjogMyxcbiAgICBcIm1hclwiOiAzLFxuICAgIFwibWFyLlwiOiAzLFxuICAgIFwiYXZyaWxcIjogNCxcbiAgICBcImF2clwiOiA0LFxuICAgIFwiYXZyLlwiOiA0LFxuICAgIFwibWFpXCI6IDUsXG4gICAgXCJqdWluXCI6IDYsXG4gICAgXCJqdW5cIjogNixcbiAgICBcImp1aWxsZXRcIjogNyxcbiAgICBcImp1aWxcIjogNyxcbiAgICBcImp1bFwiOiA3LFxuICAgIFwianVsLlwiOiA3LFxuICAgIFwiYW/Du3RcIjogOCxcbiAgICBcImFvdXRcIjogOCxcbiAgICBcInNlcHRlbWJyZVwiOiA5LFxuICAgIFwic2VwXCI6IDksXG4gICAgXCJzZXAuXCI6IDksXG4gICAgXCJzZXB0XCI6IDksXG4gICAgXCJzZXB0LlwiOiA5LFxuICAgIFwib2N0b2JyZVwiOiAxMCxcbiAgICBcIm9jdFwiOiAxMCxcbiAgICBcIm9jdC5cIjogMTAsXG4gICAgXCJub3ZlbWJyZVwiOiAxMSxcbiAgICBcIm5vdlwiOiAxMSxcbiAgICBcIm5vdi5cIjogMTEsXG4gICAgXCJkw6ljZW1icmVcIjogMTIsXG4gICAgXCJkZWNlbWJyZVwiOiAxMixcbiAgICBcImRlY1wiOiAxMixcbiAgICBcImRlYy5cIjogMTIsXG59O1xuZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSA9IHtcbiAgICBcInVuXCI6IDEsXG4gICAgXCJkZXV4XCI6IDIsXG4gICAgXCJ0cm9pc1wiOiAzLFxuICAgIFwicXVhdHJlXCI6IDQsXG4gICAgXCJjaW5xXCI6IDUsXG4gICAgXCJzaXhcIjogNixcbiAgICBcInNlcHRcIjogNyxcbiAgICBcImh1aXRcIjogOCxcbiAgICBcIm5ldWZcIjogOSxcbiAgICBcImRpeFwiOiAxMCxcbiAgICBcIm9uemVcIjogMTEsXG4gICAgXCJkb3V6ZVwiOiAxMixcbiAgICBcInRyZWl6ZVwiOiAxMyxcbn07XG5leHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0ge1xuICAgIFwic2VjXCI6IFwic2Vjb25kXCIsXG4gICAgXCJzZWNvbmRlXCI6IFwic2Vjb25kXCIsXG4gICAgXCJzZWNvbmRlc1wiOiBcInNlY29uZFwiLFxuICAgIFwibWluXCI6IFwibWludXRlXCIsXG4gICAgXCJtaW5zXCI6IFwibWludXRlXCIsXG4gICAgXCJtaW51dGVcIjogXCJtaW51dGVcIixcbiAgICBcIm1pbnV0ZXNcIjogXCJtaW51dGVcIixcbiAgICBcImhcIjogXCJob3VyXCIsXG4gICAgXCJoclwiOiBcImhvdXJcIixcbiAgICBcImhyc1wiOiBcImhvdXJcIixcbiAgICBcImhldXJlXCI6IFwiaG91clwiLFxuICAgIFwiaGV1cmVzXCI6IFwiaG91clwiLFxuICAgIFwiam91clwiOiBcImRcIixcbiAgICBcImpvdXJzXCI6IFwiZFwiLFxuICAgIFwic2VtYWluZVwiOiBcIndlZWtcIixcbiAgICBcInNlbWFpbmVzXCI6IFwid2Vla1wiLFxuICAgIFwibW9pc1wiOiBcIm1vbnRoXCIsXG4gICAgXCJ0cmltZXN0cmVcIjogXCJxdWFydGVyXCIsXG4gICAgXCJ0cmltZXN0cmVzXCI6IFwicXVhcnRlclwiLFxuICAgIFwiYW5zXCI6IFwieWVhclwiLFxuICAgIFwiYW5uw6llXCI6IFwieWVhclwiLFxuICAgIFwiYW5uw6llc1wiOiBcInllYXJcIixcbn07XG5leHBvcnRzLk5VTUJFUl9QQVRURVJOID0gYCg/OiR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZKX18WzAtOV0rfFswLTldK1xcXFwuWzAtOV0rfHVuZT98cXVlbHF1ZXM/fGRlbWktPylgO1xuZnVuY3Rpb24gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gbWF0Y2gudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWVtudW1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtID09PSBcInVuZVwiIHx8IG51bSA9PT0gXCJ1blwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW0ubWF0Y2goL3F1ZWxxdWVzPy8pKSB7XG4gICAgICAgIHJldHVybiAzO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW0ubWF0Y2goL2RlbWktPy8pKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bSk7XG59XG5leHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IHBhcnNlTnVtYmVyUGF0dGVybjtcbmV4cG9ydHMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTiA9IGAoPzpbMC05XXsxLDJ9KD86ZXIpPylgO1xuZnVuY3Rpb24gcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGxldCBudW0gPSBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgIG51bSA9IG51bS5yZXBsYWNlKC8oPzplcikkL2ksIFwiXCIpO1xuICAgIHJldHVybiBwYXJzZUludChudW0pO1xufVxuZXhwb3J0cy5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuID0gcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybjtcbmV4cG9ydHMuWUVBUl9QQVRURVJOID0gYCg/OlsxLTldWzAtOV17MCwzfVxcXFxzKig/OkFDfEFEfHBcXFxcLlxcXFxzKkMoPzpocj8pP1xcXFwuXFxcXHMqblxcXFwuKXxbMS0yXVswLTldezN9fFs1LTldWzAtOV0pYDtcbmZ1bmN0aW9uIHBhcnNlWWVhcihtYXRjaCkge1xuICAgIGlmICgvQUMvaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICBtYXRjaCA9IG1hdGNoLnJlcGxhY2UoL0JDL2ksIFwiXCIpO1xuICAgICAgICByZXR1cm4gLXBhcnNlSW50KG1hdGNoKTtcbiAgICB9XG4gICAgaWYgKC9BRC9pLnRlc3QobWF0Y2gpIHx8IC9DL2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9bXlxcZF0rL2ksIFwiXCIpO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQobWF0Y2gpO1xuICAgIH1cbiAgICBsZXQgeWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICBpZiAoeWVhck51bWJlciA8IDEwMCkge1xuICAgICAgICBpZiAoeWVhck51bWJlciA+IDUwKSB7XG4gICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDE5MDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDIwMDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHllYXJOdW1iZXI7XG59XG5leHBvcnRzLnBhcnNlWWVhciA9IHBhcnNlWWVhcjtcbmNvbnN0IFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiA9IGAoJHtleHBvcnRzLk5VTUJFUl9QQVRURVJOfSlcXFxcc3swLDV9KCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZKX0pXFxcXHN7MCw1fWA7XG5jb25zdCBTSU5HTEVfVElNRV9VTklUX1JFR0VYID0gbmV3IFJlZ0V4cChTSU5HTEVfVElNRV9VTklUX1BBVFRFUk4sIFwiaVwiKTtcbmV4cG9ydHMuVElNRV9VTklUU19QQVRURVJOID0gcGF0dGVybl8xLnJlcGVhdGVkVGltZXVuaXRQYXR0ZXJuKFwiXCIsIFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTik7XG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0cyh0aW1ldW5pdFRleHQpIHtcbiAgICBjb25zdCBmcmFnbWVudHMgPSB7fTtcbiAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRpbWV1bml0VGV4dDtcbiAgICBsZXQgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpO1xuICAgICAgICByZW1haW5pbmdUZXh0ID0gcmVtYWluaW5nVGV4dC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudHM7XG59XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gcGFyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKTtcbiAgICBjb25zdCB1bml0ID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFsyXS50b0xvd2VyQ2FzZSgpXTtcbiAgICBmcmFnbWVudHNbdW5pdF0gPSBudW07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuc3RyaWN0ID0gZXhwb3J0cy5jYXN1YWwgPSB2b2lkIDA7XG5jb25zdCBjb25maWd1cmF0aW9uc18xID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZ3VyYXRpb25zXCIpO1xuY29uc3QgY2hyb25vXzEgPSByZXF1aXJlKFwiLi4vLi4vY2hyb25vXCIpO1xuY29uc3QgRlJDYXN1YWxEYXRlUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUkNhc3VhbERhdGVQYXJzZXJcIikpO1xuY29uc3QgRlJDYXN1YWxUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUkNhc3VhbFRpbWVQYXJzZXJcIikpO1xuY29uc3QgU2xhc2hEYXRlRm9ybWF0UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uL2NvbW1vbi9wYXJzZXJzL1NsYXNoRGF0ZUZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBGUlRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUlRpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IEZSTWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9GUk1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNvbnN0IEZSTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvRlJNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY29uc3QgRlJXZWVrZGF5UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUldlZWtkYXlQYXJzZXJcIikpO1xuY29uc3QgRlJTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9GUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXJcIikpO1xuY29uc3QgRlJNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0ZSTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IEZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0ZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgRlJUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvRlJUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBGUlRpbWVVbml0UmVsYXRpdmVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0ZSVGltZVVuaXRSZWxhdGl2ZUZvcm1hdFBhcnNlclwiKSk7XG5leHBvcnRzLmNhc3VhbCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbigpKTtcbmV4cG9ydHMuc3RyaWN0ID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDb25maWd1cmF0aW9uKHRydWUpKTtcbmZ1bmN0aW9uIHBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlKHRleHQsIHJlZiwgb3B0aW9uKTtcbn1cbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbikge1xuICAgIHJldHVybiBleHBvcnRzLmNhc3VhbC5wYXJzZURhdGUodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZURhdGUgPSBwYXJzZURhdGU7XG5mdW5jdGlvbiBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKGxpdHRsZUVuZGlhbiA9IHRydWUpIHtcbiAgICBjb25zdCBvcHRpb24gPSBjcmVhdGVDb25maWd1cmF0aW9uKGZhbHNlLCBsaXR0bGVFbmRpYW4pO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEZSQ2FzdWFsRGF0ZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgRlJDYXN1YWxUaW1lUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBGUlRpbWVVbml0UmVsYXRpdmVGb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIHJldHVybiBvcHRpb247XG59XG5leHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uO1xuZnVuY3Rpb24gY3JlYXRlQ29uZmlndXJhdGlvbihzdHJpY3RNb2RlID0gdHJ1ZSwgbGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBGUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBGUlRpbWVFeHByZXNzaW9uUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IEZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgRlJXZWVrZGF5UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICBdLFxuICAgICAgICByZWZpbmVyczogW25ldyBGUk1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEuZGVmYXVsdCgpLCBuZXcgRlJNZXJnZURhdGVSYW5nZVJlZmluZXJfMS5kZWZhdWx0KCldLFxuICAgIH0sIHN0cmljdE1vZGUpO1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IHJlZmVyZW5jZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9jYXN1YWxSZWZlcmVuY2VzXCIpKTtcbmNsYXNzIEZSQ2FzdWFsRGF0ZVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oY29udGV4dCkge1xuICAgICAgICByZXR1cm4gLyhtYWludGVuYW50fGF1am91cmQnaHVpfGRlbWFpbnxoaWVyfGNldHRlXFxzKm51aXR8bGFcXHMqdmVpbGxlKSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgbGV0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgbG93ZXJUZXh0ID0gbWF0Y2hbMF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKGxvd2VyVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcIm1haW50ZW5hbnRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5ub3coY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcImF1am91cmQnaHVpXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMudG9kYXkoY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcImhpZXJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy55ZXN0ZXJkYXkoY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcImRlbWFpblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbW9ycm93KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaWYgKGxvd2VyVGV4dC5tYXRjaCgvY2V0dGVcXHMqbnVpdC8pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAyMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb3dlclRleHQubWF0Y2goL2xhXFxzKnZlaWxsZS8pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGUgPSB0YXJnZXREYXRlLmFkZCgtMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUkNhc3VhbERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jbGFzcyBGUkNhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8oY2V0Pyk/XFxzKihtYXRpbnxzb2lyfGFwcsOocy1taWRpfGFwcmVtfGEgbWlkaXzDoCBtaW51aXQpKD89XFxXfCQpL2k7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBzdWZmaXhMb3dlciA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChzdWZmaXhMb3dlcikge1xuICAgICAgICAgICAgY2FzZSBcImFwcsOocy1taWRpXCI6XG4gICAgICAgICAgICBjYXNlIFwiYXByZW1cIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE0KTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic29pclwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTgpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtYXRpblwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgOCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImEgbWlkaVwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTIpO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCLDoCBtaW51aXRcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uQU0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJDYXN1YWxUaW1lUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Om9uXFxcXHMqPyk/XCIgK1xuICAgIGAoJHtjb25zdGFudHNfMy5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSlgICtcbiAgICBgKD86XFxcXHMqKD86YXV8XFxcXC18XFxcXOKAk3xqdXNxdSdhdT98XFxcXHMpXFxcXHMqKCR7Y29uc3RhbnRzXzMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTn0pKT9gICtcbiAgICBgKD86LXwvfFxcXFxzKig/OmRlKT9cXFxccyopYCArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSl9KWAgK1xuICAgIGAoPzooPzotfC98LD9cXFxccyopKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSg/IVteXFxcXHNdXFxcXGQpKSk/YCArXG4gICAgYCg/PVxcXFxXfCQpYCwgXCJpXCIpO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBEQVRFX1RPX0dST1VQID0gMjtcbmNvbnN0IE1PTlRIX05BTUVfR1JPVVAgPSAzO1xuY29uc3QgWUVBUl9HUk9VUCA9IDQ7XG5jbGFzcyBGUk1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KG1hdGNoLmluZGV4LCBtYXRjaFswXSk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWVttYXRjaFtNT05USF9OQU1FX0dST1VQXS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgY29uc3QgZGF5ID0gY29uc3RhbnRzXzMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX0dST1VQXSk7XG4gICAgICAgIGlmIChkYXkgPiAzMSkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoW0RBVEVfR1JPVVBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJtb250aFwiLCBtb250aCk7XG4gICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJkYXlcIiwgZGF5KTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyTnVtYmVyID0gY29uc3RhbnRzXzIucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5hc3NpZ24oXCJ5ZWFyXCIsIHllYXJOdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydC5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoW0RBVEVfVE9fR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCBlbmREYXRlID0gY29uc3RhbnRzXzMucGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaFtEQVRFX1RPX0dST1VQXSk7XG4gICAgICAgICAgICByZXN1bHQuZW5kID0gcmVzdWx0LnN0YXJ0LmNsb25lKCk7XG4gICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcImRheVwiLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZSTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgRklSU1RfUkVHX1BBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKF58XFxcXHN8VClcIiArXG4gICAgXCIoPzooPzpbw6BhXSlcXFxccyopP1wiICtcbiAgICBcIihcXFxcZHsxLDJ9KSg/Omh8Oik/XCIgK1xuICAgIFwiKD86KFxcXFxkezEsMn0pKD86bXw6KT8pP1wiICtcbiAgICBcIig/OihcXFxcZHsxLDJ9KSg/OnN8Oik/KT9cIiArXG4gICAgXCIoPzpcXFxccyooQVxcXFwuTVxcXFwufFBcXFxcLk1cXFxcLnxBTT98UE0/KSk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgU0VDT05EX1JFR19QQVRURVJOID0gbmV3IFJlZ0V4cChcIl5cXFxccyooXFxcXC18XFxcXOKAk3xcXFxcfnxcXFxc44CcfFvDoGFdfFxcXFw/KVxcXFxzKlwiICtcbiAgICBcIihcXFxcZHsxLDJ9KSg/Omh8Oik/XCIgK1xuICAgIFwiKD86KFxcXFxkezEsMn0pKD86bXw6KT8pP1wiICtcbiAgICBcIig/OihcXFxcZHsxLDJ9KSg/OnN8Oik/KT9cIiArXG4gICAgXCIoPzpcXFxccyooQVxcXFwuTVxcXFwufFBcXFxcLk1cXFxcLnxBTT98UE0/KSk/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgSE9VUl9HUk9VUCA9IDI7XG5jb25zdCBNSU5VVEVfR1JPVVAgPSAzO1xuY29uc3QgU0VDT05EX0dST1VQID0gNDtcbmNvbnN0IEFNX1BNX0hPVVJfR1JPVVAgPSA1O1xuY2xhc3MgRlJTcGVjaWZpY1RpbWVFeHByZXNzaW9uUGFyc2VyIHtcbiAgICBwYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIEZJUlNUX1JFR19QQVRURVJOO1xuICAgIH1cbiAgICBleHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCArIG1hdGNoWzFdLmxlbmd0aCwgbWF0Y2hbMF0uc3Vic3RyaW5nKG1hdGNoWzFdLmxlbmd0aCkpO1xuICAgICAgICBpZiAocmVzdWx0LnRleHQubWF0Y2goL15cXGR7NH0kLykpIHtcbiAgICAgICAgICAgIG1hdGNoLmluZGV4ICs9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5zdGFydCA9IEZSU3BlY2lmaWNUaW1lRXhwcmVzc2lvblBhcnNlci5leHRyYWN0VGltZUNvbXBvbmVudChyZXN1bHQuc3RhcnQuY2xvbmUoKSwgbWF0Y2gpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdGFydCkge1xuICAgICAgICAgICAgbWF0Y2guaW5kZXggKz0gbWF0Y2hbMF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtYWluaW5nVGV4dCA9IGNvbnRleHQudGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgICBjb25zdCBzZWNvbmRNYXRjaCA9IFNFQ09ORF9SRUdfUEFUVEVSTi5leGVjKHJlbWFpbmluZ1RleHQpO1xuICAgICAgICBpZiAoc2Vjb25kTWF0Y2gpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmQgPSBGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXIuZXh0cmFjdFRpbWVDb21wb25lbnQocmVzdWx0LnN0YXJ0LmNsb25lKCksIHNlY29uZE1hdGNoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnRleHQgKz0gc2Vjb25kTWF0Y2hbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3RhdGljIGV4dHJhY3RUaW1lQ29tcG9uZW50KGV4dHJhY3RpbmdDb21wb25lbnRzLCBtYXRjaCkge1xuICAgICAgICBsZXQgaG91ciA9IDA7XG4gICAgICAgIGxldCBtaW51dGUgPSAwO1xuICAgICAgICBsZXQgbWVyaWRpZW0gPSBudWxsO1xuICAgICAgICBob3VyID0gcGFyc2VJbnQobWF0Y2hbSE9VUl9HUk9VUF0pO1xuICAgICAgICBpZiAobWF0Y2hbTUlOVVRFX0dST1VQXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBtaW51dGUgPSBwYXJzZUludChtYXRjaFtNSU5VVEVfR1JPVVBdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWludXRlID49IDYwIHx8IGhvdXIgPiAyNCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvdXIgPj0gMTIpIHtcbiAgICAgICAgICAgIG1lcmlkaWVtID0gaW5kZXhfMS5NZXJpZGllbS5QTTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbQU1fUE1fSE9VUl9HUk9VUF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGhvdXIgPiAxMilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGFtcG0gPSBtYXRjaFtBTV9QTV9IT1VSX0dST1VQXVswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJhXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uQU07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgPT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFtcG0gPT0gXCJwXCIpIHtcbiAgICAgICAgICAgICAgICBtZXJpZGllbSA9IGluZGV4XzEuTWVyaWRpZW0uUE07XG4gICAgICAgICAgICAgICAgaWYgKGhvdXIgIT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwiaG91clwiLCBob3VyKTtcbiAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwibWludXRlXCIsIG1pbnV0ZSk7XG4gICAgICAgIGlmIChtZXJpZGllbSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0cmFjdGluZ0NvbXBvbmVudHMuYXNzaWduKFwibWVyaWRpZW1cIiwgbWVyaWRpZW0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGV4dHJhY3RpbmdDb21wb25lbnRzLmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBleHRyYWN0aW5nQ29tcG9uZW50cy5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaFtTRUNPTkRfR1JPVVBdICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IHBhcnNlSW50KG1hdGNoW1NFQ09ORF9HUk9VUF0pO1xuICAgICAgICAgICAgaWYgKHNlY29uZCA+PSA2MClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGV4dHJhY3RpbmdDb21wb25lbnRzLmFzc2lnbihcInNlY29uZFwiLCBzZWNvbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRyYWN0aW5nQ29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUlNwZWNpZmljVGltZUV4cHJlc3Npb25QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpO1xuY2xhc3MgRlJUaW1lRXhwcmVzc2lvblBhcnNlciBleHRlbmRzIEFic3RyYWN0VGltZUV4cHJlc3Npb25QYXJzZXJfMS5BYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyIHtcbiAgICBwcmltYXJ5UHJlZml4KCkge1xuICAgICAgICByZXR1cm4gXCIoPzooPzpbw6BhXSlcXFxccyopP1wiO1xuICAgIH1cbiAgICBmb2xsb3dpbmdQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxcXHMqKD86XFxcXC18XFxcXOKAk3xcXFxcfnxcXFxc44CcfFvDoGFdfFxcXFw/KVxcXFxzKlwiO1xuICAgIH1cbiAgICBleHRyYWN0UHJpbWFyeVRpbWVDb21wb25lbnRzKGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGlmIChtYXRjaFswXS5tYXRjaCgvXlxccypcXGR7NH1cXHMqJC8pKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJUaW1lRXhwcmVzc2lvblBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcmVzdWx0c18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3Jlc3VsdHNcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCB0aW1ldW5pdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy90aW1ldW5pdHNcIik7XG5jbGFzcyBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBpbCB5IGFcXFxccyooJHtjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk59KSg/PSg/OlxcXFxXfCQpKWAsIFwiaVwiKTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVVbml0cyA9IGNvbnN0YW50c18xLnBhcnNlVGltZVVuaXRzKG1hdGNoWzFdKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0VGltZVVuaXRzID0gdGltZXVuaXRzXzEucmV2ZXJzZVRpbWVVbml0cyh0aW1lVW5pdHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCBvdXRwdXRUaW1lVW5pdHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgdGltZXVuaXRzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvdGltZXVuaXRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jbGFzcyBGUlRpbWVVbml0QWdvRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGAoPzpsZXM/fGxhfGwnfGR1fGRlcz8pXFxcXHMqYCArXG4gICAgICAgICAgICBgKCR7Y29uc3RhbnRzXzEuTlVNQkVSX1BBVFRFUk59KT9gICtcbiAgICAgICAgICAgIGAoPzpcXFxccyoocHJvY2hhaW5lP3M/fGRlcm5pW2XDqF1yZT9zP3xwYXNzW8OpZV1lP3M/fHByW8OpZV1jW8OpZV1kZW50cz98c3VpdmFudGU/cz8pKT9gICtcbiAgICAgICAgICAgIGBcXFxccyooJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLlRJTUVfVU5JVF9ESUNUSU9OQVJZKX0pYCArXG4gICAgICAgICAgICBgKD86XFxcXHMqKHByb2NoYWluZT9zP3xkZXJuaVtlw6hdcmU/cz98cGFzc1vDqWVdZT9zP3xwclvDqWVdY1vDqWVdZGVudHM/fHN1aXZhbnRlP3M/KSk/YCwgXCJpXCIpO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbnVtID0gbWF0Y2hbMV0gPyBjb25zdGFudHNfMS5wYXJzZU51bWJlclBhdHRlcm4obWF0Y2hbMV0pIDogMTtcbiAgICAgICAgY29uc3QgdW5pdCA9IGNvbnN0YW50c18xLlRJTUVfVU5JVF9ESUNUSU9OQVJZW21hdGNoWzNdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBsZXQgdGltZVVuaXRzID0ge307XG4gICAgICAgIHRpbWVVbml0c1t1bml0XSA9IG51bTtcbiAgICAgICAgbGV0IG1vZGlmaWVyID0gbWF0Y2hbMl0gfHwgbWF0Y2hbNF0gfHwgXCJcIjtcbiAgICAgICAgbW9kaWZpZXIgPSBtb2RpZmllci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIW1vZGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9kZXJuaVtlw6hdcmU/cz8vLnRlc3QobW9kaWZpZXIpIHx8IC9wYXNzW8OpZV1lP3M/Ly50ZXN0KG1vZGlmaWVyKSB8fCAvcHJbw6llXWNbw6llXWRlbnRzPy8udGVzdChtb2RpZmllcikpIHtcbiAgICAgICAgICAgIHRpbWVVbml0cyA9IHRpbWV1bml0c18xLnJldmVyc2VUaW1lVW5pdHModGltZVVuaXRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCB0aW1lVW5pdHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZSVGltZVVuaXRBZ29Gb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY2xhc3MgRlJUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGAoPzpkYW5zfGVufHBvdXJ8cGVuZGFudClcXFxccyooJHtjb25zdGFudHNfMS5USU1FX1VOSVRTX1BBVFRFUk59KSg/PVxcXFxXfCQpYCwgXCJpXCIpO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgdGltZVVuaXRzID0gY29uc3RhbnRzXzEucGFyc2VUaW1lVW5pdHMobWF0Y2hbMV0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0c18xLlBhcnNpbmdDb21wb25lbnRzLmNyZWF0ZVJlbGF0aXZlRnJvbVJlZkluc3RhbnQoY29udGV4dC5yZWZEYXRlLCB0aW1lVW5pdHMpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEZSVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3Qgd2Vla3NfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi93ZWVrc1wiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKD86KD86XFxcXCx8XFxcXCh8XFxcXO+8iClcXFxccyopP1wiICtcbiAgICBcIig/Oig/OmNlKVxcXFxzKik/XCIgK1xuICAgIGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWSl9KWAgK1xuICAgIFwiKD86XFxcXHMqKD86XFxcXCx8XFxcXCl8XFxcXO+8iSkpP1wiICtcbiAgICBcIig/OlxcXFxzKihkZXJuaWVyfHByb2NoYWluKVxcXFxzKik/XCIgK1xuICAgIFwiKD89XFxcXFd8XFxcXGR8JClcIiwgXCJpXCIpO1xuY29uc3QgV0VFS0RBWV9HUk9VUCA9IDE7XG5jb25zdCBQT1NURklYX0dST1VQID0gMjtcbmNsYXNzIEZSV2Vla2RheVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gbWF0Y2hbV0VFS0RBWV9HUk9VUF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZW2RheU9mV2Vla107XG4gICAgICAgIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1ZmZpeCA9IG1hdGNoW1BPU1RGSVhfR1JPVVBdO1xuICAgICAgICBzdWZmaXggPSBzdWZmaXggfHwgXCJcIjtcbiAgICAgICAgc3VmZml4ID0gc3VmZml4LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtb2RpZmllciA9IG51bGw7XG4gICAgICAgIGlmIChzdWZmaXggPT0gXCJkZXJuaWVyXCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJsYXN0XCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VmZml4ID09IFwicHJvY2hhaW5cIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcIm5leHRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gd2Vla3NfMS50b0RheUpTV2Vla2RheShjb250ZXh0LnJlZkRhdGUsIG9mZnNldCwgbW9kaWZpZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKClcbiAgICAgICAgICAgIC5hc3NpZ24oXCJ3ZWVrZGF5XCIsIG9mZnNldClcbiAgICAgICAgICAgIC5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSlcbiAgICAgICAgICAgIC5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpXG4gICAgICAgICAgICAuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUldlZWtkYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBGUk1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyoow6B8YXwtKVxccyokL2k7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gRlJNZXJnZURhdGVSYW5nZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3JlZmluZXJzL0Fic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY2xhc3MgRlJNZXJnZURhdGVUaW1lUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlVGltZVJlZmluZXJfMS5kZWZhdWx0IHtcbiAgICBwYXR0ZXJuQmV0d2VlbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoXCJeXFxcXHMqKFR8w6B8YXx2ZXJzfGRlfCx8LSk/XFxcXHMqJFwiKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBGUk1lcmdlRGF0ZVRpbWVSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnRvSGFua2FrdSA9IHZvaWQgMDtcbmZ1bmN0aW9uIHRvSGFua2FrdSh0ZXh0KSB7XG4gICAgcmV0dXJuIFN0cmluZyh0ZXh0KVxuICAgICAgICAucmVwbGFjZSgvXFx1MjAxOS9nLCBcIlxcdTAwMjdcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcdTIwMUQvZywgXCJcXHUwMDIyXCIpXG4gICAgICAgIC5yZXBsYWNlKC9cXHUzMDAwL2csIFwiXFx1MDAyMFwiKVxuICAgICAgICAucmVwbGFjZSgvXFx1RkZFNS9nLCBcIlxcdTAwQTVcIilcbiAgICAgICAgLnJlcGxhY2UoL1tcXHVGRjAxXFx1RkYwMy1cXHVGRjA2XFx1RkYwOFxcdUZGMDlcXHVGRjBDLVxcdUZGMTlcXHVGRjFDLVxcdUZGMUZcXHVGRjIxLVxcdUZGM0JcXHVGRjNEXFx1RkYzRlxcdUZGNDEtXFx1RkY1QlxcdUZGNURcXHVGRjVFXS9nLCBhbHBoYU51bSk7XG59XG5leHBvcnRzLnRvSGFua2FrdSA9IHRvSGFua2FrdTtcbmZ1bmN0aW9uIGFscGhhTnVtKHRva2VuKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodG9rZW4uY2hhckNvZGVBdCgwKSAtIDY1MjQ4KTtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5zdHJpY3QgPSBleHBvcnRzLmNhc3VhbCA9IHZvaWQgMDtcbmNvbnN0IEpQU3RhbmRhcmRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0pQU3RhbmRhcmRQYXJzZXJcIikpO1xuY29uc3QgSlBNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9KUE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jb25zdCBKUENhc3VhbERhdGVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL0pQQ2FzdWFsRGF0ZVBhcnNlclwiKSk7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5leHBvcnRzLmNhc3VhbCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbigpKTtcbmV4cG9ydHMuc3RyaWN0ID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDb25maWd1cmF0aW9uKCkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbigpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IEpQQ2FzdWFsRGF0ZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb247XG5mdW5jdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHBhcnNlcnM6IFtuZXcgSlBTdGFuZGFyZFBhcnNlcl8xLmRlZmF1bHQoKV0sXG4gICAgICAgIHJlZmluZXJzOiBbbmV3IEpQTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9O1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgcmVmZXJlbmNlcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL2Nhc3VhbFJlZmVyZW5jZXNcIikpO1xuY29uc3QgUEFUVEVSTiA9IC/ku4rml6V85b2T5pelfOaYqOaXpXzmmI7ml6V85LuK5aScfOS7iuWklXzku4rmmal85LuK5pydL2k7XG5jbGFzcyBKUENhc3VhbERhdGVQYXJzZXIge1xuICAgIHBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBleHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBtYXRjaFswXTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IGRheWpzXzEuZGVmYXVsdChjb250ZXh0LnJlZkRhdGUpO1xuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBzd2l0Y2ggKHRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCLmmKjml6VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy55ZXN0ZXJkYXkoY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcIuaYjuaXpVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbW9ycm93KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGNhc2UgXCLku4rml6VcIjpcbiAgICAgICAgICAgIGNhc2UgXCLlvZPml6VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b2RheShjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRleHQgPT0gXCLku4rlpJxcIiB8fCB0ZXh0ID09IFwi5LuK5aSVXCIgfHwgdGV4dCA9PSBcIuS7iuaZqVwiKSB7XG4gICAgICAgICAgICBjb21wb25lbnRzLmltcGx5KFwiaG91clwiLCAyMik7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRleHQubWF0Y2goXCLku4rmnJ1cIikpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJob3VyXCIsIDYpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcImRheVwiLCBkYXRlLmRhdGUoKSk7XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwibW9udGhcIiwgZGF0ZS5tb250aCgpICsgMSk7XG4gICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEpQQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmNvbnN0IGRheWpzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImRheWpzXCIpKTtcbmNvbnN0IFBBVFRFUk4gPSAvKD86KD86KFvlkIzku4rmnKxdKXwoKOaYreWSjHzlubPmiJB85Luk5ZKMKT8oWzAtOe+8kC3vvJldezEsNH185YWDKSkp5bm0XFxzKik/KFswLTnvvJAt77yZXXsxLDJ9KeaciFxccyooWzAtOe+8kC3vvJldezEsMn0p5pelL2k7XG5jb25zdCBTUEVDSUFMX1lFQVJfR1JPVVAgPSAxO1xuY29uc3QgVFlQSUNBTF9ZRUFSX0dST1VQID0gMjtcbmNvbnN0IEVSQV9HUk9VUCA9IDM7XG5jb25zdCBZRUFSX05VTUJFUl9HUk9VUCA9IDQ7XG5jb25zdCBNT05USF9HUk9VUCA9IDU7XG5jb25zdCBEQVlfR1JPVVAgPSA2O1xuY2xhc3MgSlBTdGFuZGFyZFBhcnNlciB7XG4gICAgcGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChjb25zdGFudHNfMS50b0hhbmtha3UobWF0Y2hbTU9OVEhfR1JPVVBdKSk7XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGNvbnN0YW50c18xLnRvSGFua2FrdShtYXRjaFtEQVlfR1JPVVBdKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKHtcbiAgICAgICAgICAgIGRheTogZGF5LFxuICAgICAgICAgICAgbW9udGg6IG1vbnRoLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1hdGNoW1NQRUNJQUxfWUVBUl9HUk9VUF0gJiYgbWF0Y2hbU1BFQ0lBTF9ZRUFSX0dST1VQXS5tYXRjaChcIuWQjHzku4p85pysXCIpKSB7XG4gICAgICAgICAgICBjb25zdCBtb21lbnQgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCBtb21lbnQueWVhcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbVFlQSUNBTF9ZRUFSX0dST1VQXSkge1xuICAgICAgICAgICAgY29uc3QgeWVhck51bVRleHQgPSBtYXRjaFtZRUFSX05VTUJFUl9HUk9VUF07XG4gICAgICAgICAgICBsZXQgeWVhciA9IHllYXJOdW1UZXh0ID09IFwi5YWDXCIgPyAxIDogcGFyc2VJbnQoY29uc3RhbnRzXzEudG9IYW5rYWt1KHllYXJOdW1UZXh0KSk7XG4gICAgICAgICAgICBpZiAobWF0Y2hbRVJBX0dST1VQXSA9PSBcIuS7pOWSjFwiKSB7XG4gICAgICAgICAgICAgICAgeWVhciArPSAyMDE4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbRVJBX0dST1VQXSA9PSBcIuW5s+aIkFwiKSB7XG4gICAgICAgICAgICAgICAgeWVhciArPSAxOTg4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hbRVJBX0dST1VQXSA9PSBcIuaYreWSjFwiKSB7XG4gICAgICAgICAgICAgICAgeWVhciArPSAxOTI1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IEpQU3RhbmRhcmRQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBKUE1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyoo44GL44KJfOODvHwtKVxccyokL2k7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gSlBNZXJnZURhdGVSYW5nZVJlZmluZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucGFyc2VUaW1lVW5pdHMgPSBleHBvcnRzLlRJTUVfVU5JVFNfUEFUVEVSTiA9IGV4cG9ydHMucGFyc2VZZWFyID0gZXhwb3J0cy5ZRUFSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSBleHBvcnRzLk9SRElOQUxfTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IGV4cG9ydHMuTlVNQkVSX1BBVFRFUk4gPSBleHBvcnRzLlRJTUVfVU5JVF9ESUNUSU9OQVJZID0gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWSA9IGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUlkgPSBleHBvcnRzLk1PTlRIX0RJQ1RJT05BUlkgPSBleHBvcnRzLldFRUtEQVlfRElDVElPTkFSWSA9IHZvaWQgMDtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgeWVhcnNfMSA9IHJlcXVpcmUoXCIuLi8uLi9jYWxjdWxhdGlvbi95ZWFyc1wiKTtcbmV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0ge1xuICAgIHpvbmRhZzogMCxcbiAgICB6b246IDAsXG4gICAgXCJ6b24uXCI6IDAsXG4gICAgem86IDAsXG4gICAgXCJ6by5cIjogMCxcbiAgICBtYWFuZGFnOiAxLFxuICAgIG1hOiAxLFxuICAgIFwibWEuXCI6IDEsXG4gICAgZGluc2RhZzogMixcbiAgICBkaW46IDIsXG4gICAgXCJkaW4uXCI6IDIsXG4gICAgZGk6IDIsXG4gICAgXCJkaS5cIjogMixcbiAgICB3b2Vuc2RhZzogMyxcbiAgICB3b2U6IDMsXG4gICAgXCJ3b2UuXCI6IDMsXG4gICAgd286IDMsXG4gICAgXCJ3by5cIjogMyxcbiAgICBkb25kZXJkYWc6IDQsXG4gICAgZG9uZDogNCxcbiAgICBcImRvbmQuXCI6IDQsXG4gICAgZG86IDQsXG4gICAgXCJkby5cIjogNCxcbiAgICB2cmlqZGFnOiA1LFxuICAgIHZyaWo6IDUsXG4gICAgXCJ2cmlqLlwiOiA1LFxuICAgIHZyOiA1LFxuICAgIFwidnIuXCI6IDUsXG4gICAgemF0ZXJkYWc6IDYsXG4gICAgemF0OiA2LFxuICAgIFwiemF0LlwiOiA2LFxuICAgIFwiemFcIjogNixcbiAgICBcInphLlwiOiA2LFxufTtcbmV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IHtcbiAgICBqYW51YXJpOiAxLFxuICAgIGphbjogMSxcbiAgICBcImphbi5cIjogMSxcbiAgICBmZWJydWFyaTogMixcbiAgICBmZWI6IDIsXG4gICAgXCJmZWIuXCI6IDIsXG4gICAgbWFhcnQ6IDMsXG4gICAgbWFyOiAzLFxuICAgIFwibWFyLlwiOiAzLFxuICAgIGFwcmlsOiA0LFxuICAgIGFwcjogNCxcbiAgICBcImFwci5cIjogNCxcbiAgICBtZWk6IDUsXG4gICAganVuaTogNixcbiAgICBqdW46IDYsXG4gICAgXCJqdW4uXCI6IDYsXG4gICAganVsaTogNyxcbiAgICBqdWw6IDcsXG4gICAgXCJqdWwuXCI6IDcsXG4gICAgYXVndXN0dXM6IDgsXG4gICAgYXVnOiA4LFxuICAgIFwiYXVnLlwiOiA4LFxuICAgIHNlcHRlbWJlcjogOSxcbiAgICBzZXA6IDksXG4gICAgXCJzZXAuXCI6IDksXG4gICAgc2VwdDogOSxcbiAgICBcInNlcHQuXCI6IDksXG4gICAgb2t0b2JlcjogMTAsXG4gICAgb2t0OiAxMCxcbiAgICBcIm9rdC5cIjogMTAsXG4gICAgbm92ZW1iZXI6IDExLFxuICAgIG5vdjogMTEsXG4gICAgXCJub3YuXCI6IDExLFxuICAgIGRlY2VtYmVyOiAxMixcbiAgICBkZWM6IDEyLFxuICAgIFwiZGVjLlwiOiAxMixcbn07XG5leHBvcnRzLklOVEVHRVJfV09SRF9ESUNUSU9OQVJZID0ge1xuICAgIGVlbjogMSxcbiAgICB0d2VlOiAyLFxuICAgIGRyaWU6IDMsXG4gICAgdmllcjogNCxcbiAgICB2aWpmOiA1LFxuICAgIHplczogNixcbiAgICB6ZXZlbjogNyxcbiAgICBhY2h0OiA4LFxuICAgIG5lZ2VuOiA5LFxuICAgIHRpZW46IDEwLFxuICAgIGVsZjogMTEsXG4gICAgdHdhYWxmOiAxMixcbn07XG5leHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZID0ge1xuICAgIGVlcnN0ZTogMSxcbiAgICB0d2VlZGU6IDIsXG4gICAgZGVyZGU6IDMsXG4gICAgdmllcmRlOiA0LFxuICAgIHZpamZkZTogNSxcbiAgICB6ZXNkZTogNixcbiAgICB6ZXZlbmRlOiA3LFxuICAgIGFjaHRzdGU6IDgsXG4gICAgbmVnZW5kZTogOSxcbiAgICB0aWVuZGU6IDEwLFxuICAgIGVsZmRlOiAxMSxcbiAgICB0d2FhbGZkZTogMTIsXG4gICAgZGVydGllbmRlOiAxMyxcbiAgICB2ZWVydGllbmRlOiAxNCxcbiAgICB2aWpmdGllbmRlOiAxNSxcbiAgICB6ZXN0aWVuZGU6IDE2LFxuICAgIHpldmVudGllbmRlOiAxNyxcbiAgICBhY2h0dGllbmRlOiAxOCxcbiAgICBuZWdlbnRpZW5kZTogMTksXG4gICAgdHdpbnRpZ3N0ZTogMjAsXG4gICAgXCJlZW5lbnR3aW50aWdzdGVcIjogMjEsXG4gICAgXCJ0d2Vlw6tudHdpbnRpZ3N0ZVwiOiAyMixcbiAgICBcImRyaWVlbnR3aW50aWdzdGVcIjogMjMsXG4gICAgXCJ2aWVyZW50d2ludGlnc3RlXCI6IDI0LFxuICAgIFwidmlqZmVudHdpbnRpZ3N0ZVwiOiAyNSxcbiAgICBcInplc2VudHdpbnRpZ3N0ZVwiOiAyNixcbiAgICBcInpldmVuZW50d2ludGlnc3RlXCI6IDI3LFxuICAgIFwiYWNodGVudHdpbnRpZ1wiOiAyOCxcbiAgICBcIm5lZ2VuZW50d2ludGlnXCI6IDI5LFxuICAgIFwiZGVydGlnc3RlXCI6IDMwLFxuICAgIFwiZWVuZW5kZXJ0aWdzdGVcIjogMzEsXG59O1xuZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWSA9IHtcbiAgICBzZWM6IFwic2Vjb25kXCIsXG4gICAgc2Vjb25kOiBcInNlY29uZFwiLFxuICAgIHNlY29uZGVuOiBcInNlY29uZFwiLFxuICAgIG1pbjogXCJtaW51dGVcIixcbiAgICBtaW5zOiBcIm1pbnV0ZVwiLFxuICAgIG1pbnV0ZTogXCJtaW51dGVcIixcbiAgICBtaW51dGVuOiBcIm1pbnV0ZVwiLFxuICAgIGg6IFwiaG91clwiLFxuICAgIGhyOiBcImhvdXJcIixcbiAgICBocnM6IFwiaG91clwiLFxuICAgIHV1cjogXCJob3VyXCIsXG4gICAgdXJlbjogXCJob3VyXCIsXG4gICAgZGFnOiBcImRcIixcbiAgICBkYWdlbjogXCJkXCIsXG4gICAgd2VlazogXCJ3ZWVrXCIsXG4gICAgd2VrZW46IFwid2Vla1wiLFxuICAgIG1hYW5kOiBcIm1vbnRoXCIsXG4gICAgbWFhbmRlbjogXCJtb250aFwiLFxuICAgIGphYXI6IFwieWVhclwiLFxuICAgIGpyOiBcInllYXJcIixcbiAgICBqYXJlbjogXCJ5ZWFyXCIsXG59O1xuZXhwb3J0cy5OVU1CRVJfUEFUVEVSTiA9IGAoPzoke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWSl9fFswLTldK3xbMC05XStcXFxcLlswLTldK3xlZW4/fGhhbHZlPylgO1xuZnVuY3Rpb24gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gbWF0Y2gudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoZXhwb3J0cy5JTlRFR0VSX1dPUkRfRElDVElPTkFSWVtudW1dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGV4cG9ydHMuSU5URUdFUl9XT1JEX0RJQ1RJT05BUllbbnVtXTtcbiAgICB9XG4gICAgZWxzZSBpZiAobnVtID09PSBcImVlblwiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBlbHNlIGlmIChudW0ubWF0Y2goL2hhbHZlPy8pKSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUZsb2F0KG51bSk7XG59XG5leHBvcnRzLnBhcnNlTnVtYmVyUGF0dGVybiA9IHBhcnNlTnVtYmVyUGF0dGVybjtcbmV4cG9ydHMuT1JESU5BTF9OVU1CRVJfUEFUVEVSTiA9IGAoPzoke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWSl9fFswLTldezEsMn0oPzpzdGV8ZGUpPylgO1xuZnVuY3Rpb24gcGFyc2VPcmRpbmFsTnVtYmVyUGF0dGVybihtYXRjaCkge1xuICAgIGxldCBudW0gPSBtYXRjaC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChleHBvcnRzLk9SRElOQUxfV09SRF9ESUNUSU9OQVJZW251bV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZXhwb3J0cy5PUkRJTkFMX1dPUkRfRElDVElPTkFSWVtudW1dO1xuICAgIH1cbiAgICBudW0gPSBudW0ucmVwbGFjZSgvKD86c3RlfGRlKSQvaSwgXCJcIik7XG4gICAgcmV0dXJuIHBhcnNlSW50KG51bSk7XG59XG5leHBvcnRzLnBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuO1xuZXhwb3J0cy5ZRUFSX1BBVFRFUk4gPSBgKD86WzEtOV1bMC05XXswLDN9XFxcXHMqKD86dm9vciBDaHJpc3R1c3xuYSBDaHJpc3R1cyl8WzEtMl1bMC05XXszfXxbNS05XVswLTldKWA7XG5mdW5jdGlvbiBwYXJzZVllYXIobWF0Y2gpIHtcbiAgICBpZiAoL3Zvb3IgQ2hyaXN0dXMvaS50ZXN0KG1hdGNoKSkge1xuICAgICAgICBtYXRjaCA9IG1hdGNoLnJlcGxhY2UoL3Zvb3IgQ2hyaXN0dXMvaSwgXCJcIik7XG4gICAgICAgIHJldHVybiAtcGFyc2VJbnQobWF0Y2gpO1xuICAgIH1cbiAgICBpZiAoL25hIENocmlzdHVzL2kudGVzdChtYXRjaCkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9uYSBDaHJpc3R1cy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoKTtcbiAgICB9XG4gICAgY29uc3QgcmF3WWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICByZXR1cm4geWVhcnNfMS5maW5kTW9zdExpa2VseUFEWWVhcihyYXdZZWFyTnVtYmVyKTtcbn1cbmV4cG9ydHMucGFyc2VZZWFyID0gcGFyc2VZZWFyO1xuY29uc3QgU0lOR0xFX1RJTUVfVU5JVF9QQVRURVJOID0gYCgke2V4cG9ydHMuTlVNQkVSX1BBVFRFUk59KVxcXFxzezAsNX0oJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGV4cG9ydHMuVElNRV9VTklUX0RJQ1RJT05BUlkpfSlcXFxcc3swLDV9YDtcbmNvbnN0IFNJTkdMRV9USU1FX1VOSVRfUkVHRVggPSBuZXcgUmVnRXhwKFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTiwgXCJpXCIpO1xuZXhwb3J0cy5USU1FX1VOSVRTX1BBVFRFUk4gPSBwYXR0ZXJuXzEucmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4oYCg/Oig/OmJpbm5lbnxpbilcXFxccyopP2AsIFNJTkdMRV9USU1FX1VOSVRfUEFUVEVSTik7XG5mdW5jdGlvbiBwYXJzZVRpbWVVbml0cyh0aW1ldW5pdFRleHQpIHtcbiAgICBjb25zdCBmcmFnbWVudHMgPSB7fTtcbiAgICBsZXQgcmVtYWluaW5nVGV4dCA9IHRpbWV1bml0VGV4dDtcbiAgICBsZXQgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgIGNvbGxlY3REYXRlVGltZUZyYWdtZW50KGZyYWdtZW50cywgbWF0Y2gpO1xuICAgICAgICByZW1haW5pbmdUZXh0ID0gcmVtYWluaW5nVGV4dC5zdWJzdHJpbmcobWF0Y2hbMF0ubGVuZ3RoKTtcbiAgICAgICAgbWF0Y2ggPSBTSU5HTEVfVElNRV9VTklUX1JFR0VYLmV4ZWMocmVtYWluaW5nVGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudHM7XG59XG5leHBvcnRzLnBhcnNlVGltZVVuaXRzID0gcGFyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBjb2xsZWN0RGF0ZVRpbWVGcmFnbWVudChmcmFnbWVudHMsIG1hdGNoKSB7XG4gICAgY29uc3QgbnVtID0gcGFyc2VOdW1iZXJQYXR0ZXJuKG1hdGNoWzFdKTtcbiAgICBjb25zdCB1bml0ID0gZXhwb3J0cy5USU1FX1VOSVRfRElDVElPTkFSWVttYXRjaFsyXS50b0xvd2VyQ2FzZSgpXTtcbiAgICBmcmFnbWVudHNbdW5pdF0gPSBudW07XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGV4cG9ydHMucGFyc2VEYXRlID0gZXhwb3J0cy5wYXJzZSA9IGV4cG9ydHMuc3RyaWN0ID0gZXhwb3J0cy5jYXN1YWwgPSB2b2lkIDA7XG5jb25zdCBjb25maWd1cmF0aW9uc18xID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZ3VyYXRpb25zXCIpO1xuY29uc3QgY2hyb25vXzEgPSByZXF1aXJlKFwiLi4vLi4vY2hyb25vXCIpO1xuY29uc3QgTkxNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9OTE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jb25zdCBOTE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcmVmaW5lcnMvTkxNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jb25zdCBOTENhc3VhbERhdGVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MQ2FzdWFsRGF0ZVBhcnNlclwiKSk7XG5jb25zdCBOTENhc3VhbFRpbWVQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MQ2FzdWFsVGltZVBhcnNlclwiKSk7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IE5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJcIikpO1xuY29uc3QgTkxXZWVrZGF5UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTFdlZWtkYXlQYXJzZXJcIikpO1xuY29uc3QgTkxNb250aE5hbWVNaWRkbGVFbmRpYW5QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyXCIpKTtcbmNvbnN0IE5MTW9udGhOYW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTE1vbnRoTmFtZVBhcnNlclwiKSk7XG5jb25zdCBOTFNsYXNoTW9udGhGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL05MU2xhc2hNb250aEZvcm1hdFBhcnNlclwiKSk7XG5jb25zdCBOTFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTFRpbWVFeHByZXNzaW9uUGFyc2VyXCIpKTtcbmNvbnN0IE5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTENhc3VhbFllYXJNb250aERheVBhcnNlclwiKSk7XG5jb25zdCBOTENhc3VhbERhdGVUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9OTENhc3VhbERhdGVUaW1lUGFyc2VyXCIpKTtcbmV4cG9ydHMuY2FzdWFsID0gbmV3IGNocm9ub18xLkNocm9ubyhjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uKCkpO1xuZXhwb3J0cy5zdHJpY3QgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNvbmZpZ3VyYXRpb24odHJ1ZSkpO1xuZnVuY3Rpb24gcGFyc2UodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2UodGV4dCwgcmVmLCBvcHRpb24pO1xufVxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZnVuY3Rpb24gcGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY2FzdWFsLnBhcnNlRGF0ZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlRGF0ZSA9IHBhcnNlRGF0ZTtcbmZ1bmN0aW9uIGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24obGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24oZmFsc2UsIGxpdHRsZUVuZGlhbik7XG4gICAgb3B0aW9uLnBhcnNlcnMudW5zaGlmdChuZXcgTkxDYXN1YWxEYXRlUGFyc2VyXzEuZGVmYXVsdCgpKTtcbiAgICBvcHRpb24ucGFyc2Vycy51bnNoaWZ0KG5ldyBOTENhc3VhbFRpbWVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnVuc2hpZnQobmV3IE5MQ2FzdWFsRGF0ZVRpbWVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIHJldHVybiBvcHRpb247XG59XG5leHBvcnRzLmNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24gPSBjcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uO1xuZnVuY3Rpb24gY3JlYXRlQ29uZmlndXJhdGlvbihzdHJpY3RNb2RlID0gdHJ1ZSwgbGl0dGxlRW5kaWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiBjb25maWd1cmF0aW9uc18xLmluY2x1ZGVDb21tb25Db25maWd1cmF0aW9uKHtcbiAgICAgICAgcGFyc2VyczogW1xuICAgICAgICAgICAgbmV3IFNsYXNoRGF0ZUZvcm1hdFBhcnNlcl8xLmRlZmF1bHQobGl0dGxlRW5kaWFuKSxcbiAgICAgICAgICAgIG5ldyBOTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTE1vbnRoTmFtZVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IE5MVGltZVVuaXRXaXRoaW5Gb3JtYXRQYXJzZXJfMS5kZWZhdWx0KCksXG4gICAgICAgICAgICBuZXcgTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IE5MV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBOTENhc3VhbFllYXJNb250aERheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmaW5lcnM6IFtuZXcgTkxNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQoKSwgbmV3IE5MTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCgpXSxcbiAgICB9LCBzdHJpY3RNb2RlKTtcbn1cbmV4cG9ydHMuY3JlYXRlQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb247XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgcmVmZXJlbmNlcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL2Nhc3VhbFJlZmVyZW5jZXNcIikpO1xuY2xhc3MgTkxDYXN1YWxEYXRlUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybihjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAvKG51fHZhbmRhYWd8bW9yZ2VufG1vcmdlbmR8Z2lzdGVyZW4pKD89XFxXfCQpL2k7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCBsb3dlclRleHQgPSBtYXRjaFswXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIHN3aXRjaCAobG93ZXJUZXh0KSB7XG4gICAgICAgICAgICBjYXNlIFwibnVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5ub3coY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcInZhbmRhYWdcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b2RheShjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjYXNlIFwibW9yZ2VuXCI6XG4gICAgICAgICAgICBjYXNlIFwibW9yZ2VuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvbW9ycm93KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGNhc2UgXCJnaXN0ZXJlblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnllc3RlcmRheShjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTENhc3VhbERhdGVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IGluZGV4XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBkYXlqc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL2RheWpzXCIpO1xuY29uc3QgZGF5anNfMiA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgREFURV9HUk9VUCA9IDE7XG5jb25zdCBUSU1FX09GX0RBWV9HUk9VUCA9IDI7XG5jbGFzcyBOTENhc3VhbERhdGVUaW1lUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybihjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAvKGdpc3RlcmVufG1vcmdlbnx2YW4pKG9jaHRlbmR8bWlkZGFnfG5hbWlkZGFnfGF2b25kfG5hY2h0KSg/PVxcV3wkKS9pO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgZGF0ZVRleHQgPSBtYXRjaFtEQVRFX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCB0aW1lVGV4dCA9IG1hdGNoW1RJTUVfT0ZfREFZX0dST1VQXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18yLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgc3dpdGNoIChkYXRlVGV4dCkge1xuICAgICAgICAgICAgY2FzZSBcImdpc3RlcmVuXCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMS5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUuYWRkKC0xLCBcImRheVwiKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwidmFuXCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMS5hc3NpZ25TaW1pbGFyRGF0ZShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vcmdlblwiOlxuICAgICAgICAgICAgICAgIGRheWpzXzEuYXNzaWduVGhlTmV4dERheShjb21wb25lbnQsIHRhcmdldERhdGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGltZVRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJvY2h0ZW5kXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkYWdcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLkFNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDEyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJuYW1pZGRhZ1wiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMTUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImF2b25kXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAyMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTENhc3VhbERhdGVUaW1lUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBpbmRleF8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgZGF5anNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZGF5anNcIikpO1xuY29uc3QgZGF5anNfMiA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9kYXlqc1wiKTtcbmNvbnN0IERBWV9HUk9VUCA9IDE7XG5jb25zdCBNT01FTlRfR1JPVVAgPSAyO1xuY2xhc3MgTkxDYXN1YWxUaW1lUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIC8oZGV6ZSk/XFxzKihuYW1pZGRhZ3xhdm9uZHxtaWRkZXJuYWNodHxvY2h0ZW5kfG1pZGRhZ3wncyBtaWRkYWdzfCdzIGF2b25kc3wncyBvY2h0ZW5kcykoPz1cXFd8JCkvaTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERhdGUgPSBkYXlqc18xLmRlZmF1bHQoY29udGV4dC5yZWZEYXRlKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpO1xuICAgICAgICBpZiAobWF0Y2hbREFZX0dST1VQXSA9PT0gXCJkZXplXCIpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5hc3NpZ24oXCJkYXlcIiwgY29udGV4dC5yZWZEYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICBjb21wb25lbnQuYXNzaWduKFwibW9udGhcIiwgY29udGV4dC5yZWZEYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5hc3NpZ24oXCJ5ZWFyXCIsIGNvbnRleHQucmVmRGF0ZS5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG1hdGNoW01PTUVOVF9HUk9VUF0udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgY2FzZSBcIm5hbWlkZGFnXCI6XG4gICAgICAgICAgICBjYXNlIFwiJ3MgbmFtaWRkYWdzXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxNSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYXZvbmRcIjpcbiAgICAgICAgICAgIGNhc2UgXCIncyBhdm9uZHMnXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5QTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAyMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWlkZGVybmFjaHRcIjpcbiAgICAgICAgICAgICAgICBkYXlqc18yLmFzc2lnblRoZU5leHREYXkoY29tcG9uZW50LCB0YXJnZXREYXRlKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDApO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1pbnV0ZVwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwib2NodGVuZFwiOlxuICAgICAgICAgICAgY2FzZSBcIidzIG9jaHRlbmRzXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtaWRkYWdcIjpcbiAgICAgICAgICAgIGNhc2UgXCIncyBtaWRkYWdzXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTENhc3VhbFRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHBhdHRlcm5fMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi91dGlscy9wYXR0ZXJuXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoYChbMC05XXs0fSlbXFxcXC5cXFxcL1xcXFxzXWAgK1xuICAgIGAoPzooJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSl8KFswLTldezEsMn0pKVtcXFxcLlxcXFwvXFxcXHNdYCArXG4gICAgYChbMC05XXsxLDJ9KWAgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgWUVBUl9OVU1CRVJfR1JPVVAgPSAxO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDI7XG5jb25zdCBNT05USF9OVU1CRVJfR1JPVVAgPSAzO1xuY29uc3QgREFURV9OVU1CRVJfR1JPVVAgPSA0O1xuY2xhc3MgTkxDYXN1YWxZZWFyTW9udGhEYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gbWF0Y2hbTU9OVEhfTlVNQkVSX0dST1VQXVxuICAgICAgICAgICAgPyBwYXJzZUludChtYXRjaFtNT05USF9OVU1CRVJfR1JPVVBdKVxuICAgICAgICAgICAgOiBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBpZiAobW9udGggPCAxIHx8IG1vbnRoID4gMTIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChtYXRjaFtZRUFSX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChtYXRjaFtEQVRFX05VTUJFUl9HUk9VUF0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgICAgICB5ZWFyOiB5ZWFyLFxuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MQ2FzdWFsWWVhck1vbnRoRGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzIgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgY29uc3RhbnRzXzMgPSByZXF1aXJlKFwiLi4vY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Om9uXFxcXHMqPyk/XCIgK1xuICAgIGAoJHtjb25zdGFudHNfMi5PUkRJTkFMX05VTUJFUl9QQVRURVJOfSlgICtcbiAgICBcIig/OlxcXFxzKlwiICtcbiAgICBcIig/OnRvdHxcXFxcLXxcXFxc4oCTfHVudGlsfHRocm91Z2h8dGlsbHxcXFxccylcXFxccypcIiArXG4gICAgYCgke2NvbnN0YW50c18yLk9SRElOQUxfTlVNQkVSX1BBVFRFUk59KWAgK1xuICAgIFwiKT9cIiArXG4gICAgXCIoPzotfC98XFxcXHMqKD86b2YpP1xcXFxzKilcIiArXG4gICAgXCIoXCIgK1xuICAgIHBhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuTU9OVEhfRElDVElPTkFSWSkgK1xuICAgIFwiKVwiICtcbiAgICBcIig/OlwiICtcbiAgICBcIig/Oi18L3wsP1xcXFxzKilcIiArXG4gICAgYCgke2NvbnN0YW50c18zLllFQVJfUEFUVEVSTn0oPyFbXlxcXFxzXVxcXFxkKSlgICtcbiAgICBcIik/XCIgK1xuICAgIFwiKD89XFxcXFd8JClcIiwgXCJpXCIpO1xuY29uc3QgTU9OVEhfTkFNRV9HUk9VUCA9IDM7XG5jb25zdCBEQVRFX0dST1VQID0gMTtcbmNvbnN0IERBVEVfVE9fR1JPVVAgPSAyO1xuY29uc3QgWUVBUl9HUk9VUCA9IDQ7XG5jbGFzcyBOTE1vbnRoTmFtZU1pZGRsZUVuZGlhblBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZW21hdGNoW01PTlRIX05BTUVfR1JPVVBdLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb25zdCBkYXkgPSBjb25zdGFudHNfMi5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbREFURV9HUk9VUF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoe1xuICAgICAgICAgICAgZGF5OiBkYXksXG4gICAgICAgICAgICBtb250aDogbW9udGgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSBjb25zdGFudHNfMy5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeWVhciA9IHllYXJzXzEuZmluZFllYXJDbG9zZXN0VG9SZWYoY29udGV4dC5yZWZEYXRlLCBkYXksIG1vbnRoKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIHllYXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBjb25zdGFudHNfMi5wYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuKG1hdGNoW0RBVEVfVE9fR1JPVVBdKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29udGV4dC5jcmVhdGVQYXJzaW5nUmVzdWx0KG1hdGNoLmluZGV4LCBtYXRjaFswXSk7XG4gICAgICAgIHJlc3VsdC5zdGFydCA9IGNvbXBvbmVudHM7XG4gICAgICAgIHJlc3VsdC5lbmQgPSBjb21wb25lbnRzLmNsb25lKCk7XG4gICAgICAgIHJlc3VsdC5lbmQuYXNzaWduKFwiZGF5XCIsIGVuZERhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MTW9udGhOYW1lTWlkZGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCB5ZWFyc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3llYXJzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChgKCR7cGF0dGVybl8xLm1hdGNoQW55UGF0dGVybihjb25zdGFudHNfMS5NT05USF9ESUNUSU9OQVJZKX0pYCArXG4gICAgYFxcXFxzKmAgK1xuICAgIGAoPzpgICtcbiAgICBgWywtXT9cXFxccyooJHtjb25zdGFudHNfMi5ZRUFSX1BBVFRFUk59KT9gICtcbiAgICBcIik/XCIgK1xuICAgIFwiKD89W15cXFxcc1xcXFx3XXxcXFxccytbXjAtOV18XFxcXHMrJHwkKVwiLCBcImlcIik7XG5jb25zdCBNT05USF9OQU1FX0dST1VQID0gMTtcbmNvbnN0IFlFQVJfR1JPVVAgPSAyO1xuY2xhc3MgTkxNb250aE5hbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCk7XG4gICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgMSk7XG4gICAgICAgIGNvbnN0IG1vbnRoTmFtZSA9IG1hdGNoW01PTlRIX05BTUVfR1JPVVBdO1xuICAgICAgICBjb25zdCBtb250aCA9IGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUllbbW9udGhOYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgaWYgKG1hdGNoW1lFQVJfR1JPVVBdKSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0gY29uc3RhbnRzXzIucGFyc2VZZWFyKG1hdGNoW1lFQVJfR1JPVVBdKTtcbiAgICAgICAgICAgIGNvbXBvbmVudHMuYXNzaWduKFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXIgPSB5ZWFyc18xLmZpbmRZZWFyQ2xvc2VzdFRvUmVmKGNvbnRleHQucmVmRGF0ZSwgMSwgbW9udGgpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInllYXJcIiwgeWVhcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTkxNb250aE5hbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKFwiKFswLTldfDBbMS05XXwxWzAxMl0pLyhbMC05XXs0fSlcIiArIFwiXCIsIFwiaVwiKTtcbmNvbnN0IE1PTlRIX0dST1VQID0gMTtcbmNvbnN0IFlFQVJfR1JPVVAgPSAyO1xuY2xhc3MgTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEuQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5Q2hlY2tpbmcge1xuICAgIGlubmVyUGF0dGVybigpIHtcbiAgICAgICAgcmV0dXJuIFBBVFRFUk47XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICBjb25zdCBtb250aCA9IHBhcnNlSW50KG1hdGNoW01PTlRIX0dST1VQXSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKCkuaW1wbHkoXCJkYXlcIiwgMSkuYXNzaWduKFwibW9udGhcIiwgbW9udGgpLmFzc2lnbihcInllYXJcIiwgeWVhcik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTkxTbGFzaE1vbnRoRm9ybWF0UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlclwiKTtcbmNsYXNzIE5MVGltZUV4cHJlc3Npb25QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgcHJpbWFyeVByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86KD86b20pXFxcXHMqKT9cIjtcbiAgICB9XG4gICAgZm9sbG93aW5nUGhhc2UoKSB7XG4gICAgICAgIHJldHVybiBcIlxcXFxzKig/OlxcXFwtfFxcXFzigJN8XFxcXH58XFxcXOOAnHxvbXxcXFxcPylcXFxccypcIjtcbiAgICB9XG4gICAgZXh0cmFjdFByaW1hcnlUaW1lQ29tcG9uZW50cyhjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBpZiAobWF0Y2hbMF0ubWF0Y2goL15cXHMqXFxkezR9XFxzKiQvKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmV4dHJhY3RQcmltYXJ5VGltZUNvbXBvbmVudHMoY29udGV4dCwgbWF0Y2gpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IE5MVGltZUV4cHJlc3Npb25QYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGNvbnN0YW50c18xID0gcmVxdWlyZShcIi4uL2NvbnN0YW50c1wiKTtcbmNvbnN0IHJlc3VsdHNfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9yZXN1bHRzXCIpO1xuY29uc3QgQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RQYXJzZXJXaXRoV29yZEJvdW5kYXJ5XCIpO1xuY2xhc3MgTkxUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGAoPzpiaW5uZW58aW58YmlubmVuIGRlfHZvb3IpXFxcXHMqYCArIFwiKFwiICsgY29uc3RhbnRzXzEuVElNRV9VTklUU19QQVRURVJOICsgXCIpXCIgKyBgKD89XFxcXFd8JClgLCBcImlcIik7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0aW1lVW5pdHMgPSBjb25zdGFudHNfMS5wYXJzZVRpbWVVbml0cyhtYXRjaFsxXSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzXzEuUGFyc2luZ0NvbXBvbmVudHMuY3JlYXRlUmVsYXRpdmVGcm9tUmVmSW5zdGFudChjb250ZXh0LnJlZkRhdGUsIHRpbWVVbml0cyk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTkxUaW1lVW5pdFdpdGhpbkZvcm1hdFBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgY29uc3RhbnRzXzEgPSByZXF1aXJlKFwiLi4vLi4vbmwvY29uc3RhbnRzXCIpO1xuY29uc3QgcGF0dGVybl8xID0gcmVxdWlyZShcIi4uLy4uLy4uL3V0aWxzL3BhdHRlcm5cIik7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCB3ZWVrc18xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NhbGN1bGF0aW9uL3dlZWtzXCIpO1xuY29uc3QgUEFUVEVSTiA9IG5ldyBSZWdFeHAoXCIoPzooPzpcXFxcLHxcXFxcKHxcXFxc77yIKVxcXFxzKik/XCIgK1xuICAgIFwiKD86b3BcXFxccyo/KT9cIiArXG4gICAgXCIoPzooZGV6ZXx2b3JpZ2V8dm9sZ2VuZGUpXFxcXHMqKD86d2Vla1xcXFxzKik/KT9cIiArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZKX0pYCArXG4gICAgXCIoPz1cXFxcV3wkKVwiLCBcImlcIik7XG5jb25zdCBQUkVGSVhfR1JPVVAgPSAxO1xuY29uc3QgV0VFS0RBWV9HUk9VUCA9IDI7XG5jb25zdCBQT1NURklYX0dST1VQID0gMztcbmNsYXNzIE5MV2Vla2RheVBhcnNlciBleHRlbmRzIEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xLkFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeUNoZWNraW5nIHtcbiAgICBpbm5lclBhdHRlcm4oKSB7XG4gICAgICAgIHJldHVybiBQQVRURVJOO1xuICAgIH1cbiAgICBpbm5lckV4dHJhY3QoY29udGV4dCwgbWF0Y2gpIHtcbiAgICAgICAgY29uc3QgZGF5T2ZXZWVrID0gbWF0Y2hbV0VFS0RBWV9HUk9VUF0udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZW2RheU9mV2Vla107XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoW1BSRUZJWF9HUk9VUF07XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSBtYXRjaFtQT1NURklYX0dST1VQXTtcbiAgICAgICAgbGV0IG1vZGlmaWVyV29yZCA9IHByZWZpeCB8fCBwb3N0Zml4O1xuICAgICAgICBtb2RpZmllcldvcmQgPSBtb2RpZmllcldvcmQgfHwgXCJcIjtcbiAgICAgICAgbW9kaWZpZXJXb3JkID0gbW9kaWZpZXJXb3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtb2RpZmllciA9IG51bGw7XG4gICAgICAgIGlmIChtb2RpZmllcldvcmQgPT0gXCJ2b3JpZ2VcIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcImxhc3RcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtb2RpZmllcldvcmQgPT0gXCJ2b2xnZW5kZVwiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibmV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGlmaWVyV29yZCA9PSBcImRlemVcIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcInRoaXNcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gd2Vla3NfMS50b0RheUpTV2Vla2RheShjb250ZXh0LnJlZkRhdGUsIG9mZnNldCwgbW9kaWZpZXIpO1xuICAgICAgICByZXR1cm4gY29udGV4dFxuICAgICAgICAgICAgLmNyZWF0ZVBhcnNpbmdDb21wb25lbnRzKClcbiAgICAgICAgICAgIC5hc3NpZ24oXCJ3ZWVrZGF5XCIsIG9mZnNldClcbiAgICAgICAgICAgIC5pbXBseShcImRheVwiLCBkYXRlLmRhdGUoKSlcbiAgICAgICAgICAgIC5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpXG4gICAgICAgICAgICAuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTFdlZWtkYXlQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jbGFzcyBOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lciBleHRlbmRzIEFic3RyYWN0TWVyZ2VEYXRlUmFuZ2VSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiAvXlxccyoodG90fC0pXFxzKiQvaTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBOTE1lcmdlRGF0ZVJhbmdlUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lclwiKSk7XG5jbGFzcyBOTE1lcmdlRGF0ZVRpbWVSZWZpbmVyIGV4dGVuZHMgQWJzdHJhY3RNZXJnZURhdGVUaW1lUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl5cXFxccyoob218bmF8dm9vcnxpbiBkZXwsfC0pP1xcXFxzKiRcIik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gTkxNZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wYXJzZVllYXIgPSBleHBvcnRzLllFQVJfUEFUVEVSTiA9IGV4cG9ydHMuTU9OVEhfRElDVElPTkFSWSA9IGV4cG9ydHMuV0VFS0RBWV9ESUNUSU9OQVJZID0gdm9pZCAwO1xuZXhwb3J0cy5XRUVLREFZX0RJQ1RJT05BUlkgPSB7XG4gICAgXCJkb21pbmdvXCI6IDAsXG4gICAgXCJkb21cIjogMCxcbiAgICBcInNlZ3VuZGFcIjogMSxcbiAgICBcInNlZ3VuZGEtZmVpcmFcIjogMSxcbiAgICBcInNlZ1wiOiAxLFxuICAgIFwidGVyw6dhXCI6IDIsXG4gICAgXCJ0ZXLDp2EtZmVpcmFcIjogMixcbiAgICBcInRlclwiOiAyLFxuICAgIFwicXVhcnRhXCI6IDMsXG4gICAgXCJxdWFydGEtZmVpcmFcIjogMyxcbiAgICBcInF1YVwiOiAzLFxuICAgIFwicXVpbnRhXCI6IDQsXG4gICAgXCJxdWludGEtZmVpcmFcIjogNCxcbiAgICBcInF1aVwiOiA0LFxuICAgIFwic2V4dGFcIjogNSxcbiAgICBcInNleHRhLWZlaXJhXCI6IDUsXG4gICAgXCJzZXhcIjogNSxcbiAgICBcInPDoWJhZG9cIjogNixcbiAgICBcInNhYmFkb1wiOiA2LFxuICAgIFwic2FiXCI6IDYsXG59O1xuZXhwb3J0cy5NT05USF9ESUNUSU9OQVJZID0ge1xuICAgIFwiamFuZWlyb1wiOiAxLFxuICAgIFwiamFuXCI6IDEsXG4gICAgXCJqYW4uXCI6IDEsXG4gICAgXCJmZXZlcmVpcm9cIjogMixcbiAgICBcImZldlwiOiAyLFxuICAgIFwiZmV2LlwiOiAyLFxuICAgIFwibWFyw6dvXCI6IDMsXG4gICAgXCJtYXJcIjogMyxcbiAgICBcIm1hci5cIjogMyxcbiAgICBcImFicmlsXCI6IDQsXG4gICAgXCJhYnJcIjogNCxcbiAgICBcImFici5cIjogNCxcbiAgICBcIm1haW9cIjogNSxcbiAgICBcIm1haVwiOiA1LFxuICAgIFwibWFpLlwiOiA1LFxuICAgIFwianVuaG9cIjogNixcbiAgICBcImp1blwiOiA2LFxuICAgIFwianVuLlwiOiA2LFxuICAgIFwianVsaG9cIjogNyxcbiAgICBcImp1bFwiOiA3LFxuICAgIFwianVsLlwiOiA3LFxuICAgIFwiYWdvc3RvXCI6IDgsXG4gICAgXCJhZ29cIjogOCxcbiAgICBcImFnby5cIjogOCxcbiAgICBcInNldGVtYnJvXCI6IDksXG4gICAgXCJzZXRcIjogOSxcbiAgICBcInNldC5cIjogOSxcbiAgICBcIm91dHVicm9cIjogMTAsXG4gICAgXCJvdXRcIjogMTAsXG4gICAgXCJvdXQuXCI6IDEwLFxuICAgIFwibm92ZW1icm9cIjogMTEsXG4gICAgXCJub3ZcIjogMTEsXG4gICAgXCJub3YuXCI6IDExLFxuICAgIFwiZGV6ZW1icm9cIjogMTIsXG4gICAgXCJkZXpcIjogMTIsXG4gICAgXCJkZXouXCI6IDEyLFxufTtcbmV4cG9ydHMuWUVBUl9QQVRURVJOID0gXCJbMC05XXsxLDR9KD8hW15cXFxcc11cXFxcZCkoPzpcXFxccypbYXxkXVxcXFwuP1xcXFxzKmNcXFxcLj98XFxcXHMqYVxcXFwuP1xcXFxzKmRcXFxcLj8pP1wiO1xuZnVuY3Rpb24gcGFyc2VZZWFyKG1hdGNoKSB7XG4gICAgaWYgKG1hdGNoLm1hdGNoKC9eWzAtOV17MSw0fSQvKSkge1xuICAgICAgICBsZXQgeWVhck51bWJlciA9IHBhcnNlSW50KG1hdGNoKTtcbiAgICAgICAgaWYgKHllYXJOdW1iZXIgPCAxMDApIHtcbiAgICAgICAgICAgIGlmICh5ZWFyTnVtYmVyID4gNTApIHtcbiAgICAgICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDE5MDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5ZWFyTnVtYmVyID0geWVhck51bWJlciArIDIwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXJOdW1iZXI7XG4gICAgfVxuICAgIGlmIChtYXRjaC5tYXRjaCgvYVxcLj9cXHMqY1xcLj8vaSkpIHtcbiAgICAgICAgbWF0Y2ggPSBtYXRjaC5yZXBsYWNlKC9hXFwuP1xccypjXFwuPy9pLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIC1wYXJzZUludChtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZUludChtYXRjaCk7XG59XG5leHBvcnRzLnBhcnNlWWVhciA9IHBhcnNlWWVhcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gZXhwb3J0cy5jcmVhdGVDYXN1YWxDb25maWd1cmF0aW9uID0gZXhwb3J0cy5wYXJzZURhdGUgPSBleHBvcnRzLnBhcnNlID0gZXhwb3J0cy5zdHJpY3QgPSBleHBvcnRzLmNhc3VhbCA9IHZvaWQgMDtcbmNvbnN0IGNvbmZpZ3VyYXRpb25zXzEgPSByZXF1aXJlKFwiLi4vLi4vY29uZmlndXJhdGlvbnNcIik7XG5jb25zdCBjaHJvbm9fMSA9IHJlcXVpcmUoXCIuLi8uLi9jaHJvbm9cIik7XG5jb25zdCBTbGFzaERhdGVGb3JtYXRQYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY29tbW9uL3BhcnNlcnMvU2xhc2hEYXRlRm9ybWF0UGFyc2VyXCIpKTtcbmNvbnN0IFBUV2Vla2RheVBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvUFRXZWVrZGF5UGFyc2VyXCIpKTtcbmNvbnN0IFBUVGltZUV4cHJlc3Npb25QYXJzZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9wYXJzZXJzL1BUVGltZUV4cHJlc3Npb25QYXJzZXJcIikpO1xuY29uc3QgUFRNZXJnZURhdGVUaW1lUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3JlZmluZXJzL1BUTWVyZ2VEYXRlVGltZVJlZmluZXJcIikpO1xuY29uc3QgUFRNZXJnZURhdGVSYW5nZVJlZmluZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9yZWZpbmVycy9QVE1lcmdlRGF0ZVJhbmdlUmVmaW5lclwiKSk7XG5jb25zdCBQVE1vbnRoTmFtZUxpdHRsZUVuZGlhblBhcnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3BhcnNlcnMvUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXJcIikpO1xuY29uc3QgUFRDYXN1YWxEYXRlUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9QVENhc3VhbERhdGVQYXJzZXJcIikpO1xuY29uc3QgUFRDYXN1YWxUaW1lUGFyc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vcGFyc2Vycy9QVENhc3VhbFRpbWVQYXJzZXJcIikpO1xuZXhwb3J0cy5jYXN1YWwgPSBuZXcgY2hyb25vXzEuQ2hyb25vKGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb24oKSk7XG5leHBvcnRzLnN0cmljdCA9IG5ldyBjaHJvbm9fMS5DaHJvbm8oY3JlYXRlQ29uZmlndXJhdGlvbih0cnVlKSk7XG5mdW5jdGlvbiBwYXJzZSh0ZXh0LCByZWYsIG9wdGlvbikge1xuICAgIHJldHVybiBleHBvcnRzLmNhc3VhbC5wYXJzZSh0ZXh0LCByZWYsIG9wdGlvbik7XG59XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXJzZURhdGUodGV4dCwgcmVmLCBvcHRpb24pIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jYXN1YWwucGFyc2VEYXRlKHRleHQsIHJlZiwgb3B0aW9uKTtcbn1cbmV4cG9ydHMucGFyc2VEYXRlID0gcGFyc2VEYXRlO1xuZnVuY3Rpb24gY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbihsaXR0bGVFbmRpYW4gPSB0cnVlKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbihmYWxzZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBvcHRpb24ucGFyc2Vycy5wdXNoKG5ldyBQVENhc3VhbERhdGVQYXJzZXJfMS5kZWZhdWx0KCkpO1xuICAgIG9wdGlvbi5wYXJzZXJzLnB1c2gobmV3IFBUQ2FzdWFsVGltZVBhcnNlcl8xLmRlZmF1bHQoKSk7XG4gICAgcmV0dXJuIG9wdGlvbjtcbn1cbmV4cG9ydHMuY3JlYXRlQ2FzdWFsQ29uZmlndXJhdGlvbiA9IGNyZWF0ZUNhc3VhbENvbmZpZ3VyYXRpb247XG5mdW5jdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKHN0cmljdE1vZGUgPSB0cnVlLCBsaXR0bGVFbmRpYW4gPSB0cnVlKSB7XG4gICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25zXzEuaW5jbHVkZUNvbW1vbkNvbmZpZ3VyYXRpb24oe1xuICAgICAgICBwYXJzZXJzOiBbXG4gICAgICAgICAgICBuZXcgU2xhc2hEYXRlRm9ybWF0UGFyc2VyXzEuZGVmYXVsdChsaXR0bGVFbmRpYW4pLFxuICAgICAgICAgICAgbmV3IFBUV2Vla2RheVBhcnNlcl8xLmRlZmF1bHQoKSxcbiAgICAgICAgICAgIG5ldyBQVFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICAgICAgbmV3IFBUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyXzEuZGVmYXVsdCgpLFxuICAgICAgICBdLFxuICAgICAgICByZWZpbmVyczogW25ldyBQVE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEuZGVmYXVsdCgpLCBuZXcgUFRNZXJnZURhdGVSYW5nZVJlZmluZXJfMS5kZWZhdWx0KCldLFxuICAgIH0sIHN0cmljdE1vZGUpO1xufVxuZXhwb3J0cy5jcmVhdGVDb25maWd1cmF0aW9uID0gY3JlYXRlQ29uZmlndXJhdGlvbjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcGFyc2Vycy9BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlcIik7XG5jb25zdCByZWZlcmVuY2VzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vY2FzdWFsUmVmZXJlbmNlc1wiKSk7XG5jbGFzcyBQVENhc3VhbERhdGVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIC8oYWdvcmF8aG9qZXxhbWFuaGF8YW1hbmjDo3xvbnRlbSkoPz1cXFd8JCkvaTtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGxvd2VyVGV4dCA9IG1hdGNoWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChsb3dlclRleHQpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZ29yYVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLm5vdyhjb250ZXh0LnJlZmVyZW5jZSk7XG4gICAgICAgICAgICBjYXNlIFwiaG9qZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLnRvZGF5KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgICAgIGNhc2UgXCJhbWFuaGFcIjpcbiAgICAgICAgICAgIGNhc2UgXCJhbWFuaMOjXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMudG9tb3Jyb3coY29udGV4dC5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgY2FzZSBcIm9udGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMueWVzdGVyZGF5KGNvbnRleHQucmVmZXJlbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUQ2FzdWFsRGF0ZVBhcnNlcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaW5kZXhfMSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IGRheWpzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCBkYXlqc18yID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jbGFzcyBQVENhc3VhbFRpbWVQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gLyg/OmVzdGFcXHMqKT8obWFuaGF8bWFuaMOjfHRhcmRlfG1laWEtbm9pdGV8bWVpby1kaWF8bm9pdGUpKD89XFxXfCQpL2k7XG4gICAgfVxuICAgIGlubmVyRXh0cmFjdChjb250ZXh0LCBtYXRjaCkge1xuICAgICAgICBjb25zdCB0YXJnZXREYXRlID0gZGF5anNfMi5kZWZhdWx0KGNvbnRleHQucmVmRGF0ZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ0NvbXBvbmVudHMoKTtcbiAgICAgICAgc3dpdGNoIChtYXRjaFsxXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwidGFyZGVcIjpcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtZXJpZGllbVwiLCBpbmRleF8xLk1lcmlkaWVtLlBNKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIDE1KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub2l0ZVwiOlxuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcIm1lcmlkaWVtXCIsIGluZGV4XzEuTWVyaWRpZW0uUE0pO1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbXBseShcImhvdXJcIiwgMjIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1hbmhhXCI6XG4gICAgICAgICAgICBjYXNlIFwibWFuaMOjXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCA2KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZWlhLW5vaXRlXCI6XG4gICAgICAgICAgICAgICAgZGF5anNfMS5hc3NpZ25UaGVOZXh0RGF5KGNvbXBvbmVudCwgdGFyZ2V0RGF0ZSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAwKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwic2Vjb25kXCIsIDApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1laW8tZGlhXCI6XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwibWVyaWRpZW1cIiwgaW5kZXhfMS5NZXJpZGllbS5BTSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQVENhc3VhbFRpbWVQYXJzZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHllYXJzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24veWVhcnNcIik7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBjb25zdGFudHNfMiA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IFBBVFRFUk4gPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSkoPzrCunzCqnzCsCk/YCArXG4gICAgXCIoPzpcXFxccyooPzpkZXNkZXxkZXxcXFxcLXxcXFxc4oCTfGFvP3xcXFxccylcXFxccyooWzAtOV17MSwyfSkoPzrCunzCqnzCsCk/KT9cXFxccyooPzpkZSk/XFxcXHMqXCIgK1xuICAgIGAoPzotfC98XFxcXHMqKD86ZGV8LCk/XFxcXHMqKWAgK1xuICAgIGAoJHtwYXR0ZXJuXzEubWF0Y2hBbnlQYXR0ZXJuKGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUlkpfSlgICtcbiAgICBgKD86XFxcXHMqKD86ZGV8LCk/XFxcXHMqKCR7Y29uc3RhbnRzXzIuWUVBUl9QQVRURVJOfSkpP2AgK1xuICAgIGAoPz1cXFxcV3wkKWAsIFwiaVwiKTtcbmNvbnN0IERBVEVfR1JPVVAgPSAxO1xuY29uc3QgREFURV9UT19HUk9VUCA9IDI7XG5jb25zdCBNT05USF9OQU1FX0dST1VQID0gMztcbmNvbnN0IFlFQVJfR1JPVVAgPSA0O1xuY2xhc3MgUFRNb250aE5hbWVMaXR0bGVFbmRpYW5QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRleHQuY3JlYXRlUGFyc2luZ1Jlc3VsdChtYXRjaC5pbmRleCwgbWF0Y2hbMF0pO1xuICAgICAgICBjb25zdCBtb250aCA9IGNvbnN0YW50c18xLk1PTlRIX0RJQ1RJT05BUllbbWF0Y2hbTU9OVEhfTkFNRV9HUk9VUF0udG9Mb3dlckNhc2UoKV07XG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KG1hdGNoW0RBVEVfR1JPVVBdKTtcbiAgICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgICAgICBtYXRjaC5pbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbREFURV9HUk9VUF0ubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcIm1vbnRoXCIsIG1vbnRoKTtcbiAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcImRheVwiLCBkYXkpO1xuICAgICAgICBpZiAobWF0Y2hbWUVBUl9HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJOdW1iZXIgPSBjb25zdGFudHNfMi5wYXJzZVllYXIobWF0Y2hbWUVBUl9HUk9VUF0pO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmFzc2lnbihcInllYXJcIiwgeWVhck51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB5ZWFyID0geWVhcnNfMS5maW5kWWVhckNsb3Nlc3RUb1JlZihjb250ZXh0LnJlZkRhdGUsIGRheSwgbW9udGgpO1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0LmltcGx5KFwieWVhclwiLCB5ZWFyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hbREFURV9UT19HUk9VUF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBwYXJzZUludChtYXRjaFtEQVRFX1RPX0dST1VQXSk7XG4gICAgICAgICAgICByZXN1bHQuZW5kID0gcmVzdWx0LnN0YXJ0LmNsb25lKCk7XG4gICAgICAgICAgICByZXN1bHQuZW5kLmFzc2lnbihcImRheVwiLCBlbmREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUTW9udGhOYW1lTGl0dGxlRW5kaWFuUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29tbW9uL3BhcnNlcnMvQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlclwiKTtcbmNsYXNzIFBUVGltZUV4cHJlc3Npb25QYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFRpbWVFeHByZXNzaW9uUGFyc2VyXzEuQWJzdHJhY3RUaW1lRXhwcmVzc2lvblBhcnNlciB7XG4gICAgcHJpbWFyeVByZWZpeCgpIHtcbiAgICAgICAgcmV0dXJuIFwiKD86KD86YW8/fMOgcz98ZGFzfGRhfGRlfGRvKVxcXFxzKik/XCI7XG4gICAgfVxuICAgIGZvbGxvd2luZ1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gXCJcXFxccyooPzpcXFxcLXxcXFxc4oCTfFxcXFx+fFxcXFzjgJx8YSg/Om8pP3xcXFxcPylcXFxccypcIjtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBQVFRpbWVFeHByZXNzaW9uUGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjb25zdGFudHNfMSA9IHJlcXVpcmUoXCIuLi9jb25zdGFudHNcIik7XG5jb25zdCBwYXR0ZXJuXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vdXRpbHMvcGF0dGVyblwiKTtcbmNvbnN0IEFic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9wYXJzZXJzL0Fic3RyYWN0UGFyc2VyV2l0aFdvcmRCb3VuZGFyeVwiKTtcbmNvbnN0IHdlZWtzXzEgPSByZXF1aXJlKFwiLi4vLi4vLi4vY2FsY3VsYXRpb24vd2Vla3NcIik7XG5jb25zdCBQQVRURVJOID0gbmV3IFJlZ0V4cChcIig/Oig/OlxcXFwsfFxcXFwofFxcXFzvvIgpXFxcXHMqKT9cIiArXG4gICAgXCIoPzooZXN0ZXxlc3RhfHBhc3NhZG98cHJbb8OzXXhpbW8pXFxcXHMqKT9cIiArXG4gICAgYCgke3BhdHRlcm5fMS5tYXRjaEFueVBhdHRlcm4oY29uc3RhbnRzXzEuV0VFS0RBWV9ESUNUSU9OQVJZKX0pYCArXG4gICAgXCIoPzpcXFxccyooPzpcXFxcLHxcXFxcKXxcXFxc77yJKSk/XCIgK1xuICAgIFwiKD86XFxcXHMqKGVzdGV8ZXN0YXxwYXNzYWRvfHByW8Ozb114aW1vKVxcXFxzKnNlbWFuYSk/XCIgK1xuICAgIFwiKD89XFxcXFd8XFxcXGR8JClcIiwgXCJpXCIpO1xuY29uc3QgUFJFRklYX0dST1VQID0gMTtcbmNvbnN0IFdFRUtEQVlfR1JPVVAgPSAyO1xuY29uc3QgUE9TVEZJWF9HUk9VUCA9IDM7XG5jbGFzcyBQVFdlZWtkYXlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlfMS5BYnN0cmFjdFBhcnNlcldpdGhXb3JkQm91bmRhcnlDaGVja2luZyB7XG4gICAgaW5uZXJQYXR0ZXJuKCkge1xuICAgICAgICByZXR1cm4gUEFUVEVSTjtcbiAgICB9XG4gICAgaW5uZXJFeHRyYWN0KGNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGRheU9mV2VlayA9IG1hdGNoW1dFRUtEQVlfR1JPVVBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNvbnN0YW50c18xLldFRUtEQVlfRElDVElPTkFSWVtkYXlPZldlZWtdO1xuICAgICAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoW1BSRUZJWF9HUk9VUF07XG4gICAgICAgIGNvbnN0IHBvc3RmaXggPSBtYXRjaFtQT1NURklYX0dST1VQXTtcbiAgICAgICAgbGV0IG5vcm0gPSBwcmVmaXggfHwgcG9zdGZpeCB8fCBcIlwiO1xuICAgICAgICBub3JtID0gbm9ybS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgbW9kaWZpZXIgPSBudWxsO1xuICAgICAgICBpZiAobm9ybSA9PSBcInBhc3NhZG9cIikge1xuICAgICAgICAgICAgbW9kaWZpZXIgPSBcInRoaXNcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub3JtID09IFwicHLDs3hpbW9cIiB8fCBub3JtID09IFwicHJveGltb1wiKSB7XG4gICAgICAgICAgICBtb2RpZmllciA9IFwibmV4dFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vcm0gPT0gXCJlc3RlXCIpIHtcbiAgICAgICAgICAgIG1vZGlmaWVyID0gXCJ0aGlzXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0ZSA9IHdlZWtzXzEudG9EYXlKU1dlZWtkYXkoY29udGV4dC5yZWZEYXRlLCBvZmZzZXQsIG1vZGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHRcbiAgICAgICAgICAgIC5jcmVhdGVQYXJzaW5nQ29tcG9uZW50cygpXG4gICAgICAgICAgICAuYXNzaWduKFwid2Vla2RheVwiLCBvZmZzZXQpXG4gICAgICAgICAgICAuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpXG4gICAgICAgICAgICAuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKVxuICAgICAgICAgICAgLmltcGx5KFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUFRXZWVrZGF5UGFyc2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jb21tb24vcmVmaW5lcnMvQWJzdHJhY3RNZXJnZURhdGVSYW5nZVJlZmluZXJcIikpO1xuY2xhc3MgUFRNZXJnZURhdGVSYW5nZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVJhbmdlUmVmaW5lcl8xLmRlZmF1bHQge1xuICAgIHBhdHRlcm5CZXR3ZWVuKCkge1xuICAgICAgICByZXR1cm4gL15cXHMqKD86LSlcXHMqJC9pO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFBUTWVyZ2VEYXRlUmFuZ2VSZWZpbmVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2NvbW1vbi9yZWZpbmVycy9BYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXCIpKTtcbmNsYXNzIFBUTWVyZ2VEYXRlVGltZVJlZmluZXIgZXh0ZW5kcyBBYnN0cmFjdE1lcmdlRGF0ZVRpbWVSZWZpbmVyXzEuZGVmYXVsdCB7XG4gICAgcGF0dGVybkJldHdlZW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXlxcXFxzKig/Oix8w6ApP1xcXFxzKiRcIik7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUFRNZXJnZURhdGVUaW1lUmVmaW5lcjtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5QYXJzaW5nUmVzdWx0ID0gZXhwb3J0cy5QYXJzaW5nQ29tcG9uZW50cyA9IGV4cG9ydHMuUmVmZXJlbmNlV2l0aFRpbWV6b25lID0gdm9pZCAwO1xuY29uc3QgcXVhcnRlck9mWWVhcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqcy9wbHVnaW4vcXVhcnRlck9mWWVhclwiKSk7XG5jb25zdCBkYXlqc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJkYXlqc1wiKSk7XG5jb25zdCBkYXlqc18yID0gcmVxdWlyZShcIi4vdXRpbHMvZGF5anNcIik7XG5jb25zdCB0aW1lem9uZV8xID0gcmVxdWlyZShcIi4vdGltZXpvbmVcIik7XG5kYXlqc18xLmRlZmF1bHQuZXh0ZW5kKHF1YXJ0ZXJPZlllYXJfMS5kZWZhdWx0KTtcbmNsYXNzIFJlZmVyZW5jZVdpdGhUaW1lem9uZSB7XG4gICAgY29uc3RydWN0b3IoaW5wdXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaW5wdXQgPSBpbnB1dCAhPT0gbnVsbCAmJiBpbnB1dCAhPT0gdm9pZCAwID8gaW5wdXQgOiBuZXcgRGF0ZSgpO1xuICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbnQgPSBpbnB1dDtcbiAgICAgICAgICAgIHRoaXMudGltZXpvbmVPZmZzZXQgPSAtaW5wdXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFudCA9IChfYSA9IGlucHV0Lmluc3RhbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnRpbWV6b25lT2Zmc2V0ID0gdGltZXpvbmVfMS50b1RpbWV6b25lT2Zmc2V0KChfYiA9IGlucHV0LnRpbWV6b25lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAtdGhpcy5pbnN0YW50LmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5SZWZlcmVuY2VXaXRoVGltZXpvbmUgPSBSZWZlcmVuY2VXaXRoVGltZXpvbmU7XG5jbGFzcyBQYXJzaW5nQ29tcG9uZW50cyB7XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlLCBrbm93bkNvbXBvbmVudHMpIHtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgICAgIHRoaXMua25vd25WYWx1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5pbXBsaWVkVmFsdWVzID0ge307XG4gICAgICAgIGlmIChrbm93bkNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGtub3duQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMua25vd25WYWx1ZXNba2V5XSA9IGtub3duQ29tcG9uZW50c1trZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZkRheUpzID0gZGF5anNfMS5kZWZhdWx0KHJlZmVyZW5jZS5pbnN0YW50KTtcbiAgICAgICAgdGhpcy5pbXBseShcImRheVwiLCByZWZEYXlKcy5kYXRlKCkpO1xuICAgICAgICB0aGlzLmltcGx5KFwibW9udGhcIiwgcmVmRGF5SnMubW9udGgoKSArIDEpO1xuICAgICAgICB0aGlzLmltcGx5KFwieWVhclwiLCByZWZEYXlKcy55ZWFyKCkpO1xuICAgICAgICB0aGlzLmltcGx5KFwiaG91clwiLCAxMik7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJtaW51dGVcIiwgMCk7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJzZWNvbmRcIiwgMCk7XG4gICAgICAgIHRoaXMuaW1wbHkoXCJtaWxsaXNlY29uZFwiLCAwKTtcbiAgICB9XG4gICAgZ2V0KGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoY29tcG9uZW50IGluIHRoaXMua25vd25WYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmtub3duVmFsdWVzW2NvbXBvbmVudF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbiB0aGlzLmltcGxpZWRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmltcGxpZWRWYWx1ZXNbY29tcG9uZW50XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaXNDZXJ0YWluKGNvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50IGluIHRoaXMua25vd25WYWx1ZXM7XG4gICAgfVxuICAgIGdldENlcnRhaW5Db21wb25lbnRzKCkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5rbm93blZhbHVlcyk7XG4gICAgfVxuICAgIGltcGx5KGNvbXBvbmVudCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudCBpbiB0aGlzLmtub3duVmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmltcGxpZWRWYWx1ZXNbY29tcG9uZW50XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgYXNzaWduKGNvbXBvbmVudCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5rbm93blZhbHVlc1tjb21wb25lbnRdID0gdmFsdWU7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmltcGxpZWRWYWx1ZXNbY29tcG9uZW50XTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRlbGV0ZShjb21wb25lbnQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMua25vd25WYWx1ZXNbY29tcG9uZW50XTtcbiAgICAgICAgZGVsZXRlIHRoaXMuaW1wbGllZFZhbHVlc1tjb21wb25lbnRdO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IFBhcnNpbmdDb21wb25lbnRzKHRoaXMucmVmZXJlbmNlKTtcbiAgICAgICAgY29tcG9uZW50Lmtub3duVmFsdWVzID0ge307XG4gICAgICAgIGNvbXBvbmVudC5pbXBsaWVkVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMua25vd25WYWx1ZXMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5rbm93blZhbHVlc1trZXldID0gdGhpcy5rbm93blZhbHVlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuaW1wbGllZFZhbHVlcykge1xuICAgICAgICAgICAgY29tcG9uZW50LmltcGxpZWRWYWx1ZXNba2V5XSA9IHRoaXMuaW1wbGllZFZhbHVlc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICAgIGlzT25seURhdGUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0NlcnRhaW4oXCJob3VyXCIpICYmICF0aGlzLmlzQ2VydGFpbihcIm1pbnV0ZVwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJzZWNvbmRcIik7XG4gICAgfVxuICAgIGlzT25seVRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0NlcnRhaW4oXCJ3ZWVrZGF5XCIpICYmICF0aGlzLmlzQ2VydGFpbihcImRheVwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJtb250aFwiKTtcbiAgICB9XG4gICAgaXNPbmx5V2Vla2RheUNvbXBvbmVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDZXJ0YWluKFwid2Vla2RheVwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJkYXlcIikgJiYgIXRoaXMuaXNDZXJ0YWluKFwibW9udGhcIik7XG4gICAgfVxuICAgIGlzT25seURheU1vbnRoQ29tcG9uZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0NlcnRhaW4oXCJkYXlcIikgJiYgdGhpcy5pc0NlcnRhaW4oXCJtb250aFwiKSAmJiAhdGhpcy5pc0NlcnRhaW4oXCJ5ZWFyXCIpO1xuICAgIH1cbiAgICBpc1ZhbGlkRGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZVdpdGhvdXRUaW1lem9uZUFkanVzdG1lbnQoKTtcbiAgICAgICAgaWYgKGRhdGUuZ2V0RnVsbFllYXIoKSAhPT0gdGhpcy5nZXQoXCJ5ZWFyXCIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGF0ZS5nZXRNb250aCgpICE9PSB0aGlzLmdldChcIm1vbnRoXCIpIC0gMSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpICE9PSB0aGlzLmdldChcImRheVwiKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0KFwiaG91clwiKSAhPSBudWxsICYmIGRhdGUuZ2V0SG91cnMoKSAhPSB0aGlzLmdldChcImhvdXJcIikpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmdldChcIm1pbnV0ZVwiKSAhPSBudWxsICYmIGRhdGUuZ2V0TWludXRlcygpICE9IHRoaXMuZ2V0KFwibWludXRlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiBgW1BhcnNpbmdDb21wb25lbnRzIHtrbm93blZhbHVlczogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmtub3duVmFsdWVzKX0sIGltcGxpZWRWYWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5pbXBsaWVkVmFsdWVzKX19XWA7XG4gICAgfVxuICAgIGRheWpzKCkge1xuICAgICAgICByZXR1cm4gZGF5anNfMS5kZWZhdWx0KHRoaXMuZGF0ZSgpKTtcbiAgICB9XG4gICAgZGF0ZSgpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuZGF0ZVdpdGhvdXRUaW1lem9uZUFkanVzdG1lbnQoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgdGhpcy5nZXRTeXN0ZW1UaW1lem9uZUFkanVzdG1lbnRNaW51dGUoKSAqIDYwMDAwKTtcbiAgICB9XG4gICAgZGF0ZVdpdGhvdXRUaW1lem9uZUFkanVzdG1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmdldChcInllYXJcIiksIHRoaXMuZ2V0KFwibW9udGhcIikgLSAxLCB0aGlzLmdldChcImRheVwiKSwgdGhpcy5nZXQoXCJob3VyXCIpLCB0aGlzLmdldChcIm1pbnV0ZVwiKSwgdGhpcy5nZXQoXCJzZWNvbmRcIiksIHRoaXMuZ2V0KFwibWlsbGlzZWNvbmRcIikpO1xuICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHRoaXMuZ2V0KFwieWVhclwiKSk7XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgICBnZXRTeXN0ZW1UaW1lem9uZUFkanVzdG1lbnRNaW51dGUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgY3VycmVudFRpbWV6b25lT2Zmc2V0ID0gLW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGltZXpvbmVPZmZzZXQgPSAoX2EgPSB0aGlzLmdldChcInRpbWV6b25lT2Zmc2V0XCIpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnJlZmVyZW5jZS50aW1lem9uZU9mZnNldDtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lem9uZU9mZnNldCAtIHRhcmdldFRpbWV6b25lT2Zmc2V0O1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlUmVsYXRpdmVGcm9tUmVmSW5zdGFudChyZWZJbnN0YW50LCBmcmFnbWVudHMpIHtcbiAgICAgICAgbGV0IGRhdGUgPSBkYXlqc18xLmRlZmF1bHQocmVmSW5zdGFudCk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyYWdtZW50cykge1xuICAgICAgICAgICAgZGF0ZSA9IGRhdGUuYWRkKGZyYWdtZW50c1trZXldLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IG5ldyBSZWZlcmVuY2VXaXRoVGltZXpvbmUocmVmSW5zdGFudCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSBuZXcgUGFyc2luZ0NvbXBvbmVudHMocmVmZXJlbmNlKTtcbiAgICAgICAgaWYgKGZyYWdtZW50c1tcImhvdXJcIl0gfHwgZnJhZ21lbnRzW1wibWludXRlXCJdIHx8IGZyYWdtZW50c1tcInNlY29uZFwiXSkge1xuICAgICAgICAgICAgZGF5anNfMi5hc3NpZ25TaW1pbGFyVGltZShjb21wb25lbnRzLCBkYXRlKTtcbiAgICAgICAgICAgIGRheWpzXzIuYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50cywgZGF0ZSk7XG4gICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInRpbWV6b25lT2Zmc2V0XCIsIC1yZWZJbnN0YW50LmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF5anNfMi5pbXBseVNpbWlsYXJUaW1lKGNvbXBvbmVudHMsIGRhdGUpO1xuICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcInRpbWV6b25lT2Zmc2V0XCIsIC1yZWZJbnN0YW50LmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICAgICAgICAgICAgaWYgKGZyYWdtZW50c1tcImRcIl0pIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcImRheVwiLCBkYXRlLmRhdGUoKSk7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50c1tcIndlZWtcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIndlZWtkYXlcIiwgZGF0ZS5kYXkoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudHNbXCJtb250aFwiXSkge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFzc2lnbihcInllYXJcIiwgZGF0ZS55ZWFyKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5pbXBseShcIm1vbnRoXCIsIGRhdGUubW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnRzW1wieWVhclwiXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hc3NpZ24oXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuaW1wbHkoXCJ5ZWFyXCIsIGRhdGUueWVhcigpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50cztcbiAgICB9XG59XG5leHBvcnRzLlBhcnNpbmdDb21wb25lbnRzID0gUGFyc2luZ0NvbXBvbmVudHM7XG5jbGFzcyBQYXJzaW5nUmVzdWx0IHtcbiAgICBjb25zdHJ1Y3RvcihyZWZlcmVuY2UsIGluZGV4LCB0ZXh0LCBzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgICAgICB0aGlzLnJlZkRhdGUgPSByZWZlcmVuY2UuaW5zdGFudDtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQgfHwgbmV3IFBhcnNpbmdDb21wb25lbnRzKHJlZmVyZW5jZSk7XG4gICAgICAgIHRoaXMuZW5kID0gZW5kO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFBhcnNpbmdSZXN1bHQodGhpcy5yZWZlcmVuY2UsIHRoaXMuaW5kZXgsIHRoaXMudGV4dCk7XG4gICAgICAgIHJlc3VsdC5zdGFydCA9IHRoaXMuc3RhcnQgPyB0aGlzLnN0YXJ0LmNsb25lKCkgOiBudWxsO1xuICAgICAgICByZXN1bHQuZW5kID0gdGhpcy5lbmQgPyB0aGlzLmVuZC5jbG9uZSgpIDogbnVsbDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQuZGF0ZSgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIGBbUGFyc2luZ1Jlc3VsdCB7aW5kZXg6ICR7dGhpcy5pbmRleH0sIHRleHQ6ICcke3RoaXMudGV4dH0nLCAuLi59XWA7XG4gICAgfVxufVxuZXhwb3J0cy5QYXJzaW5nUmVzdWx0ID0gUGFyc2luZ1Jlc3VsdDtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50b1RpbWV6b25lT2Zmc2V0ID0gZXhwb3J0cy5USU1FWk9ORV9BQkJSX01BUCA9IHZvaWQgMDtcbmV4cG9ydHMuVElNRVpPTkVfQUJCUl9NQVAgPSB7XG4gICAgQUNEVDogNjMwLFxuICAgIEFDU1Q6IDU3MCxcbiAgICBBRFQ6IC0xODAsXG4gICAgQUVEVDogNjYwLFxuICAgIEFFU1Q6IDYwMCxcbiAgICBBRlQ6IDI3MCxcbiAgICBBS0RUOiAtNDgwLFxuICAgIEFLU1Q6IC01NDAsXG4gICAgQUxNVDogMzYwLFxuICAgIEFNU1Q6IC0xODAsXG4gICAgQU1UOiAtMjQwLFxuICAgIEFOQVNUOiA3MjAsXG4gICAgQU5BVDogNzIwLFxuICAgIEFRVFQ6IDMwMCxcbiAgICBBUlQ6IC0xODAsXG4gICAgQVNUOiAtMjQwLFxuICAgIEFXRFQ6IDU0MCxcbiAgICBBV1NUOiA0ODAsXG4gICAgQVpPU1Q6IDAsXG4gICAgQVpPVDogLTYwLFxuICAgIEFaU1Q6IDMwMCxcbiAgICBBWlQ6IDI0MCxcbiAgICBCTlQ6IDQ4MCxcbiAgICBCT1Q6IC0yNDAsXG4gICAgQlJTVDogLTEyMCxcbiAgICBCUlQ6IC0xODAsXG4gICAgQlNUOiA2MCxcbiAgICBCVFQ6IDM2MCxcbiAgICBDQVNUOiA0ODAsXG4gICAgQ0FUOiAxMjAsXG4gICAgQ0NUOiAzOTAsXG4gICAgQ0RUOiAtMzAwLFxuICAgIENFU1Q6IDEyMCxcbiAgICBDRVQ6IDYwLFxuICAgIENIQURUOiA4MjUsXG4gICAgQ0hBU1Q6IDc2NSxcbiAgICBDS1Q6IC02MDAsXG4gICAgQ0xTVDogLTE4MCxcbiAgICBDTFQ6IC0yNDAsXG4gICAgQ09UOiAtMzAwLFxuICAgIENTVDogLTM2MCxcbiAgICBDVlQ6IC02MCxcbiAgICBDWFQ6IDQyMCxcbiAgICBDaFNUOiA2MDAsXG4gICAgREFWVDogNDIwLFxuICAgIEVBU1NUOiAtMzAwLFxuICAgIEVBU1Q6IC0zNjAsXG4gICAgRUFUOiAxODAsXG4gICAgRUNUOiAtMzAwLFxuICAgIEVEVDogLTI0MCxcbiAgICBFRVNUOiAxODAsXG4gICAgRUVUOiAxMjAsXG4gICAgRUdTVDogMCxcbiAgICBFR1Q6IC02MCxcbiAgICBFU1Q6IC0zMDAsXG4gICAgRVQ6IC0zMDAsXG4gICAgRkpTVDogNzgwLFxuICAgIEZKVDogNzIwLFxuICAgIEZLU1Q6IC0xODAsXG4gICAgRktUOiAtMjQwLFxuICAgIEZOVDogLTEyMCxcbiAgICBHQUxUOiAtMzYwLFxuICAgIEdBTVQ6IC01NDAsXG4gICAgR0VUOiAyNDAsXG4gICAgR0ZUOiAtMTgwLFxuICAgIEdJTFQ6IDcyMCxcbiAgICBHTVQ6IDAsXG4gICAgR1NUOiAyNDAsXG4gICAgR1lUOiAtMjQwLFxuICAgIEhBQTogLTE4MCxcbiAgICBIQUM6IC0zMDAsXG4gICAgSEFEVDogLTU0MCxcbiAgICBIQUU6IC0yNDAsXG4gICAgSEFQOiAtNDIwLFxuICAgIEhBUjogLTM2MCxcbiAgICBIQVNUOiAtNjAwLFxuICAgIEhBVDogLTkwLFxuICAgIEhBWTogLTQ4MCxcbiAgICBIS1Q6IDQ4MCxcbiAgICBITFY6IC0yMTAsXG4gICAgSE5BOiAtMjQwLFxuICAgIEhOQzogLTM2MCxcbiAgICBITkU6IC0zMDAsXG4gICAgSE5QOiAtNDgwLFxuICAgIEhOUjogLTQyMCxcbiAgICBITlQ6IC0xNTAsXG4gICAgSE5ZOiAtNTQwLFxuICAgIEhPVlQ6IDQyMCxcbiAgICBJQ1Q6IDQyMCxcbiAgICBJRFQ6IDE4MCxcbiAgICBJT1Q6IDM2MCxcbiAgICBJUkRUOiAyNzAsXG4gICAgSVJLU1Q6IDU0MCxcbiAgICBJUktUOiA1NDAsXG4gICAgSVJTVDogMjEwLFxuICAgIElTVDogMzMwLFxuICAgIEpTVDogNTQwLFxuICAgIEtHVDogMzYwLFxuICAgIEtSQVNUOiA0ODAsXG4gICAgS1JBVDogNDgwLFxuICAgIEtTVDogNTQwLFxuICAgIEtVWVQ6IDI0MCxcbiAgICBMSERUOiA2NjAsXG4gICAgTEhTVDogNjMwLFxuICAgIExJTlQ6IDg0MCxcbiAgICBNQUdTVDogNzIwLFxuICAgIE1BR1Q6IDcyMCxcbiAgICBNQVJUOiAtNTEwLFxuICAgIE1BV1Q6IDMwMCxcbiAgICBNRFQ6IC0zNjAsXG4gICAgTUVTWjogMTIwLFxuICAgIE1FWjogNjAsXG4gICAgTUhUOiA3MjAsXG4gICAgTU1UOiAzOTAsXG4gICAgTVNEOiAyNDAsXG4gICAgTVNLOiAyNDAsXG4gICAgTVNUOiAtNDIwLFxuICAgIE1VVDogMjQwLFxuICAgIE1WVDogMzAwLFxuICAgIE1ZVDogNDgwLFxuICAgIE5DVDogNjYwLFxuICAgIE5EVDogLTkwLFxuICAgIE5GVDogNjkwLFxuICAgIE5PVlNUOiA0MjAsXG4gICAgTk9WVDogMzYwLFxuICAgIE5QVDogMzQ1LFxuICAgIE5TVDogLTE1MCxcbiAgICBOVVQ6IC02NjAsXG4gICAgTlpEVDogNzgwLFxuICAgIE5aU1Q6IDcyMCxcbiAgICBPTVNTVDogNDIwLFxuICAgIE9NU1Q6IDQyMCxcbiAgICBQRFQ6IC00MjAsXG4gICAgUEVUOiAtMzAwLFxuICAgIFBFVFNUOiA3MjAsXG4gICAgUEVUVDogNzIwLFxuICAgIFBHVDogNjAwLFxuICAgIFBIT1Q6IDc4MCxcbiAgICBQSFQ6IDQ4MCxcbiAgICBQS1Q6IDMwMCxcbiAgICBQTURUOiAtMTIwLFxuICAgIFBNU1Q6IC0xODAsXG4gICAgUE9OVDogNjYwLFxuICAgIFBTVDogLTQ4MCxcbiAgICBQVDogLTQ4MCxcbiAgICBQV1Q6IDU0MCxcbiAgICBQWVNUOiAtMTgwLFxuICAgIFBZVDogLTI0MCxcbiAgICBSRVQ6IDI0MCxcbiAgICBTQU1UOiAyNDAsXG4gICAgU0FTVDogMTIwLFxuICAgIFNCVDogNjYwLFxuICAgIFNDVDogMjQwLFxuICAgIFNHVDogNDgwLFxuICAgIFNSVDogLTE4MCxcbiAgICBTU1Q6IC02NjAsXG4gICAgVEFIVDogLTYwMCxcbiAgICBURlQ6IDMwMCxcbiAgICBUSlQ6IDMwMCxcbiAgICBUS1Q6IDc4MCxcbiAgICBUTFQ6IDU0MCxcbiAgICBUTVQ6IDMwMCxcbiAgICBUVlQ6IDcyMCxcbiAgICBVTEFUOiA0ODAsXG4gICAgVVRDOiAwLFxuICAgIFVZU1Q6IC0xMjAsXG4gICAgVVlUOiAtMTgwLFxuICAgIFVaVDogMzAwLFxuICAgIFZFVDogLTIxMCxcbiAgICBWTEFTVDogNjYwLFxuICAgIFZMQVQ6IDY2MCxcbiAgICBWVVQ6IDY2MCxcbiAgICBXQVNUOiAxMjAsXG4gICAgV0FUOiA2MCxcbiAgICBXRVNUOiA2MCxcbiAgICBXRVNaOiA2MCxcbiAgICBXRVQ6IDAsXG4gICAgV0VaOiAwLFxuICAgIFdGVDogNzIwLFxuICAgIFdHU1Q6IC0xMjAsXG4gICAgV0dUOiAtMTgwLFxuICAgIFdJQjogNDIwLFxuICAgIFdJVDogNTQwLFxuICAgIFdJVEE6IDQ4MCxcbiAgICBXU1Q6IDc4MCxcbiAgICBXVDogMCxcbiAgICBZQUtTVDogNjAwLFxuICAgIFlBS1Q6IDYwMCxcbiAgICBZQVBUOiA2MDAsXG4gICAgWUVLU1Q6IDM2MCxcbiAgICBZRUtUOiAzNjAsXG59O1xuZnVuY3Rpb24gdG9UaW1lem9uZU9mZnNldCh0aW1lem9uZUlucHV0KSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0eXBlb2YgdGltZXpvbmVJbnB1dCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gdGltZXpvbmVJbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuIChfYSA9IGV4cG9ydHMuVElNRVpPTkVfQUJCUl9NQVBbdGltZXpvbmVJbnB1dF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG59XG5leHBvcnRzLnRvVGltZXpvbmVPZmZzZXQgPSB0b1RpbWV6b25lT2Zmc2V0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmltcGx5U2ltaWxhclRpbWUgPSBleHBvcnRzLmFzc2lnblNpbWlsYXJUaW1lID0gZXhwb3J0cy5hc3NpZ25TaW1pbGFyRGF0ZSA9IGV4cG9ydHMuYXNzaWduVGhlTmV4dERheSA9IHZvaWQgMDtcbmZ1bmN0aW9uIGFzc2lnblRoZU5leHREYXkoY29tcG9uZW50LCB0YXJnZXREYXlKcykge1xuICAgIHRhcmdldERheUpzID0gdGFyZ2V0RGF5SnMuYWRkKDEsIFwiZGF5XCIpO1xuICAgIGFzc2lnblNpbWlsYXJEYXRlKGNvbXBvbmVudCwgdGFyZ2V0RGF5SnMpO1xuICAgIGltcGx5U2ltaWxhclRpbWUoY29tcG9uZW50LCB0YXJnZXREYXlKcyk7XG59XG5leHBvcnRzLmFzc2lnblRoZU5leHREYXkgPSBhc3NpZ25UaGVOZXh0RGF5O1xuZnVuY3Rpb24gYXNzaWduU2ltaWxhckRhdGUoY29tcG9uZW50LCB0YXJnZXREYXlKcykge1xuICAgIGNvbXBvbmVudC5hc3NpZ24oXCJkYXlcIiwgdGFyZ2V0RGF5SnMuZGF0ZSgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibW9udGhcIiwgdGFyZ2V0RGF5SnMubW9udGgoKSArIDEpO1xuICAgIGNvbXBvbmVudC5hc3NpZ24oXCJ5ZWFyXCIsIHRhcmdldERheUpzLnllYXIoKSk7XG59XG5leHBvcnRzLmFzc2lnblNpbWlsYXJEYXRlID0gYXNzaWduU2ltaWxhckRhdGU7XG5mdW5jdGlvbiBhc3NpZ25TaW1pbGFyVGltZShjb21wb25lbnQsIHRhcmdldERheUpzKSB7XG4gICAgY29tcG9uZW50LmFzc2lnbihcImhvdXJcIiwgdGFyZ2V0RGF5SnMuaG91cigpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibWludXRlXCIsIHRhcmdldERheUpzLm1pbnV0ZSgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwic2Vjb25kXCIsIHRhcmdldERheUpzLnNlY29uZCgpKTtcbiAgICBjb21wb25lbnQuYXNzaWduKFwibWlsbGlzZWNvbmRcIiwgdGFyZ2V0RGF5SnMubWlsbGlzZWNvbmQoKSk7XG59XG5leHBvcnRzLmFzc2lnblNpbWlsYXJUaW1lID0gYXNzaWduU2ltaWxhclRpbWU7XG5mdW5jdGlvbiBpbXBseVNpbWlsYXJUaW1lKGNvbXBvbmVudCwgdGFyZ2V0RGF5SnMpIHtcbiAgICBjb21wb25lbnQuaW1wbHkoXCJob3VyXCIsIHRhcmdldERheUpzLmhvdXIoKSk7XG4gICAgY29tcG9uZW50LmltcGx5KFwibWludXRlXCIsIHRhcmdldERheUpzLm1pbnV0ZSgpKTtcbiAgICBjb21wb25lbnQuaW1wbHkoXCJzZWNvbmRcIiwgdGFyZ2V0RGF5SnMuc2Vjb25kKCkpO1xuICAgIGNvbXBvbmVudC5pbXBseShcIm1pbGxpc2Vjb25kXCIsIHRhcmdldERheUpzLm1pbGxpc2Vjb25kKCkpO1xufVxuZXhwb3J0cy5pbXBseVNpbWlsYXJUaW1lID0gaW1wbHlTaW1pbGFyVGltZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tYXRjaEFueVBhdHRlcm4gPSBleHBvcnRzLmV4dHJhY3RUZXJtcyA9IGV4cG9ydHMucmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm4gPSB2b2lkIDA7XG5mdW5jdGlvbiByZXBlYXRlZFRpbWV1bml0UGF0dGVybihwcmVmaXgsIHNpbmdsZVRpbWV1bml0UGF0dGVybikge1xuICAgIGNvbnN0IHNpbmdsZVRpbWV1bml0UGF0dGVybk5vQ2FwdHVyZSA9IHNpbmdsZVRpbWV1bml0UGF0dGVybi5yZXBsYWNlKC9cXCgoPyFcXD8pL2csIFwiKD86XCIpO1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHtzaW5nbGVUaW1ldW5pdFBhdHRlcm5Ob0NhcHR1cmV9XFxcXHMqKD86LD9cXFxcc3swLDV9JHtzaW5nbGVUaW1ldW5pdFBhdHRlcm5Ob0NhcHR1cmV9KXswLDEwfWA7XG59XG5leHBvcnRzLnJlcGVhdGVkVGltZXVuaXRQYXR0ZXJuID0gcmVwZWF0ZWRUaW1ldW5pdFBhdHRlcm47XG5mdW5jdGlvbiBleHRyYWN0VGVybXMoZGljdGlvbmFyeSkge1xuICAgIGxldCBrZXlzO1xuICAgIGlmIChkaWN0aW9uYXJ5IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAga2V5cyA9IFsuLi5kaWN0aW9uYXJ5XTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGljdGlvbmFyeSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICBrZXlzID0gQXJyYXkuZnJvbShkaWN0aW9uYXJ5LmtleXMoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMoZGljdGlvbmFyeSk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuZXhwb3J0cy5leHRyYWN0VGVybXMgPSBleHRyYWN0VGVybXM7XG5mdW5jdGlvbiBtYXRjaEFueVBhdHRlcm4oZGljdGlvbmFyeSkge1xuICAgIGNvbnN0IGpvaW5lZFRlcm1zID0gZXh0cmFjdFRlcm1zKGRpY3Rpb25hcnkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKVxuICAgICAgICAuam9pbihcInxcIilcbiAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCBcIlxcXFwuXCIpO1xuICAgIHJldHVybiBgKD86JHtqb2luZWRUZXJtc30pYDtcbn1cbmV4cG9ydHMubWF0Y2hBbnlQYXR0ZXJuID0gbWF0Y2hBbnlQYXR0ZXJuO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFkZEltcGxpZWRUaW1lVW5pdHMgPSBleHBvcnRzLnJldmVyc2VUaW1lVW5pdHMgPSB2b2lkIDA7XG5mdW5jdGlvbiByZXZlcnNlVGltZVVuaXRzKHRpbWVVbml0cykge1xuICAgIGNvbnN0IHJldmVyc2VkID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGltZVVuaXRzKSB7XG4gICAgICAgIHJldmVyc2VkW2tleV0gPSAtdGltZVVuaXRzW2tleV07XG4gICAgfVxuICAgIHJldHVybiByZXZlcnNlZDtcbn1cbmV4cG9ydHMucmV2ZXJzZVRpbWVVbml0cyA9IHJldmVyc2VUaW1lVW5pdHM7XG5mdW5jdGlvbiBhZGRJbXBsaWVkVGltZVVuaXRzKGNvbXBvbmVudHMsIHRpbWVVbml0cykge1xuICAgIGNvbnN0IG91dHB1dCA9IGNvbXBvbmVudHMuY2xvbmUoKTtcbiAgICBsZXQgZGF0ZSA9IGNvbXBvbmVudHMuZGF5anMoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aW1lVW5pdHMpIHtcbiAgICAgICAgZGF0ZSA9IGRhdGUuYWRkKHRpbWVVbml0c1trZXldLCBrZXkpO1xuICAgIH1cbiAgICBpZiAoXCJkYXlcIiBpbiB0aW1lVW5pdHMgfHwgXCJkXCIgaW4gdGltZVVuaXRzIHx8IFwid2Vla1wiIGluIHRpbWVVbml0cyB8fCBcIm1vbnRoXCIgaW4gdGltZVVuaXRzIHx8IFwieWVhclwiIGluIHRpbWVVbml0cykge1xuICAgICAgICBvdXRwdXQuaW1wbHkoXCJkYXlcIiwgZGF0ZS5kYXRlKCkpO1xuICAgICAgICBvdXRwdXQuaW1wbHkoXCJtb250aFwiLCBkYXRlLm1vbnRoKCkgKyAxKTtcbiAgICAgICAgb3V0cHV0LmltcGx5KFwieWVhclwiLCBkYXRlLnllYXIoKSk7XG4gICAgfVxuICAgIGlmIChcInNlY29uZFwiIGluIHRpbWVVbml0cyB8fCBcIm1pbnV0ZVwiIGluIHRpbWVVbml0cyB8fCBcImhvdXJcIiBpbiB0aW1lVW5pdHMpIHtcbiAgICAgICAgb3V0cHV0LmltcGx5KFwic2Vjb25kXCIsIGRhdGUuc2Vjb25kKCkpO1xuICAgICAgICBvdXRwdXQuaW1wbHkoXCJtaW51dGVcIiwgZGF0ZS5taW51dGUoKSk7XG4gICAgICAgIG91dHB1dC5pbXBseShcImhvdXJcIiwgZGF0ZS5ob3VyKCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufVxuZXhwb3J0cy5hZGRJbXBsaWVkVGltZVVuaXRzID0gYWRkSW1wbGllZFRpbWVVbml0cztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vKlxuICBNSVQgTGljZW5zZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuICBBdXRob3IgVG9iaWFzIEtvcHBlcnMgQHNva3JhXG4qL1xuLy8gY3NzIGJhc2UgY29kZSwgaW5qZWN0ZWQgYnkgdGhlIGNzcy1sb2FkZXJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKSB7XG4gIHZhciBsaXN0ID0gW107IC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblxuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSk7XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIHJldHVybiBcIkBtZWRpYSBcIi5jb25jYXQoaXRlbVsyXSwgXCIge1wiKS5jb25jYXQoY29udGVudCwgXCJ9XCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9KS5qb2luKFwiXCIpO1xuICB9OyAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXG5cbiAgbGlzdC5pID0gZnVuY3Rpb24gKG1vZHVsZXMsIG1lZGlhUXVlcnksIGRlZHVwZSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBtb2R1bGVzID0gW1tudWxsLCBtb2R1bGVzLCBcIlwiXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWRlc3RydWN0dXJpbmdcbiAgICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaWRdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBtb2R1bGVzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfaV0pO1xuXG4gICAgICBpZiAoZGVkdXBlICYmIGFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVkaWFRdWVyeSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzJdID0gXCJcIi5jb25jYXQobWVkaWFRdWVyeSwgXCIgYW5kIFwiKS5jb25jYXQoaXRlbVsyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkgeyByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpOyB9XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH1cblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikgeyBpZiAoIW8pIHJldHVybjsgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpOyBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lOyBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTsgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOyB9XG5cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7IGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7IHZhciBfaSA9IGFyciAmJiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBhcnJbU3ltYm9sLml0ZXJhdG9yXSB8fCBhcnJbXCJAQGl0ZXJhdG9yXCJdKTsgaWYgKF9pID09IG51bGwpIHJldHVybjsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfcywgX2U7IHRyeSB7IGZvciAoX2kgPSBfaS5jYWxsKGFycik7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHsgX2Fyci5wdXNoKF9zLnZhbHVlKTsgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrOyB9IH0gY2F0Y2ggKGVycikgeyBfZCA9IHRydWU7IF9lID0gZXJyOyB9IGZpbmFsbHkgeyB0cnkgeyBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7IH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pIHtcbiAgdmFyIF9pdGVtID0gX3NsaWNlZFRvQXJyYXkoaXRlbSwgNCksXG4gICAgICBjb250ZW50ID0gX2l0ZW1bMV0sXG4gICAgICBjc3NNYXBwaW5nID0gX2l0ZW1bM107XG5cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gXCIvKiMgc291cmNlVVJMPVwiLmNvbmNhdChjc3NNYXBwaW5nLnNvdXJjZVJvb3QgfHwgXCJcIikuY29uY2F0KHNvdXJjZSwgXCIgKi9cIik7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIHJldHVybiBbY29udGVudF0uam9pbihcIlxcblwiKTtcbn07IiwiIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6KHQ9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczp0fHxzZWxmKS5kYXlqcz1lKCl9KHRoaXMsKGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9MWUzLGU9NmU0LG49MzZlNSxyPVwibWlsbGlzZWNvbmRcIixpPVwic2Vjb25kXCIscz1cIm1pbnV0ZVwiLHU9XCJob3VyXCIsYT1cImRheVwiLG89XCJ3ZWVrXCIsZj1cIm1vbnRoXCIsaD1cInF1YXJ0ZXJcIixjPVwieWVhclwiLGQ9XCJkYXRlXCIsJD1cIkludmFsaWQgRGF0ZVwiLGw9L14oXFxkezR9KVstL10/KFxcZHsxLDJ9KT9bLS9dPyhcXGR7MCwyfSlbXjAtOV0qKFxcZHsxLDJ9KT86PyhcXGR7MSwyfSk/Oj8oXFxkezEsMn0pP1suOl0/KFxcZCspPyQvLHk9L1xcWyhbXlxcXV0rKV18WXsxLDR9fE17MSw0fXxEezEsMn18ZHsxLDR9fEh7MSwyfXxoezEsMn18YXxBfG17MSwyfXxzezEsMn18WnsxLDJ9fFNTUy9nLE09e25hbWU6XCJlblwiLHdlZWtkYXlzOlwiU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXlcIi5zcGxpdChcIl9cIiksbW9udGhzOlwiSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlclwiLnNwbGl0KFwiX1wiKX0sbT1mdW5jdGlvbih0LGUsbil7dmFyIHI9U3RyaW5nKHQpO3JldHVybiFyfHxyLmxlbmd0aD49ZT90OlwiXCIrQXJyYXkoZSsxLXIubGVuZ3RoKS5qb2luKG4pK3R9LGc9e3M6bSx6OmZ1bmN0aW9uKHQpe3ZhciBlPS10LnV0Y09mZnNldCgpLG49TWF0aC5hYnMoZSkscj1NYXRoLmZsb29yKG4vNjApLGk9biU2MDtyZXR1cm4oZTw9MD9cIitcIjpcIi1cIikrbShyLDIsXCIwXCIpK1wiOlwiK20oaSwyLFwiMFwiKX0sbTpmdW5jdGlvbiB0KGUsbil7aWYoZS5kYXRlKCk8bi5kYXRlKCkpcmV0dXJuLXQobixlKTt2YXIgcj0xMioobi55ZWFyKCktZS55ZWFyKCkpKyhuLm1vbnRoKCktZS5tb250aCgpKSxpPWUuY2xvbmUoKS5hZGQocixmKSxzPW4taTwwLHU9ZS5jbG9uZSgpLmFkZChyKyhzPy0xOjEpLGYpO3JldHVybisoLShyKyhuLWkpLyhzP2ktdTp1LWkpKXx8MCl9LGE6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MD9NYXRoLmNlaWwodCl8fDA6TWF0aC5mbG9vcih0KX0scDpmdW5jdGlvbih0KXtyZXR1cm57TTpmLHk6Yyx3Om8sZDphLEQ6ZCxoOnUsbTpzLHM6aSxtczpyLFE6aH1bdF18fFN0cmluZyh0fHxcIlwiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL3MkLyxcIlwiKX0sdTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH19LEQ9XCJlblwiLHY9e307dltEXT1NO3ZhciBwPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgX30sUz1mdW5jdGlvbih0LGUsbil7dmFyIHI7aWYoIXQpcmV0dXJuIEQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpdlt0XSYmKHI9dCksZSYmKHZbdF09ZSxyPXQpO2Vsc2V7dmFyIGk9dC5uYW1lO3ZbaV09dCxyPWl9cmV0dXJuIW4mJnImJihEPXIpLHJ8fCFuJiZEfSx3PWZ1bmN0aW9uKHQsZSl7aWYocCh0KSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBuPVwib2JqZWN0XCI9PXR5cGVvZiBlP2U6e307cmV0dXJuIG4uZGF0ZT10LG4uYXJncz1hcmd1bWVudHMsbmV3IF8obil9LE89ZztPLmw9UyxPLmk9cCxPLnc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdyh0LHtsb2NhbGU6ZS4kTCx1dGM6ZS4kdSx4OmUuJHgsJG9mZnNldDplLiRvZmZzZXR9KX07dmFyIF89ZnVuY3Rpb24oKXtmdW5jdGlvbiBNKHQpe3RoaXMuJEw9Uyh0LmxvY2FsZSxudWxsLCEwKSx0aGlzLnBhcnNlKHQpfXZhciBtPU0ucHJvdG90eXBlO3JldHVybiBtLnBhcnNlPWZ1bmN0aW9uKHQpe3RoaXMuJGQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5kYXRlLG49dC51dGM7aWYobnVsbD09PWUpcmV0dXJuIG5ldyBEYXRlKE5hTik7aWYoTy51KGUpKXJldHVybiBuZXcgRGF0ZTtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gbmV3IERhdGUoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUmJiEvWiQvaS50ZXN0KGUpKXt2YXIgcj1lLm1hdGNoKGwpO2lmKHIpe3ZhciBpPXJbMl0tMXx8MCxzPShyWzddfHxcIjBcIikuc3Vic3RyaW5nKDAsMyk7cmV0dXJuIG4/bmV3IERhdGUoRGF0ZS5VVEMoclsxXSxpLHJbM118fDEscls0XXx8MCxyWzVdfHwwLHJbNl18fDAscykpOm5ldyBEYXRlKHJbMV0saSxyWzNdfHwxLHJbNF18fDAscls1XXx8MCxyWzZdfHwwLHMpfX1yZXR1cm4gbmV3IERhdGUoZSl9KHQpLHRoaXMuJHg9dC54fHx7fSx0aGlzLmluaXQoKX0sbS5pbml0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy4kZDt0aGlzLiR5PXQuZ2V0RnVsbFllYXIoKSx0aGlzLiRNPXQuZ2V0TW9udGgoKSx0aGlzLiREPXQuZ2V0RGF0ZSgpLHRoaXMuJFc9dC5nZXREYXkoKSx0aGlzLiRIPXQuZ2V0SG91cnMoKSx0aGlzLiRtPXQuZ2V0TWludXRlcygpLHRoaXMuJHM9dC5nZXRTZWNvbmRzKCksdGhpcy4kbXM9dC5nZXRNaWxsaXNlY29uZHMoKX0sbS4kdXRpbHM9ZnVuY3Rpb24oKXtyZXR1cm4gT30sbS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuISh0aGlzLiRkLnRvU3RyaW5nKCk9PT0kKX0sbS5pc1NhbWU9ZnVuY3Rpb24odCxlKXt2YXIgbj13KHQpO3JldHVybiB0aGlzLnN0YXJ0T2YoZSk8PW4mJm48PXRoaXMuZW5kT2YoZSl9LG0uaXNBZnRlcj1mdW5jdGlvbih0LGUpe3JldHVybiB3KHQpPHRoaXMuc3RhcnRPZihlKX0sbS5pc0JlZm9yZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVuZE9mKGUpPHcodCl9LG0uJGc9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPLnUodCk/dGhpc1tlXTp0aGlzLnNldChuLHQpfSxtLnVuaXg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfSxtLnZhbHVlT2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC5nZXRUaW1lKCl9LG0uc3RhcnRPZj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj0hIU8udShlKXx8ZSxoPU8ucCh0KSwkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9Ty53KG4uJHU/RGF0ZS5VVEMobi4keSxlLHQpOm5ldyBEYXRlKG4uJHksZSx0KSxuKTtyZXR1cm4gcj9pOmkuZW5kT2YoYSl9LGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTy53KG4udG9EYXRlKClbdF0uYXBwbHkobi50b0RhdGUoXCJzXCIpLChyP1swLDAsMCwwXTpbMjMsNTksNTksOTk5XSkuc2xpY2UoZSkpLG4pfSx5PXRoaXMuJFcsTT10aGlzLiRNLG09dGhpcy4kRCxnPVwic2V0XCIrKHRoaXMuJHU/XCJVVENcIjpcIlwiKTtzd2l0Y2goaCl7Y2FzZSBjOnJldHVybiByPyQoMSwwKTokKDMxLDExKTtjYXNlIGY6cmV0dXJuIHI/JCgxLE0pOiQoMCxNKzEpO2Nhc2Ugbzp2YXIgRD10aGlzLiRsb2NhbGUoKS53ZWVrU3RhcnR8fDAsdj0oeTxEP3krNzp5KS1EO3JldHVybiAkKHI/bS12Om0rKDYtdiksTSk7Y2FzZSBhOmNhc2UgZDpyZXR1cm4gbChnK1wiSG91cnNcIiwwKTtjYXNlIHU6cmV0dXJuIGwoZytcIk1pbnV0ZXNcIiwxKTtjYXNlIHM6cmV0dXJuIGwoZytcIlNlY29uZHNcIiwyKTtjYXNlIGk6cmV0dXJuIGwoZytcIk1pbGxpc2Vjb25kc1wiLDMpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuY2xvbmUoKX19LG0uZW5kT2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc3RhcnRPZih0LCExKX0sbS4kc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG4sbz1PLnAodCksaD1cInNldFwiKyh0aGlzLiR1P1wiVVRDXCI6XCJcIiksJD0obj17fSxuW2FdPWgrXCJEYXRlXCIsbltkXT1oK1wiRGF0ZVwiLG5bZl09aCtcIk1vbnRoXCIsbltjXT1oK1wiRnVsbFllYXJcIixuW3VdPWgrXCJIb3Vyc1wiLG5bc109aCtcIk1pbnV0ZXNcIixuW2ldPWgrXCJTZWNvbmRzXCIsbltyXT1oK1wiTWlsbGlzZWNvbmRzXCIsbilbb10sbD1vPT09YT90aGlzLiREKyhlLXRoaXMuJFcpOmU7aWYobz09PWZ8fG89PT1jKXt2YXIgeT10aGlzLmNsb25lKCkuc2V0KGQsMSk7eS4kZFskXShsKSx5LmluaXQoKSx0aGlzLiRkPXkuc2V0KGQsTWF0aC5taW4odGhpcy4kRCx5LmRheXNJbk1vbnRoKCkpKS4kZH1lbHNlICQmJnRoaXMuJGRbJF0obCk7cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9LG0uc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuY2xvbmUoKS4kc2V0KHQsZSl9LG0uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW08ucCh0KV0oKX0sbS5hZGQ9ZnVuY3Rpb24ocixoKXt2YXIgZCwkPXRoaXM7cj1OdW1iZXIocik7dmFyIGw9Ty5wKGgpLHk9ZnVuY3Rpb24odCl7dmFyIGU9dygkKTtyZXR1cm4gTy53KGUuZGF0ZShlLmRhdGUoKStNYXRoLnJvdW5kKHQqcikpLCQpfTtpZihsPT09ZilyZXR1cm4gdGhpcy5zZXQoZix0aGlzLiRNK3IpO2lmKGw9PT1jKXJldHVybiB0aGlzLnNldChjLHRoaXMuJHkrcik7aWYobD09PWEpcmV0dXJuIHkoMSk7aWYobD09PW8pcmV0dXJuIHkoNyk7dmFyIE09KGQ9e30sZFtzXT1lLGRbdV09bixkW2ldPXQsZClbbF18fDEsbT10aGlzLiRkLmdldFRpbWUoKStyKk07cmV0dXJuIE8udyhtLHRoaXMpfSxtLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuYWRkKC0xKnQsZSl9LG0uZm9ybWF0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiAkO3ZhciBuPXR8fFwiWVlZWS1NTS1ERFRISDptbTpzc1pcIixyPU8ueih0aGlzKSxpPXRoaXMuJGxvY2FsZSgpLHM9dGhpcy4kSCx1PXRoaXMuJG0sYT10aGlzLiRNLG89aS53ZWVrZGF5cyxmPWkubW9udGhzLGg9ZnVuY3Rpb24odCxyLGkscyl7cmV0dXJuIHQmJih0W3JdfHx0KGUsbikpfHxpW3JdLnN1YnN0cigwLHMpfSxjPWZ1bmN0aW9uKHQpe3JldHVybiBPLnMocyUxMnx8MTIsdCxcIjBcIil9LGQ9aS5tZXJpZGllbXx8ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQ8MTI/XCJBTVwiOlwiUE1cIjtyZXR1cm4gbj9yLnRvTG93ZXJDYXNlKCk6cn0sbD17WVk6U3RyaW5nKHRoaXMuJHkpLnNsaWNlKC0yKSxZWVlZOnRoaXMuJHksTTphKzEsTU06Ty5zKGErMSwyLFwiMFwiKSxNTU06aChpLm1vbnRoc1Nob3J0LGEsZiwzKSxNTU1NOmgoZixhKSxEOnRoaXMuJEQsREQ6Ty5zKHRoaXMuJEQsMixcIjBcIiksZDpTdHJpbmcodGhpcy4kVyksZGQ6aChpLndlZWtkYXlzTWluLHRoaXMuJFcsbywyKSxkZGQ6aChpLndlZWtkYXlzU2hvcnQsdGhpcy4kVyxvLDMpLGRkZGQ6b1t0aGlzLiRXXSxIOlN0cmluZyhzKSxISDpPLnMocywyLFwiMFwiKSxoOmMoMSksaGg6YygyKSxhOmQocyx1LCEwKSxBOmQocyx1LCExKSxtOlN0cmluZyh1KSxtbTpPLnModSwyLFwiMFwiKSxzOlN0cmluZyh0aGlzLiRzKSxzczpPLnModGhpcy4kcywyLFwiMFwiKSxTU1M6Ty5zKHRoaXMuJG1zLDMsXCIwXCIpLFo6cn07cmV0dXJuIG4ucmVwbGFjZSh5LChmdW5jdGlvbih0LGUpe3JldHVybiBlfHxsW3RdfHxyLnJlcGxhY2UoXCI6XCIsXCJcIil9KSl9LG0udXRjT2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIDE1Ki1NYXRoLnJvdW5kKHRoaXMuJGQuZ2V0VGltZXpvbmVPZmZzZXQoKS8xNSl9LG0uZGlmZj1mdW5jdGlvbihyLGQsJCl7dmFyIGwseT1PLnAoZCksTT13KHIpLG09KE0udXRjT2Zmc2V0KCktdGhpcy51dGNPZmZzZXQoKSkqZSxnPXRoaXMtTSxEPU8ubSh0aGlzLE0pO3JldHVybiBEPShsPXt9LGxbY109RC8xMixsW2ZdPUQsbFtoXT1ELzMsbFtvXT0oZy1tKS82MDQ4ZTUsbFthXT0oZy1tKS84NjRlNSxsW3VdPWcvbixsW3NdPWcvZSxsW2ldPWcvdCxsKVt5XXx8ZywkP0Q6Ty5hKEQpfSxtLmRheXNJbk1vbnRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kT2YoZikuJER9LG0uJGxvY2FsZT1mdW5jdGlvbigpe3JldHVybiB2W3RoaXMuJExdfSxtLmxvY2FsZT1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLiRMO3ZhciBuPXRoaXMuY2xvbmUoKSxyPVModCxlLCEwKTtyZXR1cm4gciYmKG4uJEw9ciksbn0sbS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBPLncodGhpcy4kZCx0aGlzKX0sbS50b0RhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpfSxtLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH0sbS50b0lTT1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRkLnRvSVNPU3RyaW5nKCl9LG0udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZC50b1VUQ1N0cmluZygpfSxNfSgpLGI9Xy5wcm90b3R5cGU7cmV0dXJuIHcucHJvdG90eXBlPWIsW1tcIiRtc1wiLHJdLFtcIiRzXCIsaV0sW1wiJG1cIixzXSxbXCIkSFwiLHVdLFtcIiRXXCIsYV0sW1wiJE1cIixmXSxbXCIkeVwiLGNdLFtcIiREXCIsZF1dLmZvckVhY2goKGZ1bmN0aW9uKHQpe2JbdFsxXV09ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGcoZSx0WzBdLHRbMV0pfX0pKSx3LmV4dGVuZD1mdW5jdGlvbih0LGUpe3JldHVybiB0LiRpfHwodChlLF8sdyksdC4kaT0hMCksd30sdy5sb2NhbGU9Uyx3LmlzRGF5anM9cCx3LnVuaXg9ZnVuY3Rpb24odCl7cmV0dXJuIHcoMWUzKnQpfSx3LmVuPXZbRF0sdy5Mcz12LHcucD17fSx3fSkpOyIsIiFmdW5jdGlvbih0LG4pe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPW4oKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKG4pOih0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6dHx8c2VsZikuZGF5anNfcGx1Z2luX3F1YXJ0ZXJPZlllYXI9bigpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciB0PVwibW9udGhcIixuPVwicXVhcnRlclwiO3JldHVybiBmdW5jdGlvbihlLGkpe3ZhciByPWkucHJvdG90eXBlO3IucXVhcnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy4kdXRpbHMoKS51KHQpP01hdGguY2VpbCgodGhpcy5tb250aCgpKzEpLzMpOnRoaXMubW9udGgodGhpcy5tb250aCgpJTMrMyoodC0xKSl9O3ZhciBzPXIuYWRkO3IuYWRkPWZ1bmN0aW9uKGUsaSl7cmV0dXJuIGU9TnVtYmVyKGUpLHRoaXMuJHV0aWxzKCkucChpKT09PW4/dGhpcy5hZGQoMyplLHQpOnMuYmluZCh0aGlzKShlLGkpfTt2YXIgdT1yLnN0YXJ0T2Y7ci5zdGFydE9mPWZ1bmN0aW9uKGUsaSl7dmFyIHI9dGhpcy4kdXRpbHMoKSxzPSEhci51KGkpfHxpO2lmKHIucChlKT09PW4pe3ZhciBvPXRoaXMucXVhcnRlcigpLTE7cmV0dXJuIHM/dGhpcy5tb250aCgzKm8pLnN0YXJ0T2YodCkuc3RhcnRPZihcImRheVwiKTp0aGlzLm1vbnRoKDMqbysyKS5lbmRPZih0KS5lbmRPZihcImRheVwiKX1yZXR1cm4gdS5iaW5kKHRoaXMpKGUsaSl9fX0pKTsiLCJleHBvcnQgZnVuY3Rpb24gZGVib3VuY2UgKGZ1bmMsIHdhaXQpIHtcbiAgbGV0IHRpbWVvdXRcblxuICByZXR1cm4gZnVuY3Rpb24gZXhlY3V0ZWRGdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGNvbnN0IGxhdGVyID0gKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICBmdW5jKC4uLmFyZ3MpXG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpXG4gIH1cbn1cbiIsIi8vIEltcG9ydHNcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fIGZyb20gXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvY3NzV2l0aE1hcHBpbmdUb1N0cmluZy5qc1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiO1xudmFyIF9fX0NTU19MT0FERVJfRVhQT1JUX19fID0gX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18pO1xuLy8gTW9kdWxlXG5fX19DU1NfTE9BREVSX0VYUE9SVF9fXy5wdXNoKFttb2R1bGUuaWQsIFwiLnRhcGktZHJvcGRvd24ge1xcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG59XFxuXFxuLnRhcGktZHJvcGRvd24tY29udGVudCB7XFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgbWluLXdpZHRoOiAyMDBweDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIGJveC1zaGFkb3c6IDBweCA4cHggMTZweCAwcHggcmdiYSgwLDAsMCwwLjIpO1xcbiAgICB6LWluZGV4OiAxO1xcbiAgICBjb2xvcjogIzAwMDtcXG59XFxuXFxuLnNob3cge1xcbiAgICBkaXNwbGF5OiBibG9jaztcXG59XFxuXCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovLy4vc3JjL3N0YXR1cy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUE7SUFDSSxrQkFBa0I7SUFDbEIscUJBQXFCO0FBQ3pCOztBQUVBO0lBQ0ksYUFBYTtJQUNiLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLDRDQUE0QztJQUM1QyxVQUFVO0lBQ1YsV0FBVztBQUNmOztBQUVBO0lBQ0ksY0FBYztBQUNsQlwiLFwic291cmNlc0NvbnRlbnRcIjpbXCIudGFwaS1kcm9wZG93biB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbn1cXG5cXG4udGFwaS1kcm9wZG93bi1jb250ZW50IHtcXG4gICAgZGlzcGxheTogbm9uZTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBtaW4td2lkdGg6IDIwMHB4O1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgYm94LXNoYWRvdzogMHB4IDhweCAxNnB4IDBweCByZ2JhKDAsMCwwLDAuMik7XFxuICAgIHotaW5kZXg6IDE7XFxuICAgIGNvbG9yOiAjMDAwO1xcbn1cXG5cXG4uc2hvdyB7XFxuICAgIGRpc3BsYXk6IGJsb2NrO1xcbn1cXG5cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwiaW1wb3J0IGFwaSBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiO1xuICAgICAgICAgICAgaW1wb3J0IGNvbnRlbnQgZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdGF0dXMuY3NzXCI7XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0IGRlZmF1bHQgY29udGVudC5sb2NhbHMgfHwge307IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBpc09sZElFID0gZnVuY3Rpb24gaXNPbGRJRSgpIHtcbiAgdmFyIG1lbW87XG4gIHJldHVybiBmdW5jdGlvbiBtZW1vcml6ZSgpIHtcbiAgICBpZiAodHlwZW9mIG1lbW8gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBUZXN0IGZvciBJRSA8PSA5IGFzIHByb3Bvc2VkIGJ5IEJyb3dzZXJoYWNrc1xuICAgICAgLy8gQHNlZSBodHRwOi8vYnJvd3NlcmhhY2tzLmNvbS8jaGFjay1lNzFkODY5MmY2NTMzNDE3M2ZlZTcxNWMyMjJjYjgwNVxuICAgICAgLy8gVGVzdHMgZm9yIGV4aXN0ZW5jZSBvZiBzdGFuZGFyZCBnbG9iYWxzIGlzIHRvIGFsbG93IHN0eWxlLWxvYWRlclxuICAgICAgLy8gdG8gb3BlcmF0ZSBjb3JyZWN0bHkgaW50byBub24tc3RhbmRhcmQgZW52aXJvbm1lbnRzXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyL2lzc3Vlcy8xNzdcbiAgICAgIG1lbW8gPSBCb29sZWFuKHdpbmRvdyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5hbGwgJiYgIXdpbmRvdy5hdG9iKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtbztcbiAgfTtcbn0oKTtcblxudmFyIGdldFRhcmdldCA9IGZ1bmN0aW9uIGdldFRhcmdldCgpIHtcbiAgdmFyIG1lbW8gPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1lbW9yaXplKHRhcmdldCkge1xuICAgIGlmICh0eXBlb2YgbWVtb1t0YXJnZXRdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHN0eWxlVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOyAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuXG4gICAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbiAgICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVtb1t0YXJnZXRdO1xuICB9O1xufSgpO1xuXG52YXIgc3R5bGVzSW5Eb20gPSBbXTtcblxuZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICB2YXIgcmVzdWx0ID0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXNJbkRvbS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzdHlsZXNJbkRvbVtpXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXN1bHQgPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpIHtcbiAgdmFyIGlkQ291bnRNYXAgPSB7fTtcbiAgdmFyIGlkZW50aWZpZXJzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSBsaXN0W2ldO1xuICAgIHZhciBpZCA9IG9wdGlvbnMuYmFzZSA/IGl0ZW1bMF0gKyBvcHRpb25zLmJhc2UgOiBpdGVtWzBdO1xuICAgIHZhciBjb3VudCA9IGlkQ291bnRNYXBbaWRdIHx8IDA7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBcIlwiLmNvbmNhdChpZCwgXCIgXCIpLmNvbmNhdChjb3VudCk7XG4gICAgaWRDb3VudE1hcFtpZF0gPSBjb3VudCArIDE7XG4gICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgdmFyIG9iaiA9IHtcbiAgICAgIGNzczogaXRlbVsxXSxcbiAgICAgIG1lZGlhOiBpdGVtWzJdLFxuICAgICAgc291cmNlTWFwOiBpdGVtWzNdXG4gICAgfTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHN0eWxlc0luRG9tW2luZGV4XS5yZWZlcmVuY2VzKys7XG4gICAgICBzdHlsZXNJbkRvbVtpbmRleF0udXBkYXRlcihvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZXNJbkRvbS5wdXNoKHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogYWRkU3R5bGUob2JqLCBvcHRpb25zKSxcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgdmFyIGF0dHJpYnV0ZXMgPSBvcHRpb25zLmF0dHJpYnV0ZXMgfHwge307XG5cbiAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLm5vbmNlID09PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBub25jZSA9IHR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyAhPT0gJ3VuZGVmaW5lZCcgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG5cbiAgICBpZiAobm9uY2UpIHtcbiAgICAgIGF0dHJpYnV0ZXMubm9uY2UgPSBub25jZTtcbiAgICB9XG4gIH1cblxuICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pO1xuICB9KTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMuaW5zZXJ0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb3B0aW9ucy5pbnNlcnQoc3R5bGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQob3B0aW9ucy5pbnNlcnQgfHwgJ2hlYWQnKTtcblxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO1xuICAgIH1cblxuICAgIHRhcmdldC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICByZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSkge1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgaWZcbiAgaWYgKHN0eWxlLnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTtcbn1cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuXG5cbnZhciByZXBsYWNlVGV4dCA9IGZ1bmN0aW9uIHJlcGxhY2VUZXh0KCkge1xuICB2YXIgdGV4dFN0b3JlID0gW107XG4gIHJldHVybiBmdW5jdGlvbiByZXBsYWNlKGluZGV4LCByZXBsYWNlbWVudCkge1xuICAgIHRleHRTdG9yZVtpbmRleF0gPSByZXBsYWNlbWVudDtcbiAgICByZXR1cm4gdGV4dFN0b3JlLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcbiAgfTtcbn0oKTtcblxuZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyhzdHlsZSwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG4gIHZhciBjc3MgPSByZW1vdmUgPyAnJyA6IG9iai5tZWRpYSA/IFwiQG1lZGlhIFwiLmNvbmNhdChvYmoubWVkaWEsIFwiIHtcIikuY29uY2F0KG9iai5jc3MsIFwifVwiKSA6IG9iai5jc3M7IC8vIEZvciBvbGQgSUVcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG5cbiAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSByZXBsYWNlVGV4dChpbmRleCwgY3NzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcyk7XG4gICAgdmFyIGNoaWxkTm9kZXMgPSBzdHlsZS5jaGlsZE5vZGVzO1xuXG4gICAgaWYgKGNoaWxkTm9kZXNbaW5kZXhdKSB7XG4gICAgICBzdHlsZS5yZW1vdmVDaGlsZChjaGlsZE5vZGVzW2luZGV4XSk7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkTm9kZXMubGVuZ3RoKSB7XG4gICAgICBzdHlsZS5pbnNlcnRCZWZvcmUoY3NzTm9kZSwgY2hpbGROb2Rlc1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5hcHBlbmRDaGlsZChjc3NOb2RlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlUb1RhZyhzdHlsZSwgb3B0aW9ucywgb2JqKSB7XG4gIHZhciBjc3MgPSBvYmouY3NzO1xuICB2YXIgbWVkaWEgPSBvYmoubWVkaWE7XG4gIHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG4gIGlmIChtZWRpYSkge1xuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnbWVkaWEnLCBtZWRpYSk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlKCdtZWRpYScpO1xuICB9XG5cbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiLmNvbmNhdChidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpLCBcIiAqL1wiKTtcbiAgfSAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG5cbiAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHN0eWxlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlLnJlbW92ZUNoaWxkKHN0eWxlLmZpcnN0Q2hpbGQpO1xuICAgIH1cblxuICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbnZhciBzaW5nbGV0b24gPSBudWxsO1xudmFyIHNpbmdsZXRvbkNvdW50ZXIgPSAwO1xuXG5mdW5jdGlvbiBhZGRTdHlsZShvYmosIG9wdGlvbnMpIHtcbiAgdmFyIHN0eWxlO1xuICB2YXIgdXBkYXRlO1xuICB2YXIgcmVtb3ZlO1xuXG4gIGlmIChvcHRpb25zLnNpbmdsZXRvbikge1xuICAgIHZhciBzdHlsZUluZGV4ID0gc2luZ2xldG9uQ291bnRlcisrO1xuICAgIHN0eWxlID0gc2luZ2xldG9uIHx8IChzaW5nbGV0b24gPSBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucykpO1xuICAgIHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgZmFsc2UpO1xuICAgIHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUgPSBpbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gICAgdXBkYXRlID0gYXBwbHlUb1RhZy5iaW5kKG51bGwsIHN0eWxlLCBvcHRpb25zKTtcblxuICAgIHJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSk7XG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZShvYmopO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlU3R5bGUobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZShvYmogPSBuZXdPYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmUoKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGxpc3QsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307IC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuICAvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cbiAgaWYgKCFvcHRpb25zLnNpbmdsZXRvbiAmJiB0eXBlb2Ygb3B0aW9ucy5zaW5nbGV0b24gIT09ICdib29sZWFuJykge1xuICAgIG9wdGlvbnMuc2luZ2xldG9uID0gaXNPbGRJRSgpO1xuICB9XG5cbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdMaXN0KSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5Eb21baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG5cbiAgICB2YXIgbmV3TGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKG5ld0xpc3QsIG9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IF9pKyspIHtcbiAgICAgIHZhciBfaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tfaV07XG5cbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG5cbiAgICAgIGlmIChzdHlsZXNJbkRvbVtfaW5kZXhdLnJlZmVyZW5jZXMgPT09IDApIHtcbiAgICAgICAgc3R5bGVzSW5Eb21bX2luZGV4XS51cGRhdGVyKCk7XG5cbiAgICAgICAgc3R5bGVzSW5Eb20uc3BsaWNlKF9pbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn07XHJcbmltcG9ydCAqIGFzIGNocm9ubyBmcm9tICdjaHJvbm8tbm9kZSc7XHJcbmltcG9ydCB7IGF4aW9zLCBleHRyYWN0TnVtYmVyIH0gZnJvbSAnLi91dGlscyc7XHJcbmV4cG9ydCBjbGFzcyBDYWxsSGlzdG9yeSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmNhbGxlcklkcyA9IHt9O1xyXG4gICAgfVxyXG4gICAgdXBkYXRlQ2FsbEhpc3RvcnlFbnRyeShjYWxsLCBjYWxsZXJJZCkge1xyXG4gICAgICAgIHZhciBzcGFuID0gY2FsbC5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XHJcbiAgICAgICAgdGhpcy5zaG93VGltZU1hbmFnZXIoY2FsbCwgc3Bhbi5uZXh0U2libGluZy50ZXh0Q29udGVudC50cmltKCksIGNhbGxlcklkKTtcclxuICAgICAgICBpZiAoY2FsbGVySWQgJiYgY2FsbGVySWQudERfTkFNRSAhPT0gJycpIHtcclxuICAgICAgICAgICAgdmFyIHRleHQgPSBzcGFuLnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gY2FsbGVySWQudERfTkFNRTtcclxuICAgICAgICAgICAgdmFyIGJyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKTtcclxuICAgICAgICAgICAgdmFyIHNwYW4yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4gICAgICAgICAgICBzcGFuMi5zdHlsZS5mb250U2l6ZSA9ICdzbWFsbCc7XHJcbiAgICAgICAgICAgIHNwYW4yLnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgICAgICAgICAgc3Bhbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShiciwgc3Bhbi5uZXh0U2libGluZyk7XHJcbiAgICAgICAgICAgIHNwYW4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3BhbjIsIHNwYW4ubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNob3dUaW1lTWFuYWdlcihjYWxsLCBkYXRlLCBjYWxsZXJJZCkge1xyXG4gICAgICAgIHZhciBkYXRlUGFydHMgPSBkYXRlLm1hdGNoKC9eKD88ZGF0ZT4uKiksICg/PGR1cmF0aW9uPlswLTldezJ9OlswLTldezJ9OlswLTldezJ9KSQvKTtcclxuICAgICAgICB2YXIgZHVyYXRpb24gPSAnMDA6MDA6MDAnO1xyXG4gICAgICAgIGlmIChkYXRlUGFydHMpIHtcclxuICAgICAgICAgICAgZGF0ZSA9IGRhdGVQYXJ0cy5ncm91cHMuZGF0ZTtcclxuICAgICAgICAgICAgZHVyYXRpb24gPSBkYXRlUGFydHMuZ3JvdXBzLmR1cmF0aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgcGFyc2VkRGF0ZSA9IGNocm9uby5kZS5wYXJzZURhdGUoZGF0ZSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWREYXRlKSB7XHJcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSBjaHJvbm8ucGFyc2VEYXRlKGRhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXBhcnNlZERhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBEYXRlIHBhcnNpbmcgaXMgYXdmdWwsIGp1c3QgYXNzdW1lIHRoZSBmaXJzdCBudW1iZXIgaXMgdGhlIGRheSBvZiBtb250aFxyXG4gICAgICAgIHZhciBkYXkgPSBkYXRlLm1hdGNoKC9bMC05XSsvKVswXTtcclxuICAgICAgICB2YXIgcGFyc2VkRHVyYXRpb24gPSBjaHJvbm8ucGFyc2VEYXRlKGR1cmF0aW9uKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBjYWxsIGhpc3RvcnkgdGltZTonLCBkYXRlLCAncGFyc2VkRGF0ZTonLCBwYXJzZWREYXRlLCAnZHVyYXRpb246JywgZHVyYXRpb24sICdwYXJzZWREdXJhdGlvbjonLCBwYXJzZWREdXJhdGlvbik7XHJcbiAgICAgICAgdmFyIGNvbm5lY3QgPSBwYXJzZWREYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSArXHJcbiAgICAgICAgICAgIChwYXJzZWREYXRlLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAvLyAoSmFudWFyeSBnaXZlcyAwKVxyXG4gICAgICAgICAgICBkYXkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpICtcclxuICAgICAgICAgICAgcGFyc2VkRGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArXHJcbiAgICAgICAgICAgIHBhcnNlZERhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICB2YXIgbGVuZ3RoID0gKHBhcnNlZER1cmF0aW9uLmdldEhvdXJzKCkgKiA2MCArIHBhcnNlZER1cmF0aW9uLmdldE1pbnV0ZXMoKSkudG9TdHJpbmcoKTtcclxuICAgICAgICB2YXIgdG9vbGJhciA9IGNhbGwucXVlcnlTZWxlY3RvcignLndjVG9vbGJhclRpbGVzJyk7XHJcbiAgICAgICAgdmFyIGhyZWYgPSAnZG9taXppbDovL1BNL1plaXRidWNodW5nPyc7XHJcbiAgICAgICAgaWYgKGNhbGxlcklkICYmIGNhbGxlcklkLnREX0lEKSB7XHJcbiAgICAgICAgICAgIGhyZWYgKz0gJ0tvbnRha3RJZD0nICsgY2FsbGVySWQudERfSUQgKyAnJic7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGhyZWYgKz0gJ2Nvbm5lY3Q9JyArIGNvbm5lY3QgKyAnJmxlbmd0aD0nICsgbGVuZ3RoO1xyXG4gICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIGEudGl0bGUgPSAnUE0gWmVpdGJ1Y2h1bmcnO1xyXG4gICAgICAgIGEuZGF0YXNldC5kb21pemlsTGluayA9IGhyZWY7XHJcbiAgICAgICAgYS5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB3aW5kb3cub3BlbihocmVmKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGEuaW5uZXJIVE1MID0gJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDU1OS45OCA1NTkuOThcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIj4nICtcclxuICAgICAgICAgICAgJzxnPicgK1xyXG4gICAgICAgICAgICAnICA8Zz4nICtcclxuICAgICAgICAgICAgJyAgICA8cGF0aCBkPVwiTTI3OS45OSwwQzEyNS42MDEsMCwwLDEyNS42MDEsMCwyNzkuOTljMCwxNTQuMzksMTI1LjYwMSwyNzkuOTksMjc5Ljk5LDI3OS45OWMxNTQuMzksMCwyNzkuOTktMTI1LjYwMSwyNzkuOTktMjc5Ljk5JyArXHJcbiAgICAgICAgICAgICcgICAgICBDNTU5Ljk4LDEyNS42MDEsNDM0LjM4LDAsMjc5Ljk5LDB6IE0yNzkuOTksNDk4Ljc4Yy0xMjAuNjQ0LDAtMjE4Ljc5LTk4LjE0Ni0yMTguNzktMjE4Ljc5JyArXHJcbiAgICAgICAgICAgICcgICAgICBjMC0xMjAuNjM4LDk4LjE0Ni0yMTguNzksMjE4Ljc5LTIxOC43OXMyMTguNzksOTguMTUyLDIxOC43OSwyMTguNzlDNDk4Ljc4LDQwMC42MzQsNDAwLjYzNCw0OTguNzgsMjc5Ljk5LDQ5OC43OHpcIi8+JyArXHJcbiAgICAgICAgICAgICcgICAgPHBhdGggZD1cIk0zMDQuMjI2LDI4MC4zMjZWMTYyLjk3NmMwLTEzLjEwMy0xMC42MTgtMjMuNzIxLTIzLjcxNi0yMy43MjFjLTEzLjEwMiwwLTIzLjcyMSwxMC42MTgtMjMuNzIxLDIzLjcyMXYxMjQuOTI4JyArXHJcbiAgICAgICAgICAgICcgICAgICBjMCwwLjM3MywwLjA5MiwwLjcyMywwLjExLDEuMDk2Yy0wLjMxMiw2LjQ1LDEuOTEsMTIuOTk5LDYuODM2LDE3LjkyNmw4OC4zNDMsODguMzM2YzkuMjY2LDkuMjY2LDI0LjI4NCw5LjI2NiwzMy41NDMsMCcgK1xyXG4gICAgICAgICAgICAnICAgICAgYzkuMjYtOS4yNjYsOS4yNjYtMjQuMjg0LDAtMzMuNTQ0TDMwNC4yMjYsMjgwLjMyNnpcIi8+JyArXHJcbiAgICAgICAgICAgICcgIDwvZz4nICtcclxuICAgICAgICAgICAgJzwvZz4nICtcclxuICAgICAgICAgICAgJzwvc3ZnPic7XHJcbiAgICAgICAgdG9vbGJhci5pbnNlcnRCZWZvcmUoYSwgdG9vbGJhci5maXJzdENoaWxkKTtcclxuICAgIH1cclxuICAgIHNob3dDYWxsSGlzdG9yeShlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgdmFyIHNwYW4gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTtcclxuICAgICAgICAgICAgdmFyIG51bWJlciA9IGV4dHJhY3ROdW1iZXIoc3Bhbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgIGlmICghbnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGxIaXN0b3J5RW50cnkoZWxlbWVudCwgdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jYWxsZXJJZHNbbnVtYmVyXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGxIaXN0b3J5RW50cnkoZWxlbWVudCwgdGhpcy5jYWxsZXJJZHNbbnVtYmVyXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSB5aWVsZCBheGlvcy5nZXQoJ2h0dHA6Ly9jcGF0YXBpLmNwc3J2d2ViMjAxNi5jcC1hdXN0cmlhLmF0L2NhbGxlcmlkLycgKyBlbmNvZGVVUklDb21wb25lbnQobnVtYmVyKSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgY2FsbGVySWQgPSB7IHREX05BTUU6ICcnIH07XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsZXJJZCA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBjYWxsIGhpc3Ryb3kgY2FsbGVyaWQgcmVzcG9uc2UnLCBudW1iZXIsIHJlc3BvbnNlLCBjYWxsZXJJZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxlcklkc1tudW1iZXJdID0gY2FsbGVySWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNhbGxIaXN0b3J5RW50cnkoZWxlbWVudCwgY2FsbGVySWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59O1xyXG5pbXBvcnQgeyBheGlvcywgZXh0cmFjdE51bWJlciB9IGZyb20gJy4vdXRpbHMnO1xyXG5leHBvcnQgY2xhc3MgQ2FsbE5vdGlmaWNhdGlvbiB7XHJcbiAgICBzaG93Q2FsbE5vdGlmaWNhdGlvbihlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgdmFyIG51bWJlciA9IGVsZW1lbnQuZGF0YXNldC5pZDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RBUEkgY2FsbCBub3RpZmljYXRpb24nLCBudW1iZXIpO1xyXG4gICAgICAgICAgICBudW1iZXIgPSBleHRyYWN0TnVtYmVyKG51bWJlcik7XHJcbiAgICAgICAgICAgIGlmICghbnVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBjYWxsZXJpZCBubyBudW1iZXIgZm91bmQnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBzZWFyY2hpbmcgY2FsbGVyaWQgZm9yJywgbnVtYmVyKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0geWllbGQgYXhpb3MuZ2V0KCdodHRwOi8vY3BhdGFwaS5jcHNydndlYjIwMTYuY3AtYXVzdHJpYS5hdC9jYWxsZXJpZC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KG51bWJlcikpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBjYWxsZXJpZCByZXNwb25zZScsIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgdmFyIG5vdGlmaWNhdGlvbiA9IHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IG51bWJlclxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBjYWxsZXJJZCA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGVySWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24udGV4dCA9IGNhbGxlcklkLnREX05BTUUgKyAnXFxyXFxuJyArIG51bWJlciArICcgKCcgKyBjYWxsZXJJZC50RF9NRURJVU0gKyAnKSc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXHJcbiAgICAgICAgICAgIEdNLm5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuL2RlYm91bmNlJztcclxuaW1wb3J0IHsgYXhpb3MsIGZpcmVDaGFuZ2VFdmVudHMgfSBmcm9tICcuL3V0aWxzJztcclxuZXhwb3J0IGNsYXNzIFNlYXJjaCB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5kb1NlYXJjaCA9IGRlYm91bmNlKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgdmFyIHNlYXJjaCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YXBpU2VhcmNoSW5wdXQnKTtcclxuICAgICAgICAgICAgdmFyIHNlYXJjaFRleHQgPSBzZWFyY2gudmFsdWUudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAoc2VhcmNoVGV4dCA9PT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VhcmNoUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHNlYXJjaFRleHQgPT09IHRoaXMuY3VycmVudFNlYXJjaFRleHQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2VhcmNoaW5nIFRBUEknKTtcclxuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0geWllbGQgYXhpb3MuZ2V0KCdodHRwOi8vY3BhdGFwaS5jcHNydndlYjIwMTYuY3AtYXVzdHJpYS5hdC9zZWFyY2g/cXVlcnk9JyArIGVuY29kZVVSSUNvbXBvbmVudChzZWFyY2hUZXh0KSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUQVBJIFNlYXJjaCByZXNwb25zZScsIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RBUEkgQ29udGFjdHMnLCBjb250YWN0cyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VhcmNoUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXh0ID0gc2VhcmNoVGV4dDtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdExpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpO1xyXG4gICAgICAgICAgICByZXN1bHRMaXN0LmlkID0gJ3RhcGlSZXN1bHRzJztcclxuICAgICAgICAgICAgcmVzdWx0TGlzdC5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbmF2LWFic29sdXRlJyk7XHJcbiAgICAgICAgICAgIHJlc3VsdExpc3QuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW5hdi11bCcpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFwaVNlYXJjaEJveCcpLmFwcGVuZENoaWxkKHJlc3VsdExpc3QpO1xyXG4gICAgICAgICAgICByZXN1bHRMaXN0LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgICAgICBjb250YWN0cy5mb3JFYWNoKGNvbnRhY3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtcclxuICAgICAgICAgICAgICAgIGxpLmNsYXNzTGlzdC5hZGQoJ3RhcGktc2VhcmNoLXJlc3VsdCcpO1xyXG4gICAgICAgICAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLXJlc3VsdCcpO1xyXG4gICAgICAgICAgICAgICAgbGkuY2xhc3NMaXN0LmFkZCgncG9pbnRlcicpO1xyXG4gICAgICAgICAgICAgICAgbGkub25tb3VzZW92ZXIgPSAoKSA9PiB7IHRoaXMuc2VsZWN0UmVzdWx0KGxpKTsgfTtcclxuICAgICAgICAgICAgICAgIGxpLmRhdGFzZXQudGFwaU51bWJlciA9IGNvbnRhY3QudERfTlVNQkVSX1RBUEk7XHJcbiAgICAgICAgICAgICAgICBsaS5vbmNsaWNrID0gKCkgPT4geyB0aGlzLmRpYWwoY29udGFjdC50RF9OVU1CRVJfVEFQSSk7IH07XHJcbiAgICAgICAgICAgICAgICBsaS5zdHlsZS5saXN0U3R5bGUgPSAnb3V0c2lkZSBub25lIG5vbmUnOyAvLyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFRleHQuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLXJlc3VsdC10eHQnKTtcclxuICAgICAgICAgICAgICAgIGxpLmFwcGVuZENoaWxkKHJlc3VsdFRleHQpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgICAgICBsaW5lMS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250YWN0LnREX05BTUUpKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFRleHQuYXBwZW5kQ2hpbGQobGluZTEpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpbmUyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgICAgICBsaW5lMi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250YWN0LnREX01FRElVTSArICc6ICcgKyBjb250YWN0LnREX05VTUJFUl9UQVBJKSk7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRUZXh0LmFwcGVuZENoaWxkKGxpbmUyKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdExpc3QuYXBwZW5kQ2hpbGQobGkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KSwgMjAwKTtcclxuICAgIH1cclxuICAgIGNyZWF0ZVNlYXJjaFdpbmRvdyhlbGVtZW50KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0NyZWF0ZSBUQVBJIFNlYXJjaCcpO1xyXG4gICAgICAgIHZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xyXG4gICAgICAgIGZvcm0uc3R5bGUud2lkdGggPSAnMjAwcHgnO1xyXG4gICAgICAgIGZvcm0uc3R5bGUuZmxvYXQgPSAncmlnaHQnO1xyXG4gICAgICAgIGZvcm0uc3R5bGUubWFyZ2luUmlnaHQgPSAnMjBweCc7XHJcbiAgICAgICAgZm9ybS5vbnN1Ym1pdCA9ICgpID0+IHtcclxuICAgICAgICAgICAgdmFyIGl0ZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFwaS1zZWFyY2gtcmVzdWx0LXNlbGVjdGVkJyk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFwaS1zZWFyY2gtcmVzdWx0Jyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlhbChpdGVtc1swXS5kYXRhc2V0LnRhcGlOdW1iZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZhciBzZWFyY2hCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBzZWFyY2hCb3guY2xhc3NMaXN0LmFkZCgnY29udGFjdC1zZWFyY2gtYm94Jyk7XHJcbiAgICAgICAgc2VhcmNoQm94LmlkID0gJ3RhcGlTZWFyY2hCb3gnO1xyXG4gICAgICAgIGZvcm0uYXBwZW5kQ2hpbGQoc2VhcmNoQm94KTtcclxuICAgICAgICB2YXIgc2VhcmNoV3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHNlYXJjaFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLWlucHV0LXdyYXBwZXInKTtcclxuICAgICAgICBzZWFyY2hXcmFwcGVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICBzZWFyY2hCb3guYXBwZW5kQ2hpbGQoc2VhcmNoV3JhcHBlcik7XHJcbiAgICAgICAgdmFyIHNlYXJjaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgICAgc2VhcmNoLmlkID0gJ3RhcGlTZWFyY2hJbnB1dCc7XHJcbiAgICAgICAgc2VhcmNoLmF1dG9jb21wbGV0ZSA9ICdvZmYnO1xyXG4gICAgICAgIHNlYXJjaC5jbGFzc0xpc3QuYWRkKCdwYWRkZXInKTtcclxuICAgICAgICBzZWFyY2guY2xhc3NMaXN0LmFkZCgncm91bmRlZCcpO1xyXG4gICAgICAgIHNlYXJjaC5jbGFzc0xpc3QuYWRkKCdiZy1saWdodCcpO1xyXG4gICAgICAgIHNlYXJjaC5jbGFzc0xpc3QuYWRkKCduby1ib3JkZXInKTtcclxuICAgICAgICBzZWFyY2guY2xhc3NMaXN0LmFkZCgnY29udGFjdC1zZWFyY2gtYm94Jyk7XHJcbiAgICAgICAgc2VhcmNoLnBsYWNlaG9sZGVyID0gJ1RBUEkgU3VjaGUnO1xyXG4gICAgICAgIHNlYXJjaC5vbmZvY3VzID0gKCkgPT4geyB0aGlzLmRvU2VhcmNoKCk7IH07XHJcbiAgICAgICAgc2VhcmNoLm9ua2V5ZG93biA9IChldikgPT4geyB0aGlzLmRvU2VhcmNoS2V5RG93bihldik7IH07XHJcbiAgICAgICAgc2VhcmNoLm9uYmx1ciA9ICgpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RBUEkgU2VhcmNoIGV4aXQnLCB0aGlzKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVEFQSSBjbGVhciBzZWFyY2ggcmVzdWx0cycpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTZWFyY2hSZXN1bHRzKCk7XHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBzZWFyY2hXcmFwcGVyLmFwcGVuZENoaWxkKHNlYXJjaCk7XHJcbiAgICAgICAgdmFyIGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKCdmYScpO1xyXG4gICAgICAgIGljb24uY2xhc3NMaXN0LmFkZCgnZmEtc2VhcmNoJyk7XHJcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKCdmb3JtLWNvbnRyb2wtZmVlZGJhY2snKTtcclxuICAgICAgICBpY29uLnN0eWxlLmNvbG9yID0gJ2dyZXknO1xyXG4gICAgICAgIHNlYXJjaFdyYXBwZXIuYXBwZW5kQ2hpbGQoaWNvbik7XHJcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChmb3JtKTtcclxuICAgIH1cclxuICAgIHJlbW92ZVNlYXJjaFJlc3VsdHMoKSB7XHJcbiAgICAgICAgdmFyIHJlc3VsdExpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFwaVJlc3VsdHMnKTtcclxuICAgICAgICBpZiAocmVzdWx0TGlzdCkge1xyXG4gICAgICAgICAgICByZXN1bHRMaXN0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVzdWx0TGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRleHQgPSAnJztcclxuICAgIH1cclxuICAgIGRvU2VhcmNoS2V5RG93bihldikge1xyXG4gICAgICAgIGlmIChldi5rZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXBpLXNlYXJjaC1yZXN1bHQtc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gaXRlbXNbMF0ucHJldmlvdXNTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcHJldikge1xyXG4gICAgICAgICAgICAgICAgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXBpLXNlYXJjaC1yZXN1bHQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJlc3VsdChwcmV2KTtcclxuICAgICAgICAgICAgICAgIHByZXYuc2Nyb2xsSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZXYua2V5ID09PSAnQXJyb3dEb3duJykge1xyXG4gICAgICAgICAgICBsZXQgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXBpLXNlYXJjaC1yZXN1bHQtc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gaXRlbXNbMF0ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFuZXh0KSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhcGktc2VhcmNoLXJlc3VsdCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG5leHQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0UmVzdWx0KG5leHQpO1xyXG4gICAgICAgICAgICAgICAgbmV4dC5zY3JvbGxJbnRvVmlldyhmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZG9TZWFyY2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzZWxlY3RSZXN1bHQocmVzdWx0TGkpIHtcclxuICAgICAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXBpLXNlYXJjaC1yZXN1bHQnKTtcclxuICAgICAgICBmb3IgKHZhciBpdGVtIG9mIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgnYmctbGlnaHQnKTtcclxuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKCd0YXBpLXNlYXJjaC1yZXN1bHQtc2VsZWN0ZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzdWx0TGkuY2xhc3NMaXN0LmFkZCgnYmctbGlnaHQnKTtcclxuICAgICAgICByZXN1bHRMaS5jbGFzc0xpc3QuYWRkKCd0YXBpLXNlYXJjaC1yZXN1bHQtc2VsZWN0ZWQnKTtcclxuICAgIH1cclxuICAgIGRpYWwobnVtYmVyKSB7XHJcbiAgICAgICAgdmFyIHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoJ3NlYXJjaEJ5TnVtYmVySW5wdXQnKTtcclxuICAgICAgICBpZiAoc2VhcmNoSW5wdXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBzZWFyY2hJbnB1dFswXS52YWx1ZSA9IG51bWJlcjtcclxuICAgICAgICAgICAgc2VhcmNoSW5wdXRbMF0uZm9jdXMoKTtcclxuICAgICAgICAgICAgZmlyZUNoYW5nZUV2ZW50cyhzZWFyY2hJbnB1dFswXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufTtcclxuaW1wb3J0ICcuL3N0YXR1cy5jc3MnO1xyXG5pbXBvcnQgeyBheGlvcyB9IGZyb20gJy4vdXRpbHMnO1xyXG5leHBvcnQgY2xhc3MgU3RhdHVzIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zdGF0dXNPbiA9ICdtZW51QXZhaWxhYmxlJztcclxuICAgICAgICB0aGlzLl9zdGF0dXNPZmYgPSAnbWVudUF3YXknO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBzaG93U3RhdHVzKGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xyXG4gICAgICAgICAgICB0aGlzLl91c2VyID0geWllbGQgR00uZ2V0VmFsdWUoJ3RhcGktemMtdXNlcicsICcnKTtcclxuICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHlpZWxkIEdNLmdldFZhbHVlKCd0YXBpLXpjLWVuYWJsZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1c09uID0geWllbGQgR00uZ2V0VmFsdWUoJ3RhcGktemMtb24nLCAnbWVudUF2YWlsYWJsZScpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXNPZmYgPSB5aWVsZCBHTS5nZXRWYWx1ZSgndGFwaS16Yy1vZmYnLCAnbWVudUF2YWlsYWJsZScpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygndGFwaS16Yy11c2VyJywgdGhpcy5fdXNlciwgJ3RhcGktemMtZW5hYmxlZCcsIHRoaXMuX2VuYWJsZWQsICd0YXBpLXpjLW9uJywgdGhpcy5fc3RhdHVzT24sICd0YXBpLXpjLW9mZicsIHRoaXMuX3N0YXR1c09mZik7XHJcbiAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoJ3RhcGktZHJvcGRvd24nKTtcclxuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgICBidXR0b24uaWQgPSAndGFwaS16Yy1idXR0b24nO1xyXG4gICAgICAgICAgICBidXR0b24uY2xhc3NMaXN0LmFkZCgnYnRuJyk7XHJcbiAgICAgICAgICAgIGJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdidG4tZGVmYXVsdCcpO1xyXG4gICAgICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gJ1plaXRDb25zZW5zJztcclxuICAgICAgICAgICAgYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFwaS16Yy1kcm9wZG93bicpLmNsYXNzTGlzdC50b2dnbGUoJ3Nob3cnKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnICA8bGFiZWwgZm9yPVwidGFwaS16Yy11c2VyXCI+VXNlcm5hbWU8L2xhYmVsPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBuYW1lPVwidGFwaS16Yy11c2VyXCIgaWQ9XCJ0YXBpLXpjLXVzZXJcIj4nICtcclxuICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcclxuICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgPGxhYmVsIGZvcj1cInRhcGktemMtb25cIj5TaWduZWQgaW48L2xhYmVsPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgPHNlbGVjdCBpZD1cInRhcGktemMtb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibWVudUF2YWlsYWJsZVwiPkF2YWlsYWJsZTwvb3B0aW9uPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibWVudU91dG9mb2ZmaWNlXCI+RG8gTm90IERpc3R1cmI8L29wdGlvbj4nICtcclxuICAgICAgICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIm1lbnVDdXN0b20xXCI+VmVyZsO8Z2JhciBEVzwvb3B0aW9uPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgPC9zZWxlY3Q+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj4nICtcclxuICAgICAgICAgICAgICAgICcgIDxsYWJlbCBmb3I9XCJ0YXBpLXpjLW9mZlwiPlNpZ25lZCBpbjwvbGFiZWw+JyArXHJcbiAgICAgICAgICAgICAgICAnICA8c2VsZWN0IGlkPVwidGFwaS16Yy1vZmZcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibWVudUF3YXlcIj5Bd2F5PC9vcHRpb24+JyArXHJcbiAgICAgICAgICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJtZW51T3V0b2ZvZmZpY2VcIj5EbyBOb3QgRGlzdHVyYjwvb3B0aW9uPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgPC9zZWxlY3Q+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+JyArXHJcbiAgICAgICAgICAgICAgICAnICA8bGFiZWwgY2xhc3M9XCJpLWNoZWNrc1wiIGZvcj1cInRhcGktemMtZW5hYmxlZFwiPicgK1xyXG4gICAgICAgICAgICAgICAgJyAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0YXBpLXpjLWVuYWJsZWRcIj4nICtcclxuICAgICAgICAgICAgICAgICcgICAgPGk+PC9pPjxzcGFuPkVuYWJsZWQ8L3NwYW4+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9sYWJlbD4nO1xyXG4gICAgICAgICAgICAnPC9kaXY+JztcclxuICAgICAgICAgICAgdmFyIGRyb3Bkb3duID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoJ3RhcGktZHJvcGRvd24tY29udGVudCcpO1xyXG4gICAgICAgICAgICBkcm9wZG93bi5jbGFzc0xpc3QuYWRkKCdwYW5lbC1ib2R5Jyk7XHJcbiAgICAgICAgICAgIGRyb3Bkb3duLmlkID0gJ3RhcGktemMtZHJvcGRvd24nO1xyXG4gICAgICAgICAgICBkcm9wZG93bi5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZHJvcGRvd24pO1xyXG4gICAgICAgICAgICBlbGVtZW50Lmluc2VydEJlZm9yZShkaXYsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIHZhciB6Y1VzZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFwaS16Yy11c2VyJyk7XHJcbiAgICAgICAgICAgIHpjVXNlci52YWx1ZSA9IHRoaXMuX3VzZXI7XHJcbiAgICAgICAgICAgIHpjVXNlci5vbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VzZXIgPSB6Y1VzZXIudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBHTS5zZXRWYWx1ZSgndGFwaS16Yy11c2VyJywgdGhpcy5fdXNlcik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGFwaS16Yy11c2VyJywgdGhpcy5fdXNlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdHVzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB2YXIgemNFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhcGktemMtZW5hYmxlZCcpO1xyXG4gICAgICAgICAgICB6Y0VuYWJsZWQuY2hlY2tlZCA9IHRoaXMuX2VuYWJsZWQ7XHJcbiAgICAgICAgICAgIHpjRW5hYmxlZC5vbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSB6Y0VuYWJsZWQuY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIEdNLnNldFZhbHVlKCd0YXBpLXpjLWVuYWJsZWQnLCB0aGlzLl9lbmFibGVkKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0YXBpLXpjLWVuYWJsZWQnLCB0aGlzLl9lbmFibGVkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciB6Y09uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhcGktemMtb24nKTtcclxuICAgICAgICAgICAgemNPbi52YWx1ZSA9IHRoaXMuX3N0YXR1c09uO1xyXG4gICAgICAgICAgICB6Y09uLm9uY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdHVzT24gPSB6Y09uLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgR00uc2V0VmFsdWUoJ3RhcGktemMtb24nLCB0aGlzLl9zdGF0dXNPbik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGFwaS16Yy1vbicsIHRoaXMuX3N0YXR1c09uKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZhciB6Y09mZiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YXBpLXpjLW9mZicpO1xyXG4gICAgICAgICAgICB6Y09mZi52YWx1ZSA9IHRoaXMuX3N0YXR1c09mZjtcclxuICAgICAgICAgICAgemNPZmYub25jaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXNPZmYgPSB6Y09mZi52YWx1ZTtcclxuICAgICAgICAgICAgICAgIEdNLnNldFZhbHVlKCd0YXBpLXpjLW9mZicsIHRoaXMuX3N0YXR1c09mZik7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGFwaS16Yy1vZmYnLCB0aGlzLl9zdGF0dXNPZmYpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFN0YXR1cyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1N0YXR1cygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY2hlY2tTdGF0dXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IHlpZWxkIGF4aW9zLmdldCgnaHR0cDovL2NwYXRhcGkuY3BzcnZ3ZWIyMDE2LmNwLWF1c3RyaWEuYXQvYXZhaWxhYmlsaXR5LycgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5fdXNlcikpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAyMDApIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFN0YXR1cyAhPT0gc3RhdHVzLmxvZ2dlZEluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0dXMgPSBzdGF0dXMubG9nZ2VkSW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdOZXcgc3RhdHVzLCBsb2dnZWRJbicsIHRoaXMuX2N1cnJlbnRTdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiY3VycmVudC1zdGF0dXNcIilbMF0uY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdHVzSWQgPSB0aGlzLl9jdXJyZW50U3RhdHVzID8gdGhpcy5fc3RhdHVzT24gOiB0aGlzLl9zdGF0dXNPZmY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzdGF0dXNJZCkuY2xpY2soKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrU3RhdHVzKCksIDEwMDAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBeGlvc1Jlc3BvbnNlXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBkYXRhXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBoZWFkZXJzXHJcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWdcclxuICogQHByb3BlcnR5IHtPYmplY3R9IHJlcXVlc3RcclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvZGVcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0YXR1c1RleHRcclxuICovXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBBeGlvc0Vycm9yXHJcbiAqIEBwcm9wZXJ0eSB7QXhpb3NSZXNwb25zZX0gcmVzcG9uc2VcclxuICovXHJcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XHJcbmltcG9ydCBhZGFwdGVyIGZyb20gJ2F4aW9zLXVzZXJzY3JpcHQtYWRhcHRlcic7XHJcbmF4aW9zLmRlZmF1bHRzLmFkYXB0ZXIgPSBhZGFwdGVyO1xyXG5leHBvcnQgeyBheGlvcyB9O1xyXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE51bWJlcihzKSB7XHJcbiAgICB2YXIgbWF0Y2ggPSAvKFxcKz9bMC05XXs0LH0pLy5leGVjKHMpO1xyXG4gICAgaWYgKCFtYXRjaCkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICB2YXIgbnVtYmVyID0gbWF0Y2hbMV07XHJcbiAgICBpZiAobnVtYmVyLnN0YXJ0c1dpdGgoJysnKSkge1xyXG4gICAgICAgIG51bWJlciA9IG51bWJlci5yZXBsYWNlKCcrJywgJzAwJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBmaXJlQ2hhbmdlRXZlbnRzKGVsZW1lbnQpIHtcclxuICAgIHZhciBjaGFuZ2VFdmVudCA9IG51bGw7XHJcbiAgICBjaGFuZ2VFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XHJcbiAgICBjaGFuZ2VFdmVudC5pbml0RXZlbnQoJ2lucHV0JywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgY29uc29sZS5kZWJ1ZygnaW5wdXQgZXZlbnQgZGlzcGF0Y2hlZCBmb3IgZWxlbWVudDogJyArIGVsZW1lbnQuaWQpO1xyXG4gICAgY2hhbmdlRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpO1xyXG4gICAgY2hhbmdlRXZlbnQuaW5pdEV2ZW50KCdrZXl1cCcsIHRydWUsIHRydWUpO1xyXG4gICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcclxuICAgIGNvbnNvbGUuZGVidWcoJ2tleXVwIGV2ZW50IGRpc3BhdGNoZWQgZm9yIGVsZW1lbnQ6ICcgKyBlbGVtZW50LmlkKTtcclxuICAgIGNoYW5nZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKTtcclxuICAgIGNoYW5nZUV2ZW50LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xyXG4gICAgY29uc29sZS5kZWJ1ZygnY2hhbmdlIGV2ZW50IGRpc3BhdGNoZWQgZm9yIGVsZW1lbnQ6ICcgKyBlbGVtZW50LmlkKTtcclxufVxyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IGF4aW9zOyIsIm1vZHVsZS5leHBvcnRzID0gYXhpb3NHbXhockFkYXB0ZXI7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHRpZDogbW9kdWxlSWQsXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iaiwgcHJvcCkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7IH0iLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCAqIGFzIGNocm9ubyBmcm9tICdjaHJvbm8tbm9kZSdcbmltcG9ydCB7IENhbGxIaXN0b3J5IH0gZnJvbSAnLi9jYWxsLWhpc3RvcnknXG5pbXBvcnQgeyBDYWxsTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9jYWxsLW5vdGlmaWNhdGlvbidcbmltcG9ydCB7IFNlYXJjaCB9IGZyb20gJy4vc2VhcmNoJ1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9zdGF0dXMnXG5cbmNvbnNvbGUubG9nKCdzY3JpcHQgc3RhcnQnKVxuXG5jb25zdCBzZWFyY2ggPSBuZXcgU2VhcmNoKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxud2FpdEZvcktleUVsZW1lbnRzKCdkaXYubmF2LXNlYXJjaCcsIChlbGVtZW50KSA9PiB7IHNlYXJjaC5jcmVhdGVTZWFyY2hXaW5kb3coZWxlbWVudCkgfSwgdHJ1ZSlcblxuY29uc3QgY2FsbE5vdGlmaWNhdGlvbiA9IG5ldyBDYWxsTm90aWZpY2F0aW9uKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxud2FpdEZvcktleUVsZW1lbnRzKCdjYWxsLXZpZXcnLCAoZWxlbWVudCkgPT4geyBjYWxsTm90aWZpY2F0aW9uLnNob3dDYWxsTm90aWZpY2F0aW9uKGVsZW1lbnQpIH0sIGZhbHNlKVxuXG5jb25zdCBjYWxsSGlzdG9yeSA9IG5ldyBDYWxsSGlzdG9yeSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbndhaXRGb3JLZXlFbGVtZW50cygnLmNhbGwtaGlzdG9yeS1saXN0IGNhbGwnLCAoZWxlbWVudCkgPT4geyBjYWxsSGlzdG9yeS5zaG93Q2FsbEhpc3RvcnkoZWxlbWVudCkgfSwgZmFsc2UpXG5cbmNvbnN0IHN0YXR1cyA9IG5ldyBTdGF0dXMoKVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG53YWl0Rm9yS2V5RWxlbWVudHMoJyNzdGF0dXMtY2hhbmdlJywgKGVsZW1lbnQpID0+IHsgc3RhdHVzLnNob3dTdGF0dXMoZWxlbWVudCkgfSwgZmFsc2UpXG4iXSwic291cmNlUm9vdCI6IiJ9