app-state-utils
Version:
A set of utilities for state management in web apps, integrates well with front-end state management libraries like redux and vuex, and can be used on server side as well. It defines methods for mutating keys and values in a conventional javascript object
153 lines (143 loc) • 24.7 kB
JavaScript
;var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.clearValue=void 0;var _typeof2=_interopRequireDefault(require("@babel/runtime/helpers/typeof"));/**
* @author Peter Collins - https://github.com/onepetercollins
*
* @fileoverview : Exports a function: clearValue(state, payload)
*
* @function clearValue : For state drilling and surgical deletion of object values.
* This function can be used to dynamically delete infinitely nested object values.
* It takes current state and a payload object as arguments.
* It returns a local function which returns updated state.
*
* @param {Object} state The object to be mutated.
* @param {Object} payload { name: String, child: Array }
* @param {String} payload.name Name of the key to be cleared or second object in the nesting hieriarchy.
* @param {Array} payload.child Array of strings pointing to the nested key to be cleared.
* @returns {Function} (local function) (payload) => : The new app state, or current state if it was not altered.
*/
var clearValue=function clearValue(state,payload){
/**
* @param {Object} payload { name: String, child: Array }
* @param {String} payload.name Name of the key to be created or second object in the nesting hieriarchy.
* @param {Array} payload.child Array of strings pointing to the nested key to be cleared.
* @returns {Object} { updatedState } : The new app state, or current state if it was not altered.
*/
return function(){var payloadInherited=arguments.length>0&&arguments[0]!==undefined?arguments[0]:payload;
var currentState=JSON.parse(JSON.stringify(state));
var updatedState=null;
var name=payloadInherited.name,child=payloadInherited.child;
var nameField=name;
var children=child;
var testArray=state?Array.from(state):null;
var snapshots=[];
if((0,_typeof2.default)(state)!=='object'||state[state.length-1]===testArray.pop()&&typeof testArray.pop()!=="undefined"){
console.error("[state] must be a valid javascript object");
return state;
}
if((0,_typeof2.default)(children)==="object")/* check if 'children' is an empty array and nullify it */{
if(children.length===0&&typeof children[children.length-1]==="undefined"){
children=null;
}
}
if(!children&¤tState.hasOwnProperty(nameField)){
Object.assign(currentState,state);
if(typeof currentState[nameField]==="boolean"){
if(currentState[nameField]){
currentState[nameField]=false;
updatedState=currentState;
return updatedState;
}
}else if(typeof currentState[nameField]==="number"){
if(currentState[nameField]!==0){
currentState[nameField]=0;
updatedState=currentState;
return updatedState;
}
}else if((0,_typeof2.default)(currentState[nameField])==="object"){
if(currentState[nameField]){
if(typeof currentState.length==="number"&&typeof currentState[currentState.length-1]!=="undefined"){
currentState[nameField]=[];
updatedState=currentState;
return updatedState;
}else{
currentState[nameField]={};
updatedState=currentState;
return updatedState;
}
}
}else if(typeof currentState[nameField]==="string"||(0,_typeof2.default)(currentState[nameField])==="symbol"){
if(currentState[nameField].length){
currentState[nameField]='';
updatedState=currentState;
return updatedState;
}
}else{
currentState[nameField]='';
updatedState=currentState;
return updatedState;
}
}else if(!children&&!currentState.hasOwnProperty(nameField)){
console.error("The referenced property '".concat(nameField,"' does not exist in current state."));
return state;
}else if(children.length){
for(var index=0;index<children.length;index++){
if(!snapshots.length){
if(typeof currentState[nameField][children[index]]!=="undefined"){
snapshots.push(currentState[nameField][children[index]]);
}else{
console.error("The referenced property '".concat(children[index],"' does not exist in current state."));
return state;
}
}else{
if(typeof snapshots[snapshots.length-1][children[index]]!=="undefined"){
snapshots.push(snapshots[snapshots.length-1][children[index]]);
}else{
console.error("The referenced property '".concat(children[index],"' does not exist in current state."));
return state;
}
}
if(index===children.length-1){
for(var index0=snapshots.length-1;index0>=0;index0--){
if(index0===snapshots.length-1){
if(snapshots[snapshots.length-1]!==null){
if(typeof snapshots[snapshots.length-1]==="boolean"){
if(snapshots[snapshots.length-1]){
snapshots[snapshots.length-1]=false;
}
}else if(typeof snapshots[snapshots.length-1]==="number"){
if(snapshots[snapshots.length-1]!==0){
snapshots[snapshots.length-1]=0;
}
}else if((0,_typeof2.default)(snapshots[snapshots.length-1])==="object"){
if(snapshots[snapshots.length-1]){
if(typeof snapshots[snapshots.length-1].length==="number"&&typeof(snapshots[snapshots.length-1].length-1)!=="undefined"){
snapshots[snapshots.length-1]=[];
}else{
snapshots[snapshots.length-1]={};
}
}
}else if(typeof snapshots[snapshots.length-1]==="string"){
if(snapshots[snapshots.length-1].length){
snapshots[snapshots.length-1]='';
}
}else if((0,_typeof2.default)(snapshots[snapshots.length-1])==="symbol"){
snapshots[snapshots.length-1]='';
}else{
snapshots[snapshots.length-1]='';
}
}
}else{
snapshots[index0][children[index0+1]]=snapshots[index0+1];
}
if(index0===0){
Object.assign(currentState,state);
currentState[nameField][children[index0]]=snapshots[index0];
updatedState=currentState;
return updatedState;
}
}
}
}
}
};
};exports.clearValue=clearValue;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNsZWFyVmFsdWUuanMiXSwibmFtZXMiOlsiY2xlYXJWYWx1ZSIsInN0YXRlIiwicGF5bG9hZCIsInBheWxvYWRJbmhlcml0ZWQiLCJjdXJyZW50U3RhdGUiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJ1cGRhdGVkU3RhdGUiLCJuYW1lIiwiY2hpbGQiLCJuYW1lRmllbGQiLCJjaGlsZHJlbiIsInRlc3RBcnJheSIsIkFycmF5IiwiZnJvbSIsInNuYXBzaG90cyIsImxlbmd0aCIsInBvcCIsImNvbnNvbGUiLCJlcnJvciIsImhhc093blByb3BlcnR5IiwiT2JqZWN0IiwiYXNzaWduIiwiaW5kZXgiLCJwdXNoIiwiaW5kZXgwIl0sIm1hcHBpbmdzIjoiaVFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRVEsR0FBTUEsQ0FBQUEsVUFBVSxDQUFHLFFBQWJBLENBQUFBLFVBQWEsQ0FBQ0MsS0FBRCxDQUFRQyxPQUFSLENBQW9COztBQUUzQztBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUksTUFBTyxXQUFzQyxJQUE1QkMsQ0FBQUEsZ0JBQTRCLDJEQUFURCxPQUFTO0FBQ3pDLEdBQUlFLENBQUFBLFlBQVksQ0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ0UsU0FBTCxDQUFlTixLQUFmLENBQVgsQ0FBbkI7QUFDQSxHQUFJTyxDQUFBQSxZQUFZLENBQUcsSUFBbkI7QUFDQSxHQUFNQyxDQUFBQSxJQUFOLENBQXNCTixnQkFBdEIsQ0FBTU0sSUFBTixDQUFZQyxLQUFaLENBQXNCUCxnQkFBdEIsQ0FBWU8sS0FBWjtBQUNBLEdBQUlDLENBQUFBLFNBQVMsQ0FBR0YsSUFBaEI7QUFDQSxHQUFJRyxDQUFBQSxRQUFRLENBQUdGLEtBQWY7QUFDQSxHQUFJRyxDQUFBQSxTQUFTLENBQUdaLEtBQUssQ0FBR2EsS0FBSyxDQUFDQyxJQUFO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QUFELENBQVQsQ0FBa0JkLFFBQVEsQ0FBQ2MsTUFBTSxDQUFHLENBQVYsQ0FBMUIsRUFBMENWLFNBQVMsQ0FBQ1UsTUFBTSxDQUFHLENBQVYsQ0FBbkQ7QUFDSDs7QUFFRCxHQUFJQSxNQUFNLEdBQUssQ0FBZixDQUFrQjtBQUNkSixNQUFNLENBQUNDLE1BQVAsQ0FBY25CLFlBQWQsQ0FBNEJILEtBQTVCO0FBQ0FHLFlBQVksQ0FBQ08sU0FBRCxDQUFaLENBQXdCQyxRQUFRLENBQUNjLE1BQUQsQ0FBaEMsRUFBNENWLFNBQVMsQ0FBQ1UsTUFBRCxDQUFyRDtBQUNBbEIsWUFBWSxDQUFHSixZQUFmO0FBQ0EsTUFBT0ksQ0FBQUEsWUFBUDtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7QUFDSixDQTNIRDtBQTRISCxDQXJJTyxDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBhdXRob3IgUGV0ZXIgQ29sbGlucyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9vbmVwZXRlcmNvbGxpbnNcclxuICogXHJcbiAqIEBmaWxlb3ZlcnZpZXcgOiBFeHBvcnRzIGEgZnVuY3Rpb246IGNsZWFyVmFsdWUoc3RhdGUsIHBheWxvYWQpXHJcbiAqIFxyXG4gKiBAZnVuY3Rpb24gY2xlYXJWYWx1ZSA6IEZvciBzdGF0ZSBkcmlsbGluZyBhbmQgc3VyZ2ljYWwgZGVsZXRpb24gb2Ygb2JqZWN0IHZhbHVlcy5cclxuICogICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGRlbGV0ZSBpbmZpbml0ZWx5IG5lc3RlZCBvYmplY3QgdmFsdWVzLlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEl0IHRha2VzIGN1cnJlbnQgc3RhdGUgYW5kIGEgcGF5bG9hZCBvYmplY3QgYXMgYXJndW1lbnRzLlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEl0IHJldHVybnMgYSBsb2NhbCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIHVwZGF0ZWQgc3RhdGUuXHJcbiAqIFxyXG4gKiBAcGFyYW0gICB7T2JqZWN0fSAgIHN0YXRlIFRoZSBvYmplY3QgdG8gYmUgbXV0YXRlZC5cclxuICogQHBhcmFtICAge09iamVjdH0gICBwYXlsb2FkIHsgbmFtZTogU3RyaW5nLCBjaGlsZDogQXJyYXkgfVxyXG4gKiBAcGFyYW0gICB7U3RyaW5nfSAgIHBheWxvYWQubmFtZSBOYW1lIG9mIHRoZSBrZXkgdG8gYmUgY2xlYXJlZCBvciBzZWNvbmQgb2JqZWN0IGluIHRoZSBuZXN0aW5nIGhpZXJpYXJjaHkuXHJcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgcGF5bG9hZC5jaGlsZCBBcnJheSBvZiBzdHJpbmdzIHBvaW50aW5nIHRvIHRoZSBuZXN0ZWQga2V5IHRvIGJlIGNsZWFyZWQuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gKGxvY2FsIGZ1bmN0aW9uKSAocGF5bG9hZCkgPT4gOiBUaGUgbmV3IGFwcCBzdGF0ZSwgb3IgY3VycmVudCBzdGF0ZSBpZiBpdCB3YXMgbm90IGFsdGVyZWQuXHJcbiAqL1xyXG5cclxuIGV4cG9ydCBjb25zdCBjbGVhclZhbHVlID0gKHN0YXRlLCBwYXlsb2FkKSA9PiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gICB7T2JqZWN0fSBwYXlsb2FkIHsgbmFtZTogU3RyaW5nLCBjaGlsZDogQXJyYXkgfVxyXG4gICAgICogQHBhcmFtICAge1N0cmluZ30gcGF5bG9hZC5uYW1lIE5hbWUgb2YgdGhlIGtleSB0byBiZSBjcmVhdGVkIG9yIHNlY29uZCBvYmplY3QgaW4gdGhlIG5lc3RpbmcgaGllcmlhcmNoeS5cclxuICAgICAqIEBwYXJhbSAgIHtBcnJheX0gIHBheWxvYWQuY2hpbGQgQXJyYXkgb2Ygc3RyaW5ncyBwb2ludGluZyB0byB0aGUgbmVzdGVkIGtleSB0byBiZSBjbGVhcmVkLlxyXG4gICAgICogQHJldHVybnMge09iamVjdH0geyB1cGRhdGVkU3RhdGUgfSA6IFRoZSBuZXcgYXBwIHN0YXRlLCBvciBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBub3QgYWx0ZXJlZC5cclxuICAgICAqL1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAocGF5bG9hZEluaGVyaXRlZCA9IHBheWxvYWQpIHtcclxuICAgICAgICBsZXQgY3VycmVudFN0YXRlID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShzdGF0ZSkpO1xyXG4gICAgICAgIGxldCB1cGRhdGVkU3RhdGUgPSBudWxsO1xyXG4gICAgICAgIGxldCB7IG5hbWUsIGNoaWxkIH0gPSBwYXlsb2FkSW5oZXJpdGVkO1xyXG4gICAgICAgIGxldCBuYW1lRmllbGQgPSBuYW1lO1xyXG4gICAgICAgIGxldCBjaGlsZHJlbiA9IGNoaWxkO1xyXG4gICAgICAgIGxldCB0ZXN0QXJyYXkgPSBzdGF0ZSA/IEFycmF5LmZyb20oc3RhdGUpIDogbnVsbFxyXG4gICAgICAgIGxldCBzbmFwc2hvdHMgPSBbXTtcclxuICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGUgIT09ICdvYmplY3QnIHx8IChzdGF0ZVtzdGF0ZS5sZW5ndGggLSAxXSA9PT0gdGVzdEFycmF5LnBvcCgpICYmIHR5cGVvZiB0ZXN0QXJyYXkucG9wKCkgIT09IFwidW5kZWZpbmVkXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtzdGF0ZV0gbXVzdCBiZSBhIHZhbGlkIGphdmFzY3JpcHQgb2JqZWN0YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSBcIm9iamVjdFwiKSAvKiBjaGVjayBpZiAnY2hpbGRyZW4nIGlzIGFuIGVtcHR5IGFycmF5IGFuZCBudWxsaWZ5IGl0ICovIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiB0eXBlb2YgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGlmICghY2hpbGRyZW4gJiYgY3VycmVudFN0YXRlLmhhc093blByb3BlcnR5KG5hbWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJyZW50U3RhdGUsIHN0YXRlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFN0YXRlW25hbWVGaWVsZF0gPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlW25hbWVGaWVsZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlW25hbWVGaWVsZF0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50U3RhdGUubGVuZ3RoID09PSBcIm51bWJlclwiICYmIHR5cGVvZiBjdXJyZW50U3RhdGVbY3VycmVudFN0YXRlLmxlbmd0aCAtIDFdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkU3RhdGUgPSBjdXJyZW50U3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY3VycmVudFN0YXRlW25hbWVGaWVsZF0gPT09IFwic3ltYm9sXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGVbbmFtZUZpZWxkXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFN0YXRlW25hbWVGaWVsZF0gPSAnJztcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkU3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCFjaGlsZHJlbiAmJiAhY3VycmVudFN0YXRlLmhhc093blByb3BlcnR5KG5hbWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgJyR7bmFtZUZpZWxkfScgZG9lcyBub3QgZXhpc3QgaW4gY3VycmVudCBzdGF0ZS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghc25hcHNob3RzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudFN0YXRlW25hbWVGaWVsZF1bY2hpbGRyZW5baW5kZXhdXSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHMucHVzaChjdXJyZW50U3RhdGVbbmFtZUZpZWxkXVtjaGlsZHJlbltpbmRleF1dKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBUaGUgcmVmZXJlbmNlZCBwcm9wZXJ0eSAnJHtjaGlsZHJlbltpbmRleF19JyBkb2VzIG5vdCBleGlzdCBpbiBjdXJyZW50IHN0YXRlLmApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV1bY2hpbGRyZW5baW5kZXhdXSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHMucHVzaChzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdW2NoaWxkcmVuW2luZGV4XV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFRoZSByZWZlcmVuY2VkIHByb3BlcnR5ICcke2NoaWxkcmVuW2luZGV4XX0nIGRvZXMgbm90IGV4aXN0IGluIGN1cnJlbnQgc3RhdGUuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gKGNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXgwID0gc25hcHNob3RzLmxlbmd0aCAtIDE7IGluZGV4MCA+PSAwOyBpbmRleDAtLSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgwID09PSAoc25hcHNob3RzLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0gPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0gIT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0gPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXS5sZW5ndGgpID09PSBcIm51bWJlclwiICYmIHR5cGVvZiAoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXS5sZW5ndGggLTEpICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9PT0gXCJzeW1ib2xcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90c1tpbmRleDBdW2NoaWxkcmVuW2luZGV4MCArIDFdXSA9IHNuYXBzaG90c1tpbmRleDAgKyAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleDAgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3VycmVudFN0YXRlLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXVtjaGlsZHJlbltpbmRleDBdXSA9IHNuYXBzaG90c1tpbmRleDBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFN0YXRlID0gY3VycmVudFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuIl19