@magic-xpa/utils
Version:
magic utils package
259 lines (258 loc) • 22.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
// In order to convert some functionality to Visual C#, the Java Language Conversion Assistant
// creates "support classes" that duplicate the original functionality.
//
// Support classes replicate the functionality of the original code, but in some cases they are
// substantially different architecturally. Although every effort is made to preserve the
// original architecture of the application in the converted project, the user should be aware that
// the primary goal of these support classes is to replicate functionality, and that at times
// the architecture of the resulting solution may differ somewhat.
import { StringBuilder, NString, NNumber, DateTime, RefParam } from "@magic-xpa/mscorelib";
var Misc = /** @class */ (function () {
function Misc() {
}
/// <summary>
/// Writes the exception stack trace to the received stream
/// </summary>
/// <param name="throwable">Exception to obtain information from</param>
/// <param name="stream">Output sream used to write to</param>
/**
* @param {?} throwable
* @return {?}
*/
Misc.WriteStackTrace = /**
* @param {?} throwable
* @return {?}
*/
function (throwable) {
console.log(throwable.Message);
console.log(throwable.StackTrace);
};
/// <summary>
/// Receives a byte array and returns it transformed in an byte array
/// </summary>
/// <param name="byteArray">Byte array to process</param>
/// <returns>The transformed array</returns>
/**
* @param {?} byteArray
* @return {?}
*/
Misc.ToSByteArray = /**
* @param {?} byteArray
* @return {?}
*/
function (byteArray) {
/** @type {?} */
var sbyteArray = null;
if (byteArray !== null) {
sbyteArray = new Int8Array(byteArray.length);
for (var i = 0; i < byteArray.length; i = i + 1) {
sbyteArray[i] = /** @type {?} */ (byteArray[i]);
}
}
return sbyteArray;
};
/// <summary>
/// Receives sbyte array and returns it transformed in a byte array
/// </summary>
/// <param name="sbyteArray">sbyte array to process</param>
/// <returns>The transformed array</returns>
/**
* @param {?} sbyteArray
* @return {?}
*/
Misc.ToByteArray = /**
* @param {?} sbyteArray
* @return {?}
*/
function (sbyteArray) {
/** @type {?} */
var byteArray = null;
if (sbyteArray !== null) {
byteArray = new Uint8Array(sbyteArray.length);
for (var i = 0; i < sbyteArray.length; i = i + 1) {
byteArray[i] = /** @type {?} */ (sbyteArray[i]);
}
}
return byteArray;
};
/// <summary> Compares number of bytes in two byte arrays</summary>
/// <param name="source"></param>
/// <param name="destination"></param>
/// <param name="numberOfBytes"></param>
/// <returns> boolen true if equal</returns>
/**
* @param {?} source
* @param {?} destination
* @param {?} numberOfBytes
* @return {?}
*/
Misc.CompareByteArray = /**
* @param {?} source
* @param {?} destination
* @param {?} numberOfBytes
* @return {?}
*/
function (source, destination, numberOfBytes) {
if (source.length >= numberOfBytes && destination.length >= numberOfBytes) {
for (var len = 0; len < numberOfBytes; len++) {
if (source[len] !== destination[len])
return false;
}
}
else
return false;
return true;
};
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
// TODO: instead of calling URShift(number, bits), we can use((uint)number) >> bits.
/**
* @param {?} number
* @param {?} bits
* @return {?}
*/
Misc.URShift = /**
* @param {?} number
* @param {?} bits
* @return {?}
*/
function (number, bits) {
/** @type {?} */
var result;
if (number >= 0) {
result = number >> bits;
}
else {
result = (number >> bits) + (2 << ~bits);
}
return result;
};
/// <summary>
/// get system's time in milliseconds
/// </summary>
/// <returns></returns>
/**
* @return {?}
*/
Misc.getSystemMilliseconds = /**
* @return {?}
*/
function () {
// TODO - check if we need this adjustment
return Math.floor((DateTime.Now.Ticks - 621355968000000000) / 10000);
};
/// <summary>
/// Compares 2 int arrays
/// </summary>
/// <param name="arrayOne"></param>
/// <param name="arrayTwo"></param>
/// <returns>true if arrays are equal else false</returns>
/**
* @param {?} arrayOne
* @param {?} arrayTwo
* @return {?}
*/
Misc.CompareIntArrays = /**
* @param {?} arrayOne
* @param {?} arrayTwo
* @return {?}
*/
function (arrayOne, arrayTwo) {
/** @type {?} */
var areEqual = false;
if (arrayOne === arrayTwo) {
areEqual = true;
}
else {
if (arrayOne !== null && arrayTwo !== null) {
if (arrayOne.length === arrayTwo.length) {
for (var i = 0; i < arrayOne.length; i = i + 1) {
if (arrayOne[i] !== arrayTwo[i]) {
break;
}
areEqual = true;
}
}
}
}
return areEqual;
};
/// <summary>
/// Returns the comma separated string for the values passed in int array.
/// </summary>
/// <param name="values">Integer array</param>
/// <returns>comma separated string</returns>
/**
* @param {?} intArray
* @return {?}
*/
Misc.GetCommaSeperatedString = /**
* @param {?} intArray
* @return {?}
*/
function (intArray) {
/** @type {?} */
var temp = new StringBuilder();
for (var val = 0; val < intArray.length; val = val + 1) {
/** @type {?} */
var value = intArray[val];
if (temp.Length > 0) {
temp.Append(",");
}
temp.Append(value);
}
return temp.ToString();
};
/// <summary>
/// Returns int array out of comma separated string
/// </summary>
/// <param name="value">comma separated string</param>
/// <returns>Integer array</returns>
/**
* @param {?} commaSeparatedValue
* @return {?}
*/
Misc.GetIntArray = /**
* @param {?} commaSeparatedValue
* @return {?}
*/
function (commaSeparatedValue) {
/** @type {?} */
var intArray = new Array(0);
if (!NString.IsNullOrEmpty(commaSeparatedValue)) {
/** @type {?} */
var vals = commaSeparatedValue.split(',');
intArray = new Array(vals.length);
/** @type {?} */
var outInt = new RefParam(0);
for (var iCtr = 0; iCtr < vals.length; iCtr = iCtr + 1) {
/** @type {?} */
var _r = NNumber.TryParse(vals[iCtr], outInt);
intArray[iCtr] = outInt.value;
}
}
return intArray;
};
/**
* @param {?} fileName
* @return {?}
*/
Misc.IsWebUrl = /**
* @param {?} fileName
* @return {?}
*/
function (fileName) {
return fileName.toLowerCase().startsWith("http");
};
return Misc;
}());
export { Misc };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtYWdpYy14cGEvdXRpbHMvIiwic291cmNlcyI6WyJzcmMvTWlzYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFVQSxPQUFPLEVBQ00sYUFBYSxFQUN4QixPQUFPLEVBQUUsT0FBTyxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNuQixNQUFNLHNCQUFzQixDQUFDO0FBTzlCLElBQUE7OztJQUVFLGFBQWE7SUFDYiwyREFBMkQ7SUFDM0QsY0FBYztJQUNkLHdFQUF3RTtJQUN4RSw4REFBOEQ7Ozs7O0lBQ3ZELG9CQUFlOzs7O0lBQXRCLFVBQXVCLFNBQW9CO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsYUFBYTtJQUNiLHFFQUFxRTtJQUNyRSxjQUFjO0lBQ2QseURBQXlEO0lBQ3pELDRDQUE0Qzs7Ozs7SUFDckMsaUJBQVk7Ozs7SUFBbkIsVUFBb0IsU0FBcUI7O1FBQ3ZDLElBQUksVUFBVSxHQUFjLElBQUksQ0FBQztRQUNqQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN2QixVQUFVLEdBQUcsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxVQUFVLENBQUMsQ0FBQyxDQUFDLHFCQUFXLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO2FBQ3RDO1NBQ0Y7UUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0tBQ25CO0lBRUQsYUFBYTtJQUNiLG1FQUFt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c0RBQXNEO0lBQ3RELG9DQUFvQzs7Ozs7SUFDN0IsZ0JBQVc7Ozs7SUFBbEIsVUFBbUIsbUJBQTJCOztRQUM1QyxJQUFJLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ2hELElBQUksSUFBSSxHQUFhLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDOztZQUUxQyxJQUFJLE1BQU0sR0FBcUIsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQVcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7O2dCQUMvRCxJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDL0I7U0FDRjtRQUVELE1BQU0sQ0FBQyxRQUFRLENBQUM7S0FDakI7Ozs7O0lBRU0sYUFBUTs7OztJQUFmLFVBQWdCLFFBQWdCO1FBQzlCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2xEO2VBakxIO0lBa0xDLENBQUE7QUE3SkQsZ0JBNkpDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8gY29udmVydCBzb21lIGZ1bmN0aW9uYWxpdHkgdG8gVmlzdWFsIEMjLCB0aGUgSmF2YSBMYW5ndWFnZSBDb252ZXJzaW9uIEFzc2lzdGFudFxyXG4vLyBjcmVhdGVzIFwic3VwcG9ydCBjbGFzc2VzXCIgdGhhdCBkdXBsaWNhdGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uYWxpdHkuXHJcbi8vXHJcbi8vIFN1cHBvcnQgY2xhc3NlcyByZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIG9yaWdpbmFsIGNvZGUsIGJ1dCBpbiBzb21lIGNhc2VzIHRoZXkgYXJlXHJcbi8vIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50IGFyY2hpdGVjdHVyYWxseS4gQWx0aG91Z2ggZXZlcnkgZWZmb3J0IGlzIG1hZGUgdG8gcHJlc2VydmUgdGhlXHJcbi8vIG9yaWdpbmFsIGFyY2hpdGVjdHVyZSBvZiB0aGUgYXBwbGljYXRpb24gaW4gdGhlIGNvbnZlcnRlZCBwcm9qZWN0LCB0aGUgdXNlciBzaG91bGQgYmUgYXdhcmUgdGhhdFxyXG4vLyB0aGUgcHJpbWFyeSBnb2FsIG9mIHRoZXNlIHN1cHBvcnQgY2xhc3NlcyBpcyB0byByZXBsaWNhdGUgZnVuY3Rpb25hbGl0eSwgYW5kIHRoYXQgYXQgdGltZXNcclxuLy8gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgcmVzdWx0aW5nIHNvbHV0aW9uIG1heSBkaWZmZXIgc29tZXdoYXQuXHJcblxyXG5cclxuaW1wb3J0IHtcclxuICBFeGNlcHRpb24sIFN0cmluZ0J1aWxkZXIsXHJcbiAgTlN0cmluZywgTk51bWJlcixcclxuICBEYXRlVGltZSwgUmVmUGFyYW1cclxufSBmcm9tIFwiQG1hZ2ljLXhwYS9tc2NvcmVsaWJcIjtcclxuXHJcblxyXG5cclxuLy8vIDxzdW1tYXJ5PlxyXG4vLy8gQ29udGFpbnMgY29udmVyc2lvbiBzdXBwb3J0IGVsZW1lbnRzIHN1Y2ggYXMgY2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgc3RhdGljIG1ldGhvZHMuXHJcbi8vLyA8L3N1bW1hcnk+XHJcbmV4cG9ydCBjbGFzcyBNaXNjIHtcclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB0byB0aGUgcmVjZWl2ZWQgc3RyZWFtXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ0aHJvd2FibGVcIj5FeGNlcHRpb24gdG8gb2J0YWluIGluZm9ybWF0aW9uIGZyb208L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInN0cmVhbVwiPk91dHB1dCBzcmVhbSB1c2VkIHRvIHdyaXRlIHRvPC9wYXJhbT5cclxuICBzdGF0aWMgV3JpdGVTdGFja1RyYWNlKHRocm93YWJsZTogRXhjZXB0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyh0aHJvd2FibGUuTWVzc2FnZSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aHJvd2FibGUuU3RhY2tUcmFjZSk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJlY2VpdmVzIGEgYnl0ZSBhcnJheSBhbmQgcmV0dXJucyBpdCB0cmFuc2Zvcm1lZCBpbiBhbiBieXRlIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJieXRlQXJyYXlcIj5CeXRlIGFycmF5IHRvIHByb2Nlc3M8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgdHJhbnNmb3JtZWQgYXJyYXk8L3JldHVybnM+XHJcbiAgc3RhdGljIFRvU0J5dGVBcnJheShieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBJbnQ4QXJyYXkge1xyXG4gICAgbGV0IHNieXRlQXJyYXk6IEludDhBcnJheSA9IG51bGw7XHJcbiAgICBpZiAoYnl0ZUFycmF5ICE9PSBudWxsKSB7XHJcbiAgICAgIHNieXRlQXJyYXkgPSBuZXcgSW50OEFycmF5KGJ5dGVBcnJheS5sZW5ndGgpO1xyXG4gICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgYnl0ZUFycmF5Lmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgc2J5dGVBcnJheVtpXSA9IDxudW1iZXI+Ynl0ZUFycmF5W2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc2J5dGVBcnJheTtcclxuICB9XHJcblxyXG4gIC8vLyA8c3VtbWFyeT5cclxuICAvLy8gUmVjZWl2ZXMgc2J5dGUgYXJyYXkgYW5kIHJldHVybnMgaXQgdHJhbnNmb3JtZWQgaW4gYSBieXRlIGFycmF5XHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJzYnl0ZUFycmF5XCI+c2J5dGUgYXJyYXkgdG8gcHJvY2VzczwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPlRoZSB0cmFuc2Zvcm1lZCBhcnJheTwvcmV0dXJucz5cclxuICBzdGF0aWMgVG9CeXRlQXJyYXkoc2J5dGVBcnJheTogSW50OEFycmF5KTogVWludDhBcnJheSB7XHJcbiAgICBsZXQgYnl0ZUFycmF5OiBVaW50OEFycmF5ID0gbnVsbDtcclxuICAgIGlmIChzYnl0ZUFycmF5ICE9PSBudWxsKSB7XHJcbiAgICAgIGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KHNieXRlQXJyYXkubGVuZ3RoKTtcclxuICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHNieXRlQXJyYXkubGVuZ3RoOyBpID0gaSArIDEpIHtcclxuICAgICAgICBieXRlQXJyYXlbaV0gPSA8bnVtYmVyPnNieXRlQXJyYXlbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBieXRlQXJyYXk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+IENvbXBhcmVzIG51bWJlciBvZiBieXRlcyBpbiB0d28gYnl0ZSBhcnJheXM8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwic291cmNlXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJkZXN0aW5hdGlvblwiPjwvcGFyYW0+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibnVtYmVyT2ZCeXRlc1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPiBib29sZW4gdHJ1ZSBpZiBlcXVhbDwvcmV0dXJucz5cclxuICBzdGF0aWMgQ29tcGFyZUJ5dGVBcnJheShzb3VyY2U6IFVpbnQ4QXJyYXksIGRlc3RpbmF0aW9uOiBVaW50OEFycmF5LCBudW1iZXJPZkJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGlmIChzb3VyY2UubGVuZ3RoID49IG51bWJlck9mQnl0ZXMgJiYgZGVzdGluYXRpb24ubGVuZ3RoID49IG51bWJlck9mQnl0ZXMpIHtcclxuICAgICAgZm9yIChsZXQgbGVuOiBudW1iZXIgPSAwOyBsZW4gPCBudW1iZXJPZkJ5dGVzOyBsZW4rKykge1xyXG4gICAgICAgIGlmIChzb3VyY2VbbGVuXSAhPT0gZGVzdGluYXRpb25bbGVuXSlcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFBlcmZvcm1zIGFuIHVuc2lnbmVkIGJpdHdpc2UgcmlnaHQgc2hpZnQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlclxyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxwYXJhbSBuYW1lPVwibnVtYmVyXCI+TnVtYmVyIHRvIG9wZXJhdGUgb248L3BhcmFtPlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImJpdHNcIj5BbW1vdW50IG9mIGJpdHMgdG8gc2hpZnQ8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5UaGUgcmVzdWx0aW5nIG51bWJlciBmcm9tIHRoZSBzaGlmdCBvcGVyYXRpb248L3JldHVybnM+XHJcbiAgLy8gVE9ETzogaW5zdGVhZCBvZiBjYWxsaW5nIFVSU2hpZnQobnVtYmVyLCBiaXRzKSwgd2UgY2FuIHVzZSgodWludCludW1iZXIpID4+IGJpdHMuXHJcbiAgc3RhdGljIFVSU2hpZnQobnVtYmVyOiBudW1iZXIsIGJpdHM6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQgcmVzdWx0OiBudW1iZXI7XHJcbiAgICBpZiAobnVtYmVyID49IDApIHtcclxuICAgICAgcmVzdWx0ID0gbnVtYmVyID4+IGJpdHM7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmVzdWx0ID0gKG51bWJlciA+PiBiaXRzKSArICgyIDw8IH5iaXRzKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIGdldCBzeXN0ZW0ncyB0aW1lIGluIG1pbGxpc2Vjb25kc1xyXG4gIC8vLyA8L3N1bW1hcnk+XHJcbiAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5cclxuICBzdGF0aWMgZ2V0U3lzdGVtTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XHJcbiAgICAvLyBUT0RPIC0gY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGFkanVzdG1lbnRcclxuICAgIHJldHVybiBNYXRoLmZsb29yKChEYXRlVGltZS5Ob3cuVGlja3MgLSA2MjEzNTU5NjgwMDAwMDAwMDApIC8gMTAwMDApO1xyXG4gIH1cclxuXHJcbiAgLy8vIDxzdW1tYXJ5PlxyXG4gIC8vLyBDb21wYXJlcyAyIGludCBhcnJheXNcclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cImFycmF5T25lXCI+PC9wYXJhbT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJhcnJheVR3b1wiPjwvcGFyYW0+XHJcbiAgLy8vIDxyZXR1cm5zPnRydWUgaWYgYXJyYXlzIGFyZSBlcXVhbCBlbHNlIGZhbHNlPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBDb21wYXJlSW50QXJyYXlzKGFycmF5T25lOiBudW1iZXJbXSwgYXJyYXlUd286IG51bWJlcltdKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgYXJlRXF1YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGlmIChhcnJheU9uZSA9PT0gYXJyYXlUd28pIHtcclxuICAgICAgYXJlRXF1YWwgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChhcnJheU9uZSAhPT0gbnVsbCAmJiBhcnJheVR3byAhPT0gbnVsbCkge1xyXG4gICAgICAgIGlmIChhcnJheU9uZS5sZW5ndGggPT09IGFycmF5VHdvLmxlbmd0aCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGFycmF5T25lLmxlbmd0aDsgaSA9IGkgKyAxKSB7XHJcbiAgICAgICAgICAgIGlmIChhcnJheU9uZVtpXSAhPT0gYXJyYXlUd29baV0pIHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhcmVFcXVhbCA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXJlRXF1YWw7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgdGhlIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgZm9yIHRoZSB2YWx1ZXMgcGFzc2VkIGluIGludCBhcnJheS5cclxuICAvLy8gPC9zdW1tYXJ5PlxyXG4gIC8vLyA8cGFyYW0gbmFtZT1cInZhbHVlc1wiPkludGVnZXIgYXJyYXk8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5jb21tYSBzZXBhcmF0ZWQgc3RyaW5nPC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRDb21tYVNlcGVyYXRlZFN0cmluZyhpbnRBcnJheTogbnVtYmVyW10pOiBzdHJpbmcge1xyXG4gICAgbGV0IHRlbXA6IFN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpO1xyXG4gICAgZm9yIChsZXQgdmFsOiBudW1iZXIgPSAwOyB2YWwgPCBpbnRBcnJheS5sZW5ndGg7IHZhbCA9IHZhbCArIDEpIHtcclxuICAgICAgbGV0IHZhbHVlOiBudW1iZXIgPSBpbnRBcnJheVt2YWxdO1xyXG4gICAgICBpZiAodGVtcC5MZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGVtcC5BcHBlbmQoXCIsXCIpO1xyXG4gICAgICB9XHJcbiAgICAgIHRlbXAuQXBwZW5kKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wLlRvU3RyaW5nKCk7XHJcbiAgfVxyXG5cclxuICAvLy8gPHN1bW1hcnk+XHJcbiAgLy8vIFJldHVybnMgaW50IGFycmF5IG91dCBvZiBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nXHJcbiAgLy8vIDwvc3VtbWFyeT5cclxuICAvLy8gPHBhcmFtIG5hbWU9XCJ2YWx1ZVwiPmNvbW1hIHNlcGFyYXRlZCBzdHJpbmc8L3BhcmFtPlxyXG4gIC8vLyA8cmV0dXJucz5JbnRlZ2VyIGFycmF5PC9yZXR1cm5zPlxyXG4gIHN0YXRpYyBHZXRJbnRBcnJheShjb21tYVNlcGFyYXRlZFZhbHVlOiBzdHJpbmcpOiBudW1iZXJbXSB7XHJcbiAgICBsZXQgaW50QXJyYXk6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oMCk7XHJcblxyXG4gICAgaWYgKCFOU3RyaW5nLklzTnVsbE9yRW1wdHkoY29tbWFTZXBhcmF0ZWRWYWx1ZSkpIHtcclxuICAgICAgbGV0IHZhbHM6IHN0cmluZ1tdID0gY29tbWFTZXBhcmF0ZWRWYWx1ZS5zcGxpdCgnLCcpO1xyXG4gICAgICBpbnRBcnJheSA9IG5ldyBBcnJheTxudW1iZXI+KHZhbHMubGVuZ3RoKTtcclxuXHJcbiAgICAgIGxldCBvdXRJbnQ6IFJlZlBhcmFtPG51bWJlcj4gPSBuZXcgUmVmUGFyYW0oMCk7XHJcbiAgICAgIGZvciAobGV0IGlDdHI6IG51bWJlciA9IDA7IGlDdHIgPCB2YWxzLmxlbmd0aDsgaUN0ciA9IGlDdHIgKyAxKSB7XHJcbiAgICAgICAgbGV0IF9yID0gTk51bWJlci5UcnlQYXJzZSh2YWxzW2lDdHJdLCBvdXRJbnQpO1xyXG4gICAgICAgIGludEFycmF5W2lDdHJdID0gb3V0SW50LnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGludEFycmF5O1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIElzV2ViVXJsKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJodHRwXCIpO1xyXG4gIH1cclxufVxyXG4iXX0=