Skip to content

Instantly share code, notes, and snippets.

@w33ble
Created May 3, 2017 18:40
Show Gist options
  • Save w33ble/9aed0aa9a3d33505317cc18b03abbe2e to your computer and use it in GitHub Desktop.
Save w33ble/9aed0aa9a3d33505317cc18b03abbe2e to your computer and use it in GitHub Desktop.
requirebin sketch
var rison = require('rison-node');
var appState = {
filters: {},
query: {
querystring: {
analyze_wildcard: true,
query: "my query here",
}
}
};
var encoded = rison.encode(appState);
document.querySelector('body').innerHTML = `Encoded object: ${encoded}`;
setTimeout(function(){
;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"rison-node":[function(require,module,exports){
(function (global){
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.rison = f()}})(function(){var define,module,exports;
var rison = {};
//////////////////////////////////////////////////
//
// the stringifier is based on
// http://json.org/json.js as of 2006-04-28 from json.org
// the parser is based on
// http://osteele.com/sources/openlaszlo/json
//
if (typeof rison == 'undefined')
window.rison = {};
/**
* rules for an uri encoder that is more tolerant than encodeURIComponent
*
* encodeURIComponent passes ~!*()-_.'
*
* we also allow ,:@$/
*
*/
rison.uri_ok = { // ok in url paths and in form query args
'~': true, '!': true, '*': true, '(': true, ')': true,
'-': true, '_': true, '.': true, ',': true,
':': true, '@': true, '$': true,
"'": true, '/': true
};
/*
* we divide the uri-safe glyphs into three sets
* <rison> - used by rison ' ! : ( ) ,
* <reserved> - not common in strings, reserved * @ $ & ; =
*
* we define <identifier> as anything that's not forbidden
*/
/**
* punctuation characters that are legal inside ids.
*/
// this var isn't actually used
//rison.idchar_punctuation = "_-./~";
(function () {
var l = [];
for (var hi = 0; hi < 16; hi++) {
for (var lo = 0; lo < 16; lo++) {
if (hi+lo == 0) continue;
var c = String.fromCharCode(hi*16 + lo);
if (! /\w|[-_.\/~]/.test(c))
l.push('\\u00' + hi.toString(16) + lo.toString(16));
}
}
/**
* characters that are illegal inside ids.
* <rison> and <reserved> classes are illegal in ids.
*
*/
rison.not_idchar = l.join('')
//idcrx = new RegExp('[' + rison.not_idchar + ']');
//console.log('NOT', (idcrx.test(' ')) );
})();
//rison.not_idchar = " \t\r\n\"<>[]{}'!=:(),*@$;&";
rison.not_idchar = " '!:(),*@$";
/**
* characters that are illegal as the start of an id
* this is so ids can't look like numbers.
*/
rison.not_idstart = "-0123456789";
(function () {
var idrx = '[^' + rison.not_idstart + rison.not_idchar +
'][^' + rison.not_idchar + ']*';
rison.id_ok = new RegExp('^' + idrx + '$');
// regexp to find the end of an id when parsing
// g flag on the regexp is necessary for iterative regexp.exec()
rison.next_id = new RegExp(idrx, 'g');
})();
/**
* this is like encodeURIComponent() but quotes fewer characters.
*
* @see rison.uri_ok
*
* encodeURIComponent passes ~!*()-_.'
* rison.quote also passes ,:@$/
* and quotes " " as "+" instead of "%20"
*/
rison.quote = function(x) {
if (/^[-A-Za-z0-9~!*()_.',:@$\/]*$/.test(x))
return x;
return encodeURIComponent(x)
.replace(/%2C/g, ',')
.replace(/%3A/g, ':')
.replace(/%40/g, '@')
.replace(/%24/g, '$')
.replace(/%2F/g, '/')
.replace(/%20/g, '+');
};
//
// based on json.js 2006-04-28 from json.org
// license: http://www.json.org/license.html
//
// hacked by nix for use in uris.
//
(function () {
var sq = { // url-ok but quoted in strings
"'": true, '!': true
},
enc = function (v) {
if (v && typeof v.toJSON === 'function') v = v.toJSON();
var fn = s[typeof v];
if (fn) return fn(v);
},
s = {
array: function (x) {
var a = ['!('], b, f, i, l = x.length, v;
for (i = 0; i < l; i += 1) {
v = enc(x[i]);
if (typeof v == 'string') {
if (b) {
a[a.length] = ',';
}
a[a.length] = v;
b = true;
}
}
a[a.length] = ')';
return a.join('');
},
'boolean': function (x) {
if (x)
return '!t';
return '!f'
},
'null': function (x) {
return "!n";
},
number: function (x) {
if (!isFinite(x))
return '!n';
// strip '+' out of exponent, '-' is ok though
return String(x).replace(/\+/,'');
},
object: function (x) {
if (x) {
if (x instanceof Array) {
return s.array(x);
}
// WILL: will this work on non-Firefox browsers?
if (typeof x.__prototype__ === 'object' && typeof x.__prototype__.encode_rison !== 'undefined')
return x.encode_rison();
var a = ['('], b, f, i, v, ki, ks=[];
for (i in x)
ks[ks.length] = i;
ks.sort();
for (ki = 0; ki < ks.length; ki++) {
i = ks[ki];
v = enc(x[i]);
if (typeof v == 'string') {
if (b) {
a[a.length] = ',';
}
a.push(s.string(i), ':', v);
b = true;
}
}
a[a.length] = ')';
return a.join('');
}
return '!n';
},
string: function (x) {
if (x == '')
return "''";
if (rison.id_ok.test(x))
return x;
x = x.replace(/(['!])/g, function(a, b) {
if (sq[b]) return '!'+b;
return b;
});
return "'" + x + "'";
},
undefined: function (x) {
// ignore undefined just like JSON
return;
}
};
/**
* rison-encode a javascript structure
*
* implemementation based on Douglas Crockford's json.js:
* http://json.org/json.js as of 2006-04-28 from json.org
*
*/
rison.encode = function (v) {
return enc(v);
};
/**
* rison-encode a javascript object without surrounding parens
*
*/
rison.encode_object = function (v) {
if (typeof v != 'object' || v === null || v instanceof Array)
throw new Error("rison.encode_object expects an object argument");
var r = s[typeof v](v);
return r.substring(1, r.length-1);
};
/**
* rison-encode a javascript array without surrounding parens
*
*/
rison.encode_array = function (v) {
if (!(v instanceof Array))
throw new Error("rison.encode_array expects an array argument");
var r = s[typeof v](v);
return r.substring(2, r.length-1);
};
/**
* rison-encode and uri-encode a javascript structure
*
*/
rison.encode_uri = function (v) {
return rison.quote(s[typeof v](v));
};
})();
//
// based on openlaszlo-json and hacked by nix for use in uris.
//
// Author: Oliver Steele
// Copyright: Copyright 2006 Oliver Steele. All rights reserved.
// Homepage: http://osteele.com/sources/openlaszlo/json
// License: MIT License.
// Version: 1.0
/**
* parse a rison string into a javascript structure.
*
* this is the simplest decoder entry point.
*
* based on Oliver Steele's OpenLaszlo-JSON
* http://osteele.com/sources/openlaszlo/json
*/
rison.decode = function(r) {
var errcb = function(e) { throw Error('rison decoder error: ' + e); };
// validate input is a string
if (typeof r !== 'string')
return errcb("decode input must be a string");
var p = new rison.parser(errcb);
return p.parse(r);
};
/**
* parse an o-rison string into a javascript structure.
*
* this simply adds parentheses around the string before parsing.
*/
rison.decode_object = function(r) {
return rison.decode('('+r+')');
};
/**
* parse an a-rison string into a javascript structure.
*
* this simply adds array markup around the string before parsing.
*/
rison.decode_array = function(r) {
return rison.decode('!('+r+')');
};
/**
* construct a new parser object for reuse.
*
* @constructor
* @class A Rison parser class. You should probably
* use rison.decode instead.
* @see rison.decode
*/
rison.parser = function (errcb) {
this.errorHandler = errcb;
};
/**
* a string containing acceptable whitespace characters.
* by default the rison decoder tolerates no whitespace.
* to accept whitespace set rison.parser.WHITESPACE = " \t\n\r\f";
*/
rison.parser.WHITESPACE = "";
// expose this as-is?
rison.parser.prototype.setOptions = function (options) {
if (options['errorHandler'])
this.errorHandler = options.errorHandler;
};
/**
* parse a rison string into a javascript structure.
*/
rison.parser.prototype.parse = function (str) {
this.string = str;
this.index = 0;
this.message = null;
var value = this.readValue();
if (!this.message && this.next())
value = this.error("unable to parse string as rison: '" + rison.encode(str) + "'");
if (this.message && this.errorHandler)
this.errorHandler(this.message, this.index);
return value;
};
rison.parser.prototype.error = function (message) {
if (typeof(console) != 'undefined')
console.log('rison parser error: ', message);
this.message = message;
return undefined;
}
rison.parser.prototype.readValue = function () {
var c = this.next();
var fn = c && this.table[c];
if (fn)
return fn.apply(this);
// fell through table, parse as an id
var s = this.string;
var i = this.index-1;
// Regexp.lastIndex may not work right in IE before 5.5?
// g flag on the regexp is also necessary
rison.next_id.lastIndex = i;
var m = rison.next_id.exec(s);
// console.log('matched id', i, r.lastIndex);
if (m.length > 0) {
var id = m[0];
this.index = i+id.length;
return id; // a string
}
if (c) return this.error("invalid character: '" + c + "'");
return this.error("empty expression");
}
rison.parser.parse_array = function (parser) {
var ar = [];
var c;
while ((c = parser.next()) != ')') {
if (!c) return parser.error("unmatched '!('");
if (ar.length) {
if (c != ',')
parser.error("missing ','");
} else if (c == ',') {
return parser.error("extra ','");
} else
--parser.index;
var n = parser.readValue();
if (typeof n == "undefined") return undefined;
ar.push(n);
}
return ar;
};
rison.parser.bangs = {
t: true,
f: false,
n: null,
'(': rison.parser.parse_array
}
rison.parser.prototype.table = {
'!': function () {
var s = this.string;
var c = s.charAt(this.index++);
if (!c) return this.error('"!" at end of input');
var x = rison.parser.bangs[c];
if (typeof(x) == 'function') {
return x.call(null, this);
} else if (typeof(x) == 'undefined') {
return this.error('unknown literal: "!' + c + '"');
}
return x;
},
'(': function () {
var o = {};
var c;
var count = 0;
while ((c = this.next()) != ')') {
if (count) {
if (c != ',')
this.error("missing ','");
} else if (c == ',') {
return this.error("extra ','");
} else
--this.index;
var k = this.readValue();
if (typeof k == "undefined") return undefined;
if (this.next() != ':') return this.error("missing ':'");
var v = this.readValue();
if (typeof v == "undefined") return undefined;
o[k] = v;
count++;
}
return o;
},
"'": function () {
var s = this.string;
var i = this.index;
var start = i;
var segments = [];
var c;
while ((c = s.charAt(i++)) != "'") {
//if (i == s.length) return this.error('unmatched "\'"');
if (!c) return this.error('unmatched "\'"');
if (c == '!') {
if (start < i-1)
segments.push(s.slice(start, i-1));
c = s.charAt(i++);
if ("!'".indexOf(c) >= 0) {
segments.push(c);
} else {
return this.error('invalid string escape: "!'+c+'"');
}
start = i;
}
}
if (start < i-1)
segments.push(s.slice(start, i-1));
this.index = i;
return segments.length == 1 ? segments[0] : segments.join('');
},
// Also any digit. The statement that follows this table
// definition fills in the digits.
'-': function () {
var s = this.string;
var i = this.index;
var start = i-1;
var state = 'int';
var permittedSigns = '-';
var transitions = {
'int+.': 'frac',
'int+e': 'exp',
'frac+e': 'exp'
};
do {
var c = s.charAt(i++);
if (!c) break;
if ('0' <= c && c <= '9') continue;
if (permittedSigns.indexOf(c) >= 0) {
permittedSigns = '';
continue;
}
state = transitions[state+'+'+c.toLowerCase()];
if (state == 'exp') permittedSigns = '-';
} while (state);
this.index = --i;
s = s.slice(start, i)
if (s == '-') return this.error("invalid number");
return Number(s);
}
};
// copy table['-'] to each of table[i] | i <- '0'..'9':
(function (table) {
for (var i = 0; i <= 9; i++)
table[String(i)] = table['-'];
})(rison.parser.prototype.table);
// return the next non-whitespace character, or undefined
rison.parser.prototype.next = function () {
var c;
var s = this.string;
var i = this.index;
do {
if (i == s.length) return undefined;
c = s.charAt(i++);
} while (rison.parser.WHITESPACE.indexOf(c) >= 0);
this.index = i;
return c;
};
return rison;
});
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImJ1aWxkL3Jpc29uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIiYmdHlwZW9mIG1vZHVsZSE9PVwidW5kZWZpbmVkXCIpe21vZHVsZS5leHBvcnRzPWYoKX1lbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShbXSxmKX1lbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiKXtnPXdpbmRvd31lbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiKXtnPWdsb2JhbH1lbHNlIGlmKHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIil7Zz1zZWxmfWVsc2V7Zz10aGlzfWcucmlzb24gPSBmKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO1xudmFyIHJpc29uID0ge307XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICB0aGUgc3RyaW5naWZpZXIgaXMgYmFzZWQgb25cbi8vICAgIGh0dHA6Ly9qc29uLm9yZy9qc29uLmpzIGFzIG9mIDIwMDYtMDQtMjggZnJvbSBqc29uLm9yZ1xuLy8gIHRoZSBwYXJzZXIgaXMgYmFzZWQgb24gXG4vLyAgICBodHRwOi8vb3N0ZWVsZS5jb20vc291cmNlcy9vcGVubGFzemxvL2pzb25cbi8vXG5cbmlmICh0eXBlb2Ygcmlzb24gPT0gJ3VuZGVmaW5lZCcpXG4gICAgd2luZG93LnJpc29uID0ge307XG5cbi8qKlxuICogIHJ1bGVzIGZvciBhbiB1cmkgZW5jb2RlciB0aGF0IGlzIG1vcmUgdG9sZXJhbnQgdGhhbiBlbmNvZGVVUklDb21wb25lbnRcbiAqXG4gKiAgZW5jb2RlVVJJQ29tcG9uZW50IHBhc3NlcyAgfiEqKCktXy4nXG4gKlxuICogIHdlIGFsc28gYWxsb3cgICAgICAgICAgICAgICw6QCQvXG4gKlxuICovXG5yaXNvbi51cmlfb2sgPSB7ICAvLyBvayBpbiB1cmwgcGF0aHMgYW5kIGluIGZvcm0gcXVlcnkgYXJnc1xuICAgICAgICAgICAgJ34nOiB0cnVlLCAgJyEnOiB0cnVlLCAgJyonOiB0cnVlLCAgJygnOiB0cnVlLCAgJyknOiB0cnVlLFxuICAgICAgICAgICAgJy0nOiB0cnVlLCAgJ18nOiB0cnVlLCAgJy4nOiB0cnVlLCAgJywnOiB0cnVlLFxuICAgICAgICAgICAgJzonOiB0cnVlLCAgJ0AnOiB0cnVlLCAgJyQnOiB0cnVlLFxuICAgICAgICAgICAgXCInXCI6IHRydWUsICAnLyc6IHRydWVcbn07XG5cbi8qXG4gKiB3ZSBkaXZpZGUgdGhlIHVyaS1zYWZlIGdseXBocyBpbnRvIHRocmVlIHNldHNcbiAqICAgPHJpc29uPiAtIHVzZWQgYnkgcmlzb24gICAgICAgICAgICAgICAgICAgICAgICAgJyAhIDogKCApICxcbiAqICAgPHJlc2VydmVkPiAtIG5vdCBjb21tb24gaW4gc3RyaW5ncywgcmVzZXJ2ZWQgICAgKiBAICQgJiA7ID1cbiAqXG4gKiB3ZSBkZWZpbmUgPGlkZW50aWZpZXI+IGFzIGFueXRoaW5nIHRoYXQncyBub3QgZm9yYmlkZGVuXG4gKi9cblxuLyoqXG4gKiBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGxlZ2FsIGluc2lkZSBpZHMuXG4gKi9cbi8vIHRoaXMgdmFyIGlzbid0IGFjdHVhbGx5IHVzZWRcbi8vcmlzb24uaWRjaGFyX3B1bmN0dWF0aW9uID0gXCJfLS4vflwiOyAgXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGwgPSBbXTtcbiAgICBmb3IgKHZhciBoaSA9IDA7IGhpIDwgMTY7IGhpKyspIHtcbiAgICAgICAgZm9yICh2YXIgbG8gPSAwOyBsbyA8IDE2OyBsbysrKSB7XG4gICAgICAgICAgICBpZiAoaGkrbG8gPT0gMCkgY29udGludWU7XG4gICAgICAgICAgICB2YXIgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoaGkqMTYgKyBsbyk7XG4gICAgICAgICAgICBpZiAoISAvXFx3fFstXy5cXC9+XS8udGVzdChjKSlcbiAgICAgICAgICAgICAgICBsLnB1c2goJ1xcXFx1MDAnICsgaGkudG9TdHJpbmcoMTYpICsgbG8udG9TdHJpbmcoMTYpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGlsbGVnYWwgaW5zaWRlIGlkcy5cbiAgICAgKiA8cmlzb24+IGFuZCA8cmVzZXJ2ZWQ+IGNsYXNzZXMgYXJlIGlsbGVnYWwgaW4gaWRzLlxuICAgICAqXG4gICAgICovXG4gICAgcmlzb24ubm90X2lkY2hhciA9IGwuam9pbignJylcbiAgICAvL2lkY3J4ID0gbmV3IFJlZ0V4cCgnWycgKyByaXNvbi5ub3RfaWRjaGFyICsgJ10nKTtcbiAgICAvL2NvbnNvbGUubG9nKCdOT1QnLCAoaWRjcngudGVzdCgnICcpKSApO1xufSkoKTtcbi8vcmlzb24ubm90X2lkY2hhciAgPSBcIiBcXHRcXHJcXG5cXFwiPD5bXXt9JyE9OigpLCpAJDsmXCI7XG5yaXNvbi5ub3RfaWRjaGFyICA9IFwiICchOigpLCpAJFwiO1xuXG5cbi8qKlxuICogY2hhcmFjdGVycyB0aGF0IGFyZSBpbGxlZ2FsIGFzIHRoZSBzdGFydCBvZiBhbiBpZFxuICogdGhpcyBpcyBzbyBpZHMgY2FuJ3QgbG9vayBsaWtlIG51bWJlcnMuXG4gKi9cbnJpc29uLm5vdF9pZHN0YXJ0ID0gXCItMDEyMzQ1Njc4OVwiO1xuXG5cbihmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGlkcnggPSAnW14nICsgcmlzb24ubm90X2lkc3RhcnQgKyByaXNvbi5ub3RfaWRjaGFyICsgXG4gICAgICAgICAgICAgICAnXVteJyArIHJpc29uLm5vdF9pZGNoYXIgKyAnXSonO1xuXG4gICAgcmlzb24uaWRfb2sgPSBuZXcgUmVnRXhwKCdeJyArIGlkcnggKyAnJCcpO1xuXG4gICAgLy8gcmVnZXhwIHRvIGZpbmQgdGhlIGVuZCBvZiBhbiBpZCB3aGVuIHBhcnNpbmdcbiAgICAvLyBnIGZsYWcgb24gdGhlIHJlZ2V4cCBpcyBuZWNlc3NhcnkgZm9yIGl0ZXJhdGl2ZSByZWdleHAuZXhlYygpXG4gICAgcmlzb24ubmV4dF9pZCA9IG5ldyBSZWdFeHAoaWRyeCwgJ2cnKTtcbn0pKCk7XG5cbi8qKlxuICogdGhpcyBpcyBsaWtlIGVuY29kZVVSSUNvbXBvbmVudCgpIGJ1dCBxdW90ZXMgZmV3ZXIgY2hhcmFjdGVycy5cbiAqXG4gKiBAc2VlIHJpc29uLnVyaV9va1xuICpcbiAqIGVuY29kZVVSSUNvbXBvbmVudCBwYXNzZXMgICB+ISooKS1fLidcbiAqIHJpc29uLnF1b3RlIGFsc28gcGFzc2VzICAgLDpAJC9cbiAqICAgYW5kIHF1b3RlcyBcIiBcIiBhcyBcIitcIiBpbnN0ZWFkIG9mIFwiJTIwXCJcbiAqL1xucmlzb24ucXVvdGUgPSBmdW5jdGlvbih4KSB7XG4gICAgaWYgKC9eWy1BLVphLXowLTl+ISooKV8uJyw6QCRcXC9dKiQvLnRlc3QoeCkpXG4gICAgICAgIHJldHVybiB4O1xuXG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh4KVxuICAgICAgICAucmVwbGFjZSgvJTJDL2csICcsJylcbiAgICAgICAgLnJlcGxhY2UoLyUzQS9nLCAnOicpXG4gICAgICAgIC5yZXBsYWNlKC8lNDAvZywgJ0AnKVxuICAgICAgICAucmVwbGFjZSgvJTI0L2csICckJylcbiAgICAgICAgLnJlcGxhY2UoLyUyRi9nLCAnLycpXG4gICAgICAgIC5yZXBsYWNlKC8lMjAvZywgJysnKTtcbn07XG5cblxuLy9cbi8vICBiYXNlZCBvbiBqc29uLmpzIDIwMDYtMDQtMjggZnJvbSBqc29uLm9yZ1xuLy8gIGxpY2Vuc2U6IGh0dHA6Ly93d3cuanNvbi5vcmcvbGljZW5zZS5odG1sXG4vL1xuLy8gIGhhY2tlZCBieSBuaXggZm9yIHVzZSBpbiB1cmlzLlxuLy9cblxuKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3EgPSB7IC8vIHVybC1vayBidXQgcXVvdGVkIGluIHN0cmluZ3NcbiAgICAgICAgICAgICAgIFwiJ1wiOiB0cnVlLCAgJyEnOiB0cnVlXG4gICAgfSxcbiAgICBlbmMgPSBmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAodiAmJiB0eXBlb2Ygdi50b0pTT04gPT09ICdmdW5jdGlvbicpIHYgPSB2LnRvSlNPTigpO1xuICAgICAgICB2YXIgZm4gPSBzW3R5cGVvZiB2XTtcbiAgICAgICAgaWYgKGZuKSByZXR1cm4gZm4odik7XG4gICAgfSxcbiAgICBzID0ge1xuICAgICAgICAgICAgYXJyYXk6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGEgPSBbJyEoJ10sIGIsIGYsIGksIGwgPSB4Lmxlbmd0aCwgdjtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBlbmMoeFtpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2EubGVuZ3RoXSA9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFbYS5sZW5ndGhdID0gdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFbYS5sZW5ndGhdID0gJyknO1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmpvaW4oJycpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdib29sZWFuJzogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoeClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICchdCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuICchZidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnbnVsbCc6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiIW5cIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBudW1iZXI6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZSh4KSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICchbic7XG4gICAgICAgICAgICAgICAgLy8gc3RyaXAgJysnIG91dCBvZiBleHBvbmVudCwgJy0nIGlzIG9rIHRob3VnaFxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoeCkucmVwbGFjZSgvXFwrLywnJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb2JqZWN0OiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmFycmF5KHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFdJTEw6IHdpbGwgdGhpcyB3b3JrIG9uIG5vbi1GaXJlZm94IGJyb3dzZXJzP1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHguX19wcm90b3R5cGVfXyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHguX19wcm90b3R5cGVfXy5lbmNvZGVfcmlzb24gIT09ICd1bmRlZmluZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguZW5jb2RlX3Jpc29uKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbJygnXSwgYiwgZiwgaSwgdiwga2ksIGtzPVtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4geClcbiAgICAgICAgICAgICAgICAgICAgICAgIGtzW2tzLmxlbmd0aF0gPSBpO1xuICAgICAgICAgICAgICAgICAgICBrcy5zb3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2kgPSAwOyBraSA8IGtzLmxlbmd0aDsga2krKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGtzW2tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBlbmMoeFtpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2EubGVuZ3RoXSA9ICcsJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHMuc3RyaW5nKGkpLCAnOicsIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFbYS5sZW5ndGhdID0gJyknO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5qb2luKCcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICchbic7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyaW5nOiBmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIGlmICh4ID09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCInJ1wiO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJpc29uLmlkX29rLnRlc3QoeCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4O1xuXG4gICAgICAgICAgICAgICAgeCA9IHgucmVwbGFjZSgvKFsnIV0pL2csIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNxW2JdKSByZXR1cm4gJyEnK2I7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIidcIiArIHggKyBcIidcIjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1bmRlZmluZWQ6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHVuZGVmaW5lZCBqdXN0IGxpa2UgSlNPTlxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4gICAgLyoqXG4gICAgICogcmlzb24tZW5jb2RlIGEgamF2YXNjcmlwdCBzdHJ1Y3R1cmVcbiAgICAgKlxuICAgICAqICBpbXBsZW1lbWVudGF0aW9uIGJhc2VkIG9uIERvdWdsYXMgQ3JvY2tmb3JkJ3MganNvbi5qczpcbiAgICAgKiAgICBodHRwOi8vanNvbi5vcmcvanNvbi5qcyBhcyBvZiAyMDA2LTA0LTI4IGZyb20ganNvbi5vcmdcbiAgICAgKlxuICAgICAqL1xuICAgIHJpc29uLmVuY29kZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBlbmModik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIHJpc29uLWVuY29kZSBhIGphdmFzY3JpcHQgb2JqZWN0IHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW5zXG4gICAgICpcbiAgICAgKi9cbiAgICByaXNvbi5lbmNvZGVfb2JqZWN0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ICE9ICdvYmplY3QnIHx8IHYgPT09IG51bGwgfHwgdiBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmlzb24uZW5jb2RlX29iamVjdCBleHBlY3RzIGFuIG9iamVjdCBhcmd1bWVudFwiKTtcbiAgICAgICAgdmFyIHIgPSBzW3R5cGVvZiB2XSh2KTtcbiAgICAgICAgcmV0dXJuIHIuc3Vic3RyaW5nKDEsIHIubGVuZ3RoLTEpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiByaXNvbi1lbmNvZGUgYSBqYXZhc2NyaXB0IGFycmF5IHdpdGhvdXQgc3Vycm91bmRpbmcgcGFyZW5zXG4gICAgICpcbiAgICAgKi9cbiAgICByaXNvbi5lbmNvZGVfYXJyYXkgPSBmdW5jdGlvbiAodikge1xuICAgICAgICBpZiAoISh2IGluc3RhbmNlb2YgQXJyYXkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmlzb24uZW5jb2RlX2FycmF5IGV4cGVjdHMgYW4gYXJyYXkgYXJndW1lbnRcIik7XG4gICAgICAgIHZhciByID0gc1t0eXBlb2Ygdl0odik7XG4gICAgICAgIHJldHVybiByLnN1YnN0cmluZygyLCByLmxlbmd0aC0xKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogcmlzb24tZW5jb2RlIGFuZCB1cmktZW5jb2RlIGEgamF2YXNjcmlwdCBzdHJ1Y3R1cmVcbiAgICAgKlxuICAgICAqL1xuICAgIHJpc29uLmVuY29kZV91cmkgPSBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gcmlzb24ucXVvdGUoc1t0eXBlb2Ygdl0odikpO1xuICAgIH07XG5cbn0pKCk7XG5cblxuXG5cbi8vXG4vLyBiYXNlZCBvbiBvcGVubGFzemxvLWpzb24gYW5kIGhhY2tlZCBieSBuaXggZm9yIHVzZSBpbiB1cmlzLlxuLy9cbi8vIEF1dGhvcjogT2xpdmVyIFN0ZWVsZVxuLy8gQ29weXJpZ2h0OiBDb3B5cmlnaHQgMjAwNiBPbGl2ZXIgU3RlZWxlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEhvbWVwYWdlOiBodHRwOi8vb3N0ZWVsZS5jb20vc291cmNlcy9vcGVubGFzemxvL2pzb25cbi8vIExpY2Vuc2U6IE1JVCBMaWNlbnNlLlxuLy8gVmVyc2lvbjogMS4wXG5cblxuLyoqXG4gKiBwYXJzZSBhIHJpc29uIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJ1Y3R1cmUuXG4gKlxuICogdGhpcyBpcyB0aGUgc2ltcGxlc3QgZGVjb2RlciBlbnRyeSBwb2ludC5cbiAqXG4gKiAgYmFzZWQgb24gT2xpdmVyIFN0ZWVsZSdzIE9wZW5MYXN6bG8tSlNPTlxuICogICAgIGh0dHA6Ly9vc3RlZWxlLmNvbS9zb3VyY2VzL29wZW5sYXN6bG8vanNvblxuICovXG5yaXNvbi5kZWNvZGUgPSBmdW5jdGlvbihyKSB7XG4gICAgdmFyIGVycmNiID0gZnVuY3Rpb24oZSkgeyB0aHJvdyBFcnJvcigncmlzb24gZGVjb2RlciBlcnJvcjogJyArIGUpOyB9O1xuICAgIC8vIHZhbGlkYXRlIGlucHV0IGlzIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiByICE9PSAnc3RyaW5nJylcbiAgICAgICAgcmV0dXJuIGVycmNiKFwiZGVjb2RlIGlucHV0IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgdmFyIHAgPSBuZXcgcmlzb24ucGFyc2VyKGVycmNiKTtcbiAgICByZXR1cm4gcC5wYXJzZShyKTtcbn07XG5cbi8qKlxuICogcGFyc2UgYW4gby1yaXNvbiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgc3RydWN0dXJlLlxuICpcbiAqIHRoaXMgc2ltcGx5IGFkZHMgcGFyZW50aGVzZXMgYXJvdW5kIHRoZSBzdHJpbmcgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbnJpc29uLmRlY29kZV9vYmplY3QgPSBmdW5jdGlvbihyKSB7XG4gICAgcmV0dXJuIHJpc29uLmRlY29kZSgnKCcrcisnKScpO1xufTtcblxuLyoqXG4gKiBwYXJzZSBhbiBhLXJpc29uIHN0cmluZyBpbnRvIGEgamF2YXNjcmlwdCBzdHJ1Y3R1cmUuXG4gKlxuICogdGhpcyBzaW1wbHkgYWRkcyBhcnJheSBtYXJrdXAgYXJvdW5kIHRoZSBzdHJpbmcgYmVmb3JlIHBhcnNpbmcuXG4gKi9cbnJpc29uLmRlY29kZV9hcnJheSA9IGZ1bmN0aW9uKHIpIHtcbiAgICByZXR1cm4gcmlzb24uZGVjb2RlKCchKCcrcisnKScpO1xufTtcblxuXG4vKipcbiAqIGNvbnN0cnVjdCBhIG5ldyBwYXJzZXIgb2JqZWN0IGZvciByZXVzZS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBjbGFzcyBBIFJpc29uIHBhcnNlciBjbGFzcy4gIFlvdSBzaG91bGQgcHJvYmFibHkgXG4gKiAgICAgICAgdXNlIHJpc29uLmRlY29kZSBpbnN0ZWFkLiBcbiAqIEBzZWUgcmlzb24uZGVjb2RlXG4gKi9cbnJpc29uLnBhcnNlciA9IGZ1bmN0aW9uIChlcnJjYikge1xuICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gZXJyY2I7XG59O1xuXG4vKipcbiAqIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWNjZXB0YWJsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gKiBieSBkZWZhdWx0IHRoZSByaXNvbiBkZWNvZGVyIHRvbGVyYXRlcyBubyB3aGl0ZXNwYWNlLlxuICogdG8gYWNjZXB0IHdoaXRlc3BhY2Ugc2V0IHJpc29uLnBhcnNlci5XSElURVNQQUNFID0gXCIgXFx0XFxuXFxyXFxmXCI7XG4gKi9cbnJpc29uLnBhcnNlci5XSElURVNQQUNFID0gXCJcIjtcblxuLy8gZXhwb3NlIHRoaXMgYXMtaXM/XG5yaXNvbi5wYXJzZXIucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zWydlcnJvckhhbmRsZXInXSlcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBvcHRpb25zLmVycm9ySGFuZGxlcjtcbn07XG5cbi8qKlxuICogcGFyc2UgYSByaXNvbiBzdHJpbmcgaW50byBhIGphdmFzY3JpcHQgc3RydWN0dXJlLlxuICovXG5yaXNvbi5wYXJzZXIucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHRoaXMuc3RyaW5nID0gc3RyO1xuICAgIHRoaXMuaW5kZXggPSAwO1xuICAgIHRoaXMubWVzc2FnZSA9IG51bGw7XG4gICAgdmFyIHZhbHVlID0gdGhpcy5yZWFkVmFsdWUoKTtcbiAgICBpZiAoIXRoaXMubWVzc2FnZSAmJiB0aGlzLm5leHQoKSlcbiAgICAgICAgdmFsdWUgPSB0aGlzLmVycm9yKFwidW5hYmxlIHRvIHBhcnNlIHN0cmluZyBhcyByaXNvbjogJ1wiICsgcmlzb24uZW5jb2RlKHN0cikgKyBcIidcIik7XG4gICAgaWYgKHRoaXMubWVzc2FnZSAmJiB0aGlzLmVycm9ySGFuZGxlcilcbiAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIodGhpcy5tZXNzYWdlLCB0aGlzLmluZGV4KTtcbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG5yaXNvbi5wYXJzZXIucHJvdG90eXBlLmVycm9yID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICBpZiAodHlwZW9mKGNvbnNvbGUpICE9ICd1bmRlZmluZWQnKVxuICAgICAgICBjb25zb2xlLmxvZygncmlzb24gcGFyc2VyIGVycm9yOiAnLCBtZXNzYWdlKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4gICAgXG5yaXNvbi5wYXJzZXIucHJvdG90eXBlLnJlYWRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYyA9IHRoaXMubmV4dCgpO1xuICAgIHZhciBmbiA9IGMgJiYgdGhpcy50YWJsZVtjXTtcblxuICAgIGlmIChmbilcbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMpO1xuXG4gICAgLy8gZmVsbCB0aHJvdWdoIHRhYmxlLCBwYXJzZSBhcyBhbiBpZFxuXG4gICAgdmFyIHMgPSB0aGlzLnN0cmluZztcbiAgICB2YXIgaSA9IHRoaXMuaW5kZXgtMTtcblxuICAgIC8vIFJlZ2V4cC5sYXN0SW5kZXggbWF5IG5vdCB3b3JrIHJpZ2h0IGluIElFIGJlZm9yZSA1LjU/XG4gICAgLy8gZyBmbGFnIG9uIHRoZSByZWdleHAgaXMgYWxzbyBuZWNlc3NhcnlcbiAgICByaXNvbi5uZXh0X2lkLmxhc3RJbmRleCA9IGk7XG4gICAgdmFyIG0gPSByaXNvbi5uZXh0X2lkLmV4ZWMocyk7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnbWF0Y2hlZCBpZCcsIGksIHIubGFzdEluZGV4KTtcblxuICAgIGlmIChtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGlkID0gbVswXTtcbiAgICAgICAgdGhpcy5pbmRleCA9IGkraWQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gaWQ7ICAvLyBhIHN0cmluZ1xuICAgIH1cblxuICAgIGlmIChjKSByZXR1cm4gdGhpcy5lcnJvcihcImludmFsaWQgY2hhcmFjdGVyOiAnXCIgKyBjICsgXCInXCIpO1xuICAgIHJldHVybiB0aGlzLmVycm9yKFwiZW1wdHkgZXhwcmVzc2lvblwiKTtcbn1cblxucmlzb24ucGFyc2VyLnBhcnNlX2FycmF5ID0gZnVuY3Rpb24gKHBhcnNlcikge1xuICAgIHZhciBhciA9IFtdO1xuICAgIHZhciBjO1xuICAgIHdoaWxlICgoYyA9IHBhcnNlci5uZXh0KCkpICE9ICcpJykge1xuICAgICAgICBpZiAoIWMpIHJldHVybiBwYXJzZXIuZXJyb3IoXCJ1bm1hdGNoZWQgJyEoJ1wiKTtcbiAgICAgICAgaWYgKGFyLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGMgIT0gJywnKVxuICAgICAgICAgICAgICAgIHBhcnNlci5lcnJvcihcIm1pc3NpbmcgJywnXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJywnKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmVycm9yKFwiZXh0cmEgJywnXCIpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIC0tcGFyc2VyLmluZGV4O1xuICAgICAgICB2YXIgbiA9IHBhcnNlci5yZWFkVmFsdWUoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBuID09IFwidW5kZWZpbmVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGFyLnB1c2gobik7XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5cbnJpc29uLnBhcnNlci5iYW5ncyA9IHtcbiAgICB0OiB0cnVlLFxuICAgIGY6IGZhbHNlLFxuICAgIG46IG51bGwsXG4gICAgJygnOiByaXNvbi5wYXJzZXIucGFyc2VfYXJyYXlcbn1cblxucmlzb24ucGFyc2VyLnByb3RvdHlwZS50YWJsZSA9IHtcbiAgICAnISc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHMgPSB0aGlzLnN0cmluZztcbiAgICAgICAgdmFyIGMgPSBzLmNoYXJBdCh0aGlzLmluZGV4KyspO1xuICAgICAgICBpZiAoIWMpIHJldHVybiB0aGlzLmVycm9yKCdcIiFcIiBhdCBlbmQgb2YgaW5wdXQnKTtcbiAgICAgICAgdmFyIHggPSByaXNvbi5wYXJzZXIuYmFuZ3NbY107XG4gICAgICAgIGlmICh0eXBlb2YoeCkgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHguY2FsbChudWxsLCB0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YoeCkgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCd1bmtub3duIGxpdGVyYWw6IFwiIScgKyBjICsgJ1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfSxcbiAgICAnKCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG8gPSB7fTtcbiAgICAgICAgdmFyIGM7XG4gICAgICAgIHZhciBjb3VudCA9IDA7XG4gICAgICAgIHdoaWxlICgoYyA9IHRoaXMubmV4dCgpKSAhPSAnKScpIHtcbiAgICAgICAgICAgIGlmIChjb3VudCkge1xuICAgICAgICAgICAgICAgIGlmIChjICE9ICcsJylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcihcIm1pc3NpbmcgJywnXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcsJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKFwiZXh0cmEgJywnXCIpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgLS10aGlzLmluZGV4O1xuICAgICAgICAgICAgdmFyIGsgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBrID09IFwidW5kZWZpbmVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodGhpcy5uZXh0KCkgIT0gJzonKSByZXR1cm4gdGhpcy5lcnJvcihcIm1pc3NpbmcgJzonXCIpO1xuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnJlYWRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2ID09IFwidW5kZWZpbmVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvW2tdID0gdjtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG87XG4gICAgfSxcbiAgICBcIidcIjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc3RyaW5nO1xuICAgICAgICB2YXIgaSA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHZhciBzdGFydCA9IGk7XG4gICAgICAgIHZhciBzZWdtZW50cyA9IFtdO1xuICAgICAgICB2YXIgYztcbiAgICAgICAgd2hpbGUgKChjID0gcy5jaGFyQXQoaSsrKSkgIT0gXCInXCIpIHtcbiAgICAgICAgICAgIC8vaWYgKGkgPT0gcy5sZW5ndGgpIHJldHVybiB0aGlzLmVycm9yKCd1bm1hdGNoZWQgXCJcXCdcIicpO1xuICAgICAgICAgICAgaWYgKCFjKSByZXR1cm4gdGhpcy5lcnJvcigndW5tYXRjaGVkIFwiXFwnXCInKTtcbiAgICAgICAgICAgIGlmIChjID09ICchJykge1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IGktMSlcbiAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMucHVzaChzLnNsaWNlKHN0YXJ0LCBpLTEpKTtcbiAgICAgICAgICAgICAgICBjID0gcy5jaGFyQXQoaSsrKTtcbiAgICAgICAgICAgICAgICBpZiAoXCIhJ1wiLmluZGV4T2YoYykgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZWdtZW50cy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yKCdpbnZhbGlkIHN0cmluZyBlc2NhcGU6IFwiIScrYysnXCInKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCA8IGktMSlcbiAgICAgICAgICAgIHNlZ21lbnRzLnB1c2gocy5zbGljZShzdGFydCwgaS0xKSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpO1xuICAgICAgICByZXR1cm4gc2VnbWVudHMubGVuZ3RoID09IDEgPyBzZWdtZW50c1swXSA6IHNlZ21lbnRzLmpvaW4oJycpO1xuICAgIH0sXG4gICAgLy8gQWxzbyBhbnkgZGlnaXQuICBUaGUgc3RhdGVtZW50IHRoYXQgZm9sbG93cyB0aGlzIHRhYmxlXG4gICAgLy8gZGVmaW5pdGlvbiBmaWxscyBpbiB0aGUgZGlnaXRzLlxuICAgICctJzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc3RyaW5nO1xuICAgICAgICB2YXIgaSA9IHRoaXMuaW5kZXg7XG4gICAgICAgIHZhciBzdGFydCA9IGktMTtcbiAgICAgICAgdmFyIHN0YXRlID0gJ2ludCc7XG4gICAgICAgIHZhciBwZXJtaXR0ZWRTaWducyA9ICctJztcbiAgICAgICAgdmFyIHRyYW5zaXRpb25zID0ge1xuICAgICAgICAgICAgJ2ludCsuJzogJ2ZyYWMnLFxuICAgICAgICAgICAgJ2ludCtlJzogJ2V4cCcsXG4gICAgICAgICAgICAnZnJhYytlJzogJ2V4cCdcbiAgICAgICAgfTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgdmFyIGMgPSBzLmNoYXJBdChpKyspO1xuICAgICAgICAgICAgaWYgKCFjKSBicmVhaztcbiAgICAgICAgICAgIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgY29udGludWU7XG4gICAgICAgICAgICBpZiAocGVybWl0dGVkU2lnbnMuaW5kZXhPZihjKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcGVybWl0dGVkU2lnbnMgPSAnJztcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gdHJhbnNpdGlvbnNbc3RhdGUrJysnK2MudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT0gJ2V4cCcpIHBlcm1pdHRlZFNpZ25zID0gJy0nO1xuICAgICAgICB9IHdoaWxlIChzdGF0ZSk7XG4gICAgICAgIHRoaXMuaW5kZXggPSAtLWk7XG4gICAgICAgIHMgPSBzLnNsaWNlKHN0YXJ0LCBpKVxuICAgICAgICBpZiAocyA9PSAnLScpIHJldHVybiB0aGlzLmVycm9yKFwiaW52YWxpZCBudW1iZXJcIik7XG4gICAgICAgIHJldHVybiBOdW1iZXIocyk7XG4gICAgfVxufTtcbi8vIGNvcHkgdGFibGVbJy0nXSB0byBlYWNoIG9mIHRhYmxlW2ldIHwgaSA8LSAnMCcuLic5JzpcbihmdW5jdGlvbiAodGFibGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8PSA5OyBpKyspXG4gICAgICAgIHRhYmxlW1N0cmluZyhpKV0gPSB0YWJsZVsnLSddO1xufSkocmlzb24ucGFyc2VyLnByb3RvdHlwZS50YWJsZSk7XG5cbi8vIHJldHVybiB0aGUgbmV4dCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIG9yIHVuZGVmaW5lZFxucmlzb24ucGFyc2VyLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBjO1xuICAgIHZhciBzID0gdGhpcy5zdHJpbmc7XG4gICAgdmFyIGkgPSB0aGlzLmluZGV4O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKGkgPT0gcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGMgPSBzLmNoYXJBdChpKyspO1xuICAgIH0gd2hpbGUgKHJpc29uLnBhcnNlci5XSElURVNQQUNFLmluZGV4T2YoYykgPj0gMCk7XG4gICAgdGhpcy5pbmRleCA9IGk7XG4gICAgcmV0dXJuIGM7XG59O1xuXG5yZXR1cm4gcmlzb247XG5cbn0pO1xuIl19
var rison = require('rison-node');
var appState = {
filters: {},
query: {
querystring: {
analyze_wildcard: true,
query: "my query here",
}
}
};
var encoded = rison.encode(appState);
document.querySelector('body').innerHTML = `Encoded object: ${encoded}`;
;}, 0)
{
"name": "requirebin-sketch",
"version": "1.0.0",
"dependencies": {
"rison-node": "1.0.0"
}
}
<!-- contents of this file will be placed inside the <body> -->
<!-- contents of this file will be placed inside the <head> -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment