@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
145 lines • 18.1 kB
JavaScript
/**
* This class consists exclusively of the static methods that operate on or return results of the different cipher algorythms
*/
export class Ciphers {
/**
* Generates UUID ver. 4
* @returns UUID
*/
static uuid_v4() {
let d = new Date().getTime(); //Timestamp
let arr = Ciphers.UUID_V4_PIC.map((c) => {
if ("-4".indexOf(c) >= 0)
return c;
let r = Math.random() * 16; //random number between 0 and 16
if (d > 0) { //Use timestamp until depleted
r = (d + r) % 16 | 0;
d = Math.floor(d / 16);
}
else { //Use microseconds since page-load if supported
let d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now() * 1000)) || 0; //Time in microseconds since page-load or 0 if unsupported
r = (d2 + r) % 16 | 0;
d2 = Math.floor(d2 / 16);
}
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return arr.join("");
}
/**
* Returns the numeric hash value of the some string key
* @param key String value
* @param mapSize A value for modulo division
* @returns Calculated hash value
*/
static keyHash(key, mapSize) {
let keyHash = 0;
let nLen = key.length;
for (let i = 0; i < nLen; i++) {
keyHash = (3 * keyHash + key.charCodeAt(i)) % mapSize;
}
return keyHash;
}
/* https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript */
/* https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ */
/**
* Gets the hash code of the string just like Java's hashCode() method does
* @param source A string for which you want to get a hash code
* @returns Numeric hash code of the `source`
* @see {@link encode}
*/
static hashCode(source) {
if (typeof (source) === "string") {
let hash = 0;
let nLen = source.length;
if (nLen > 0) {
let chr;
let i = -1;
while (++i < nLen) {
chr = source.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
}
return hash >>> 0; // to positive value
}
return 0;
}
/* Found here: https://gist.github.com/vaiorabbit/5657561 */
/* Ref.: http://isthe.com/chongo/tech/comp/fnv/ */
/**
* Calculate a 32 bit FNV-1a hash
* @param {string} source the input value
* @param {integer} [seed] optionally pass the hash of the previous chunk
* @returns Numeric hash code of the `source`
*/
static hashFnv32a(source, seed) {
if (typeof source === "string") {
let nLen = source.length;
if (nLen > 0) {
const FNV1_32A_INIT = 0x811c9dc5;
let hval = FNV1_32A_INIT;
if (typeof seed === "number") {
hval = seed;
}
let i = -1;
while (++i < nLen) {
hval ^= source.charCodeAt(i);
hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
}
return hval >>> 0; // to positive value
}
}
return 0;
}
/**
* Decode string that was encoded in `format`
* @param source Source encoded string
* @param format Encoding format. Default is `Base64`
* @returns Decoded string if succeededs, or an empty string ('') if some error occurs
* @see {@link encode}
*/
static decode(source, format = "Base64") {
if (typeof (source) == "string" && typeof (format) == "string") {
switch (format.trim().toLowerCase()) {
case "base64":
return new TextDecoder().decode(new Uint8Array(atob(source).split('').map((char) => char.charCodeAt(0))));
case "uri":
try {
return decodeURI(source);
}
catch (error) {
// URIError
}
}
}
return "";
}
/**
* Encode string to specified format
* @param source Source string to encode
* @param {EncodingFormat} format Encoding format
* @returns Encoded string if succeeded, or an empty string ('') if some error occurs
* @see {@link decode}
* @see {@link hashCode}
*/
static encode(source, format = "Base64") {
if (typeof (source) == "string" && typeof (format) == "string") {
switch (format.trim().toLowerCase()) {
case "base64":
return btoa(Array.from(new TextEncoder().encode(source))
.map((n) => String.fromCharCode(n))
.join(''));
case "uri":
try {
return encodeURI(source);
}
catch (error) {
// URIError
}
}
}
return "";
}
}
Ciphers.UUID_V4_PIC = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.split("");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2lwaGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2N1dGUtY29yZS9zcmMvbGliL3V0aWwvQ2lwaGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxPQUFPO0lBRWxCOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFdBQVc7UUFDekMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsZ0NBQWdDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFLLDhCQUE4QjtnQkFDNUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JCLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzthQUN4QjtpQkFBTSxFQUFTLCtDQUErQztnQkFDN0QsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sV0FBVyxLQUFLLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQSwwREFBMEQ7Z0JBQ2hLLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3lCQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2xDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNmLEtBQUssS0FBSztvQkFDUixJQUFJO3dCQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMxQjtvQkFBQyxPQUFPLEtBQUssRUFBRTt3QkFDZCxXQUFXO3FCQUNaO2FBQ0o7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7QUF4SWMsbUJBQVcsR0FBRyxzQ0FBc0MsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBFbmNvZGluZ0Zvcm1hdCA9IFwiQmFzZTY0XCIgfCBcIlVSSVwiO1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgY2xhc3MgY29uc2lzdHMgZXhjbHVzaXZlbHkgb2YgdGhlIHN0YXRpYyBtZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBvciByZXR1cm4gcmVzdWx0cyBvZiB0aGUgZGlmZmVyZW50IGNpcGhlciBhbGdvcnl0aG1zXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ2lwaGVycyB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgVVVJRF9WNF9QSUMgPSAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5zcGxpdChcIlwiKTtcclxuICAvKipcclxuICAgKiBHZW5lcmF0ZXMgVVVJRCB2ZXIuIDRcclxuICAgKiBAcmV0dXJucyBVVUlEXHJcbiAgICovXHJcbiAgc3RhdGljIHV1aWRfdjQoKTogc3RyaW5nIHtcclxuICAgIGxldCBkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7IC8vVGltZXN0YW1wXHJcbiAgICBsZXQgYXJyID0gQ2lwaGVycy5VVUlEX1Y0X1BJQy5tYXAoKGMpID0+IHtcclxuICAgICAgaWYgKFwiLTRcIi5pbmRleE9mKGMpID49IDApIHJldHVybiBjO1xyXG4gICAgICBsZXQgciA9IE1hdGgucmFuZG9tKCkgKiAxNjsgLy9yYW5kb20gbnVtYmVyIGJldHdlZW4gMCBhbmQgMTZcclxuICAgICAgaWYgKGQgPiAwKSB7ICAgIC8vVXNlIHRpbWVzdGFtcCB1bnRpbCBkZXBsZXRlZFxyXG4gICAgICAgIHIgPSAoZCArIHIpICUgMTYgfCAwO1xyXG4gICAgICAgIGQgPSBNYXRoLmZsb29yKGQgLyAxNik7XHJcbiAgICAgIH0gZWxzZSB7ICAgICAgICAvL1VzZSBtaWNyb3NlY29uZHMgc2luY2UgcGFnZS1sb2FkIGlmIHN1cHBvcnRlZFxyXG4gICAgICAgIGxldCBkMiA9ICgodHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJykgJiYgcGVyZm9ybWFuY2Uubm93ICYmIChwZXJmb3JtYW5jZS5ub3coKSAqIDEwMDApKSB8fCAwOy8vVGltZSBpbiBtaWNyb3NlY29uZHMgc2luY2UgcGFnZS1sb2FkIG9yIDAgaWYgdW5zdXBwb3J0ZWRcclxuICAgICAgICByID0gKGQyICsgcikgJSAxNiB8IDA7XHJcbiAgICAgICAgZDIgPSBNYXRoLmZsb29yKGQyIC8gMTYpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAoYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KSkudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYXJyLmpvaW4oXCJcIik7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIG51bWVyaWMgaGFzaCB2YWx1ZSBvZiB0aGUgc29tZSBzdHJpbmcga2V5XHJcbiAgICogQHBhcmFtIGtleSBTdHJpbmcgdmFsdWVcclxuICAgKiBAcGFyYW0gbWFwU2l6ZSAgQSB2YWx1ZSBmb3IgbW9kdWxvIGRpdmlzaW9uXHJcbiAgICogQHJldHVybnMgQ2FsY3VsYXRlZCBoYXNoIHZhbHVlXHJcbiAgICovXHJcbiAgc3RhdGljIGtleUhhc2goa2V5OiBzdHJpbmcsIG1hcFNpemU6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICBsZXQga2V5SGFzaCA9IDA7XHJcbiAgICBsZXQgbkxlbiA9IGtleS5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5MZW47IGkrKykge1xyXG4gICAgICBrZXlIYXNoID0gKDMqa2V5SGFzaCArICBrZXkuY2hhckNvZGVBdChpKSkgJSBtYXBTaXplO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleUhhc2g7XHJcbiAgfVxyXG4gIC8qIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc2MTY0NjEvZ2VuZXJhdGUtYS1oYXNoLWZyb20tc3RyaW5nLWluLWphdmFzY3JpcHQgICAgICAgICovXHJcbiAgLyogaHR0cHM6Ly93ZXJ4bHRkLmNvbS93cC8yMDEwLzA1LzEzL2phdmFzY3JpcHQtaW1wbGVtZW50YXRpb24tb2YtamF2YXMtc3RyaW5nLWhhc2hjb2RlLW1ldGhvZC8gKi9cclxuICAvKipcclxuICAgKiBHZXRzIHRoZSBoYXNoIGNvZGUgb2YgdGhlIHN0cmluZyBqdXN0IGxpa2UgSmF2YSdzIGhhc2hDb2RlKCkgbWV0aG9kIGRvZXNcclxuICAgKiBAcGFyYW0gc291cmNlIEEgc3RyaW5nIGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgYSBoYXNoIGNvZGVcclxuICAgKiBAcmV0dXJucyBOdW1lcmljIGhhc2ggY29kZSBvZiB0aGUgYHNvdXJjZWBcclxuICAgKiBAc2VlIHtAbGluayBlbmNvZGV9XHJcbiAgICovXHJcbiAgc3RhdGljIGhhc2hDb2RlKHNvdXJjZTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICh0eXBlb2YgKHNvdXJjZSkgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgbGV0IGhhc2ggPSAwXHJcbiAgICAgIGxldCBuTGVuID0gc291cmNlLmxlbmd0aDtcclxuICAgICAgaWYgKG5MZW4gPiAwKSB7XHJcbiAgICAgICAgbGV0IGNocjogbnVtYmVyO1xyXG4gICAgICAgIGxldCBpOiBudW1iZXIgPSAtMTtcclxuICAgICAgICB3aGlsZSAoKytpIDwgbkxlbikge1xyXG4gICAgICAgICAgY2hyID0gc291cmNlLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaHI7XHJcbiAgICAgICAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gaGFzaCA+Pj4gMDsgIC8vIHRvIHBvc2l0aXZlIHZhbHVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcbiAgLyogRm91bmQgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vdmFpb3JhYmJpdC81NjU3NTYxICovXHJcbiAgLyogUmVmLjogaHR0cDovL2lzdGhlLmNvbS9jaG9uZ28vdGVjaC9jb21wL2Zudi8gICAgICAgICAgICovXHJcbiAgLyoqXHJcbiAgICogQ2FsY3VsYXRlIGEgMzIgYml0IEZOVi0xYSBoYXNoXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSB0aGUgaW5wdXQgdmFsdWVcclxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IFtzZWVkXSBvcHRpb25hbGx5IHBhc3MgdGhlIGhhc2ggb2YgdGhlIHByZXZpb3VzIGNodW5rXHJcbiAgICogQHJldHVybnMgTnVtZXJpYyBoYXNoIGNvZGUgb2YgdGhlIGBzb3VyY2VgXHJcbiAgICovXHJcbiAgc3RhdGljIGhhc2hGbnYzMmEoc291cmNlOiBzdHJpbmcsIHNlZWQ/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgbGV0IG5MZW4gPSBzb3VyY2UubGVuZ3RoO1xyXG4gICAgICBpZiAobkxlbiA+IDApIHtcclxuICAgICAgICBjb25zdCBGTlYxXzMyQV9JTklUID0gMHg4MTFjOWRjNTtcclxuICAgICAgICBsZXQgaHZhbCA9IEZOVjFfMzJBX0lOSVQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBzZWVkID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICBodmFsID0gc2VlZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGkgPSAtMTtcclxuICAgICAgICB3aGlsZSAoKytpIDwgbkxlbikge1xyXG4gICAgICAgICAgaHZhbCBePSBzb3VyY2UuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgIGh2YWwgKz0gKGh2YWwgPDwgMSkgKyAoaHZhbCA8PCA0KSArIChodmFsIDw8IDcpICsgKGh2YWwgPDwgOCkgKyAoaHZhbCA8PCAyNCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBodmFsID4+PiAwOyAgIC8vIHRvIHBvc2l0aXZlIHZhbHVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEZWNvZGUgc3RyaW5nIHRoYXQgd2FzIGVuY29kZWQgaW4gYGZvcm1hdGBcclxuICAgKiBAcGFyYW0gc291cmNlICBTb3VyY2UgZW5jb2RlZCBzdHJpbmdcclxuICAgKiBAcGFyYW0gZm9ybWF0ICBFbmNvZGluZyBmb3JtYXQuIERlZmF1bHQgaXMgYEJhc2U2NGBcclxuICAgKiBAcmV0dXJucyBEZWNvZGVkIHN0cmluZyBpZiBzdWNjZWVkZWRzLCBvciBhbiBlbXB0eSBzdHJpbmcgKCcnKSBpZiBzb21lIGVycm9yIG9jY3Vyc1xyXG4gICAqIEBzZWUge0BsaW5rIGVuY29kZX1cclxuICAgKi9cclxuICBzdGF0aWMgZGVjb2RlKHNvdXJjZTogc3RyaW5nLCBmb3JtYXQ6IEVuY29kaW5nRm9ybWF0ID0gXCJCYXNlNjRcIik6IHN0cmluZyB7XHJcbiAgICBpZiAodHlwZW9mIChzb3VyY2UpID09IFwic3RyaW5nXCIgJiYgdHlwZW9mIChmb3JtYXQpID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgc3dpdGNoIChmb3JtYXQudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKFxyXG4gICAgICAgICAgICBuZXcgVWludDhBcnJheShhdG9iKHNvdXJjZSkuc3BsaXQoJycpLm1hcCgoY2hhcikgPT4gY2hhci5jaGFyQ29kZUF0KDApKSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgY2FzZSBcInVyaVwiOlxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSShzb3VyY2UpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgLy8gVVJJRXJyb3JcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEVuY29kZSBzdHJpbmcgdG8gc3BlY2lmaWVkIGZvcm1hdFxyXG4gICAqIEBwYXJhbSBzb3VyY2UgIFNvdXJjZSBzdHJpbmcgdG8gZW5jb2RlXHJcbiAgICogQHBhcmFtIHtFbmNvZGluZ0Zvcm1hdH0gZm9ybWF0IEVuY29kaW5nIGZvcm1hdFxyXG4gICAqIEByZXR1cm5zIEVuY29kZWQgc3RyaW5nIGlmIHN1Y2NlZWRlZCwgb3IgYW4gZW1wdHkgc3RyaW5nICgnJykgaWYgc29tZSBlcnJvciBvY2N1cnNcclxuICAgKiBAc2VlIHtAbGluayBkZWNvZGV9XHJcbiAgICogQHNlZSB7QGxpbmsgaGFzaENvZGV9XHJcbiAgICovXHJcbiAgc3RhdGljIGVuY29kZShzb3VyY2U6IHN0cmluZywgZm9ybWF0OiBFbmNvZGluZ0Zvcm1hdCA9IFwiQmFzZTY0XCIpOiBzdHJpbmcge1xyXG4gICAgaWYgKHR5cGVvZiAoc291cmNlKSA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiAoZm9ybWF0KSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIHN3aXRjaCAoZm9ybWF0LnRyaW0oKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgY2FzZSBcImJhc2U2NFwiOlxyXG4gICAgICAgICAgcmV0dXJuIGJ0b2EoQXJyYXkuZnJvbShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc291cmNlKSlcclxuICAgICAgICAgICAgLm1hcCgobikgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShuKSlcclxuICAgICAgICAgICAgLmpvaW4oJycpKTtcclxuICAgICAgICBjYXNlIFwidXJpXCI6XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJKHNvdXJjZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAvLyBVUklFcnJvclxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gXCJcIjtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==