made with requirebin
Created
May 3, 2017 18:40
-
-
Save w33ble/9aed0aa9a3d33505317cc18b03abbe2e to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}`; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"rison-node": "1.0.0" | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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