clientnode 4.0.1428 → 4.0.1429
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Lock.js +100 -1
- package/dist/Logger.js +185 -1
- package/dist/Semaphore.js +65 -1
- package/dist/array.js +452 -1
- package/dist/cli.js +51 -1
- package/dist/constants.js +126 -1
- package/dist/context.js +40 -1
- package/dist/cookie.js +84 -1
- package/dist/data-transfer.js +216 -1
- package/dist/datetime.js +282 -1
- package/dist/domNode.js +331 -1
- package/dist/expression/evaluators.js +273 -1
- package/dist/expression/helper.js +97 -1
- package/dist/expression/index.js +26 -1
- package/dist/expression/indicator-functions.js +37 -1
- package/dist/expression/type.js +20 -0
- package/dist/filesystem.js +410 -1
- package/dist/function.js +75 -1
- package/dist/index.js +43 -1
- package/dist/indicators.js +121 -1
- package/dist/number.js +61 -1
- package/dist/object.js +934 -1
- package/dist/process.js +69 -1
- package/dist/property-types.js +115 -1
- package/dist/require.js +82 -1
- package/dist/scope.js +85 -1
- package/dist/string.js +806 -1
- package/dist/test-helper.js +341 -1
- package/dist/type.js +21 -1
- package/dist/utility.js +139 -1
- package/package.json +23 -22
- package/dist/Lock.d.ts +0 -39
- package/dist/Logger.d.ts +0 -102
- package/dist/Semaphore.d.ts +0 -29
- package/dist/array.d.ts +0 -150
- package/dist/bundle/Lock.js +0 -1
- package/dist/bundle/Logger.js +0 -1
- package/dist/bundle/Semaphore.js +0 -1
- package/dist/bundle/array.js +0 -1
- package/dist/bundle/cli.js +0 -1
- package/dist/bundle/constants.js +0 -1
- package/dist/bundle/context.js +0 -1
- package/dist/bundle/cookie.js +0 -1
- package/dist/bundle/data-transfer.js +0 -1
- package/dist/bundle/datetime.js +0 -1
- package/dist/bundle/domNode.js +0 -1
- package/dist/bundle/expression/evaluators.js +0 -1
- package/dist/bundle/expression/helper.js +0 -1
- package/dist/bundle/expression/index.js +0 -1
- package/dist/bundle/expression/indicator-functions.js +0 -1
- package/dist/bundle/expression/types.js +0 -1
- package/dist/bundle/filesystem.js +0 -1
- package/dist/bundle/function.js +0 -1
- package/dist/bundle/index.js +0 -1
- package/dist/bundle/indicators.js +0 -1
- package/dist/bundle/number.js +0 -1
- package/dist/bundle/object.js +0 -1
- package/dist/bundle/process.js +0 -1
- package/dist/bundle/property-types.js +0 -1
- package/dist/bundle/require.js +0 -1
- package/dist/bundle/scope.js +0 -1
- package/dist/bundle/string.js +0 -1
- package/dist/bundle/test-helper.js +0 -1
- package/dist/bundle/type.js +0 -1
- package/dist/bundle/utility.js +0 -1
- package/dist/cli.d.ts +0 -31
- package/dist/compatible/Lock.js +0 -1
- package/dist/compatible/Logger.js +0 -1
- package/dist/compatible/Semaphore.js +0 -1
- package/dist/compatible/array.js +0 -1
- package/dist/compatible/cli.js +0 -1
- package/dist/compatible/constants.js +0 -1
- package/dist/compatible/context.js +0 -1
- package/dist/compatible/cookie.js +0 -1
- package/dist/compatible/data-transfer.js +0 -1
- package/dist/compatible/datetime.js +0 -1
- package/dist/compatible/domNode.js +0 -1
- package/dist/compatible/expression/evaluators.js +0 -1
- package/dist/compatible/expression/helper.js +0 -1
- package/dist/compatible/expression/index.js +0 -1
- package/dist/compatible/expression/indicator-functions.js +0 -1
- package/dist/compatible/expression/types.js +0 -1
- package/dist/compatible/filesystem.js +0 -1
- package/dist/compatible/function.js +0 -1
- package/dist/compatible/index.js +0 -1
- package/dist/compatible/indicators.js +0 -1
- package/dist/compatible/number.js +0 -1
- package/dist/compatible/object.js +0 -1
- package/dist/compatible/process.js +0 -1
- package/dist/compatible/property-types.js +0 -1
- package/dist/compatible/require.js +0 -1
- package/dist/compatible/scope.js +0 -1
- package/dist/compatible/string.js +0 -1
- package/dist/compatible/test-helper.js +0 -1
- package/dist/compatible/type.js +0 -1
- package/dist/compatible/utility.js +0 -1
- package/dist/constants.d.ts +0 -99
- package/dist/context.d.ts +0 -9
- package/dist/cookie.d.ts +0 -31
- package/dist/data-transfer.d.ts +0 -45
- package/dist/datetime.d.ts +0 -37
- package/dist/domNode.d.ts +0 -82
- package/dist/expression/evaluators.d.ts +0 -55
- package/dist/expression/helper.d.ts +0 -4
- package/dist/expression/index.d.ts +0 -7
- package/dist/expression/indicator-functions.d.ts +0 -14
- package/dist/expression/types.d.ts +0 -70
- package/dist/expression/types.js +0 -1
- package/dist/filesystem.d.ts +0 -138
- package/dist/function.d.ts +0 -20
- package/dist/index.d.ts +0 -23
- package/dist/indicators.d.ts +0 -68
- package/dist/number.d.ts +0 -35
- package/dist/object.d.ts +0 -213
- package/dist/process.d.ts +0 -22
- package/dist/property-types.d.ts +0 -460
- package/dist/require.d.ts +0 -6
- package/dist/scope.d.ts +0 -44
- package/dist/string.d.ts +0 -299
- package/dist/test/Lock.d.ts +0 -1
- package/dist/test/Logger.d.ts +0 -1
- package/dist/test/Semaphore.d.ts +0 -1
- package/dist/test/array.d.ts +0 -1
- package/dist/test/cookie.d.ts +0 -1
- package/dist/test/data-transfer.d.ts +0 -1
- package/dist/test/datetime.d.ts +0 -1
- package/dist/test/domNode.d.ts +0 -1
- package/dist/test/expression/evaluators.d.ts +0 -1
- package/dist/test/expression/helper.d.ts +0 -1
- package/dist/test/expression/indicator-functions.d.ts +0 -1
- package/dist/test/filesystem.d.ts +0 -1
- package/dist/test/function.d.ts +0 -1
- package/dist/test/indicators.d.ts +0 -1
- package/dist/test/number.d.ts +0 -1
- package/dist/test/object.d.ts +0 -1
- package/dist/test/process.d.ts +0 -1
- package/dist/test/property-types.d.ts +0 -1
- package/dist/test/scope.d.ts +0 -1
- package/dist/test/string.d.ts +0 -1
- package/dist/test/utility.d.ts +0 -1
- package/dist/test-helper.d.ts +0 -143
- package/dist/type.d.ts +0 -211
- package/dist/utility.d.ts +0 -44
package/dist/object.js
CHANGED
|
@@ -1 +1,934 @@
|
|
|
1
|
-
"use strict";if("undefined"!=typeof module&&null!==module&&"undefined"!==eval("typeof require")&&null!==eval("require")&&"main"in eval("require")&&"undefined"!==eval("typeof require.main")&&null!==eval("require.main")){var ORIGINAL_MAIN_MODULE=module;module!==eval("require.main")&&"paths"in module&&"paths"in eval("require.main")&&"undefined"!=typeof __dirname&&null!==__dirname&&(module.paths=eval("require.main.paths").concat(module.paths.filter(function(path){return eval("require.main.paths").includes(path)})))}if(null==window)var window="undefined"==typeof global||null===global?{}:global;!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@babel/runtime/helpers/extends"),require("@babel/runtime/helpers/construct"));else if("function"==typeof define&&define.amd)define(["@babel/runtime/helpers/extends","@babel/runtime/helpers/construct"],r);else{var t="object"==typeof exports?r(require("@babel/runtime/helpers/extends"),require("@babel/runtime/helpers/construct")):r(e["@babel/runtime/helpers/extends"],e["@babel/runtime/helpers/construct"]);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,function(__WEBPACK_EXTERNAL_MODULE__3__,__WEBPACK_EXTERNAL_MODULE__13__){return function(){var __webpack_modules__=[function(e,r,t){t.d(r,{CLASS_TO_TYPE_MAPPING:function(){return _},IGNORE_NULL_AND_UNDEFINED_SYMBOL:function(){return o},PLAIN_OBJECT_PROTOTYPES:function(){return a},SPECIAL_REGEX_SEQUENCES:function(){return i},VALUE_COPY_SYMBOL:function(){return n}});var n=Symbol.for("clientnodeValue"),o=Symbol.for("clientnodeIgnoreNullAndUndefined"),_={"[object Array]":"array","[object Boolean]":"boolean","[object Date]":"date","[object Error]":"error","[object Function]":"function","[object Map]":"map","[object Number]":"number","[object Object]":"object","[object RegExp]":"regexp","[object Set]":"set","[object String]":"string"},a=[Object.prototype],i=["-","[","]","(",")","^","$","*","+",".","{","}"]},function(e,r,t){t.d(r,{globalContext:function(){return a}});var n,o,_=t(5);e=t.hmd(e);var a="undefined"==typeof globalThis?void 0===window?void 0===t.g?e:Object.prototype.hasOwnProperty.call(t.g,"window")?t.g.window:t.g:window:globalThis;a.fetch=a.fetch?a.fetch.bind(a):null!==(n=null==(o=(0,_.optionalRequire)("node-fetch"))?void 0:o.default)&&void 0!==n?n:function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];return _.currentImport?(0,_.currentImport)("node-fetch").then(function(e){var t;return(t=e).default.apply(t,r)}):null}},function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{addDynamicGetterAndSetter:function(){return _addDynamicGetterAndSetter},convertCircularObjectToJSON:function(){return convertCircularObjectToJSON},convertMapToPlainObject:function(){return _convertMapToPlainObject},convertPlainObjectToMap:function(){return _convertPlainObjectToMap},convertSubstringInPlainObject:function(){return _convertSubstringInPlainObject},copy:function(){return _copy},determineType:function(){return determineType},equals:function(){return _equals},evaluateDynamicData:function(){return evaluateDynamicData},extend:function(){return _extend},getProxyHandler:function(){return getProxyHandler},mask:function(){return _mask},modifyObject:function(){return _modifyObject},removeKeyPrefixes:function(){return _removeKeyPrefixes},removeKeysInEvaluation:function(){return _removeKeysInEvaluation},represent:function(){return _represent},sort:function(){return sort},unwrapProxy:function(){return _unwrapProxy}});var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(3),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__),_constants__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(0),_indicators__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(4),_number__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(8),_string__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(7);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var _addDynamicGetterAndSetter=function(e,r,t,n,o,_){if(void 0===r&&(r=null),void 0===t&&(t=null),void 0===n&&(n={}),void 0===o&&(o=!0),void 0===_&&(_=[Object]),o&&"object"==typeof e)if(Array.isArray(e))for(var a,i=0,l=_createForOfIteratorHelperLoose(e);!(a=l()).done;){var s=a.value;e[i]=_addDynamicGetterAndSetter(s,r,t,n,o),i+=1}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var u,c=_createForOfIteratorHelperLoose(e);!(u=c()).done;){var f=u.value,p=f[0],d=f[1];e.set(p,_addDynamicGetterAndSetter(d,r,t,n,o))}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var v,O=[],E=_createForOfIteratorHelperLoose(e);!(v=E()).done;){var b=v.value;e.delete(b),O.push(_addDynamicGetterAndSetter(b,r,t,n,o))}for(var g=0,P=O;g<P.length;g++){var y=P[g];e.add(y)}}else if(null!==e)for(var m=0,h=Object.entries(e);m<h.length;m++){var M=h[m],A=M[0],D=M[1];e[A]=_addDynamicGetterAndSetter(D,r,t,n,o)}if(r||t)for(var I,L,R=function(){var o=L.value;if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e)&&e instanceof o){var _=getProxyHandler(e,n),a=getProxyHandler(e,n);r&&(a.get=function(t,n){return"__target__"===n?e:"__revoke__"===n?function(){return s(),e}:"function"==typeof e[n]?e[n]:r(_.get(l,n),n,e)}),t&&(a.set=function(r,n,o){return _.set(l,n,t(n,o,e))});var i=Proxy.revocable({},a),l=i.proxy,s=i.revoke;return{v:l}}},T=_createForOfIteratorHelperLoose(_);!(L=T()).done;)if(I=R())return I.v;return e},convertCircularObjectToJSON=function(e,r,t){void 0===r&&(r=function(e){return null!=e?e:"__circularReference__"}),void 0===t&&(t=0);var n=new Map;return function(e){var o=function(e,t){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(t)){var _,a;if(n.has(t))return r(null!==(_=n.get(t))&&void 0!==_?_:null,e,t,n);if(n.set(t,null),Array.isArray(t)){a=[];for(var i,l=_createForOfIteratorHelperLoose(t);!(i=l()).done;){var s=i.value;a.push(o(null,s))}}else{a={};for(var u=0,c=Object.entries(t);u<c.length;u++){var f=c[u],p=f[0],d=f[1];a[p]=o(p,d)}}return n.set(t,a),a}return t};return JSON.stringify(e,o,t)}(e)},_convertMapToPlainObject=function(e,r){if(void 0===r&&(r=!0),"object"==typeof e){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e)){for(var t,n={},o=_createForOfIteratorHelperLoose(e);!(t=o()).done;){var _=t.value,a=_[0],i=_[1];r&&(i=_convertMapToPlainObject(i,r)),["number","string"].includes(typeof a)&&(n[String(a)]=i)}return n}if(r)if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(e))for(var l=0,s=Object.entries(e);l<s.length;l++){var u=s[l],c=u[0],f=u[1];e[c]=_convertMapToPlainObject(f,r)}else if(Array.isArray(e))for(var p=0,d=0,v=e;d<v.length;d++){var O=v[d];e[p]=_convertMapToPlainObject(O,r),p+=1}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var E,b=[],g=_createForOfIteratorHelperLoose(e);!(E=g()).done;){var P=E.value;e.delete(P),b.push(_convertMapToPlainObject(P,r))}for(var y=0,m=b;y<m.length;y++){var h=m[y];e.add(h)}}}return e},_convertPlainObjectToMap=function(e,r){if(void 0===r&&(r=!0),"object"==typeof e){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(e)){for(var t=new Map,n=0,o=Object.entries(e);n<o.length;n++){var _=o[n],a=_[0],i=_[1];r&&(e[a]=_convertPlainObjectToMap(i,r)),t.set(a,e[a])}return t}if(r)if(Array.isArray(e))for(var l=0,s=0,u=e;s<u.length;s++){var c=u[s];e[l]=_convertPlainObjectToMap(c,r),l+=1}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var f,p=_createForOfIteratorHelperLoose(e);!(f=p()).done;){var d=f.value,v=d[0],O=d[1];e.set(v,_convertPlainObjectToMap(O,r))}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var E,b=[],g=_createForOfIteratorHelperLoose(e);!(E=g()).done;){var P=E.value;e.delete(P),b.push(_convertPlainObjectToMap(P,r))}for(var y=0,m=b;y<m.length;y++){var h=m[y];e.add(h)}}}return e},_convertSubstringInPlainObject=function(e,r,t){for(var n=0,o=Object.entries(e);n<o.length;n++){var _=o[n],a=_[0],i=_[1];(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(i)?e[a]=_convertSubstringInPlainObject(i,r,t):"string"==typeof i&&(e[a]=i.replace(r,t))}return e},_copy=function(e,r,t,n,o,_,a,i){if(void 0===r&&(r=!1),void 0===t&&(t=-1),void 0===n&&(n=_constants__WEBPACK_IMPORTED_MODULE_1__.VALUE_COPY_SYMBOL),void 0===o&&(o=null),void 0===_&&(_=!1),void 0===a&&(a=[]),void 0===i&&(i=0),(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e)){if(!o){if(Array.isArray(e))return _copy(e,r,t,n,[],_,a,i);if(e instanceof Map)return _copy(e,r,t,n,new Map,_,a,i);if(e instanceof Set)return _copy(e,r,t,n,new Set,_,a,i);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp){var l=/[^/]*$/.exec(e.toString());return(o=new RegExp(e.source,l?l[0]:void 0)).lastIndex=e.lastIndex,o}return"undefined"!=typeof Blob&&e instanceof Blob?r?e.slice(0,e.size,e.type):e:_copy(e,r,t,n,{},_,a,i)}if(e===o)throw new Error("Can't copy because source and destination are identical.");if(!_&&![void 0,null].includes(e)){var s=a.indexOf(e);if(-1!==s)return a[s];a.push(e)}var u=function(e){if(-1!==t&&t<i+1)return n===_constants__WEBPACK_IMPORTED_MODULE_1__.VALUE_COPY_SYMBOL?e:n;var o=_copy(e,r,t,n,null,_,a,i+1);return _||[void 0,null].includes(e)||"object"!=typeof e||a.push(e),o};if(Array.isArray(e))for(var c,f=_createForOfIteratorHelperLoose(e);!(c=f()).done;){var p=c.value;o.push(u(p))}else if(e instanceof Map)for(var d,v=_createForOfIteratorHelperLoose(e);!(d=v()).done;){var O=d.value,E=O[0],b=O[1];o.set(E,u(b))}else if(e instanceof Set)for(var g,P=_createForOfIteratorHelperLoose(e);!(g=P()).done;){var y=g.value;o.add(u(y))}else for(var m=0,h=Object.entries(e);m<h.length;m++){var M=h[m],A=M[0],D=M[1];try{o[A]=u(D)}catch(e){throw new Error('Failed to copy property value object "'+A+'": '+_represent(e),{cause:e})}}}return o||e},determineType=function(e){if([null,void 0].includes(e))return String(e);var r=typeof e;if(["function","object"].includes(r)&&"toString"in e){var t=Object.prototype.toString.call(e);if(Object.prototype.hasOwnProperty.call(_constants__WEBPACK_IMPORTED_MODULE_1__.CLASS_TO_TYPE_MAPPING,t))return _constants__WEBPACK_IMPORTED_MODULE_1__.CLASS_TO_TYPE_MAPPING[t]}return r},_equals=function equals(firstValue,secondValue,givenOptions){void 0===givenOptions&&(givenOptions={});var options=_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({compareBlobs:!1,deep:-1,exceptionPrefixes:[],ignoreFunctions:!0,properties:null,returnReasonIfNotEqual:!1},givenOptions);if(options.ignoreFunctions&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isFunction)(firstValue)&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isFunction)(secondValue)||firstValue===secondValue||(0,_number__WEBPACK_IMPORTED_MODULE_3__.isNotANumber)(firstValue)&&(0,_number__WEBPACK_IMPORTED_MODULE_3__.isNotANumber)(secondValue)||firstValue instanceof RegExp&&secondValue instanceof RegExp&&firstValue.toString()===secondValue.toString()&&firstValue.flags.split("").sort().join("")===secondValue.flags.split("").sort().join("")||firstValue instanceof Date&&secondValue instanceof Date&&(isNaN(firstValue.getTime())&&isNaN(secondValue.getTime())||!isNaN(firstValue.getTime())&&!isNaN(secondValue.getTime())&&firstValue.getTime()===secondValue.getTime())||options.compareBlobs&&"undefined"!==eval("typeof Buffer")&&Object.prototype.hasOwnProperty.call(eval("Buffer"),"isBuffer")&&firstValue instanceof eval("Buffer")&&secondValue instanceof eval("Buffer")&&firstValue.toString("base64")===secondValue.toString("base64"))return!0;if(options.compareBlobs&&"undefined"!=typeof Blob&&firstValue instanceof Blob&&secondValue instanceof Blob)return new Promise(function(e){for(var r=[],t=0,n=[firstValue,secondValue];t<n.length;t++){var o=n[t],_=new FileReader;_.onload=function(t){null===t.target?r.push(null):r.push(t.target.result),2===r.length&&(r[0]===r[1]?e(!0):e(!!options.returnReasonIfNotEqual&&">>> Blob("+_represent(r[0])+") !== Blob("+_represent(r[1])+")"))},_.readAsDataURL(o)}});if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(firstValue)&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(secondValue)&&!(firstValue instanceof RegExp||secondValue instanceof RegExp)||Array.isArray(firstValue)&&Array.isArray(secondValue)&&firstValue.length===secondValue.length||determineType(firstValue)===determineType(secondValue)&&["map","set"].includes(determineType(firstValue))&&firstValue.size===secondValue.size){for(var promises=[],_i11=0,_arr4=[[firstValue,secondValue],[secondValue,firstValue]];_i11<_arr4.length;_i11++){var _arr4$_i=_arr4[_i11],first=_arr4$_i[0],second=_arr4$_i[1],firstIsArray=Array.isArray(first);if(firstIsArray&&(!Array.isArray(second)||first.length!==second.length))return!!options.returnReasonIfNotEqual&&".length";var firstIsMap=(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(first);if(firstIsMap&&(!(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(second)||first.size!==second.size))return!!options.returnReasonIfNotEqual&&".size";var firstIsSet=(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(first);if(firstIsSet&&(!(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(second)||first.size!==second.size))return!!options.returnReasonIfNotEqual&&".size";if(firstIsArray){for(var index=0,_loop2=function(){var e=_arr5[_i12];if(0!==options.deep){var r=_equals(e,second[index],_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},options,{deep:options.deep-1}));if(!r)return{v:!1};var t=index,n=function(e){var r;return"string"==typeof e?"["+String(t)+"]"+(null!==(r={"[":"",">":" "}[e[0]])&&void 0!==r?r:".")+e:e};if(Object.prototype.hasOwnProperty.call(r,"then")&&promises.push(r.then(n)),"string"==typeof r)return{v:n(r)}}index+=1},_ret2,_i12=0,_arr5=first;_i12<_arr5.length;_i12++)if(_ret2=_loop2(),_ret2)return _ret2.v}else if(firstIsMap){for(var _loop3=function(){var e=_step11.value,r=e[0],t=e[1];if(0!==options.deep){var n=_equals(t,second.get(r),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},options,{deep:options.deep-1}));if(!n)return{v:!1};var o=function(e){var t;return"string"==typeof e?"get("+_represent(r)+")"+(null!==(t={"[":"",">":" "}[e[0]])&&void 0!==t?t:".")+e:e};if(Object.prototype.hasOwnProperty.call(n,"then")&&promises.push(n.then(o)),"string"==typeof n)return{v:o(n)}}},_ret3,_iterator11=_createForOfIteratorHelperLoose(first),_step11;!(_step11=_iterator11()).done;)if(_ret3=_loop3(),_ret3)return _ret3.v}else if(firstIsSet){for(var _loop4=function(){var e=_step12.value;if(0!==options.deep){for(var r,t=!1,n=[],o=_createForOfIteratorHelperLoose(second);!(r=o()).done;){var _=r.value,a=_equals(e,_,_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},options,{deep:options.deep-1}));if("boolean"==typeof a){if(a){t=!0;break}}else n.push(a)}var i=function(r){return!!r||!!options.returnReasonIfNotEqual&&">>> {-> "+_represent(e)+" not found}"};return t?0:(n.length&&promises.push(new Promise(function(e){Promise.all(n).then(function(r){e(i(r.some(function(e){return e})))},function(){})})),{v:i(!1)})}},_ret4,_iterator12=_createForOfIteratorHelperLoose(first),_step12;!(_step12=_iterator12()).done;)if(_ret4=_loop4(),0!==_ret4&&_ret4)return _ret4.v}else for(var _loop5=function(){var e=_Object$entries7[_i13],r=e[0],t=e[1];if(options.properties&&!options.properties.includes(r))return 0;for(var n,o=!1,_=_createForOfIteratorHelperLoose(options.exceptionPrefixes);!(n=_()).done;){var a=n.value;if(r.startsWith(a)){o=!0;break}}if(o)return 0;if(0!==options.deep){var i=_equals(t,second[r],_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},options,{deep:options.deep-1}));if(!i)return{v:!1};var l=function(e){var t;return"string"==typeof e?r+(null!==(t={"[":"",">":" "}[e[0]])&&void 0!==t?t:".")+e:e};if(Object.prototype.hasOwnProperty.call(i,"then")&&promises.push(i.then(l)),"string"==typeof i)return{v:l(i)}}},_ret5,_i13=0,_Object$entries7=Object.entries(first);_i13<_Object$entries7.length&&(_ret5=_loop5(),0!==_ret5);_i13++)if(_ret5)return _ret5.v}return!promises.length||new Promise(function(e){Promise.all(promises).then(function(r){for(var t,n=_createForOfIteratorHelperLoose(r);!(t=n()).done;){var o=t.value;if(!o||"string"==typeof o){e(o);break}}e(!0)},function(){})})}return!!options.returnReasonIfNotEqual&&">>> "+_represent(firstValue)+" !== "+_represent(secondValue)},evaluateDynamicData=function(e,r,t,n,o){if(void 0===r&&(r={}),void 0===t&&(t="self"),void 0===n&&(n="__evaluate__"),void 0===o&&(o="__execute__"),"object"!=typeof e||null===e)return e;t in r||(r[t]=e);var _=function(e,t){void 0===t&&(t=n);var _=(0,_string__WEBPACK_IMPORTED_MODULE_4__.evaluate)(e,r,t===o);if(_.error)throw new Error(_.error);return _.result},a=function(e){if("object"!=typeof e||null===e||"undefined"==typeof Proxy)return e;for(var r=0,t=Object.entries(e);r<t.length;r++){var l=t[r],s=l[0],u=l[1];if("__target__"!==s&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(u)){var c=u;if(a(c),Object.prototype.hasOwnProperty.call(c,n)||Object.prototype.hasOwnProperty.call(c,o)){var f=c;e[s]=new Proxy(c,{get:function(e,r){if("__target__"===r)return e;if("hasOwnProperty"===r)return e[r];for(var t=0,a=[n,o];t<a.length;t++){var l=a[t];if(r===l&&"string"==typeof e[r])return i(_(e[r],l))}var s=i(e);if("toString"===r){var u=_(s);return u[r].bind(u)}if("string"!=typeof r){var c,f=_(s);return null!=(c=f[r])&&c.bind?f[r].bind(f):f[r]}for(var p=0,d=[n,o];p<d.length;p++){var v=d[p];if(Object.prototype.hasOwnProperty.call(e,v))return _(s,v)[r]}return s[r]},ownKeys:function(e){for(var r=0,t=[n,o];r<t.length;r++){var a=t[r];if(Object.prototype.hasOwnProperty.call(e,a))return Object.getOwnPropertyNames(i(_(e[a],a)))}return Object.getOwnPropertyNames(e)}}),e[s].__target__||(e[s].__target__=f)}}}return e},i=function(e){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e)){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isProxy)(e)){for(var r=0,t=[n,o];r<t.length;r++){var a=t[r];if(Object.prototype.hasOwnProperty.call(e,a))return e[a]}e=e.__target__}for(var l=0,s=Object.entries(e);l<s.length;l++){var u=s[l],c=u[0],f=u[1];if([n,o].includes(c))return"undefined"==typeof Proxy?i(_(f)):f;e[c]=i(f)}}return e};r.resolve=i;var l=function(e){if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e))for(var r=0,t=Object.entries(e);r<t.length;r++){var n=t[r],o=n[0],_=n[1];if("__target__"!==o&&null!==_&&["function","undefined"].includes(typeof _)){var a=_.__target__;void 0!==a&&(e[o]=a),l(_)}}return e};return Object.prototype.hasOwnProperty.call(e,n)?_(e[n]):Object.prototype.hasOwnProperty.call(e,o)?_(e[o],o):l(i(a(e)))},_removeKeysInEvaluation=function(e,r){void 0===r&&(r=["__evaluate__","__execute__"]);for(var t=0,n=Object.entries(e);t<n.length;t++){var o=n[t],_=o[0],a=o[1];!r.includes(_)&&r.some(function(r){return Object.prototype.hasOwnProperty.call(e,r)})?delete e[_]:(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(a)&&_removeKeysInEvaluation(a,r)}return e},_extend=function(e,r){for(var t=!1,n=arguments.length,o=new Array(n>2?n-2:0),_=2;_<n;_++)o[_-2]=arguments[_];var a,i=o;e===_constants__WEBPACK_IMPORTED_MODULE_1__.IGNORE_NULL_AND_UNDEFINED_SYMBOL||"boolean"==typeof e?(t=e,a=r):(a=e,(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(r)?i=[r].concat(i):void 0!==r&&(a=r));for(var l,s=function(e,r){return r===e?e:t&&r&&((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(r)||(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(r))?(n=(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(r)?e&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e)?e:new Map:e&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(e)?e:{},_extend(t,n,r)):r;var n},u=_createForOfIteratorHelperLoose(i);!(l=u()).done;){var c=l.value,f=typeof a,p=typeof c;if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(a)&&(f+=" Map"),(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(c)&&(p+=" Map"),f===p&&a!==c)if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(a)&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(c))for(var d,v=_createForOfIteratorHelperLoose(c);!(d=v()).done;){var O=d.value,E=O[0],b=O[1];a.set(E,s(a.get(E),b))}else if(!(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(a)||Array.isArray(a)||"undefined"!=typeof Blob&&a instanceof Blob||!(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(c)||Array.isArray(c)||"undefined"!=typeof Blob&&c instanceof Blob)a=c;else for(var g=0,P=Object.entries(c);g<P.length;g++){var y=P[g],m=y[0],h=y[1];t===_constants__WEBPACK_IMPORTED_MODULE_1__.IGNORE_NULL_AND_UNDEFINED_SYMBOL&&[null,void 0].includes(h)||(a[m]=s(a[m],h))}else a=c}return a},getProxyHandler=function(e,r){return void 0===r&&(r={}),r=_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({delete:"[]",get:"[]",has:"[]",set:"[]"},r),{deleteProperty:function(t,n){return"[]"!==r.delete||"string"!=typeof n?e[r.delete](n):(delete e[n],!0)},get:function(t,n){return"[]"===r.get&&"string"==typeof n?e[n]:e[r.get](n)},has:function(t,n){return"[]"===r.has?n in e:e[r.has](n)},set:function(t,n,o){return"[]"!==r.set||"string"!=typeof n?e[r.set](n,o):(e[n]=o,!0)}}},_mask=function(e,r){if(!0===(r=_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({exclude:!1,include:!0},r)).exclude||Array.isArray(r.exclude)&&0===r.exclude.length||!1===r.include||"object"!=typeof e)return{};var t=Array.isArray(r.exclude)?r.exclude.reduce(function(e,r){var t;return _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},e,((t={})[r]=!0,t))},{}):r.exclude,n=Array.isArray(r.include)?r.include.reduce(function(e,r){var t;return _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},e,((t={})[r]=!0,t))},{}):r.include,o={};if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(n))for(var _=0,a=Object.entries(n);_<a.length;_++){var i=a[_],l=i[0],s=i[1];Object.prototype.hasOwnProperty.call(e,l)&&(!0===s?o[l]=e[l]:((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(s)||Array.isArray(s)&&s.length)&&"object"==typeof e[l]&&(o[l]=_mask(e[l],{include:s})))}else o=e;if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(t)){for(var u=!1,c=_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default()({},o),f=0,p=Object.entries(t);f<p.length;f++){var d=p[f],v=d[0],O=d[1];if(Object.prototype.hasOwnProperty.call(c,v))if(!0===O)u=!0,delete c[v];else if(((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isPlainObject)(O)||Array.isArray(O)&&O.length)&&"object"==typeof c[v]){var E=c[v];c[v]=_mask(c[v],{exclude:O}),c[v]!==E&&(u=!0)}}u&&(o=c)}return o},_modifyObject=function(e,r,t,n,o,_,a,i,l){if(void 0===t&&(t="__remove__"),void 0===n&&(n="__prepend__"),void 0===o&&(o="__append__"),void 0===_&&(_="__"),void 0===a&&(a="__"),void 0===i&&(i=null),void 0===l&&(l=null),(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(r)&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var s,u=_createForOfIteratorHelperLoose(r);!(s=u()).done;){var c=s.value,f=c[0],p=c[1];e.has(f)&&_modifyObject(e.get(f),p,t,n,o,_,a,r,f)}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(r)&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e))for(var d=0,v=Object.entries(r);d<v.length;d++){var O=v[d],E=O[0],b=O[1],g=NaN;if(Array.isArray(e)&&E.startsWith(_)&&E.endsWith(a)&&((g=parseInt(E.substring(_.length,E.length-a.length),10))<0||g>=e.length)&&(g=NaN),[t,n,o].includes(E)||!isNaN(g)){if(Array.isArray(e))if(E===t)for(var P,y=_createForOfIteratorHelperLoose([].concat(b));!(P=y()).done;){var m=P.value;"string"==typeof m&&m.startsWith(_)&&m.endsWith(a)?e.splice(parseInt(m.substring(_.length,m.length-a.length),10),1):e.includes(m)?e.splice(e.indexOf(m),1):"number"==typeof m&&m<e.length&&e.splice(m,1)}else E===o?e=e.concat(b):E===n?e=[].concat(b).concat(e):(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e[g])&&(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(b)?_extend(!0,_modifyObject(e[g],b,t,n,o,_,a),e[g],b):e[g]=b;else if(E===t)for(var h,M=_createForOfIteratorHelperLoose([].concat(b));!(h=M()).done;){var A=h.value;"string"==typeof A&&Object.prototype.hasOwnProperty.call(e,A)&&delete e[A]}delete r[E],i&&"string"==typeof l&&delete i[l]}else null!==e&&Object.prototype.hasOwnProperty.call(e,E)&&(e[E]=_modifyObject(e[E],b,t,n,o,_,a,r,E))}return e},_removeKeyPrefixes=function(e,r){void 0===r&&(r="#");var t=[].concat(r);if(Array.isArray(e))for(var n,o=0,_=_createForOfIteratorHelperLoose(e.slice());!(n=_()).done;){var a=n.value,i=!1;if("string"==typeof a){for(var l,s=_createForOfIteratorHelperLoose(t);!(l=s()).done;){var u=l.value;if(a.startsWith(u+":")){e.splice(o,1),i=!0;break}}if(i)continue}e[o]=_removeKeyPrefixes(a,t),o+=1}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e))for(var c,f=_createForOfIteratorHelperLoose(new Set(e));!(c=f()).done;){var p=c.value,d=!1;if("string"==typeof p){for(var v,O=_createForOfIteratorHelperLoose(t);!(v=O()).done;){var E=v.value;if(p.startsWith(E+":")){e.delete(p),d=!0;break}}if(d)continue}_removeKeyPrefixes(p,t)}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var b,g=_createForOfIteratorHelperLoose(new Map(e));!(b=g()).done;){var P=b.value,y=P[0],m=P[1],h=!1;if("string"==typeof y){for(var M,A=_createForOfIteratorHelperLoose(t);!(M=A()).done;){var D=M.value,I=(0,_string__WEBPACK_IMPORTED_MODULE_4__.escapeRegularExpressions)(D);if(new RegExp("^"+I+"[0-9]*$").test(y)){e.delete(y),h=!0;break}}if(h)continue}e.set(y,_removeKeyPrefixes(m,t))}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e))for(var L=0,R=Object.entries(Object.assign({},e));L<R.length;L++){for(var T,C=R[L],x=C[0],j=C[1],w=!1,B=_createForOfIteratorHelperLoose(t);!(T=B()).done;){var U=T.value,S=(0,_string__WEBPACK_IMPORTED_MODULE_4__.escapeRegularExpressions)(U);if(new RegExp("^"+S+"[0-9]*$").test(x)){delete e[x],w=!0;break}}w||(e[x]=_removeKeyPrefixes(j,t))}return e},_represent=function(e,r,t,n,o,_){if(void 0===r&&(r=30),void 0===t&&(t=" "),void 0===n&&(n=""),void 0===o&&(o="__maximum_number_of_levels_reached__"),void 0===_&&(_=8),0===_)return String(o);if(null===e)return"null";if(void 0===e)return"undefined";if("string"==typeof e)return'"'+e.replace(/\n/g,"\n"+n)+'"';if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isNumeric)(e)||"boolean"==typeof e)return String(e);if(e instanceof Date)return e.toISOString();if(Array.isArray(e)){for(var a,i="[",l=!1,s=1,u=_createForOfIteratorHelperLoose(e);!(a=u()).done;){var c=a.value;if(s>r){i+="\n"+n+"...";break}l&&(i+=","),i+="\n"+n+t+_represent(c,r,t,""+n+t,o,_-1),l=!0,s+=1}return l&&(i+="\n"+n),i+="]"}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e)){for(var f,p="",d=!1,v=1,O=_createForOfIteratorHelperLoose(e);!(f=O()).done;){var E=f.value,b=E[0],g=E[1];if(v>r){p+=",\n"+n+"...";break}d&&(p+=",\n"+n+t),p+=_represent(b,r,t,""+n+t,o,_-1)+" -> "+_represent(g,r,t,""+n+t,o,_-1),d=!0,v+=1}return d||(p="EmptyMap"),p}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var P,y="{",m=!1,h=1,M=_createForOfIteratorHelperLoose(e);!(P=M()).done;){var A=P.value;if(h>r){y+=",\n"+n+"...";break}m&&(y+=","),y+="\n"+n+t+_represent(A,r,t,""+n+t,o,_-1),m=!0,h+=1}return m?y+="\n"+n+"}":y="EmptySet",y}if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isFunction)(e))return"__function__";for(var D,I="{",L=!1,R=1,T=_createForOfIteratorHelperLoose(Object.getOwnPropertyNames(e).sort());!(D=T()).done;){var C=D.value;if(R>r){I+=",\n"+n+"...";break}L&&(I+=","),I+="\n"+n+t+C+": "+_represent(e[C],r,t,""+n+t,o,_-1),L=!0,R+=1}return L&&(I+="\n"+n),I+="}"},sort=function(e){var r=[];if(Array.isArray(e))for(var t=0;t<e.length;t++)r.push(t);else if("object"==typeof e)if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var n,o=_createForOfIteratorHelperLoose(e);!(n=o()).done;){var _=n.value;r.push(_[0])}else if(null!==e)for(var a=0,i=Object.keys(e);a<i.length;a++){var l=i[a];r.push(l)}return r.sort()},_unwrapProxy=function(e,r){if(void 0===r&&(r=new Set),(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isObject)(e)){if(r.has(e))return e;try{(0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isFunction)(e.__revoke__)&&((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isProxy)(e)&&(e=e.__target__),e.__revoke__())}catch(r){return e}finally{r.add(e)}if(Array.isArray(e))for(var t,n=0,o=_createForOfIteratorHelperLoose(e);!(t=o()).done;){var _=t.value;e[n]=_unwrapProxy(_,r),n+=1}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isMap)(e))for(var a,i=_createForOfIteratorHelperLoose(e);!(a=i()).done;){var l=a.value,s=l[0],u=l[1];e.set(s,_unwrapProxy(u,r))}else if((0,_indicators__WEBPACK_IMPORTED_MODULE_2__.isSet)(e)){for(var c,f=[],p=_createForOfIteratorHelperLoose(e);!(c=p()).done;){var d=c.value;e.delete(d),f.push(_unwrapProxy(d,r))}for(var v=0,O=f;v<O.length;v++){var E=O[v];e.add(E)}}else for(var b=0,g=Object.entries(e);b<g.length;b++){var P=g[b],y=P[0],m=P[1];e[y]=_unwrapProxy(m,r)}}return e}},function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__3__},function(e,r,t){t.d(r,{isFunction:function(){return c},isMap:function(){return s},isNumeric:function(){return _},isObject:function(){return a},isPlainObject:function(){return i},isProxy:function(){return u},isSet:function(){return l}});var n=t(0),o=t(2);var _=function(e){var r=(0,o.determineType)(e);return["number","string"].includes(r)&&!isNaN(e-parseFloat(e))},a=function(e){return null!==e&&"object"==typeof e},i=function(e){return a(e)&&n.PLAIN_OBJECT_PROTOTYPES.includes(Object.getPrototypeOf(e))},l=function(e){return"set"===(0,o.determineType)(e)},s=function(e){return"map"===(0,o.determineType)(e)},u=function(e){return Boolean(e.__target__)},c=function(e){return Boolean(e)&&["[object AsyncFunction]","[object Function]"].includes({}.toString.call(e))}},function(module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{currentImport:function(){return currentImport},optionalRequire:function(){return optionalRequire}});var currentRequire=eval("typeof require === 'undefined' ? null : require"),currentOptionalImport=null;try{currentOptionalImport=eval("typeof import === 'undefined' ? null : import")}catch(e){}var currentImport=currentOptionalImport,optionalRequire=function(e){try{return currentRequire?currentRequire(e):null}catch(e){return null}},clearRequireCache=function(e){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c);for(var r={},t=0,n=Object.entries(e);t<n.length;t++){var o=n[t],_=o[0],a=o[1];r[_]=a,delete e[_]}return r},restoreRequireCache=function(e,r){void 0===e&&(e=(null==currentRequire?void 0:currentRequire.cache)||__webpack_require__.c),clearRequireCache();for(var t=0,n=Object.entries(r);t<n.length;t++){var o=n[t],_=o[0],a=o[1];e[_]=a}},isolatedRequire=function(e,r){void 0===r&&(r=currentRequire||__webpack_require__(6));var t=clearRequireCache(r.cache);try{return r(e)}catch(e){throw e}finally{restoreRequireCache(r.cache,t)}}},function(e){function r(e){var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}r.keys=function(){return[]},r.resolve=r,r.id=6,e.exports=r},function(__unused_webpack_module,__webpack_exports__,__webpack_require__){var _extends,ABBREVIATIONS,DEFAULT_ENCODING,globalContext,MAXIMAL_NUMBER_OF_ITERATIONS,readFileSync,isFileSync,determineType;__webpack_require__.d(__webpack_exports__,{escapeRegularExpressions:function(){return escapeRegularExpressions},evaluate:function(){return evaluate}});var _babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(3),_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_babel_runtime_helpers_extends__WEBPACK_IMPORTED_MODULE_0__),_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(13),_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1__),_constants__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(0),_context__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(1),_object__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(2);function _createForOfIteratorHelperLoose(e,r){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(t)return(t=t.call(e)).next.bind(t);if(Array.isArray(e)||(t=_unsupportedIterableToArray(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var n=0;return function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}var POLYFILL_TEMPLATE_STRINGS={value:!1},ALLOWED_VARIABLE_SYMBOLS="0-9a-zA-Z_$",ALLOWED_STARTING_VARIABLE_SYMBOLS="a-zA-Z_$",FIX_ENCODING_ERROR_MAPPING=null,escapeRegularExpressions=function(e,r){if(void 0===r&&(r=[]),1===e.length&&!_constants__WEBPACK_IMPORTED_MODULE_2__.SPECIAL_REGEX_SEQUENCES.includes(e))return e;r.includes("\\")||e.replace(/\\/g,"\\\\");for(var t,n=_createForOfIteratorHelperLoose(_constants__WEBPACK_IMPORTED_MODULE_2__.SPECIAL_REGEX_SEQUENCES);!(t=n()).done;){var o=t.value;r.includes(o)||(e=e.replace(new RegExp("\\"+o,"g"),"\\"+o))}return e},convertToValidVariableName=function(e){return["class","default"].includes(e)?"_"+e:e.replace(new RegExp("^[^"+ALLOWED_STARTING_VARIABLE_SYMBOLS+"]+"),"").replace(new RegExp("[^"+ALLOWED_VARIABLE_SYMBOLS+"]+([a-zA-Z])","g"),function(e,r){return r.toUpperCase()})},encodeURIComponentExtended=function(e,r){return void 0===r&&(r=!1),encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,r?"%20":"+")},addSeparatorToPath=function(e,r){return void 0===r&&(r="/"),(e=e.trim()).substring(e.length-1)!==r&&e.length?e+r:e},hasPathPrefix=function(e,r,t){var n;(void 0===e&&(e="/admin"),void 0===r)&&(r=(null==(n=globalContext.location)?void 0:n.pathname)||"");return void 0===t&&(t="/"),"string"==typeof e&&(e.endsWith(t)||(e+=t),r===e.substring(0,e.length-t.length)||r.startsWith(e))},getDomainName=function(e,r){var t,n;void 0===e&&(e=(null==(t=globalContext.location)?void 0:t.href)||"");void 0===r&&(r=(null==(n=globalContext.location)?void 0:n.hostname)||"");var o=/^([a-z]*:?\/\/)?([^/]+?)(?::[0-9]+)?(?:\/.*|$)/i.exec(e);return o&&o.length>2&&o[1]&&o[2]?o[2]:r},getPortNumber=function(e,r){var t,n,o;void 0===e&&(e=(null==(n=globalContext.location)?void 0:n.href)||"");void 0===r&&(r=null!=(o=globalContext.location)&&o.port?parseInt(globalContext.location.port):null);var _=/^(?:[a-z]*:?\/\/[^/]+?)?[^/]+?:([0-9]+)/i.exec(e);return _&&_.length>1?parseInt(_[1],10):null!==r?r:null!=(t=globalContext.location)&&t.port&&parseInt(globalContext.location.port,10)?parseInt(globalContext.location.port,10):"https"===getProtocolName(e)?443:80},getProtocolName=function(e,r){var t,n;void 0===e&&(e=(null==(t=globalContext.location)?void 0:t.href)||"");void 0===r&&(r=(null==(n=globalContext.location)?void 0:n.protocol)&&globalContext.location.protocol.substring(0,globalContext.location.protocol.length-1)||"");var o=/^([a-z]+):\/\//i.exec(e);return o&&o.length>1&&o[1]?o[1]:r},getURLParameter=function(e,r,t,n,o,_,a){var i,l,s;(void 0===e&&(e=null),void 0===r&&(r=!1),void 0===t&&(t=null),void 0===n&&(n="$"),void 0===o&&(o="!"),void 0===_&&(_=null),void 0===a)&&(a=null!==(l=null==(s=globalContext.location)?void 0:s.hash)&&void 0!==l?l:"");var u=null!==(i=a)&&void 0!==i?i:"#",c="";if(_)c=_;else if(o&&u.startsWith(o)){var f,p=u.indexOf("#");-1===p?(f=u.substring(o.length),u=""):(f=u.substring(o.length,p),u=u.substring(p));var d=f.indexOf("?");-1!==d&&(c=f.substring(d))}else globalContext.location&&(c=globalContext.location.search||"");var v=t||c,O="&"===v;if(O||"#"===v){var E="";try{E=decodeURIComponent(u)}catch(e){}var b=E.indexOf(n);-1===b?v="":(v=E.substring(b)).startsWith(n)&&(v=v.substring(n.length))}else v.startsWith("?")&&(v=v.substring(1));var g=v?v.split("&"):[];c=c.substring(1),O&&c&&(g=g.concat(c.split("&")));for(var P,y=[],m=_createForOfIteratorHelperLoose(g);!(P=m()).done;){var h=P.value,M=h.split("="),A=void 0;try{A=decodeURIComponent(M[0])}catch(e){A=""}try{h=decodeURIComponent(M[1])}catch(e){h=""}y.push(A),r?Object.prototype.hasOwnProperty.call(y,A)&&Array.isArray(y[A])?y[A].push(h):y[A]=[h]:y[A]=h}return e?Object.prototype.hasOwnProperty.call(y,e)?y[e]:null:y},serviceURLEquals=function(e,r){var t;void 0===r&&(r=(null==(t=globalContext.location)?void 0:t.href)||"");var n=getDomainName(e,""),o=getProtocolName(e,""),_=getPortNumber(e);return!(""!==n&&n!==getDomainName(r)||""!==o&&o!==getProtocolName(r)||null!==_&&_!==getPortNumber(r))},normalizeURL=function(e){if("string"==typeof e){var r=e.replace(/^:?\/+/,"").replace(/\/+$/,"").trim();return r.startsWith("http")?r:"http://"+r}return""},representURL=function(e){return"string"==typeof e?e.replace(/^(https?)?:?\/+/,"").replace(/\/+$/,"").trim():""},camelCaseToDelimited=function(e,r,t){void 0===r&&(r="-"),void 0===t&&(t=null),t||(t=ABBREVIATIONS);var n=maskForRegularExpression(r);if(t.length){for(var o,_="",a=_createForOfIteratorHelperLoose(t);!(o=a()).done;){_&&(_+="|"),_+=o.value.toUpperCase()}e=e.replace(new RegExp("("+_+")("+_+")","g"),"$1"+r+"$2")}return(e=e.replace(new RegExp("([^"+n+"])([A-Z][a-z]+)","g"),"$1"+r+"$2")).replace(/([a-z0-9])([A-Z])/g,"$1"+r+"$2").toLowerCase()},capitalize=function(e){return e.charAt(0).toUpperCase()+e.substring(1)},compressStyleValue=function(e){return e.replace(/ *([:;]) */g,"$1").replace(/ +/g," ").replace(/^;+/,"").replace(/;+$/,"").trim()},decodeHTMLEntities=function(e){if(globalContext.document){var r=globalContext.document.createElement("textarea");return r.innerHTML=e,r.value}return null},delimitedToCamelCase=function(e,r,t,n,o){void 0===r&&(r="-"),void 0===t&&(t=null),void 0===n&&(n=!1),void 0===o&&(o=!1);var _,a=maskForRegularExpression(r);if(t||(t=ABBREVIATIONS),n)_=ABBREVIATIONS.join("|");else{_="";for(var i,l=_createForOfIteratorHelperLoose(t);!(i=l()).done;){var s=i.value;_&&(_+="|"),_+=capitalize(s)+"|"+s}}var u=e.startsWith(r);return u&&(e=e.substring(r.length)),e=e.replace(new RegExp("("+a+")("+_+")("+a+"|$)","g"),function(e,r,t,n){return r+t.toUpperCase()+n}),o&&(a="(?:"+a+")+"),e=e.replace(new RegExp(a+"([a-zA-Z0-9])","g"),function(e,r){return r.toUpperCase()}),u&&(e=r+e),e},compile=function(e,r,t,n,o){var _;void 0===r&&(r=[]),void 0===t&&(t=!1),void 0===n&&(n=!0),void 0===o&&(o={});for(var a,i,l=Object.keys(globalThis).concat("globalThis").filter(function(e){return new RegExp("^["+ALLOWED_STARTING_VARIABLE_SYMBOLS+"]["+ALLOWED_VARIABLE_SYMBOLS+"]*$").test(e)}),s={error:null,globalNames:l,globalNamesUndefinedList:l.map(function(){}),originalScopeNames:Array.isArray(r)?r:"string"==typeof r?[r]:Object.keys(r),scopeNameMapping:{},scopeNames:[],templateFunction:function(){}},u=_createForOfIteratorHelperLoose(s.originalScopeNames);!(a=u()).done;){var c=a.value,f=convertToValidVariableName(c);s.scopeNameMapping[c]=f,s.scopeNames.push(f)}if(POLYFILL_TEMPLATE_STRINGS.value)if(null!=(_=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.Babel)&&_.transform)e=_context__WEBPACK_IMPORTED_MODULE_3__.globalContext.Babel.transform("("+e+")",{plugins:["transform-template-literals"]}).code;else if(e.startsWith("`")&&e.endsWith("`")){var p="####",d="`"===(e=e.replace(/\\\$/g,p).replace(/^`\$\{([\s\S]+)}`$/,"String($1)").replace(/^`([^']+)`$/,"'$1'").replace(/^`([^"]+)`$/,'"$1"')).charAt(0)?"'":e.charAt(0);e=e.replace(/\$\{((([^{]*{[^}]*}[^}]*})|[^{}]+)+)}/g,d+"+($1)+"+d).replace(/^`([\s\S]+)`$/,d+"$1"+d).replace(/\n+/g,"").replace(new RegExp(p,"g"),"\\$")}try{i=_babel_runtime_helpers_construct__WEBPACK_IMPORTED_MODULE_1___default()(Function,(n?s.globalNames:[]).concat(s.scopeNames,[(t?"":"return ")+e]))}catch(r){s.error='Given expression "'+e+'" could not be compiled width given scope names "'+s.scopeNames.join('", "')+'": '+(0,_object__WEBPACK_IMPORTED_MODULE_4__.represent)(r)}if(i){var v=i.bind(o);s.templateFunction=n?function(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];return v.apply(void 0,s.globalNamesUndefinedList.concat(r))}:v}return s},evaluate=function(e,r,t,n,o){void 0===r&&(r={}),void 0===t&&(t=!1),void 0===n&&(n=!0),void 0===o&&(o={});var _=compile(e,r,t,n,o),a=_.error,i=_.originalScopeNames,l=_.scopeNames,s=_.templateFunction,u={compileError:null,runtimeError:null,error:"Not yet evaluated.",result:void 0};if(a)return u.compileError=u.error=a,u;try{u={compileError:null,runtimeError:null,error:null,result:s.apply(void 0,i.map(function(e){return r[e]}))}}catch(a){u.error=u.runtimeError='Given expression "'+e+'" could not be evaluated with given scope names "'+l.join('", "')+'": '+(0,_object__WEBPACK_IMPORTED_MODULE_4__.represent)(a)}return u},findNormalizedMatchRange=function(e,r,t,n){void 0===t&&(t=function(e){return String(e).toLowerCase()}),void 0===n&&(n=["<",">"]);var o=t(r),_=t(e),a="string"==typeof e?e:_;if(_&&o)for(var i=!1,l=0;l<a.length;l+=1)if(i)Array.isArray(n)&&a.charAt(l)===n[1]&&(i=!1);else if(Array.isArray(n)&&a.charAt(l)===n[0])i=!0;else if(t(a.substring(l)).startsWith(o)){if(1===o.length)return[l,l+1];for(var s=a.length;s>l;s-=1)if(!t(a.substring(l,s)).startsWith(o))return[l,s+1]}return null},fixKnownEncodingErrors=function(e){for(var r=0,t=FIX_ENCODING_ERROR_MAPPING;r<t.length;r++){var n=t[r],o=n[0],_=n[1];e=e.replace(new RegExp(o,"g"),_)}return e},format=function(e){for(var r=arguments.length,t=new Array(r>1?r-1:0),n=1;n<r;n++)t[n-1]=arguments[n];t.unshift(e);for(var o=0,_=0,a=t;_<a.length;_++){var i=a[_];e=e.replace(new RegExp("\\{"+String(o)+"\\}","gm"),String(i)),o+=1}return e},getEditDistance=function(e,r){for(var t=Array(r.length+1).fill(null).map(function(){return Array(e.length+1).fill(null)}),n=0;n<=e.length;n++)t[0][n]=n;for(var o=0;o<=r.length;o++)t[o][0]=o;for(var _=1;_<=r.length;_++)for(var a=1;a<=e.length;a++){var i=e[a-1]===r[_-1]?0:1;t[_][a]=Math.min(t[_][a-1]+1,t[_-1][a]+1,t[_-1][a-1]+i)}return t[r.length][e.length]},maskForRegularExpression=function(e){return e.replace(/([\\|.*$^+[\]()?\-{}])/g,"\\$1")},lowerCase=function(e){return e.charAt(0).toLowerCase()+e.substring(1)},mark=function(e,r,t){if(void 0===t&&(t={}),"string"==typeof e&&null!=r&&r.length){var n=_extends({marker:'<span class="tools-mark">{1}</span>',normalizer:function(e){return String(e).toLowerCase()},skipTagDelimitedParts:["<",">"]},t);e=e.trim();for(var o,_=[],a=[].concat(r),i=0,l=_createForOfIteratorHelperLoose(a);!(o=l()).done;){var s=o.value;a[i]=n.normalizer(s).trim(),i+=1}for(var u=e,c=0,f=0;f<MAXIMAL_NUMBER_OF_ITERATIONS.value;f++){for(var p,d=null,v=void 0,O=_createForOfIteratorHelperLoose(a);!(p=O()).done;){var E=p.value;(v=findNormalizedMatchRange(u,E,n.normalizer,n.skipTagDelimitedParts))&&(!d||v[0]<d[0])&&(d=v)}if(!d){u.length&&_.push(u);break}d[0]>0&&_.push(e.substring(c,c+d[0])),_.push("string"==typeof n.marker?format(n.marker,e.substring(c+d[0],c+d[1])):n.marker(e.substring(c+d[0],c+d[1]),_)),c+=d[1],u=e.substring(c)}return"string"==typeof n.marker?_.join(""):_}return e},normalizePhoneNumber=function(e,r){if(void 0===r&&(r=!0),"string"==typeof e||"number"==typeof e){var t=String(e).trim();if(t=(t=t.replace(/^[^0-9]*\+/,"00")).replace(/([0-9].*?) *(,|o[rd]?)\.? ?-?[0-9]+$/,"$1"),r)return t.replace(/[^0-9]+/g,"");var n="(?:[ /\\-]+)";t=(t=t.replace(new RegExp("^(.+?)"+n+"?\\(0\\)"+n+"?(.+)$"),"$1-$2")).replace(new RegExp("^(.+?)"+n+"?\\((.+)\\)"+n+"?(.+)$"),"$1-$2-$3");var o=new RegExp("^(00[0-9]+)"+n+"([0-9]+)"+n+"(.+)$");if(o.test(t))t=t.replace(o,function(e,r,t,n){return r+"-"+t+"-"+sliceAllExceptNumberAndLastSeparator(n)});else{var _=function(e,r,t){return r.replace(/ +/,"")+"-"+sliceAllExceptNumberAndLastSeparator(t)};t=(o=/^([0-9 ]+)[/-](.+)$/).test(t)?t.replace(o,_):t.replace(new RegExp("^([0-9]+)"+n+"(.+)$"),_)}return t.replace(/[^0-9-]+/g,"").replace(/^-+$/,"")}return""},normalizeZipCode=function(e){return"string"==typeof e||"number"==typeof e?String(e).trim().replace(/^([^0-9]*[a-zA-Z]-)?(.+)$/,function(e,r,t){var n;return r&&(r=r.substring(r.length-2).charAt(0).toUpperCase()+"-"),(null!==(n=r)&&void 0!==n?n:"")+(null!=t?t:"").trim().replace(/[^0-9]+/g,"")}):""},parseEncodedObject=function parseEncodedObject(serializedObject,scope,name){var _evaluate;if(void 0===scope&&(scope={}),void 0===name&&(name="scope"),!readFileSync)throw new Error("File system api could not be loaded.");serializedObject.endsWith(".json")&&isFileSync(serializedObject)&&(serializedObject=readFileSync(serializedObject,{encoding:DEFAULT_ENCODING})),serializedObject=serializedObject.trim(),serializedObject.startsWith("{")||(serializedObject=eval("Buffer").from(serializedObject,"base64").toString(DEFAULT_ENCODING));var result=evaluate(serializedObject,(_evaluate={},_evaluate[name]=scope,_evaluate));return"object"==typeof result.result?result.result:null},representPhoneNumber=function(e){if(["number","string"].includes(determineType(e))&&e){var r=String(e).replace(/^(00|\+)([0-9]+)-([0-9-]+)$/,"+$2 (0) $3");return(r=(r=r.replace(/^0([1-9][0-9-]+)$/,"+49 (0) $1")).replace(/^([^-]+)-([0-9-]+)$/,"$1 / $2")).replace(/^(.*?)([0-9]+)(-?[0-9]*)$/,function(e,r,t,n){return r+(t.length%2==0?t.replace(/([0-9]{2})/g,"$1 "):t.replace(/^([0-9]{3})([0-9]+)$/,function(e,r,t){return r+" "+t.replace(/([0-9]{2})/g,"$1 ").trim()})+n).trim()}).trim()}return""},sliceAllExceptNumberAndLastSeparator=function(e){var r=/^(.*[0-9].*)-([0-9]+)$/;return r.test(e)?e.replace(r,function(e,r,t){return r.replace(/[^0-9]+/g,"")+"-"+t}):e.replace(/[^0-9]+/g,"")},normalizeDomNodeSelector=function(e,r){void 0===r&&(r="");var t="";return r&&(t=r+" "),e.startsWith(t)||e.trim().startsWith("<")||(e=t+e),e.trim()},limit=function(e,r){if(void 0===r&&(r=100),e.length<=r)return e;return e.substring(0,r-3)+"..."}},function(e,r,t){t.d(r,{isNotANumber:function(){return o}});var n=t(2),o=function(e){return"number"===(0,n.determineType)(e)&&isNaN(e)}},,,,,function(e){e.exports=__WEBPACK_EXTERNAL_MODULE__13__}],__webpack_module_cache__={};function __webpack_require__(e){var r=__webpack_module_cache__[e];if(void 0!==r)return r.exports;var t=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e](t,t.exports,__webpack_require__),t.loaded=!0,t.exports}__webpack_require__.c=__webpack_module_cache__,__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.hmd=function(e){return(e=Object.create(e)).children||(e.children=[]),Object.defineProperty(e,"exports",{enumerable:!0,set:function(){throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+e.id)}}),e},__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__=__webpack_require__(2);return __webpack_exports__}()});
|
|
1
|
+
// #!/usr/bin/env babel-node
|
|
2
|
+
// -*- coding: utf-8 -*-
|
|
3
|
+
/** @module object */
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
/* !
|
|
7
|
+
region header
|
|
8
|
+
[Project page](https://torben.website/clientnode)
|
|
9
|
+
|
|
10
|
+
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
11
|
+
|
|
12
|
+
License
|
|
13
|
+
-------
|
|
14
|
+
|
|
15
|
+
This library written by Torben Sickert stands under a creative commons
|
|
16
|
+
naming 3.0 unported license.
|
|
17
|
+
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
18
|
+
endregion
|
|
19
|
+
*/
|
|
20
|
+
import "core-js/modules/es.array.includes.js";
|
|
21
|
+
import "core-js/modules/es.array.push.js";
|
|
22
|
+
import "core-js/modules/es.iterator.constructor.js";
|
|
23
|
+
import "core-js/modules/es.iterator.reduce.js";
|
|
24
|
+
import "core-js/modules/es.iterator.some.js";
|
|
25
|
+
import "core-js/modules/es.json.stringify.js";
|
|
26
|
+
import "core-js/modules/es.map.get-or-insert.js";
|
|
27
|
+
import "core-js/modules/es.map.get-or-insert-computed.js";
|
|
28
|
+
import "core-js/modules/es.regexp.flags.js";
|
|
29
|
+
import "core-js/modules/es.set.difference.v2.js";
|
|
30
|
+
import "core-js/modules/es.set.intersection.v2.js";
|
|
31
|
+
import "core-js/modules/es.set.is-disjoint-from.v2.js";
|
|
32
|
+
import "core-js/modules/es.set.is-subset-of.v2.js";
|
|
33
|
+
import "core-js/modules/es.set.is-superset-of.v2.js";
|
|
34
|
+
import "core-js/modules/es.set.symmetric-difference.v2.js";
|
|
35
|
+
import "core-js/modules/es.set.union.v2.js";
|
|
36
|
+
import { CLASS_TO_TYPE_MAPPING, IGNORE_NULL_AND_UNDEFINED_SYMBOL, VALUE_COPY_SYMBOL } from "./constants.js";
|
|
37
|
+
import { isFunction, isObject, isPlainObject, isMap, isProxy, isSet, isNumeric } from "./indicators.js";
|
|
38
|
+
import { isNotANumber } from "./number.js";
|
|
39
|
+
import { escapeRegularExpressions, evaluate } from "./string.js";
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Adds dynamic getter and setter to any given data structure such as maps.
|
|
43
|
+
* @param object - Object to proxy.
|
|
44
|
+
* @param getterWrapper - Function to wrap each property get.
|
|
45
|
+
* @param setterWrapper - Function to wrap each property set.
|
|
46
|
+
* @param methodNames - Method names to perform actions on the given
|
|
47
|
+
* object.
|
|
48
|
+
* @param deep - Indicates to perform a deep wrapping of specified types.
|
|
49
|
+
* @param typesToExtend - Types which should be extended (Checks are
|
|
50
|
+
* performed via "value instanceof type".).
|
|
51
|
+
* @returns Returns given object wrapped with a dynamic getter proxy.
|
|
52
|
+
*/
|
|
53
|
+
export const addDynamicGetterAndSetter = (object, getterWrapper = null, setterWrapper = null, methodNames = {}, deep = true, typesToExtend = [Object]) => {
|
|
54
|
+
if (deep && typeof object === 'object') if (Array.isArray(object)) {
|
|
55
|
+
let index = 0;
|
|
56
|
+
for (const value of object) {
|
|
57
|
+
object[index] = addDynamicGetterAndSetter(value, getterWrapper, setterWrapper, methodNames, deep);
|
|
58
|
+
index += 1;
|
|
59
|
+
}
|
|
60
|
+
} else if (isMap(object)) for (const [key, value] of object) object.set(key, addDynamicGetterAndSetter(value, getterWrapper, setterWrapper, methodNames, deep));else if (isSet(object)) {
|
|
61
|
+
const cache = [];
|
|
62
|
+
for (const value of object) {
|
|
63
|
+
object.delete(value);
|
|
64
|
+
cache.push(addDynamicGetterAndSetter(value, getterWrapper, setterWrapper, methodNames, deep));
|
|
65
|
+
}
|
|
66
|
+
for (const value of cache) object.add(value);
|
|
67
|
+
} else if (object !== null) for (const [key, value] of Object.entries(object)) object[key] = addDynamicGetterAndSetter(value, getterWrapper, setterWrapper, methodNames, deep);
|
|
68
|
+
if (getterWrapper || setterWrapper) for (const type of typesToExtend) if (isObject(object) && object instanceof type) {
|
|
69
|
+
const defaultHandler = getProxyHandler(object, methodNames);
|
|
70
|
+
const handler = getProxyHandler(object, methodNames);
|
|
71
|
+
if (getterWrapper) handler.get = (_target, name) => {
|
|
72
|
+
if (name === '__target__') return object;
|
|
73
|
+
if (name === '__revoke__') return () => {
|
|
74
|
+
revoke();
|
|
75
|
+
return object;
|
|
76
|
+
};
|
|
77
|
+
if (typeof object[name] === 'function') return object[name];
|
|
78
|
+
return getterWrapper(defaultHandler.get(proxy, name), name, object);
|
|
79
|
+
};
|
|
80
|
+
if (setterWrapper) handler.set = (_target, name, value) => defaultHandler.set(proxy, name, setterWrapper(name, value, object));
|
|
81
|
+
const {
|
|
82
|
+
proxy,
|
|
83
|
+
revoke
|
|
84
|
+
} = Proxy.revocable({}, handler);
|
|
85
|
+
return proxy;
|
|
86
|
+
}
|
|
87
|
+
return object;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Converts given object into its serialized json representation by
|
|
91
|
+
* replacing circular references with a given provided value.
|
|
92
|
+
*
|
|
93
|
+
* This method traverses given object recursively and tracks of seen and
|
|
94
|
+
* already serialized structures to reuse generated strings or mark a
|
|
95
|
+
* circular reference.
|
|
96
|
+
* @param object - Object to serialize.
|
|
97
|
+
* @param determineCircularReferenceValue - Callback to create a fallback
|
|
98
|
+
* value depending on given redundant value.
|
|
99
|
+
* @param numberOfSpaces - Number of spaces to use for string formatting.
|
|
100
|
+
* @returns The formatted json string.
|
|
101
|
+
*/
|
|
102
|
+
export const convertCircularObjectToJSON = (object, determineCircularReferenceValue = serializedValue => serializedValue ?? '__circularReference__', numberOfSpaces = 0) => {
|
|
103
|
+
const seenObjects = new Map();
|
|
104
|
+
const stringifier = object => {
|
|
105
|
+
const replacer = (key, value) => {
|
|
106
|
+
if (isObject(value)) {
|
|
107
|
+
if (seenObjects.has(value)) return determineCircularReferenceValue(seenObjects.get(value) ?? null, key, value, seenObjects);
|
|
108
|
+
|
|
109
|
+
// NOTE: Set before traversing deeper to detect cycles.
|
|
110
|
+
seenObjects.set(value, null);
|
|
111
|
+
let result;
|
|
112
|
+
if (Array.isArray(value)) {
|
|
113
|
+
result = [];
|
|
114
|
+
for (const item of value) result.push(replacer(null, item));
|
|
115
|
+
} else {
|
|
116
|
+
result = {};
|
|
117
|
+
for (const [name, subValue] of Object.entries(value)) result[name] = replacer(name, subValue);
|
|
118
|
+
}
|
|
119
|
+
seenObjects.set(value, result);
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
return value;
|
|
123
|
+
};
|
|
124
|
+
return JSON.stringify(object, replacer, numberOfSpaces);
|
|
125
|
+
};
|
|
126
|
+
return stringifier(object);
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Converts given map and all nested found maps objects to corresponding
|
|
130
|
+
* object.
|
|
131
|
+
* @param object - Map to convert to.
|
|
132
|
+
* @param deep - Indicates whether to perform a recursive conversion.
|
|
133
|
+
* @returns Given map as object.
|
|
134
|
+
*/
|
|
135
|
+
export const convertMapToPlainObject = (object, deep = true) => {
|
|
136
|
+
if (typeof object === 'object') {
|
|
137
|
+
if (isMap(object)) {
|
|
138
|
+
const newObject = {};
|
|
139
|
+
for (let [key, value] of object) {
|
|
140
|
+
if (deep) value = convertMapToPlainObject(value, deep);
|
|
141
|
+
if (['number', 'string'].includes(typeof key)) newObject[String(key)] = value;
|
|
142
|
+
}
|
|
143
|
+
return newObject;
|
|
144
|
+
}
|
|
145
|
+
if (deep) if (isPlainObject(object)) for (const [key, value] of Object.entries(object)) object[key] = convertMapToPlainObject(value, deep);else if (Array.isArray(object)) {
|
|
146
|
+
let index = 0;
|
|
147
|
+
for (const value of object) {
|
|
148
|
+
object[index] = convertMapToPlainObject(value, deep);
|
|
149
|
+
index += 1;
|
|
150
|
+
}
|
|
151
|
+
} else if (isSet(object)) {
|
|
152
|
+
const cache = [];
|
|
153
|
+
for (const value of object) {
|
|
154
|
+
object.delete(value);
|
|
155
|
+
cache.push(convertMapToPlainObject(value, deep));
|
|
156
|
+
}
|
|
157
|
+
for (const value of cache) object.add(value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return object;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Converts given plain object and all nested found objects to
|
|
164
|
+
* corresponding map.
|
|
165
|
+
* @param object - Object to convert to.
|
|
166
|
+
* @param deep - Indicates whether to perform a recursive conversion.
|
|
167
|
+
* @returns Given object as map.
|
|
168
|
+
*/
|
|
169
|
+
export const convertPlainObjectToMap = (object, deep = true) => {
|
|
170
|
+
if (typeof object === 'object') {
|
|
171
|
+
if (isPlainObject(object)) {
|
|
172
|
+
const newObject = new Map();
|
|
173
|
+
for (const [key, value] of Object.entries(object)) {
|
|
174
|
+
if (deep) object[key] = convertPlainObjectToMap(value, deep);
|
|
175
|
+
newObject.set(key, object[key]);
|
|
176
|
+
}
|
|
177
|
+
return newObject;
|
|
178
|
+
}
|
|
179
|
+
if (deep) if (Array.isArray(object)) {
|
|
180
|
+
let index = 0;
|
|
181
|
+
for (const value of object) {
|
|
182
|
+
object[index] = convertPlainObjectToMap(value, deep);
|
|
183
|
+
index += 1;
|
|
184
|
+
}
|
|
185
|
+
} else if (isMap(object)) for (const [key, value] of object) object.set(key, convertPlainObjectToMap(value, deep));else if (isSet(object)) {
|
|
186
|
+
const cache = [];
|
|
187
|
+
for (const value of object) {
|
|
188
|
+
object.delete(value);
|
|
189
|
+
cache.push(convertPlainObjectToMap(value, deep));
|
|
190
|
+
}
|
|
191
|
+
for (const value of cache) object.add(value);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return object;
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* Replaces given pattern in each value in given object recursively with
|
|
198
|
+
* given string replacement.
|
|
199
|
+
* @param object - Object to convert substrings in.
|
|
200
|
+
* @param pattern - Regular expression to replace.
|
|
201
|
+
* @param replacement - String to use as replacement for found patterns.
|
|
202
|
+
* @returns Converted object with replaced patterns.
|
|
203
|
+
*/
|
|
204
|
+
export const convertSubstringInPlainObject = (object, pattern, replacement) => {
|
|
205
|
+
for (const [key, value] of Object.entries(object)) if (isPlainObject(value)) object[key] = convertSubstringInPlainObject(value, pattern, replacement);else if (typeof value === 'string') object[key] = value.replace(pattern, replacement);
|
|
206
|
+
return object;
|
|
207
|
+
};
|
|
208
|
+
/* eslint-disable jsdoc/require-description-complete-sentence */
|
|
209
|
+
/**
|
|
210
|
+
* Copies given object (of any type) into optionally given destination.
|
|
211
|
+
* @param source - Object to copy.
|
|
212
|
+
* @param copyBlobs - Determines whether to copy blobs as well.
|
|
213
|
+
* @param recursionLimit - Specifies how deep we should traverse into given
|
|
214
|
+
* object recursively.
|
|
215
|
+
* @param recursionEndValue - Indicates which value to use for recursion ends.
|
|
216
|
+
* Usually a reference to corresponding source value will be used.
|
|
217
|
+
* @param destination - Target to copy source to.
|
|
218
|
+
* @param cyclic - Indicates whether known sub structures should be copied or
|
|
219
|
+
* referenced (if "true" endless loops can occur if source has cyclic
|
|
220
|
+
* structures).
|
|
221
|
+
* @param knownReferences - Used to avoid traversing loops and not to copy
|
|
222
|
+
* references e.g. to objects not to copy (e.g. symbol polyfills).
|
|
223
|
+
* @param recursionLevel - Internally used to track current recursion level in
|
|
224
|
+
* given source data structure.
|
|
225
|
+
* @returns Value "true" if both objects are equal and "false" otherwise.
|
|
226
|
+
*/
|
|
227
|
+
export const copy = (source, copyBlobs = false, recursionLimit = -1, recursionEndValue = VALUE_COPY_SYMBOL, destination = null, cyclic = false, knownReferences = [], recursionLevel = 0) => {
|
|
228
|
+
/* eslint-enable jsdoc/require-description-complete-sentence */
|
|
229
|
+
if (isObject(source)) if (destination) {
|
|
230
|
+
if (source === destination) throw new Error(`Can't copy because source and destination are ` + 'identical.');
|
|
231
|
+
if (!cyclic && ![undefined, null].includes(source)) {
|
|
232
|
+
const index = knownReferences.indexOf(source);
|
|
233
|
+
if (index !== -1) return knownReferences[index];
|
|
234
|
+
knownReferences.push(source);
|
|
235
|
+
}
|
|
236
|
+
const copyValue = value => {
|
|
237
|
+
if (recursionLimit !== -1 && recursionLimit < recursionLevel + 1) return recursionEndValue === VALUE_COPY_SYMBOL ? value : recursionEndValue;
|
|
238
|
+
const result = copy(value, copyBlobs, recursionLimit, recursionEndValue, null, cyclic, knownReferences, recursionLevel + 1);
|
|
239
|
+
if (!cyclic && ![undefined, null].includes(value) && typeof value === 'object') knownReferences.push(value);
|
|
240
|
+
return result;
|
|
241
|
+
};
|
|
242
|
+
if (Array.isArray(source)) for (const item of source) destination.push(copyValue(item));else if (source instanceof Map) for (const [key, value] of source) destination.set(key, copyValue(value));else if (source instanceof Set) for (const value of source) destination.add(copyValue(value));else for (const [key, value] of Object.entries(source)) try {
|
|
243
|
+
destination[key] = copyValue(value);
|
|
244
|
+
} catch (error) {
|
|
245
|
+
throw new Error('Failed to copy property value object "' + `${key}": ${represent(error)}`, {
|
|
246
|
+
cause: error
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
} else {
|
|
250
|
+
if (Array.isArray(source)) return copy(source, copyBlobs, recursionLimit, recursionEndValue, [], cyclic, knownReferences, recursionLevel);
|
|
251
|
+
if (source instanceof Map) return copy(source, copyBlobs, recursionLimit, recursionEndValue, new Map(), cyclic, knownReferences, recursionLevel);
|
|
252
|
+
if (source instanceof Set) return copy(source, copyBlobs, recursionLimit, recursionEndValue, new Set(), cyclic, knownReferences, recursionLevel);
|
|
253
|
+
if (source instanceof Date) return new Date(source.getTime());
|
|
254
|
+
if (source instanceof RegExp) {
|
|
255
|
+
const modifier = /[^/]*$/.exec(source.toString());
|
|
256
|
+
destination = new RegExp(source.source, modifier ? modifier[0] : undefined);
|
|
257
|
+
destination.lastIndex = source.lastIndex;
|
|
258
|
+
return destination;
|
|
259
|
+
}
|
|
260
|
+
if (typeof Blob !== 'undefined' && source instanceof Blob) return copyBlobs ? source.slice(0, source.size, source.type) : source;
|
|
261
|
+
return copy(source, copyBlobs, recursionLimit, recursionEndValue, {}, cyclic, knownReferences, recursionLevel);
|
|
262
|
+
}
|
|
263
|
+
return destination || source;
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Determine the internal JavaScript [[Class]] of an object.
|
|
267
|
+
* @param value - Value to analyze.
|
|
268
|
+
* @returns Name of determined type.
|
|
269
|
+
*/
|
|
270
|
+
export const determineType = value => {
|
|
271
|
+
if ([null, undefined].includes(value)) return String(value);
|
|
272
|
+
const type = typeof value;
|
|
273
|
+
if (['function', 'object'].includes(type) && 'toString' in value) {
|
|
274
|
+
const stringRepresentation = Object.prototype.toString.call(value);
|
|
275
|
+
if (Object.prototype.hasOwnProperty.call(CLASS_TO_TYPE_MAPPING, stringRepresentation)) return CLASS_TO_TYPE_MAPPING[stringRepresentation];
|
|
276
|
+
}
|
|
277
|
+
return type;
|
|
278
|
+
};
|
|
279
|
+
/**
|
|
280
|
+
* Returns true if given items are equal for given property list. If
|
|
281
|
+
* property list isn't set all properties will be checked. All keys which
|
|
282
|
+
* starts with one of the exception prefixes will be omitted.
|
|
283
|
+
* @param firstValue - First object to compare.
|
|
284
|
+
* @param secondValue - Second object to compare.
|
|
285
|
+
* @param givenOptions - Options to define how to compare.
|
|
286
|
+
* @param givenOptions.properties - Property names to check. Check all if
|
|
287
|
+
* "null" is selected (default).
|
|
288
|
+
* @param givenOptions.deep - Recursion depth negative values means
|
|
289
|
+
* infinitely deep (default).
|
|
290
|
+
* @param givenOptions.exceptionPrefixes - Property prefixes which
|
|
291
|
+
* indicates properties to ignore.
|
|
292
|
+
* @param givenOptions.ignoreFunctions - Indicates whether functions have
|
|
293
|
+
* to be identical to interpret is as equal. If set to "true" two functions
|
|
294
|
+
* will be assumed to be equal (default).
|
|
295
|
+
* @param givenOptions.compareBlobs - Indicates whether binary data should
|
|
296
|
+
* be converted to a base64 string to compare their content. Makes this
|
|
297
|
+
* function asynchronous in browsers and potentially takes a lot of
|
|
298
|
+
* resources.
|
|
299
|
+
* @returns Value "true" if both objects are equal and "false" otherwise.
|
|
300
|
+
* If "compareBlobs" is activated, and we're running in a browser like
|
|
301
|
+
* environment and binary data is given, then a promise wrapping the
|
|
302
|
+
* determined boolean values is returned.
|
|
303
|
+
*/
|
|
304
|
+
export const equals = (firstValue, secondValue, givenOptions = {}) => {
|
|
305
|
+
const options = {
|
|
306
|
+
compareBlobs: false,
|
|
307
|
+
deep: -1,
|
|
308
|
+
exceptionPrefixes: [],
|
|
309
|
+
ignoreFunctions: true,
|
|
310
|
+
properties: null,
|
|
311
|
+
returnReasonIfNotEqual: false,
|
|
312
|
+
...givenOptions
|
|
313
|
+
};
|
|
314
|
+
if (options.ignoreFunctions && isFunction(firstValue) && isFunction(secondValue) || firstValue === secondValue || isNotANumber(firstValue) && isNotANumber(secondValue) || firstValue instanceof RegExp && secondValue instanceof RegExp && firstValue.toString() === secondValue.toString() && firstValue.flags.split('').sort().join('') === secondValue.flags.split('').sort().join('') || firstValue instanceof Date && secondValue instanceof Date && (isNaN(firstValue.getTime()) && isNaN(secondValue.getTime()) || !isNaN(firstValue.getTime()) && !isNaN(secondValue.getTime()) && firstValue.getTime() === secondValue.getTime()) || options.compareBlobs && eval('typeof Buffer') !== 'undefined' && Object.prototype.hasOwnProperty.call(eval('Buffer'), 'isBuffer') && firstValue instanceof eval('Buffer') && secondValue instanceof eval('Buffer') && firstValue.toString('base64') === secondValue.toString('base64')) return true;
|
|
315
|
+
if (options.compareBlobs && typeof Blob !== 'undefined' && firstValue instanceof Blob && secondValue instanceof Blob) return new Promise(resolve => {
|
|
316
|
+
const values = [];
|
|
317
|
+
for (const value of [firstValue, secondValue]) {
|
|
318
|
+
const fileReader = new FileReader();
|
|
319
|
+
fileReader.onload = event => {
|
|
320
|
+
if (event.target === null) values.push(null);else values.push(event.target.result);
|
|
321
|
+
if (values.length === 2) if (values[0] === values[1]) resolve(true);else resolve(options.returnReasonIfNotEqual ? `>>> Blob(${represent(values[0])}) !== ` + `Blob(${represent(values[1])})` : false);
|
|
322
|
+
};
|
|
323
|
+
fileReader.readAsDataURL(value);
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
if (isPlainObject(firstValue) && isPlainObject(secondValue) && !(firstValue instanceof RegExp || secondValue instanceof RegExp) || Array.isArray(firstValue) && Array.isArray(secondValue) && firstValue.length === secondValue.length || determineType(firstValue) === determineType(secondValue) && ['map', 'set'].includes(determineType(firstValue)) && firstValue.size === secondValue.size) {
|
|
327
|
+
const promises = [];
|
|
328
|
+
for (const [first, second] of [[firstValue, secondValue], [secondValue, firstValue]]) {
|
|
329
|
+
const firstIsArray = Array.isArray(first);
|
|
330
|
+
if (firstIsArray && (!Array.isArray(second) || first.length !== second.length)) return options.returnReasonIfNotEqual ? '.length' : false;
|
|
331
|
+
const firstIsMap = isMap(first);
|
|
332
|
+
if (firstIsMap && (!isMap(second) || first.size !== second.size)) return options.returnReasonIfNotEqual ? '.size' : false;
|
|
333
|
+
const firstIsSet = isSet(first);
|
|
334
|
+
if (firstIsSet && (!isSet(second) || first.size !== second.size)) return options.returnReasonIfNotEqual ? '.size' : false;
|
|
335
|
+
if (firstIsArray) {
|
|
336
|
+
let index = 0;
|
|
337
|
+
for (const value of first) {
|
|
338
|
+
if (options.deep !== 0) {
|
|
339
|
+
const result = equals(value, second[index], {
|
|
340
|
+
...options,
|
|
341
|
+
deep: options.deep - 1
|
|
342
|
+
});
|
|
343
|
+
if (!result) return false;
|
|
344
|
+
const currentIndex = index;
|
|
345
|
+
const determineResult = result => typeof result === 'string' ? `[${String(currentIndex)}]` + ({
|
|
346
|
+
'[': '',
|
|
347
|
+
'>': ' '
|
|
348
|
+
}[result[0]] ?? '.') + result : result;
|
|
349
|
+
if (Object.prototype.hasOwnProperty.call(result, 'then')) promises.push(result.then(determineResult));
|
|
350
|
+
if (typeof result === 'string') return determineResult(result);
|
|
351
|
+
}
|
|
352
|
+
index += 1;
|
|
353
|
+
}
|
|
354
|
+
} else if (firstIsMap) {
|
|
355
|
+
for (const [key, value] of first) if (options.deep !== 0) {
|
|
356
|
+
const result = equals(value, second.get(key), {
|
|
357
|
+
...options,
|
|
358
|
+
deep: options.deep - 1
|
|
359
|
+
});
|
|
360
|
+
if (!result) return false;
|
|
361
|
+
const determineResult = result => typeof result === 'string' ? `get(${represent(key)})` + ({
|
|
362
|
+
'[': '',
|
|
363
|
+
'>': ' '
|
|
364
|
+
}[result[0]] ?? '.') + result : result;
|
|
365
|
+
if (Object.prototype.hasOwnProperty.call(result, 'then')) promises.push(result.then(determineResult));
|
|
366
|
+
if (typeof result === 'string') return determineResult(result);
|
|
367
|
+
}
|
|
368
|
+
} else if (firstIsSet) {
|
|
369
|
+
for (const value of first) if (options.deep !== 0) {
|
|
370
|
+
let equal = false;
|
|
371
|
+
const subPromises = [];
|
|
372
|
+
/*
|
|
373
|
+
NOTE: Check if their exists at least one being
|
|
374
|
+
equally.
|
|
375
|
+
*/
|
|
376
|
+
for (const secondValue of second) {
|
|
377
|
+
const result = equals(value, secondValue, {
|
|
378
|
+
...options,
|
|
379
|
+
deep: options.deep - 1
|
|
380
|
+
});
|
|
381
|
+
if (typeof result === 'boolean') {
|
|
382
|
+
if (result) {
|
|
383
|
+
equal = true;
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
} else subPromises.push(result);
|
|
387
|
+
}
|
|
388
|
+
const determineResult = equal => equal ? true : options.returnReasonIfNotEqual ? `>>> {-> ${represent(value)} not found}` : false;
|
|
389
|
+
if (equal)
|
|
390
|
+
/*
|
|
391
|
+
NOTE: We do not have to wait for promises to be
|
|
392
|
+
resolved when one match could be found.
|
|
393
|
+
*/
|
|
394
|
+
continue;
|
|
395
|
+
if (subPromises.length) promises.push(new Promise(resolve => {
|
|
396
|
+
Promise.all(subPromises).then(results => {
|
|
397
|
+
resolve(determineResult(results.some(result => result)));
|
|
398
|
+
}, () => {
|
|
399
|
+
// Do nothing.
|
|
400
|
+
});
|
|
401
|
+
}));
|
|
402
|
+
return determineResult(false);
|
|
403
|
+
}
|
|
404
|
+
} else for (const [key, value] of Object.entries(first)) {
|
|
405
|
+
if (options.properties && !options.properties.includes(key)) break;
|
|
406
|
+
let doBreak = false;
|
|
407
|
+
for (const exceptionPrefix of options.exceptionPrefixes) if (key.startsWith(exceptionPrefix)) {
|
|
408
|
+
doBreak = true;
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
if (doBreak) break;
|
|
412
|
+
if (options.deep !== 0) {
|
|
413
|
+
const result = equals(value, second[key], {
|
|
414
|
+
...options,
|
|
415
|
+
deep: options.deep - 1
|
|
416
|
+
});
|
|
417
|
+
if (!result) return false;
|
|
418
|
+
const determineResult = result => typeof result === 'string' ? key + ({
|
|
419
|
+
'[': '',
|
|
420
|
+
'>': ' '
|
|
421
|
+
}[result[0]] ?? '.') + result : result;
|
|
422
|
+
if (Object.prototype.hasOwnProperty.call(result, 'then')) promises.push(result.then(determineResult));
|
|
423
|
+
if (typeof result === 'string') return determineResult(result);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
if (promises.length) return new Promise(resolve => {
|
|
428
|
+
Promise.all(promises).then(results => {
|
|
429
|
+
for (const result of results) if (!result || typeof result === 'string') {
|
|
430
|
+
resolve(result);
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
resolve(true);
|
|
434
|
+
}, () => {
|
|
435
|
+
// Do nothing.
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
return true;
|
|
439
|
+
}
|
|
440
|
+
return options.returnReasonIfNotEqual ? `>>> ${represent(firstValue)} !== ${represent(secondValue)}` : false;
|
|
441
|
+
};
|
|
442
|
+
/**
|
|
443
|
+
* Searches for nested mappings with given indicator key and resolves
|
|
444
|
+
* marked values. Additionally, all objects are wrapped with a proxy to
|
|
445
|
+
* dynamically resolve nested properties.
|
|
446
|
+
* @param object - Given mapping to resolve.
|
|
447
|
+
* @param options - Options to configure evaluation.
|
|
448
|
+
* @param options.scope - Scope to use evaluate again.
|
|
449
|
+
* @param options.selfReferenceName - Name to use for reference to given
|
|
450
|
+
* object.
|
|
451
|
+
* @param options.expressionIndicatorKey - Indicator property name to mark a
|
|
452
|
+
* value to evaluate.
|
|
453
|
+
* @param options.executionIndicatorKey - Indicator property name to mark a
|
|
454
|
+
* value to evaluate.
|
|
455
|
+
* @returns Evaluated given mapping.
|
|
456
|
+
*/
|
|
457
|
+
export const evaluateDynamicData = (object, givenOptions = {}) => {
|
|
458
|
+
const options = {
|
|
459
|
+
scope: {},
|
|
460
|
+
selfReferenceName: 'self',
|
|
461
|
+
expressionIndicatorKey: '__evaluate__',
|
|
462
|
+
executionIndicatorKey: '__execute__',
|
|
463
|
+
...givenOptions
|
|
464
|
+
};
|
|
465
|
+
if (typeof object !== 'object' || object === null) return object;
|
|
466
|
+
if (!(options.selfReferenceName in options.scope)) options.scope[options.selfReferenceName] = object;
|
|
467
|
+
const evaluateAndThrowError = (code, type = options.expressionIndicatorKey) => {
|
|
468
|
+
const evaluated = evaluate(code, options.scope, type === options.executionIndicatorKey);
|
|
469
|
+
if (evaluated.error) throw new Error(evaluated.error);
|
|
470
|
+
return evaluated.result;
|
|
471
|
+
};
|
|
472
|
+
const addProxyRecursively = data => {
|
|
473
|
+
if (typeof data !== 'object' || data === null || typeof Proxy === 'undefined') return data;
|
|
474
|
+
for (const [key, givenValue] of Object.entries(data)) if (key !== '__target__' && isObject(givenValue)) {
|
|
475
|
+
const value = givenValue;
|
|
476
|
+
addProxyRecursively(value);
|
|
477
|
+
// NOTE: We only wrap needed objects for performance reasons.
|
|
478
|
+
if (Object.prototype.hasOwnProperty.call(value, options.expressionIndicatorKey) || Object.prototype.hasOwnProperty.call(value, options.executionIndicatorKey)) {
|
|
479
|
+
const backup = value;
|
|
480
|
+
data[key] = new Proxy(value, {
|
|
481
|
+
get: (target, key) => {
|
|
482
|
+
if (key === '__target__') return target;
|
|
483
|
+
if (key === 'hasOwnProperty') return target[key];
|
|
484
|
+
|
|
485
|
+
/*
|
|
486
|
+
NOTE: Very complicated section, do only
|
|
487
|
+
changes while having good tests.
|
|
488
|
+
*/
|
|
489
|
+
for (const type of [options.expressionIndicatorKey, options.executionIndicatorKey]) if (key === type && typeof target[key] === 'string') return resolve(evaluateAndThrowError(target[key], type));
|
|
490
|
+
const resolvedTarget = resolve(target);
|
|
491
|
+
if (key === 'toString') {
|
|
492
|
+
const result = evaluateAndThrowError(resolvedTarget);
|
|
493
|
+
return result[key].bind(result);
|
|
494
|
+
}
|
|
495
|
+
if (typeof key !== 'string') {
|
|
496
|
+
const result = evaluateAndThrowError(resolvedTarget);
|
|
497
|
+
if (result[key]?.bind) return result[key].bind(result);
|
|
498
|
+
return result[key];
|
|
499
|
+
}
|
|
500
|
+
for (const type of [options.expressionIndicatorKey, options.executionIndicatorKey]) if (Object.prototype.hasOwnProperty.call(target, type)) return evaluateAndThrowError(resolvedTarget, type)[key];
|
|
501
|
+
return resolvedTarget[key];
|
|
502
|
+
// End of complicated stuff.
|
|
503
|
+
},
|
|
504
|
+
ownKeys: target => {
|
|
505
|
+
for (const type of [options.expressionIndicatorKey, options.executionIndicatorKey]) if (Object.prototype.hasOwnProperty.call(target, type)) return Object.getOwnPropertyNames(resolve(evaluateAndThrowError(target[type], type)));
|
|
506
|
+
return Object.getOwnPropertyNames(target);
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
/*
|
|
511
|
+
NOTE: Known proxy polyfills does not provide the
|
|
512
|
+
"__target__" api.
|
|
513
|
+
*/
|
|
514
|
+
if (!data[key].__target__) data[key].__target__ = backup;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return data;
|
|
518
|
+
};
|
|
519
|
+
const resolve = data => {
|
|
520
|
+
if (isObject(data)) {
|
|
521
|
+
if (isProxy(data)) {
|
|
522
|
+
// NOTE: We have to skip "ownKeys" proxy trap here.
|
|
523
|
+
for (const type of [options.expressionIndicatorKey, options.executionIndicatorKey]) if (Object.prototype.hasOwnProperty.call(data, type)) return data[type];
|
|
524
|
+
data = data.__target__;
|
|
525
|
+
}
|
|
526
|
+
for (const [key, value] of Object.entries(data)) {
|
|
527
|
+
if ([options.expressionIndicatorKey, options.executionIndicatorKey].includes(key)) {
|
|
528
|
+
if (typeof Proxy === 'undefined') return resolve(evaluateAndThrowError(value));
|
|
529
|
+
return value;
|
|
530
|
+
}
|
|
531
|
+
data[key] = resolve(value);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
return data;
|
|
535
|
+
};
|
|
536
|
+
options.scope.resolve = resolve;
|
|
537
|
+
const removeProxyRecursively = data => {
|
|
538
|
+
if (isObject(data)) for (const [key, value] of Object.entries(data)) if (key !== '__target__' && value !== null && ['function', 'undefined'].includes(typeof value)) {
|
|
539
|
+
const target = value.__target__;
|
|
540
|
+
if (typeof target !== 'undefined') data[key] = target;
|
|
541
|
+
removeProxyRecursively(value);
|
|
542
|
+
}
|
|
543
|
+
return data;
|
|
544
|
+
};
|
|
545
|
+
if (Object.prototype.hasOwnProperty.call(object, options.expressionIndicatorKey)) return evaluateAndThrowError(object[options.expressionIndicatorKey]);else if (Object.prototype.hasOwnProperty.call(object, options.executionIndicatorKey)) return evaluateAndThrowError(object[options.executionIndicatorKey], options.executionIndicatorKey);
|
|
546
|
+
return removeProxyRecursively(resolve(addProxyRecursively(object)));
|
|
547
|
+
};
|
|
548
|
+
/**
|
|
549
|
+
* Removes properties in objects where a dynamic indicator lives.
|
|
550
|
+
* @param data - Object to traverse recursively.
|
|
551
|
+
* @param expressionIndicators - Property key to remove.
|
|
552
|
+
* @returns Given object with removed properties.
|
|
553
|
+
*/
|
|
554
|
+
export const removeKeysInEvaluation = (data, expressionIndicators = ['__evaluate__', '__execute__']) => {
|
|
555
|
+
for (const [key, value] of Object.entries(data)) if (!expressionIndicators.includes(key) && expressionIndicators.some(name => Object.prototype.hasOwnProperty.call(data, name))) delete data[key];else if (isPlainObject(value)) removeKeysInEvaluation(value, expressionIndicators);
|
|
556
|
+
return data;
|
|
557
|
+
};
|
|
558
|
+
/**
|
|
559
|
+
* Extends given target object with given sources object. As target and
|
|
560
|
+
* sources many expandable types are allowed but target and sources have to
|
|
561
|
+
* come from the same type.
|
|
562
|
+
* @param targetOrDeepIndicator - Maybe the target or deep indicator.
|
|
563
|
+
* @param targetOrSource - Target or source object; depending on first
|
|
564
|
+
* argument.
|
|
565
|
+
* @param additionalSources - Source objects to extend into target.
|
|
566
|
+
* @returns Returns given target extended with all given sources.
|
|
567
|
+
*/
|
|
568
|
+
export const extend = (targetOrDeepIndicator, targetOrSource, ...additionalSources) => {
|
|
569
|
+
let deep = false;
|
|
570
|
+
let sources = additionalSources;
|
|
571
|
+
let target;
|
|
572
|
+
if (targetOrDeepIndicator === IGNORE_NULL_AND_UNDEFINED_SYMBOL || typeof targetOrDeepIndicator === 'boolean') {
|
|
573
|
+
// Handle a deep copy situation and skip deep indicator and target.
|
|
574
|
+
deep = targetOrDeepIndicator;
|
|
575
|
+
target = targetOrSource;
|
|
576
|
+
} else {
|
|
577
|
+
target = targetOrDeepIndicator;
|
|
578
|
+
if (isObject(targetOrSource)) sources = [targetOrSource, ...sources];else if (targetOrSource !== undefined) target = targetOrSource;
|
|
579
|
+
}
|
|
580
|
+
const mergeValue = (targetValue, value) => {
|
|
581
|
+
if (value === targetValue) return targetValue;
|
|
582
|
+
|
|
583
|
+
// Traverse recursively if we're merging plain objects or maps.
|
|
584
|
+
if (deep && value && (isPlainObject(value) || isMap(value))) {
|
|
585
|
+
let clone;
|
|
586
|
+
if (isMap(value)) clone = targetValue && isMap(targetValue) ? targetValue : new Map();else clone = targetValue && isPlainObject(targetValue) ? targetValue : {};
|
|
587
|
+
return extend(deep, clone, value);
|
|
588
|
+
}
|
|
589
|
+
return value;
|
|
590
|
+
};
|
|
591
|
+
for (const source of sources) {
|
|
592
|
+
let targetType = typeof target;
|
|
593
|
+
let sourceType = typeof source;
|
|
594
|
+
if (isMap(target)) targetType += ' Map';
|
|
595
|
+
if (isMap(source)) sourceType += ' Map';
|
|
596
|
+
if (targetType === sourceType && target !== source) {
|
|
597
|
+
if (isMap(target) && isMap(source)) for (const [key, value] of source) target.set(key, mergeValue(target.get(key), value));else if (isObject(target) && !Array.isArray(target) && !(typeof Blob !== 'undefined' && target instanceof Blob) && isObject(source) && !Array.isArray(source) && !(typeof Blob !== 'undefined' && source instanceof Blob)) {
|
|
598
|
+
for (const [key, value] of Object.entries(source)) if (!(deep === IGNORE_NULL_AND_UNDEFINED_SYMBOL && [null, undefined].includes(value))) target[key] = mergeValue(target[key], value);
|
|
599
|
+
} else target = source;
|
|
600
|
+
} else target = source;
|
|
601
|
+
}
|
|
602
|
+
return target;
|
|
603
|
+
};
|
|
604
|
+
/**
|
|
605
|
+
* Generates a proxy handler which forwards all operations to given object
|
|
606
|
+
* as there wouldn't be a proxy.
|
|
607
|
+
* @param target - Object to proxy.
|
|
608
|
+
* @param methodNames - Mapping of operand name to object specific method
|
|
609
|
+
* name.
|
|
610
|
+
* @returns Determined proxy handler.
|
|
611
|
+
*/
|
|
612
|
+
export const getProxyHandler = (target, methodNames = {}) => {
|
|
613
|
+
methodNames = {
|
|
614
|
+
delete: '[]',
|
|
615
|
+
get: '[]',
|
|
616
|
+
has: '[]',
|
|
617
|
+
set: '[]',
|
|
618
|
+
...methodNames
|
|
619
|
+
};
|
|
620
|
+
return {
|
|
621
|
+
deleteProperty: (_targetObject, key) => {
|
|
622
|
+
if (methodNames.delete === '[]' && typeof key === 'string') delete target[key];else return target[methodNames.delete](key);
|
|
623
|
+
return true;
|
|
624
|
+
},
|
|
625
|
+
get: (_targetObject, key) => {
|
|
626
|
+
if (methodNames.get === '[]' && typeof key === 'string') return target[key];
|
|
627
|
+
return target[methodNames.get](key);
|
|
628
|
+
},
|
|
629
|
+
has: (_targetObject, key) => {
|
|
630
|
+
if (methodNames.has === '[]') return key in target;
|
|
631
|
+
return target[methodNames.has](key);
|
|
632
|
+
},
|
|
633
|
+
set: (_targetObject, key, value) => {
|
|
634
|
+
if (methodNames.set === '[]' && typeof key === 'string') target[key] = value;else return target[methodNames.set](key, value);
|
|
635
|
+
return true;
|
|
636
|
+
}
|
|
637
|
+
};
|
|
638
|
+
};
|
|
639
|
+
/**
|
|
640
|
+
* Slices all properties from given object which does not match provided
|
|
641
|
+
* object mask. Items can be explicitly whitelisted via "include" mask
|
|
642
|
+
* configuration or black listed via "exclude" mask configuration.
|
|
643
|
+
* @param object - Object to slice.
|
|
644
|
+
* @param maskConfiguration - Mask configuration.
|
|
645
|
+
* @returns Given but sliced object. If (nested) object will be modified a
|
|
646
|
+
* flat copy of that object will be returned.
|
|
647
|
+
*/
|
|
648
|
+
export const mask = (object, maskConfiguration) => {
|
|
649
|
+
maskConfiguration = {
|
|
650
|
+
exclude: false,
|
|
651
|
+
include: true,
|
|
652
|
+
...maskConfiguration
|
|
653
|
+
};
|
|
654
|
+
if (maskConfiguration.exclude === true || Array.isArray(maskConfiguration.exclude) && maskConfiguration.exclude.length === 0 || maskConfiguration.include === false || typeof object !== 'object') return {};
|
|
655
|
+
const exclude = Array.isArray(maskConfiguration.exclude) ? maskConfiguration.exclude.reduce((mask, key) => ({
|
|
656
|
+
...mask,
|
|
657
|
+
[key]: true
|
|
658
|
+
}), {}) : maskConfiguration.exclude;
|
|
659
|
+
const include = Array.isArray(maskConfiguration.include) ? maskConfiguration.include.reduce((mask, key) => ({
|
|
660
|
+
...mask,
|
|
661
|
+
[key]: true
|
|
662
|
+
}), {}) : maskConfiguration.include;
|
|
663
|
+
let result = {};
|
|
664
|
+
if (isPlainObject(include)) {
|
|
665
|
+
for (const [key, value] of Object.entries(include)) if (Object.prototype.hasOwnProperty.call(object, key)) if (value === true) result[key] = object[key];else if ((isPlainObject(value) || Array.isArray(value) && value.length) && typeof object[key] === 'object') result[key] = mask(object[key], {
|
|
666
|
+
include: value
|
|
667
|
+
});
|
|
668
|
+
} else
|
|
669
|
+
// In this branch "mask.include === true" holds.
|
|
670
|
+
result = object;
|
|
671
|
+
if (isPlainObject(exclude)) {
|
|
672
|
+
let useCopy = false;
|
|
673
|
+
const copy = {
|
|
674
|
+
...result
|
|
675
|
+
};
|
|
676
|
+
for (const [key, value] of Object.entries(exclude)) if (Object.prototype.hasOwnProperty.call(copy, key)) if (value === true) {
|
|
677
|
+
useCopy = true;
|
|
678
|
+
delete copy[key];
|
|
679
|
+
} else if ((isPlainObject(value) || Array.isArray(value) && value.length) && typeof copy[key] === 'object') {
|
|
680
|
+
const current = copy[key];
|
|
681
|
+
copy[key] = mask(copy[key], {
|
|
682
|
+
exclude: value
|
|
683
|
+
});
|
|
684
|
+
if (copy[key] !== current) useCopy = true;
|
|
685
|
+
}
|
|
686
|
+
if (useCopy) result = copy;
|
|
687
|
+
}
|
|
688
|
+
return result;
|
|
689
|
+
};
|
|
690
|
+
/**
|
|
691
|
+
* Modifies given target corresponding to given source and removes source
|
|
692
|
+
* modification infos.
|
|
693
|
+
* @param target - Object to modify.
|
|
694
|
+
* @param source - Source object to load modifications from.
|
|
695
|
+
* @param removeIndicatorKey - Indicator property name or value to mark a
|
|
696
|
+
* value to remove from object or list.
|
|
697
|
+
* @param prependIndicatorKey - Indicator property name to mark a value to
|
|
698
|
+
* prepend to target list.
|
|
699
|
+
* @param appendIndicatorKey - Indicator property name to mark a value to
|
|
700
|
+
* append to target list.
|
|
701
|
+
* @param positionPrefix - Indicates a prefix to use a value on given
|
|
702
|
+
* position to add or remove.
|
|
703
|
+
* @param positionSuffix - Indicates a suffix to use a value on given
|
|
704
|
+
* position to add or remove.
|
|
705
|
+
* @param parentSource - Source context to remove modification info from
|
|
706
|
+
* (usually only needed internally).
|
|
707
|
+
* @param parentKey - Source key in given source context to remove
|
|
708
|
+
* modification info from (usually only needed internally).
|
|
709
|
+
* @returns Given target modified with given source.
|
|
710
|
+
*/
|
|
711
|
+
export const modifyObject = (target, source, removeIndicatorKey = '__remove__', prependIndicatorKey = '__prepend__', appendIndicatorKey = '__append__', positionPrefix = '__', positionSuffix = '__', parentSource = null, parentKey = null) => {
|
|
712
|
+
if (isMap(source) && isMap(target)) {
|
|
713
|
+
for (const [key, value] of source) if (target.has(key)) modifyObject(target.get(key), value, removeIndicatorKey, prependIndicatorKey, appendIndicatorKey, positionPrefix, positionSuffix, source, key);
|
|
714
|
+
} else if (isObject(source) && isObject(target)) for (const [key, sourceValue] of Object.entries(source)) {
|
|
715
|
+
let index = NaN;
|
|
716
|
+
if (Array.isArray(target) && key.startsWith(positionPrefix) && key.endsWith(positionSuffix)) {
|
|
717
|
+
index = parseInt(key.substring(positionPrefix.length, key.length - positionSuffix.length), 10);
|
|
718
|
+
if (index < 0 || index >= target.length) index = NaN;
|
|
719
|
+
}
|
|
720
|
+
if ([removeIndicatorKey, prependIndicatorKey, appendIndicatorKey].includes(key) || !isNaN(index)) {
|
|
721
|
+
if (Array.isArray(target)) {
|
|
722
|
+
if (key === removeIndicatorKey) {
|
|
723
|
+
const values = [].concat(sourceValue);
|
|
724
|
+
for (const value of values) if (typeof value === 'string' && value.startsWith(positionPrefix) && value.endsWith(positionSuffix)) target.splice(parseInt(value.substring(positionPrefix.length, value.length - positionSuffix.length), 10), 1);else if (target.includes(value)) target.splice(target.indexOf(value), 1);else if (typeof value === 'number' && value < target.length) target.splice(value, 1);
|
|
725
|
+
} else if (key === appendIndicatorKey) target = target.concat(sourceValue);else if (key === prependIndicatorKey) target = [].concat(sourceValue).concat(target);else if (isObject(target[index]) && isObject(sourceValue)) extend(true, modifyObject(target[index], sourceValue, removeIndicatorKey, prependIndicatorKey, appendIndicatorKey, positionPrefix, positionSuffix), target[index], sourceValue);else target[index] = sourceValue;
|
|
726
|
+
} else if (key === removeIndicatorKey) for (const value of [].concat(sourceValue)) if (typeof value === 'string' && Object.prototype.hasOwnProperty.call(target, value)) delete target[value];
|
|
727
|
+
delete source[key];
|
|
728
|
+
if (parentSource && typeof parentKey === 'string') delete parentSource[parentKey];
|
|
729
|
+
} else if (target !== null && Object.prototype.hasOwnProperty.call(target, key)) target[key] = modifyObject(target[key], sourceValue, removeIndicatorKey, prependIndicatorKey, appendIndicatorKey, positionPrefix, positionSuffix, source, key);
|
|
730
|
+
}
|
|
731
|
+
return target;
|
|
732
|
+
};
|
|
733
|
+
/**
|
|
734
|
+
* Removes given key from given object recursively.
|
|
735
|
+
* @param object - Object to process.
|
|
736
|
+
* @param keys - List of keys to remove.
|
|
737
|
+
* @returns Processed given object.
|
|
738
|
+
*/
|
|
739
|
+
export const removeKeyPrefixes = (object, keys = '#') => {
|
|
740
|
+
const resolvedKeys = [].concat(keys);
|
|
741
|
+
if (Array.isArray(object)) {
|
|
742
|
+
let index = 0;
|
|
743
|
+
for (const subObject of object.slice()) {
|
|
744
|
+
let skip = false;
|
|
745
|
+
if (typeof subObject === 'string') {
|
|
746
|
+
for (const key of resolvedKeys) if (subObject.startsWith(`${key}:`)) {
|
|
747
|
+
object.splice(index, 1);
|
|
748
|
+
skip = true;
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
751
|
+
if (skip) continue;
|
|
752
|
+
}
|
|
753
|
+
object[index] = removeKeyPrefixes(subObject, resolvedKeys);
|
|
754
|
+
index += 1;
|
|
755
|
+
}
|
|
756
|
+
} else if (isSet(object)) for (const subObject of new Set(object)) {
|
|
757
|
+
let skip = false;
|
|
758
|
+
if (typeof subObject === 'string') {
|
|
759
|
+
for (const key of resolvedKeys) if (subObject.startsWith(`${key}:`)) {
|
|
760
|
+
object.delete(subObject);
|
|
761
|
+
skip = true;
|
|
762
|
+
break;
|
|
763
|
+
}
|
|
764
|
+
if (skip) continue;
|
|
765
|
+
}
|
|
766
|
+
removeKeyPrefixes(subObject, resolvedKeys);
|
|
767
|
+
} else if (isMap(object)) for (const [key, subObject] of new Map(object)) {
|
|
768
|
+
let skip = false;
|
|
769
|
+
if (typeof key === 'string') {
|
|
770
|
+
for (const resolvedKey of resolvedKeys) {
|
|
771
|
+
const escapedKey = escapeRegularExpressions(resolvedKey);
|
|
772
|
+
if (new RegExp(`^${escapedKey}[0-9]*$`).test(key)) {
|
|
773
|
+
object.delete(key);
|
|
774
|
+
skip = true;
|
|
775
|
+
break;
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
if (skip) continue;
|
|
779
|
+
}
|
|
780
|
+
object.set(key, removeKeyPrefixes(subObject, resolvedKeys));
|
|
781
|
+
} else if (isObject(object)) for (const [key, value] of Object.entries(Object.assign({}, object))) {
|
|
782
|
+
let skip = false;
|
|
783
|
+
for (const resolvedKey of resolvedKeys) {
|
|
784
|
+
const escapedKey = escapeRegularExpressions(resolvedKey);
|
|
785
|
+
if (new RegExp(`^${escapedKey}[0-9]*$`).test(key)) {
|
|
786
|
+
delete object[key];
|
|
787
|
+
skip = true;
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (skip) continue;
|
|
792
|
+
object[key] = removeKeyPrefixes(value, resolvedKeys);
|
|
793
|
+
}
|
|
794
|
+
return object;
|
|
795
|
+
};
|
|
796
|
+
/**
|
|
797
|
+
* Represents given object as formatted string.
|
|
798
|
+
* @param object - Object to represent.
|
|
799
|
+
* @param maximumLengthOfLists - Maximum number of array item to render.
|
|
800
|
+
* @param indention - String (usually whitespaces) to use as indention.
|
|
801
|
+
* @param initialIndention - String (usually whitespaces) to use as
|
|
802
|
+
* additional indention for the first object traversing level.
|
|
803
|
+
* @param maximumNumberOfLevelsReachedIdentifier - Replacement for objects
|
|
804
|
+
* which are out of specified bounds to traverse.
|
|
805
|
+
* @param numberOfLevels - Specifies number of levels to traverse given
|
|
806
|
+
* data structure.
|
|
807
|
+
* @returns Representation string.
|
|
808
|
+
*/
|
|
809
|
+
export const represent = (object, maximumLengthOfLists = 30, indention = ' ', initialIndention = '', maximumNumberOfLevelsReachedIdentifier = '__maximum_number_of_levels_reached__', numberOfLevels = 8) => {
|
|
810
|
+
if (numberOfLevels === 0) return String(maximumNumberOfLevelsReachedIdentifier);
|
|
811
|
+
if (object === null) return 'null';
|
|
812
|
+
if (object === undefined) return 'undefined';
|
|
813
|
+
if (typeof object === 'string') return `"${object.replace(/\n/g, `\n${initialIndention}`)}"`;
|
|
814
|
+
if (isNumeric(object) || typeof object === 'boolean') return String(object);
|
|
815
|
+
if (object instanceof Date) return object.toISOString();
|
|
816
|
+
if (Array.isArray(object)) {
|
|
817
|
+
let result = '[';
|
|
818
|
+
let firstSeen = false;
|
|
819
|
+
let counter = 1;
|
|
820
|
+
for (const item of object) {
|
|
821
|
+
if (counter > maximumLengthOfLists) {
|
|
822
|
+
result += `\n${initialIndention}...`;
|
|
823
|
+
break;
|
|
824
|
+
}
|
|
825
|
+
if (firstSeen) result += ',';
|
|
826
|
+
result += `\n${initialIndention}${indention}` + represent(item, maximumLengthOfLists, indention, `${initialIndention}${indention}`, maximumNumberOfLevelsReachedIdentifier, numberOfLevels - 1);
|
|
827
|
+
firstSeen = true;
|
|
828
|
+
counter += 1;
|
|
829
|
+
}
|
|
830
|
+
if (firstSeen) result += `\n${initialIndention}`;
|
|
831
|
+
result += ']';
|
|
832
|
+
return result;
|
|
833
|
+
}
|
|
834
|
+
if (isMap(object)) {
|
|
835
|
+
let result = '';
|
|
836
|
+
let firstSeen = false;
|
|
837
|
+
let counter = 1;
|
|
838
|
+
for (const [key, item] of object) {
|
|
839
|
+
if (counter > maximumLengthOfLists) {
|
|
840
|
+
result += `,\n${initialIndention}...`;
|
|
841
|
+
break;
|
|
842
|
+
}
|
|
843
|
+
if (firstSeen) result += `,\n${initialIndention}${indention}`;
|
|
844
|
+
result += represent(key, maximumLengthOfLists, indention, `${initialIndention}${indention}`, maximumNumberOfLevelsReachedIdentifier, numberOfLevels - 1) + ' -> ' + represent(item, maximumLengthOfLists, indention, `${initialIndention}${indention}`, maximumNumberOfLevelsReachedIdentifier, numberOfLevels - 1);
|
|
845
|
+
firstSeen = true;
|
|
846
|
+
counter += 1;
|
|
847
|
+
}
|
|
848
|
+
if (!firstSeen) result = 'EmptyMap';
|
|
849
|
+
return result;
|
|
850
|
+
}
|
|
851
|
+
if (isSet(object)) {
|
|
852
|
+
let result = '{';
|
|
853
|
+
let firstSeen = false;
|
|
854
|
+
let counter = 1;
|
|
855
|
+
for (const item of object) {
|
|
856
|
+
if (counter > maximumLengthOfLists) {
|
|
857
|
+
result += `,\n${initialIndention}...`;
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
if (firstSeen) result += ',';
|
|
861
|
+
result += `\n${initialIndention}${indention}` + represent(item, maximumLengthOfLists, indention, `${initialIndention}${indention}`, maximumNumberOfLevelsReachedIdentifier, numberOfLevels - 1);
|
|
862
|
+
firstSeen = true;
|
|
863
|
+
counter += 1;
|
|
864
|
+
}
|
|
865
|
+
if (firstSeen) result += `\n${initialIndention}}`;else result = 'EmptySet';
|
|
866
|
+
return result;
|
|
867
|
+
}
|
|
868
|
+
if (isFunction(object)) return '__function__';
|
|
869
|
+
let result = '{';
|
|
870
|
+
const keys = Object.getOwnPropertyNames(object).sort();
|
|
871
|
+
let firstSeen = false;
|
|
872
|
+
let counter = 1;
|
|
873
|
+
for (const key of keys) {
|
|
874
|
+
if (counter > maximumLengthOfLists) {
|
|
875
|
+
result += `,\n${initialIndention}...`;
|
|
876
|
+
break;
|
|
877
|
+
}
|
|
878
|
+
if (firstSeen) result += ',';
|
|
879
|
+
result += `\n${initialIndention}${indention}${key}: ` + represent(object[key], maximumLengthOfLists, indention, `${initialIndention}${indention}`, maximumNumberOfLevelsReachedIdentifier, numberOfLevels - 1);
|
|
880
|
+
firstSeen = true;
|
|
881
|
+
counter += 1;
|
|
882
|
+
}
|
|
883
|
+
if (firstSeen) result += `\n${initialIndention}`;
|
|
884
|
+
result += '}';
|
|
885
|
+
return result;
|
|
886
|
+
};
|
|
887
|
+
/**
|
|
888
|
+
* Sort given objects keys.
|
|
889
|
+
* @param object - Object which keys should be sorted.
|
|
890
|
+
* @returns Sorted list of given keys.
|
|
891
|
+
*/
|
|
892
|
+
export const sort = object => {
|
|
893
|
+
const keys = [];
|
|
894
|
+
if (Array.isArray(object)) for (let index = 0; index < object.length; index++) keys.push(index);else if (typeof object === 'object') if (isMap(object)) for (const keyValuePair of object) keys.push(keyValuePair[0]);else if (object !== null) for (const key of Object.keys(object)) keys.push(key);
|
|
895
|
+
return keys.sort();
|
|
896
|
+
};
|
|
897
|
+
/**
|
|
898
|
+
* Removes a proxy from given data structure recursively.
|
|
899
|
+
* @param object - Object to proxy.
|
|
900
|
+
* @param seenObjects - Tracks all already processed objects to avoid
|
|
901
|
+
* endless loops (usually only needed for internal purpose).
|
|
902
|
+
* @returns Returns given object unwrapped from a dynamic proxy.
|
|
903
|
+
*/
|
|
904
|
+
export const unwrapProxy = (object, seenObjects = new Set()) => {
|
|
905
|
+
if (isObject(object)) {
|
|
906
|
+
if (seenObjects.has(object)) return object;
|
|
907
|
+
try {
|
|
908
|
+
if (isFunction(object.__revoke__)) {
|
|
909
|
+
if (isProxy(object)) object = object.__target__;
|
|
910
|
+
object.__revoke__();
|
|
911
|
+
}
|
|
912
|
+
} catch {
|
|
913
|
+
return object;
|
|
914
|
+
} finally {
|
|
915
|
+
seenObjects.add(object);
|
|
916
|
+
}
|
|
917
|
+
if (Array.isArray(object)) {
|
|
918
|
+
let index = 0;
|
|
919
|
+
for (const value of object) {
|
|
920
|
+
object[index] = unwrapProxy(value, seenObjects);
|
|
921
|
+
index += 1;
|
|
922
|
+
}
|
|
923
|
+
} else if (isMap(object)) for (const [key, value] of object) object.set(key, unwrapProxy(value, seenObjects));else if (isSet(object)) {
|
|
924
|
+
const cache = [];
|
|
925
|
+
for (const value of object) {
|
|
926
|
+
object.delete(value);
|
|
927
|
+
cache.push(unwrapProxy(value, seenObjects));
|
|
928
|
+
}
|
|
929
|
+
for (const value of cache) object.add(value);
|
|
930
|
+
} else for (const [key, value] of Object.entries(object)) object[key] = unwrapProxy(value, seenObjects);
|
|
931
|
+
}
|
|
932
|
+
return object;
|
|
933
|
+
};
|
|
934
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL29iamVjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAjIS91c3IvYmluL2VudiBiYWJlbC1ub2RlXG4vLyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbi8qKiBAbW9kdWxlIG9iamVjdCAqL1xuJ3VzZSBzdHJpY3QnXG4vKiAhXG4gICAgcmVnaW9uIGhlYWRlclxuICAgIFtQcm9qZWN0IHBhZ2VdKGh0dHBzOi8vdG9yYmVuLndlYnNpdGUvY2xpZW50bm9kZSlcblxuICAgIENvcHlyaWdodCBUb3JiZW4gU2lja2VydCAoaW5mb1tcIn5hdH5cIl10b3JiZW4ud2Vic2l0ZSkgMTYuMTIuMjAxMlxuXG4gICAgTGljZW5zZVxuICAgIC0tLS0tLS1cblxuICAgIFRoaXMgbGlicmFyeSB3cml0dGVuIGJ5IFRvcmJlbiBTaWNrZXJ0IHN0YW5kcyB1bmRlciBhIGNyZWF0aXZlIGNvbW1vbnNcbiAgICBuYW1pbmcgMy4wIHVucG9ydGVkIGxpY2Vuc2UuXG4gICAgU2VlIGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvZGVlZC5kZVxuICAgIGVuZHJlZ2lvblxuKi9cbmltcG9ydCB0eXBlIHtcbiAgICBBbnlGdW5jdGlvbixcbiAgICBDb21wYXJlT3B0aW9ucyxcbiAgICBFdmFsdWF0ZUR5bmFtaWNEYXRhT3B0aW9ucyxcbiAgICBFdmFsdWF0aW9uUmVzdWx0LFxuICAgIEdldHRlckZ1bmN0aW9uLFxuICAgIE1hcHBpbmcsXG4gICAgTm9ybWFsaXplZE9iamVjdE1hc2ssXG4gICAgT2JqZWN0TWFza0NvbmZpZ3VyYXRpb24sXG4gICAgUGxhaW5PYmplY3QsXG4gICAgUHJveHlIYW5kbGVyLFxuICAgIFByb3h5VHlwZSxcbiAgICBSZWN1cnNpdmVFdmFsdWF0ZWFibGUsXG4gICAgUmVjdXJzaXZlUGFydGlhbCxcbiAgICBTZXR0ZXJGdW5jdGlvbixcbiAgICBVbmtub3duRnVuY3Rpb24sXG4gICAgVmFsdWVPZlxufSBmcm9tICcuL3R5cGUnXG5cbmltcG9ydCB7XG4gICAgQ0xBU1NfVE9fVFlQRV9NQVBQSU5HLCBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTCwgVkFMVUVfQ09QWV9TWU1CT0xcbn0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICAgIGlzRnVuY3Rpb24sIGlzT2JqZWN0LCBpc1BsYWluT2JqZWN0LCBpc01hcCwgaXNQcm94eSwgaXNTZXQsIGlzTnVtZXJpY1xufSBmcm9tICcuL2luZGljYXRvcnMnXG5pbXBvcnQge2lzTm90QU51bWJlcn0gZnJvbSAnLi9udW1iZXInXG5pbXBvcnQge2VzY2FwZVJlZ3VsYXJFeHByZXNzaW9ucywgZXZhbHVhdGV9IGZyb20gJy4vc3RyaW5nJ1xuXG4vKipcbiAqIEFkZHMgZHluYW1pYyBnZXR0ZXIgYW5kIHNldHRlciB0byBhbnkgZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgc3VjaCBhcyBtYXBzLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBwcm94eS5cbiAqIEBwYXJhbSBnZXR0ZXJXcmFwcGVyIC0gRnVuY3Rpb24gdG8gd3JhcCBlYWNoIHByb3BlcnR5IGdldC5cbiAqIEBwYXJhbSBzZXR0ZXJXcmFwcGVyIC0gRnVuY3Rpb24gdG8gd3JhcCBlYWNoIHByb3BlcnR5IHNldC5cbiAqIEBwYXJhbSBtZXRob2ROYW1lcyAtIE1ldGhvZCBuYW1lcyB0byBwZXJmb3JtIGFjdGlvbnMgb24gdGhlIGdpdmVuXG4gKiBvYmplY3QuXG4gKiBAcGFyYW0gZGVlcCAtIEluZGljYXRlcyB0byBwZXJmb3JtIGEgZGVlcCB3cmFwcGluZyBvZiBzcGVjaWZpZWQgdHlwZXMuXG4gKiBAcGFyYW0gdHlwZXNUb0V4dGVuZCAtIFR5cGVzIHdoaWNoIHNob3VsZCBiZSBleHRlbmRlZCAoQ2hlY2tzIGFyZVxuICogcGVyZm9ybWVkIHZpYSBcInZhbHVlIGluc3RhbmNlb2YgdHlwZVwiLikuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGdpdmVuIG9iamVjdCB3cmFwcGVkIHdpdGggYSBkeW5hbWljIGdldHRlciBwcm94eS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFkZER5bmFtaWNHZXR0ZXJBbmRTZXR0ZXIgPSA8VCA9IHVua25vd24+KFxuICAgIG9iamVjdDogVCxcbiAgICBnZXR0ZXJXcmFwcGVyOiBHZXR0ZXJGdW5jdGlvbiB8IG51bGwgPSBudWxsLFxuICAgIHNldHRlcldyYXBwZXI6IG51bGwgfCBTZXR0ZXJGdW5jdGlvbiA9IG51bGwsXG4gICAgbWV0aG9kTmFtZXM6IE1hcHBpbmcgPSB7fSxcbiAgICBkZWVwID0gdHJ1ZSxcbiAgICB0eXBlc1RvRXh0ZW5kOiBBcnJheTx1bmtub3duPiA9IFtPYmplY3RdXG4pOiBQcm94eVR5cGU8VD4gfCBUID0+IHtcbiAgICBpZiAoZGVlcCAmJiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JylcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvYmplY3RbaW5kZXhdID0gYWRkRHluYW1pY0dldHRlckFuZFNldHRlcihcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGdldHRlcldyYXBwZXIsIHNldHRlcldyYXBwZXIsIG1ldGhvZE5hbWVzLCBkZWVwXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmplY3QpXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIGFkZER5bmFtaWNHZXR0ZXJBbmRTZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBnZXR0ZXJXcmFwcGVyLCBzZXR0ZXJXcmFwcGVyLCBtZXRob2ROYW1lcywgZGVlcClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlOiBBcnJheTx1bmtub3duPiA9IFtdXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUodmFsdWUpXG4gICAgICAgICAgICAgICAgY2FjaGUucHVzaChhZGREeW5hbWljR2V0dGVyQW5kU2V0dGVyKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZ2V0dGVyV3JhcHBlciwgc2V0dGVyV3JhcHBlciwgbWV0aG9kTmFtZXMsIGRlZXApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlKVxuICAgICAgICAgICAgICAgIG9iamVjdC5hZGQodmFsdWUpXG4gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0ICE9PSBudWxsKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqZWN0KSlcbiAgICAgICAgICAgICAgICAob2JqZWN0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XSA9XG4gICAgICAgICAgICAgICAgICAgIGFkZER5bmFtaWNHZXR0ZXJBbmRTZXR0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBUW0V4dHJhY3Q8a2V5b2YgVCwgc3RyaW5nPl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXR0ZXJXcmFwcGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGVyV3JhcHBlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVlcFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICBpZiAoZ2V0dGVyV3JhcHBlciB8fCBzZXR0ZXJXcmFwcGVyKVxuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXNUb0V4dGVuZClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc09iamVjdChvYmplY3QpICYmIG9iamVjdCBpbnN0YW5jZW9mICh0eXBlIGFzIEFueUZ1bmN0aW9uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXI6IFByb3h5SGFuZGxlcjxUPiA9XG4gICAgICAgICAgICAgICAgICAgIGdldFByb3h5SGFuZGxlcjxUPihvYmplY3QsIG1ldGhvZE5hbWVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxUPiA9XG4gICAgICAgICAgICAgICAgICAgIGdldFByb3h5SGFuZGxlcjxUPihvYmplY3QsIG1ldGhvZE5hbWVzKVxuXG4gICAgICAgICAgICAgICAgaWYgKGdldHRlcldyYXBwZXIpXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZ2V0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldDogVCwgbmFtZTogc3RyaW5nIHwgc3ltYm9sXG4gICAgICAgICAgICAgICAgICAgICk6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdfX3RhcmdldF9fJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnX19yZXZva2VfXycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2b2tlKClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iamVjdFtuYW1lIGFzIGtleW9mIFRdID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3RbbmFtZSBhcyBrZXlvZiBUXVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0dGVyV3JhcHBlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGFuZGxlci5nZXQocHJveHkgYXMgVCwgbmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNldHRlcldyYXBwZXIpXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldDogVCwgbmFtZTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93blxuICAgICAgICAgICAgICAgICAgICApOiBib29sZWFuID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGFuZGxlci5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkgYXMgVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRlcldyYXBwZXIobmFtZSwgdmFsdWUsIG9iamVjdClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBjb25zdCB7cHJveHksIHJldm9rZX0gPVxuICAgICAgICAgICAgICAgICAgICBQcm94eS5yZXZvY2FibGUoe30sIGhhbmRsZXIgYXMgUHJveHlIYW5kbGVyPG9iamVjdD4pXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHkgYXMgUHJveHlUeXBlPFQ+XG4gICAgICAgICAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIG9iamVjdCBpbnRvIGl0cyBzZXJpYWxpemVkIGpzb24gcmVwcmVzZW50YXRpb24gYnlcbiAqIHJlcGxhY2luZyBjaXJjdWxhciByZWZlcmVuY2VzIHdpdGggYSBnaXZlbiBwcm92aWRlZCB2YWx1ZS5cbiAqXG4gKiBUaGlzIG1ldGhvZCB0cmF2ZXJzZXMgZ2l2ZW4gb2JqZWN0IHJlY3Vyc2l2ZWx5IGFuZCB0cmFja3Mgb2Ygc2VlbiBhbmRcbiAqIGFscmVhZHkgc2VyaWFsaXplZCBzdHJ1Y3R1cmVzIHRvIHJldXNlIGdlbmVyYXRlZCBzdHJpbmdzIG9yIG1hcmsgYVxuICogY2lyY3VsYXIgcmVmZXJlbmNlLlxuICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCB0byBzZXJpYWxpemUuXG4gKiBAcGFyYW0gZGV0ZXJtaW5lQ2lyY3VsYXJSZWZlcmVuY2VWYWx1ZSAtIENhbGxiYWNrIHRvIGNyZWF0ZSBhIGZhbGxiYWNrXG4gKiB2YWx1ZSBkZXBlbmRpbmcgb24gZ2l2ZW4gcmVkdW5kYW50IHZhbHVlLlxuICogQHBhcmFtIG51bWJlck9mU3BhY2VzIC0gTnVtYmVyIG9mIHNwYWNlcyB0byB1c2UgZm9yIHN0cmluZyBmb3JtYXR0aW5nLlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBqc29uIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRDaXJjdWxhck9iamVjdFRvSlNPTiA9IChcbiAgICBvYmplY3Q6IHVua25vd24sXG4gICAgZGV0ZXJtaW5lQ2lyY3VsYXJSZWZlcmVuY2VWYWx1ZTogKChcbiAgICAgICAgc2VyaWFsaXplZFZhbHVlOiB1bmtub3duLFxuICAgICAgICBrZXk6IG51bGwgfCBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICBzZWVuT2JqZWN0czogTWFwPHVua25vd24sIHVua25vd24+XG4gICAgKSA9PiB1bmtub3duKSA9IChzZXJpYWxpemVkVmFsdWU6IHVua25vd24pOiB1bmtub3duID0+XG4gICAgICAgIHNlcmlhbGl6ZWRWYWx1ZSA/PyAnX19jaXJjdWxhclJlZmVyZW5jZV9fJyxcbiAgICBudW1iZXJPZlNwYWNlcyA9IDBcbik6IFJldHVyblR5cGU8dHlwZW9mIEpTT04uc3RyaW5naWZ5PiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3Qgc2Vlbk9iamVjdHM6IE1hcDx1bmtub3duLCB1bmtub3duPiA9IG5ldyBNYXA8dW5rbm93biwgdW5rbm93bj4oKVxuXG4gICAgY29uc3Qgc3RyaW5naWZpZXIgPSAob2JqZWN0OiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGFjZXIgPSAoa2V5OiBudWxsIHwgc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGlmIChzZWVuT2JqZWN0cy5oYXModmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGV0ZXJtaW5lQ2lyY3VsYXJSZWZlcmVuY2VWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzLmdldCh2YWx1ZSkgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vlbk9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgLy8gTk9URTogU2V0IGJlZm9yZSB0cmF2ZXJzaW5nIGRlZXBlciB0byBkZXRlY3QgY3ljbGVzLlxuICAgICAgICAgICAgICAgIHNlZW5PYmplY3RzLnNldCh2YWx1ZSwgbnVsbClcblxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ6IEFycmF5PHVua25vd24+IHwgTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXBsYWNlcihudWxsLCBpdGVtKSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7fVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBzdWJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gcmVwbGFjZXIobmFtZSwgc3ViVmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2Vlbk9iamVjdHMuc2V0KHZhbHVlLCByZXN1bHQpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iamVjdCwgcmVwbGFjZXIsIG51bWJlck9mU3BhY2VzKVxuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZmllcihvYmplY3QpXG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIG1hcCBhbmQgYWxsIG5lc3RlZCBmb3VuZCBtYXBzIG9iamVjdHMgdG8gY29ycmVzcG9uZGluZ1xuICogb2JqZWN0LlxuICogQHBhcmFtIG9iamVjdCAtIE1hcCB0byBjb252ZXJ0IHRvLlxuICogQHBhcmFtIGRlZXAgLSBJbmRpY2F0ZXMgd2hldGhlciB0byBwZXJmb3JtIGEgcmVjdXJzaXZlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBHaXZlbiBtYXAgYXMgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgY29udmVydE1hcFRvUGxhaW5PYmplY3QgPSAoXG4gICAgb2JqZWN0OiB1bmtub3duLCBkZWVwID0gdHJ1ZVxuKTogdW5rbm93biA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChpc01hcChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdPYmplY3Q6IE1hcHBpbmc8dW5rbm93bj4gPSB7fVxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChkZWVwKVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRNYXBUb1BsYWluT2JqZWN0KHZhbHVlLCBkZWVwKVxuXG4gICAgICAgICAgICAgICAgaWYgKFsnbnVtYmVyJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGVvZiBrZXkpKVxuICAgICAgICAgICAgICAgICAgICBuZXdPYmplY3RbU3RyaW5nKGtleSldID0gdmFsdWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlZXApXG4gICAgICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChvYmplY3QpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgTWFwcGluZzx1bmtub3duPilba2V5XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TWFwVG9QbGFpbk9iamVjdCh2YWx1ZSwgZGVlcClcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDBcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0IGFzIEFycmF5PHVua25vd24+KSB7XG4gICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgQXJyYXk8dW5rbm93bj4pW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0TWFwVG9QbGFpbk9iamVjdCh2YWx1ZSwgZGVlcClcblxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NldChvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGU6IEFycmF5PHVua25vd24+ID0gW11cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUodmFsdWUpXG5cbiAgICAgICAgICAgICAgICAgICAgY2FjaGUucHVzaChjb252ZXJ0TWFwVG9QbGFpbk9iamVjdCh2YWx1ZSwgZGVlcCkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZSlcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmFkZCh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKipcbiAqIENvbnZlcnRzIGdpdmVuIHBsYWluIG9iamVjdCBhbmQgYWxsIG5lc3RlZCBmb3VuZCBvYmplY3RzIHRvXG4gKiBjb3JyZXNwb25kaW5nIG1hcC5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3QgdG8gY29udmVydCB0by5cbiAqIEBwYXJhbSBkZWVwIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhIHJlY3Vyc2l2ZSBjb252ZXJzaW9uLlxuICogQHJldHVybnMgR2l2ZW4gb2JqZWN0IGFzIG1hcC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwID0gKFxuICAgIG9iamVjdDogdW5rbm93biwgZGVlcCA9IHRydWVcbik6IHVua25vd24gPT4ge1xuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdPYmplY3QgPSBuZXcgTWFwPG51bWJlciB8IHN0cmluZywgdW5rbm93bj4oKVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWVwKVxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFBsYWluT2JqZWN0VG9NYXAodmFsdWUsIGRlZXApXG5cbiAgICAgICAgICAgICAgICBuZXdPYmplY3Quc2V0KGtleSwgKG9iamVjdCBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3T2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVlcClcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QgYXMgQXJyYXk8dW5rbm93bj4pIHtcbiAgICAgICAgICAgICAgICAgICAgKG9iamVjdCBhcyBBcnJheTx1bmtub3duPilbaW5kZXhdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKVxuXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0KGtleSwgY29udmVydFBsYWluT2JqZWN0VG9NYXAodmFsdWUsIGRlZXApKVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNTZXQob2JqZWN0KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuZGVsZXRlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKGNvbnZlcnRQbGFpbk9iamVjdFRvTWFwKHZhbHVlLCBkZWVwKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlKVxuICAgICAgICAgICAgICAgICAgICBvYmplY3QuYWRkKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Rcbn1cbi8qKlxuICogUmVwbGFjZXMgZ2l2ZW4gcGF0dGVybiBpbiBlYWNoIHZhbHVlIGluIGdpdmVuIG9iamVjdCByZWN1cnNpdmVseSB3aXRoXG4gKiBnaXZlbiBzdHJpbmcgcmVwbGFjZW1lbnQuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIGNvbnZlcnQgc3Vic3RyaW5ncyBpbi5cbiAqIEBwYXJhbSBwYXR0ZXJuIC0gUmVndWxhciBleHByZXNzaW9uIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnQgLSBTdHJpbmcgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBmb3VuZCBwYXR0ZXJucy5cbiAqIEByZXR1cm5zIENvbnZlcnRlZCBvYmplY3Qgd2l0aCByZXBsYWNlZCBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbnZlcnRTdWJzdHJpbmdJblBsYWluT2JqZWN0ID0gPFxuICAgIFR5cGUgZXh0ZW5kcyBNYXBwaW5nPHVua25vd24+ID0gUGxhaW5PYmplY3Rcbj4ob2JqZWN0OiBUeXBlLCBwYXR0ZXJuOiBSZWdFeHAgfCBzdHJpbmcsIHJlcGxhY2VtZW50OiBzdHJpbmcpOiBUeXBlID0+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmplY3QpKVxuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpXG4gICAgICAgICAgICBvYmplY3Rba2V5IGFzIGtleW9mIFR5cGVdID1cbiAgICAgICAgICAgICAgICBjb252ZXJ0U3Vic3RyaW5nSW5QbGFpbk9iamVjdCh2YWx1ZSwgcGF0dGVybiwgcmVwbGFjZW1lbnQpIGFzXG4gICAgICAgICAgICAgICAgICAgIHVua25vd24gYXMgVmFsdWVPZjxUeXBlPlxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgKG9iamVjdCBhcyB1bmtub3duIGFzIE1hcHBpbmcpW2tleV0gPVxuICAgICAgICAgICAgICAgIHZhbHVlLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpXG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKiBlc2xpbnQtZGlzYWJsZSBqc2RvYy9yZXF1aXJlLWRlc2NyaXB0aW9uLWNvbXBsZXRlLXNlbnRlbmNlICovXG4vKipcbiAqIENvcGllcyBnaXZlbiBvYmplY3QgKG9mIGFueSB0eXBlKSBpbnRvIG9wdGlvbmFsbHkgZ2l2ZW4gZGVzdGluYXRpb24uXG4gKiBAcGFyYW0gc291cmNlIC0gT2JqZWN0IHRvIGNvcHkuXG4gKiBAcGFyYW0gY29weUJsb2JzIC0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGNvcHkgYmxvYnMgYXMgd2VsbC5cbiAqIEBwYXJhbSByZWN1cnNpb25MaW1pdCAtIFNwZWNpZmllcyBob3cgZGVlcCB3ZSBzaG91bGQgdHJhdmVyc2UgaW50byBnaXZlblxuICogb2JqZWN0IHJlY3Vyc2l2ZWx5LlxuICogQHBhcmFtIHJlY3Vyc2lvbkVuZFZhbHVlIC0gSW5kaWNhdGVzIHdoaWNoIHZhbHVlIHRvIHVzZSBmb3IgcmVjdXJzaW9uIGVuZHMuXG4gKiBVc3VhbGx5IGEgcmVmZXJlbmNlIHRvIGNvcnJlc3BvbmRpbmcgc291cmNlIHZhbHVlIHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBkZXN0aW5hdGlvbiAtIFRhcmdldCB0byBjb3B5IHNvdXJjZSB0by5cbiAqIEBwYXJhbSBjeWNsaWMgLSBJbmRpY2F0ZXMgd2hldGhlciBrbm93biBzdWIgc3RydWN0dXJlcyBzaG91bGQgYmUgY29waWVkIG9yXG4gKiByZWZlcmVuY2VkIChpZiBcInRydWVcIiBlbmRsZXNzIGxvb3BzIGNhbiBvY2N1ciBpZiBzb3VyY2UgaGFzIGN5Y2xpY1xuICogc3RydWN0dXJlcykuXG4gKiBAcGFyYW0ga25vd25SZWZlcmVuY2VzIC0gVXNlZCB0byBhdm9pZCB0cmF2ZXJzaW5nIGxvb3BzIGFuZCBub3QgdG8gY29weVxuICogcmVmZXJlbmNlcyBlLmcuIHRvIG9iamVjdHMgbm90IHRvIGNvcHkgKGUuZy4gc3ltYm9sIHBvbHlmaWxscykuXG4gKiBAcGFyYW0gcmVjdXJzaW9uTGV2ZWwgLSBJbnRlcm5hbGx5IHVzZWQgdG8gdHJhY2sgY3VycmVudCByZWN1cnNpb24gbGV2ZWwgaW5cbiAqIGdpdmVuIHNvdXJjZSBkYXRhIHN0cnVjdHVyZS5cbiAqIEByZXR1cm5zIFZhbHVlIFwidHJ1ZVwiIGlmIGJvdGggb2JqZWN0cyBhcmUgZXF1YWwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjb3B5ID0gPFR5cGUgPSB1bmtub3duPihcbiAgICBzb3VyY2U6IFR5cGUsXG4gICAgY29weUJsb2JzID0gZmFsc2UsXG4gICAgcmVjdXJzaW9uTGltaXQgPSAtMSxcbiAgICByZWN1cnNpb25FbmRWYWx1ZTogdW5rbm93biA9IFZBTFVFX0NPUFlfU1lNQk9MLFxuICAgIGRlc3RpbmF0aW9uOiBudWxsIHwgVHlwZSA9IG51bGwsXG4gICAgY3ljbGljID0gZmFsc2UsXG4gICAga25vd25SZWZlcmVuY2VzOiBBcnJheTx1bmtub3duPiA9IFtdLFxuICAgIHJlY3Vyc2lvbkxldmVsID0gMFxuKTogVHlwZSA9PiB7XG4gICAgLyogZXNsaW50LWVuYWJsZSBqc2RvYy9yZXF1aXJlLWRlc2NyaXB0aW9uLWNvbXBsZXRlLXNlbnRlbmNlICovXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ2FuJ3QgY29weSBiZWNhdXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGAgK1xuICAgICAgICAgICAgICAgICAgICAnaWRlbnRpY2FsLidcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhY3ljbGljICYmXG4gICAgICAgICAgICAgICAgIVt1bmRlZmluZWQsIG51bGxdLmluY2x1ZGVzKHNvdXJjZSBhcyB1bmtub3duIGFzIG51bGwpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0ga25vd25SZWZlcmVuY2VzLmluZGV4T2Yoc291cmNlKVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBrbm93blJlZmVyZW5jZXNbaW5kZXhdIGFzIFR5cGVcblxuICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcy5wdXNoKHNvdXJjZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29weVZhbHVlID0gPFY+KHZhbHVlOiBWKTogbnVsbCB8IFYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0IDwgcmVjdXJzaW9uTGV2ZWwgKyAxXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaW9uRW5kVmFsdWUgPT09IFZBTFVFX0NPUFlfU1lNQk9MID9cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlIGFzIG51bGwgfCBWXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IG51bGwgfCBWID0gY29weShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGNvcHlCbG9icyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkVuZFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjeWNsaWMsXG4gICAgICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWwgKyAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhY3ljbGljICYmXG4gICAgICAgICAgICAgICAgICAgICFbdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIHVua25vd24gYXMgbnVsbFxuICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcy5wdXNoKHZhbHVlKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyB1bmtub3duIGFzIEFycmF5PHVua25vd24+KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnB1c2goY29weVZhbHVlKGl0ZW0pKVxuICAgICAgICAgICAgZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHNvdXJjZSlcbiAgICAgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uIGFzIHVua25vd24gYXMgTWFwPHVua25vd24sIHVua25vd24+KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNldChrZXksIGNvcHlWYWx1ZSh2YWx1ZSkpXG4gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTZXQpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiBhcyB1bmtub3duIGFzIFNldDx1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoY29weVZhbHVlKHZhbHVlKSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uIGFzIE1hcHBpbmc8VmFsdWVPZjxUeXBlPj4pW2tleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlWYWx1ZSh2YWx1ZSBhcyBWYWx1ZU9mPFR5cGU+KSBhcyBWYWx1ZU9mPFR5cGU+XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjb3B5IHByb3BlcnR5IHZhbHVlIG9iamVjdCBcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2tleX1cIjogJHtyZXByZXNlbnQoZXJyb3IpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NhdXNlOiBlcnJvcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gY29weShcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjb3B5QmxvYnMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgKFtdIGFzIHVua25vd24gYXMgVHlwZSksXG4gICAgICAgICAgICAgICAgICAgIGN5Y2xpYyxcbiAgICAgICAgICAgICAgICAgICAga25vd25SZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MZXZlbFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE1hcClcbiAgICAgICAgICAgICAgICByZXR1cm4gY29weShcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjb3B5QmxvYnMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxpbWl0LFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25FbmRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgKG5ldyBNYXAoKSBhcyB1bmtub3duIGFzIFR5cGUpLFxuICAgICAgICAgICAgICAgICAgICBjeWNsaWMsXG4gICAgICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uTGV2ZWxcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHkoXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgY29weUJsb2JzLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25MaW1pdCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIChuZXcgU2V0KCkgYXMgdW5rbm93biBhcyBUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgICAgICBrbm93blJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkxldmVsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAoc291cmNlIGluc3RhbmNlb2YgRGF0ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc291cmNlLmdldFRpbWUoKSkgYXMgdW5rbm93biBhcyBUeXBlXG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllciA9IC9bXi9dKiQvLmV4ZWMoc291cmNlLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBtb2RpZmllciA/IG1vZGlmaWVyWzBdIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgKSBhcyB1bmtub3duIGFzIFR5cGVcbiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb24gYXMgdW5rbm93biBhcyBSZWdFeHApLmxhc3RJbmRleCA9XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5sYXN0SW5kZXhcblxuICAgICAgICAgICAgICAgIHJldHVybiBkZXN0aW5hdGlvblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIHNvdXJjZSBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlCbG9icyA/XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zbGljZSgwLCBzb3VyY2Uuc2l6ZSwgc291cmNlLnR5cGUpIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDpcbiAgICAgICAgICAgICAgICAgICAgc291cmNlXG5cbiAgICAgICAgICAgIHJldHVybiBjb3B5KFxuICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICBjb3B5QmxvYnMsXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uTGltaXQsXG4gICAgICAgICAgICAgICAgcmVjdXJzaW9uRW5kVmFsdWUsXG4gICAgICAgICAgICAgICAgKHt9IGFzIHVua25vd24gYXMgVHlwZSksXG4gICAgICAgICAgICAgICAgY3ljbGljLFxuICAgICAgICAgICAgICAgIGtub3duUmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICByZWN1cnNpb25MZXZlbFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICByZXR1cm4gZGVzdGluYXRpb24gfHwgc291cmNlXG59XG4vKipcbiAqIERldGVybWluZSB0aGUgaW50ZXJuYWwgSmF2YVNjcmlwdCBbW0NsYXNzXV0gb2YgYW4gb2JqZWN0LlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gYW5hbHl6ZS5cbiAqIEByZXR1cm5zIE5hbWUgb2YgZGV0ZXJtaW5lZCB0eXBlLlxuICovXG5leHBvcnQgY29uc3QgZGV0ZXJtaW5lVHlwZSA9ICh2YWx1ZT86IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICAgIGlmIChbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyh2YWx1ZSBhcyBudWxsKSlcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcblxuICAgIGNvbnN0IHR5cGU6IHN0cmluZyA9IHR5cGVvZiB2YWx1ZVxuXG4gICAgaWYgKFxuICAgICAgICBbJ2Z1bmN0aW9uJywgJ29iamVjdCddLmluY2x1ZGVzKHR5cGUpICYmXG4gICAgICAgICd0b1N0cmluZycgaW4gKHZhbHVlIGFzIG9iamVjdClcbiAgICApIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nUmVwcmVzZW50YXRpb24gPVxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKVxuXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICBDTEFTU19UT19UWVBFX01BUFBJTkcsIHN0cmluZ1JlcHJlc2VudGF0aW9uXG4gICAgICAgICkpXG4gICAgICAgICAgICByZXR1cm4gQ0xBU1NfVE9fVFlQRV9NQVBQSU5HW1xuICAgICAgICAgICAgICAgIHN0cmluZ1JlcHJlc2VudGF0aW9uIGFzXG4gICAgICAgICAgICAgICAgICAgIGtleW9mIHR5cGVvZiBDTEFTU19UT19UWVBFX01BUFBJTkdcbiAgICAgICAgICAgIF1cbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZVxufVxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZ2l2ZW4gaXRlbXMgYXJlIGVxdWFsIGZvciBnaXZlbiBwcm9wZXJ0eSBsaXN0LiBJZlxuICogcHJvcGVydHkgbGlzdCBpc24ndCBzZXQgYWxsIHByb3BlcnRpZXMgd2lsbCBiZSBjaGVja2VkLiBBbGwga2V5cyB3aGljaFxuICogc3RhcnRzIHdpdGggb25lIG9mIHRoZSBleGNlcHRpb24gcHJlZml4ZXMgd2lsbCBiZSBvbWl0dGVkLlxuICogQHBhcmFtIGZpcnN0VmFsdWUgLSBGaXJzdCBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBzZWNvbmRWYWx1ZSAtIFNlY29uZCBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMgLSBPcHRpb25zIHRvIGRlZmluZSBob3cgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMucHJvcGVydGllcyAtIFByb3BlcnR5IG5hbWVzIHRvIGNoZWNrLiBDaGVjayBhbGwgaWZcbiAqIFwibnVsbFwiIGlzIHNlbGVjdGVkIChkZWZhdWx0KS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuZGVlcCAtIFJlY3Vyc2lvbiBkZXB0aCBuZWdhdGl2ZSB2YWx1ZXMgbWVhbnNcbiAqIGluZmluaXRlbHkgZGVlcCAoZGVmYXVsdCkuXG4gKiBAcGFyYW0gZ2l2ZW5PcHRpb25zLmV4Y2VwdGlvblByZWZpeGVzIC0gUHJvcGVydHkgcHJlZml4ZXMgd2hpY2hcbiAqIGluZGljYXRlcyBwcm9wZXJ0aWVzIHRvIGlnbm9yZS5cbiAqIEBwYXJhbSBnaXZlbk9wdGlvbnMuaWdub3JlRnVuY3Rpb25zIC0gSW5kaWNhdGVzIHdoZXRoZXIgZnVuY3Rpb25zIGhhdmVcbiAqIHRvIGJlIGlkZW50aWNhbCB0byBpbnRlcnByZXQgaXMgYXMgZXF1YWwuIElmIHNldCB0byBcInRydWVcIiB0d28gZnVuY3Rpb25zXG4gKiB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgZXF1YWwgKGRlZmF1bHQpLlxuICogQHBhcmFtIGdpdmVuT3B0aW9ucy5jb21wYXJlQmxvYnMgLSBJbmRpY2F0ZXMgd2hldGhlciBiaW5hcnkgZGF0YSBzaG91bGRcbiAqIGJlIGNvbnZlcnRlZCB0byBhIGJhc2U2NCBzdHJpbmcgdG8gY29tcGFyZSB0aGVpciBjb250ZW50LiBNYWtlcyB0aGlzXG4gKiBmdW5jdGlvbiBhc3luY2hyb25vdXMgaW4gYnJvd3NlcnMgYW5kIHBvdGVudGlhbGx5IHRha2VzIGEgbG90IG9mXG4gKiByZXNvdXJjZXMuXG4gKiBAcmV0dXJucyBWYWx1ZSBcInRydWVcIiBpZiBib3RoIG9iamVjdHMgYXJlIGVxdWFsIGFuZCBcImZhbHNlXCIgb3RoZXJ3aXNlLlxuICogSWYgXCJjb21wYXJlQmxvYnNcIiBpcyBhY3RpdmF0ZWQsIGFuZCB3ZSdyZSBydW5uaW5nIGluIGEgYnJvd3NlciBsaWtlXG4gKiBlbnZpcm9ubWVudCBhbmQgYmluYXJ5IGRhdGEgaXMgZ2l2ZW4sIHRoZW4gYSBwcm9taXNlIHdyYXBwaW5nIHRoZVxuICogZGV0ZXJtaW5lZCBib29sZWFuIHZhbHVlcyBpcyByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVxdWFscyA9IChcbiAgICBmaXJzdFZhbHVlOiB1bmtub3duLFxuICAgIHNlY29uZFZhbHVlOiB1bmtub3duLFxuICAgIGdpdmVuT3B0aW9uczogUGFydGlhbDxDb21wYXJlT3B0aW9ucz4gPSB7fVxuKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gfCBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnM6IENvbXBhcmVPcHRpb25zID0ge1xuICAgICAgICBjb21wYXJlQmxvYnM6IGZhbHNlLFxuICAgICAgICBkZWVwOiAtMSxcbiAgICAgICAgZXhjZXB0aW9uUHJlZml4ZXM6IFtdLFxuICAgICAgICBpZ25vcmVGdW5jdGlvbnM6IHRydWUsXG4gICAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICAgIHJldHVyblJlYXNvbklmTm90RXF1YWw6IGZhbHNlLFxuICAgICAgICAuLi5naXZlbk9wdGlvbnNcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgIG9wdGlvbnMuaWdub3JlRnVuY3Rpb25zICYmXG4gICAgICAgIGlzRnVuY3Rpb24oZmlyc3RWYWx1ZSkgJiYgaXNGdW5jdGlvbihzZWNvbmRWYWx1ZSkgfHxcbiAgICAgICAgZmlyc3RWYWx1ZSA9PT0gc2Vjb25kVmFsdWUgfHxcbiAgICAgICAgaXNOb3RBTnVtYmVyKGZpcnN0VmFsdWUpICYmIGlzTm90QU51bWJlcihzZWNvbmRWYWx1ZSkgfHxcbiAgICAgICAgZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiBzZWNvbmRWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJlxuICAgICAgICBmaXJzdFZhbHVlLnRvU3RyaW5nKCkgPT09IHNlY29uZFZhbHVlLnRvU3RyaW5nKCkgJiZcbiAgICAgICAgZmlyc3RWYWx1ZS5mbGFncy5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpID09PVxuICAgICAgICBzZWNvbmRWYWx1ZS5mbGFncy5zcGxpdCgnJykuc29ydCgpLmpvaW4oJycpIHx8XG4gICAgICAgIGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmIHNlY29uZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSAmJlxuICAgICAgICAoXG4gICAgICAgICAgICBpc05hTihmaXJzdFZhbHVlLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgIGlzTmFOKHNlY29uZFZhbHVlLmdldFRpbWUoKSkgfHxcbiAgICAgICAgICAgICFpc05hTihmaXJzdFZhbHVlLmdldFRpbWUoKSkgJiZcbiAgICAgICAgICAgICFpc05hTihzZWNvbmRWYWx1ZS5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICBmaXJzdFZhbHVlLmdldFRpbWUoKSA9PT0gc2Vjb25kVmFsdWUuZ2V0VGltZSgpXG4gICAgICAgICkgfHxcbiAgICAgICAgb3B0aW9ucy5jb21wYXJlQmxvYnMgJiZcbiAgICAgICAgZXZhbCgndHlwZW9mIEJ1ZmZlcicpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICAoZXZhbCgnQnVmZmVyJykgYXMgdHlwZW9mIEJ1ZmZlciksICdpc0J1ZmZlcidcbiAgICAgICAgKSAmJlxuICAgICAgICBmaXJzdFZhbHVlIGluc3RhbmNlb2YgZXZhbCgnQnVmZmVyJykgJiZcbiAgICAgICAgc2Vjb25kVmFsdWUgaW5zdGFuY2VvZiBldmFsKCdCdWZmZXInKSAmJlxuICAgICAgICAoZmlyc3RWYWx1ZSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKSA9PT1cbiAgICAgICAgKHNlY29uZFZhbHVlIGFzIEJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXG4gICAgKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuXG4gICAgaWYgKFxuICAgICAgICBvcHRpb25zLmNvbXBhcmVCbG9icyAmJlxuICAgICAgICB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEJsb2IgJiZcbiAgICAgICAgc2Vjb25kVmFsdWUgaW5zdGFuY2VvZiBCbG9iXG4gICAgKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4oKFxuICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSA9PiB2b2lkXG4gICAgICAgICk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzOiBBcnJheTxBcnJheUJ1ZmZlciB8IG51bGwgfCBzdHJpbmc+ID0gW11cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgW2ZpcnN0VmFsdWUsIHNlY29uZFZhbHVlXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVSZWFkZXI6IEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgICAgICAgICAgICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaChudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMucHVzaCgoZXZlbnQudGFyZ2V0IGFzIEZpbGVSZWFkZXIpLnJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNbMF0gPT09IHZhbHVlc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvcHRpb25zLnJldHVyblJlYXNvbklmTm90RXF1YWwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPj4+IEJsb2IoJHtyZXByZXNlbnQodmFsdWVzWzBdKX0pICAhPT0gYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCbG9iKCR7cmVwcmVzZW50KHZhbHVlc1sxXSl9KWAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICBpZiAoXG4gICAgICAgIGlzUGxhaW5PYmplY3QoZmlyc3RWYWx1ZSkgJiZcbiAgICAgICAgaXNQbGFpbk9iamVjdChzZWNvbmRWYWx1ZSkgJiZcbiAgICAgICAgIShmaXJzdFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHNlY29uZFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KGZpcnN0VmFsdWUpICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc2Vjb25kVmFsdWUpICYmXG4gICAgICAgIGZpcnN0VmFsdWUubGVuZ3RoID09PSBzZWNvbmRWYWx1ZS5sZW5ndGggfHxcbiAgICAgICAgKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIGRldGVybWluZVR5cGUoZmlyc3RWYWx1ZSkgPT09IGRldGVybWluZVR5cGUoc2Vjb25kVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgWydtYXAnLCAnc2V0J10uaW5jbHVkZXMoZGV0ZXJtaW5lVHlwZShmaXJzdFZhbHVlKSlcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIChmaXJzdFZhbHVlIGFzIFNldDx1bmtub3duPikuc2l6ZSA9PT1cbiAgICAgICAgICAgIChzZWNvbmRWYWx1ZSBhcyBTZXQ8dW5rbm93bj4pLnNpemVcbiAgICAgICAgKVxuICAgICkge1xuICAgICAgICBjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj4gPSBbXVxuICAgICAgICBmb3IgKGNvbnN0IFtmaXJzdCwgc2Vjb25kXSBvZiBbXG4gICAgICAgICAgICBbZmlyc3RWYWx1ZSwgc2Vjb25kVmFsdWVdLFxuICAgICAgICAgICAgW3NlY29uZFZhbHVlLCBmaXJzdFZhbHVlXVxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdElzQXJyYXk6IGJvb2xlYW4gPSBBcnJheS5pc0FycmF5KGZpcnN0KVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGZpcnN0SXNBcnJheSAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoc2Vjb25kKSB8fFxuICAgICAgICAgICAgICAgICAgICAoZmlyc3QgYXMgQXJyYXk8dW5rbm93bj4pLmxlbmd0aCAhPT1cbiAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBhcyBBcnJheTx1bmtub3duPikubGVuZ3RoXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJldHVyblJlYXNvbklmTm90RXF1YWwgPyAnLmxlbmd0aCcgOiBmYWxzZVxuXG4gICAgICAgICAgICBjb25zdCBmaXJzdElzTWFwID0gaXNNYXAoZmlyc3QpXG4gICAgICAgICAgICBpZiAoZmlyc3RJc01hcCAmJiAoIWlzTWFwKHNlY29uZCkgfHwgZmlyc3Quc2l6ZSAhPT0gc2Vjb25kLnNpemUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnJldHVyblJlYXNvbklmTm90RXF1YWwgPyAnLnNpemUnIDogZmFsc2VcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RJc1NldCA9IGlzU2V0KGZpcnN0KVxuICAgICAgICAgICAgaWYgKGZpcnN0SXNTZXQgJiYgKCFpc1NldChzZWNvbmQpIHx8IGZpcnN0LnNpemUgIT09IHNlY29uZC5zaXplKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5yZXR1cm5SZWFzb25JZk5vdEVxdWFsID8gJy5zaXplJyA6IGZhbHNlXG5cbiAgICAgICAgICAgIGlmIChmaXJzdElzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBmaXJzdCBhcyBBcnJheTx1bmtub3duPikge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWVwICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA9IGVxdWFscyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGFzIEFycmF5PHVua25vd24+KVtpbmRleF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLm9wdGlvbnMsIGRlZXA6IG9wdGlvbnMuZGVlcCAtIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXg6IG51bWJlciA9IGluZGV4XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVybWluZVJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGJvb2xlYW4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gfCBzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBbJHtTdHJpbmcoY3VycmVudEluZGV4KX1dYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7J1snOiAnJywgJz4nOiAnICd9W3Jlc3VsdFswXV0gPz8gJy4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgJ3RoZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihkZXRlcm1pbmVSZXN1bHQpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdElzTWFwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRlZXAgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApID0gZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgYXMgTWFwPHVua25vd24sIHVua25vd24+KS5nZXQoa2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Li4ub3B0aW9ucywgZGVlcDogb3B0aW9ucy5kZWVwIC0gMX1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVybWluZVJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGJvb2xlYW4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gfCBzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBnZXQoJHtyZXByZXNlbnQoa2V5KX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7J1snOiAnJywgJz4nOiAnICd9W3Jlc3VsdFswXV0gPz8gJy4nKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgJ3RoZW4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2goKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgYXMgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbihkZXRlcm1pbmVSZXN1bHQpKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRldGVybWluZVJlc3VsdChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RJc1NldCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZmlyc3QpXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRlZXAgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlcXVhbCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJQcm9taXNlczogQXJyYXk8UHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IENoZWNrIGlmIHRoZWlyIGV4aXN0cyBhdCBsZWFzdCBvbmUgYmVpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbGx5LlxuICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2Vjb25kVmFsdWUgb2Ygc2Vjb25kIGFzIFNldDx1bmtub3duPikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPiB8IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPSBlcXVhbHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey4uLm9wdGlvbnMsIGRlZXA6IG9wdGlvbnMuZGVlcCAtIDF9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBhcyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRlcm1pbmVSZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWw6IGJvb2xlYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gfCBzdHJpbmcgPT4gZXF1YWwgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucmV0dXJuUmVhc29uSWZOb3RFcXVhbCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA+Pj4gey0+ICR7cmVwcmVzZW50KHZhbHVlKX0gbm90IGZvdW5kfWAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXF1YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogV2UgZG8gbm90IGhhdmUgdG8gd2FpdCBmb3IgcHJvbWlzZXMgdG8gYmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQgd2hlbiBvbmUgbWF0Y2ggY291bGQgYmUgZm91bmQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViUHJvbWlzZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2gobmV3IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4oKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IGJvb2xlYW4gfCBzdHJpbmcpID0+IHZvaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGw8Ym9vbGVhbiB8IHN0cmluZz4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJQcm9taXNlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0czogQXJyYXk8Ym9vbGVhbiB8IHN0cmluZz4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRldGVybWluZVJlc3VsdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zb21lKChyZXN1bHQpID0+IHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICAgICAgICBmaXJzdCBhcyBNYXBwaW5nPHVua25vd24+XG4gICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByb3BlcnRpZXMgJiYgIW9wdGlvbnMucHJvcGVydGllcy5pbmNsdWRlcyhrZXkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvQnJlYWsgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGV4Y2VwdGlvblByZWZpeCBvZiBvcHRpb25zLmV4Y2VwdGlvblByZWZpeGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGV4Y2VwdGlvblByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb0JyZWFrID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvQnJlYWspXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRlZXAgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+IHwgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApID0gZXF1YWxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgYXMgTWFwcGluZzx1bmtub3duPilba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Li4ub3B0aW9ucywgZGVlcDogb3B0aW9ucy5kZWVwIC0gMX1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVybWluZVJlc3VsdCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IGJvb2xlYW4gfCBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICk6IGJvb2xlYW4gfCBzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeydbJzogJycsICc+JzogJyAnfVtyZXN1bHRbMF1dID8/ICcuJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsICd0aGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IGFzIFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRoZW4oZGV0ZXJtaW5lUmVzdWx0KSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXRlcm1pbmVSZXN1bHQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPigoXG4gICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSA9PiB2b2lkXG4gICAgICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdHM6IEFycmF5PGJvb2xlYW4gfCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiByZXN1bHRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0IHx8IHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnMucmV0dXJuUmVhc29uSWZOb3RFcXVhbCA/XG4gICAgICAgIGA+Pj4gJHtyZXByZXNlbnQoZmlyc3RWYWx1ZSl9ICE9PSAke3JlcHJlc2VudChzZWNvbmRWYWx1ZSl9YCA6XG4gICAgICAgIGZhbHNlXG59XG4vKipcbiAqIFNlYXJjaGVzIGZvciBuZXN0ZWQgbWFwcGluZ3Mgd2l0aCBnaXZlbiBpbmRpY2F0b3Iga2V5IGFuZCByZXNvbHZlc1xuICogbWFya2VkIHZhbHVlcy4gQWRkaXRpb25hbGx5LCBhbGwgb2JqZWN0cyBhcmUgd3JhcHBlZCB3aXRoIGEgcHJveHkgdG9cbiAqIGR5bmFtaWNhbGx5IHJlc29sdmUgbmVzdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gb2JqZWN0IC0gR2l2ZW4gbWFwcGluZyB0byByZXNvbHZlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIHRvIGNvbmZpZ3VyZSBldmFsdWF0aW9uLlxuICogQHBhcmFtIG9wdGlvbnMuc2NvcGUgLSBTY29wZSB0byB1c2UgZXZhbHVhdGUgYWdhaW4uXG4gKiBAcGFyYW0gb3B0aW9ucy5zZWxmUmVmZXJlbmNlTmFtZSAtIE5hbWUgdG8gdXNlIGZvciByZWZlcmVuY2UgdG8gZ2l2ZW5cbiAqIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrIGFcbiAqIHZhbHVlIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5IC0gSW5kaWNhdG9yIHByb3BlcnR5IG5hbWUgdG8gbWFyayBhXG4gKiB2YWx1ZSB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEV2YWx1YXRlZCBnaXZlbiBtYXBwaW5nLlxuICovXG5leHBvcnQgY29uc3QgZXZhbHVhdGVEeW5hbWljRGF0YSA9IDxUeXBlID0gdW5rbm93bj4oXG4gICAgb2JqZWN0OiBudWxsIHwgUmVjdXJzaXZlRXZhbHVhdGVhYmxlPFR5cGU+LFxuICAgIGdpdmVuT3B0aW9uczogUGFydGlhbDxFdmFsdWF0ZUR5bmFtaWNEYXRhT3B0aW9ucz4gPSB7fVxuKTogVHlwZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgc2NvcGU6IHt9LFxuICAgICAgICBzZWxmUmVmZXJlbmNlTmFtZTogJ3NlbGYnLFxuICAgICAgICBleHByZXNzaW9uSW5kaWNhdG9yS2V5OiAnX19ldmFsdWF0ZV9fJyxcbiAgICAgICAgZXhlY3V0aW9uSW5kaWNhdG9yS2V5OiAnX19leGVjdXRlX18nLFxuICAgICAgICAuLi5naXZlbk9wdGlvbnNcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8IG9iamVjdCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIG9iamVjdCBhcyB1bmtub3duIGFzIFR5cGVcblxuICAgIGlmICghKG9wdGlvbnMuc2VsZlJlZmVyZW5jZU5hbWUgaW4gb3B0aW9ucy5zY29wZSkpXG4gICAgICAgIG9wdGlvbnMuc2NvcGVbb3B0aW9ucy5zZWxmUmVmZXJlbmNlTmFtZV0gPSBvYmplY3RcblxuICAgIGNvbnN0IGV2YWx1YXRlQW5kVGhyb3dFcnJvciA9IChcbiAgICAgICAgY29kZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcgPSBvcHRpb25zLmV4cHJlc3Npb25JbmRpY2F0b3JLZXlcbiAgICApOiB1bmtub3duID0+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkOiBFdmFsdWF0aW9uUmVzdWx0ID0gZXZhbHVhdGUoXG4gICAgICAgICAgICBjb2RlLCBvcHRpb25zLnNjb3BlLCB0eXBlID09PSBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGV2YWx1YXRlZC5lcnJvcilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihldmFsdWF0ZWQuZXJyb3IpXG5cbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZC5yZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCBhZGRQcm94eVJlY3Vyc2l2ZWx5ID0gKGRhdGE6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgICBkYXRhID09PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2YgUHJveHkgPT09ICd1bmRlZmluZWQnXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBkYXRhXG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBnaXZlblZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdfX3RhcmdldF9fJyAmJiBpc09iamVjdChnaXZlblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gZ2l2ZW5WYWx1ZVxuXG4gICAgICAgICAgICAgICAgYWRkUHJveHlSZWN1cnNpdmVseSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSBvbmx5IHdyYXAgbmVlZGVkIG9iamVjdHMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja3VwOiBNYXBwaW5nPHVua25vd24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgKGRhdGEgYXMgTWFwcGluZzxQcm94eVR5cGU+KVtrZXldID0gbmV3IFByb3h5KFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogc3RyaW5nIHwgc3ltYm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICdfX3RhcmdldF9fJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnaGFzT3duUHJvcGVydHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IFZlcnkgY29tcGxpY2F0ZWQgc2VjdGlvbiwgZG8gb25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB3aGlsZSBoYXZpbmcgZ29vZCB0ZXN0cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID09PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRhcmdldFtrZXldID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGV2YWx1YXRlQW5kVGhyb3dFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0sIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0OiB1bmtub3duID0gcmVzb2x2ZSh0YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICd0b1N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTWFwcGluZzxVbmtub3duRnVuY3Rpb24+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUFuZFRocm93RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVGFyZ2V0IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgYXMgTWFwcGluZzxVbmtub3duRnVuY3Rpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRba2V5XS5iaW5kKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkVGFyZ2V0IGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldIGFzIG51bGwgfCBVbmtub3duRnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk/LmJpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gYXMgVW5rbm93bkZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5iaW5kKHJlc3VsdClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFtrZXldXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhbGwodGFyZ2V0LCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFRhcmdldCBhcyBzdHJpbmcsIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUYXJnZXQgYXMgTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApW2tleV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5kIG9mIGNvbXBsaWNhdGVkIHN0dWZmLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duS2V5czogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOiBBcnJheTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsKHRhcmdldCwgdHlwZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZXZhbHVhdGVBbmRUaHJvd0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W3R5cGVdIGFzIHN0cmluZywgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKSBhcyBQcm94eVR5cGVcblxuICAgICAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgICAgICAgICAgTk9URTogS25vd24gcHJveHkgcG9seWZpbGxzIGRvZXMgbm90IHByb3ZpZGUgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIl9fdGFyZ2V0X19cIiBhcGkuXG4gICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGRhdGEgYXMgTWFwcGluZzxQcm94eVR5cGU+KVtrZXldLl9fdGFyZ2V0X18pXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBhcyBNYXBwaW5nPFByb3h5VHlwZT4pW2tleV0uX190YXJnZXRfXyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZSA9IChkYXRhOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgICAgIGlmIChpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgaWYgKGlzUHJveHkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBXZSBoYXZlIHRvIHNraXAgXCJvd25LZXlzXCIgcHJveHkgdHJhcCBoZXJlLlxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBbXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIHR5cGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhIGFzIE1hcHBpbmc8dW5rbm93bj4pW3R5cGVdXG5cbiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5fX3RhcmdldF9fXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgICAgICAgICAgIGRhdGEgYXMgTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGlmIChbXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leGVjdXRpb25JbmRpY2F0b3JLZXlcbiAgICAgICAgICAgICAgICBdLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm94eSA9PT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShldmFsdWF0ZUFuZFRocm93RXJyb3IodmFsdWUgYXMgc3RyaW5nKSlcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAoZGF0YSBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID0gcmVzb2x2ZSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgb3B0aW9ucy5zY29wZS5yZXNvbHZlID0gcmVzb2x2ZVxuICAgIGNvbnN0IHJlbW92ZVByb3h5UmVjdXJzaXZlbHkgPSAoZGF0YTogdW5rbm93bik6IHVua25vd24gPT4ge1xuICAgICAgICBpZiAoaXNPYmplY3QoZGF0YSkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtleSAhPT0gJ19fdGFyZ2V0X18nICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIFsnZnVuY3Rpb24nLCAndW5kZWZpbmVkJ10uaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IHVua25vd24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIGFzIHtfX3RhcmdldF9fOiB1bmtub3dufSkuX190YXJnZXRfX1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUHJveHlSZWN1cnNpdmVseSh2YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhwcmVzc2lvbkluZGljYXRvcktleVxuICAgICkpXG4gICAgICAgIHJldHVybiBldmFsdWF0ZUFuZFRocm93RXJyb3Iob2JqZWN0W1xuICAgICAgICAgICAgb3B0aW9ucy5leHByZXNzaW9uSW5kaWNhdG9yS2V5IGFzIGtleW9mIFJlY3Vyc2l2ZUV2YWx1YXRlYWJsZTxUeXBlPlxuICAgICAgICBdKSBhcyBUeXBlXG4gICAgZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICBvYmplY3QsIG9wdGlvbnMuZXhlY3V0aW9uSW5kaWNhdG9yS2V5XG4gICAgKSlcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlQW5kVGhyb3dFcnJvcihcbiAgICAgICAgICAgIG9iamVjdFtvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleSBhc1xuICAgICAgICAgICAgICAgIGtleW9mIFJlY3Vyc2l2ZUV2YWx1YXRlYWJsZTxUeXBlPl0sXG4gICAgICAgICAgICBvcHRpb25zLmV4ZWN1dGlvbkluZGljYXRvcktleVxuICAgICAgICApIGFzIFR5cGVcblxuICAgIHJldHVybiByZW1vdmVQcm94eVJlY3Vyc2l2ZWx5KHJlc29sdmUoYWRkUHJveHlSZWN1cnNpdmVseShvYmplY3QpKSkgYXMgVHlwZVxufVxuLyoqXG4gKiBSZW1vdmVzIHByb3BlcnRpZXMgaW4gb2JqZWN0cyB3aGVyZSBhIGR5bmFtaWMgaW5kaWNhdG9yIGxpdmVzLlxuICogQHBhcmFtIGRhdGEgLSBPYmplY3QgdG8gdHJhdmVyc2UgcmVjdXJzaXZlbHkuXG4gKiBAcGFyYW0gZXhwcmVzc2lvbkluZGljYXRvcnMgLSBQcm9wZXJ0eSBrZXkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgR2l2ZW4gb2JqZWN0IHdpdGggcmVtb3ZlZCBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlS2V5c0luRXZhbHVhdGlvbiA9IDxcbiAgICBUIGV4dGVuZHMgTWFwcGluZzx1bmtub3duPiA9IE1hcHBpbmc8dW5rbm93bj5cbj4oXG4gICAgICAgIGRhdGE6IFQsXG4gICAgICAgIGV4cHJlc3Npb25JbmRpY2F0b3JzOiBBcnJheTxzdHJpbmc+ID0gWydfX2V2YWx1YXRlX18nLCAnX19leGVjdXRlX18nXVxuICAgICk6IFQgPT4ge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhZXhwcmVzc2lvbkluZGljYXRvcnMuaW5jbHVkZXMoa2V5KSAmJlxuICAgICAgICAgICAgZXhwcmVzc2lvbkluZGljYXRvcnMuc29tZSgobmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PlxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBuYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICBkZWxldGUgKGRhdGEgYXMgdW5rbm93biBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldXG4gICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgICAgICAgcmVtb3ZlS2V5c0luRXZhbHVhdGlvbih2YWx1ZSwgZXhwcmVzc2lvbkluZGljYXRvcnMpXG5cbiAgICByZXR1cm4gZGF0YVxufVxuLyoqXG4gKiBFeHRlbmRzIGdpdmVuIHRhcmdldCBvYmplY3Qgd2l0aCBnaXZlbiBzb3VyY2VzIG9iamVjdC4gQXMgdGFyZ2V0IGFuZFxuICogc291cmNlcyBtYW55IGV4cGFuZGFibGUgdHlwZXMgYXJlIGFsbG93ZWQgYnV0IHRhcmdldCBhbmQgc291cmNlcyBoYXZlIHRvXG4gKiBjb21lIGZyb20gdGhlIHNhbWUgdHlwZS5cbiAqIEBwYXJhbSB0YXJnZXRPckRlZXBJbmRpY2F0b3IgLSBNYXliZSB0aGUgdGFyZ2V0IG9yIGRlZXAgaW5kaWNhdG9yLlxuICogQHBhcmFtIHRhcmdldE9yU291cmNlIC0gVGFyZ2V0IG9yIHNvdXJjZSBvYmplY3Q7IGRlcGVuZGluZyBvbiBmaXJzdFxuICogYXJndW1lbnQuXG4gKiBAcGFyYW0gYWRkaXRpb25hbFNvdXJjZXMgLSBTb3VyY2Ugb2JqZWN0cyB0byBleHRlbmQgaW50byB0YXJnZXQuXG4gKiBAcmV0dXJucyBSZXR1cm5zIGdpdmVuIHRhcmdldCBleHRlbmRlZCB3aXRoIGFsbCBnaXZlbiBzb3VyY2VzLlxuICovXG5leHBvcnQgY29uc3QgZXh0ZW5kID0gPFQgPSBNYXBwaW5nPHVua25vd24+PihcbiAgICB0YXJnZXRPckRlZXBJbmRpY2F0b3I6IChcbiAgICAgICAgYm9vbGVhbiB8IHR5cGVvZiBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTCB8IFJlY3Vyc2l2ZVBhcnRpYWw8VD5cbiAgICApLFxuICAgIHRhcmdldE9yU291cmNlPzogbnVsbCB8IFJlY3Vyc2l2ZVBhcnRpYWw8VD4sXG4gICAgLi4uYWRkaXRpb25hbFNvdXJjZXM6IEFycmF5PFJlY3Vyc2l2ZVBhcnRpYWw8VD4+XG4pOiBUID0+IHtcbiAgICBsZXQgZGVlcDogYm9vbGVhbiB8IHR5cGVvZiBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTCA9IGZhbHNlXG4gICAgbGV0IHNvdXJjZXM6IEFycmF5PFJlY3Vyc2l2ZVBhcnRpYWw8VD4gfCBudWxsPiA9IGFkZGl0aW9uYWxTb3VyY2VzXG4gICAgbGV0IHRhcmdldDogbnVsbCB8IFJlY3Vyc2l2ZVBhcnRpYWw8VD4gfCB1bmRlZmluZWRcblxuICAgIGlmIChcbiAgICAgICAgdGFyZ2V0T3JEZWVwSW5kaWNhdG9yID09PSBJR05PUkVfTlVMTF9BTkRfVU5ERUZJTkVEX1NZTUJPTCB8fFxuICAgICAgICB0eXBlb2YgdGFyZ2V0T3JEZWVwSW5kaWNhdG9yID09PSAnYm9vbGVhbidcbiAgICApIHtcbiAgICAgICAgLy8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvbiBhbmQgc2tpcCBkZWVwIGluZGljYXRvciBhbmQgdGFyZ2V0LlxuICAgICAgICBkZWVwID0gdGFyZ2V0T3JEZWVwSW5kaWNhdG9yIGFzXG4gICAgICAgICAgICBib29sZWFuIHwgdHlwZW9mIElHTk9SRV9OVUxMX0FORF9VTkRFRklORURfU1lNQk9MXG4gICAgICAgIHRhcmdldCA9IHRhcmdldE9yU291cmNlXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0T3JEZWVwSW5kaWNhdG9yXG4gICAgICAgIGlmIChpc09iamVjdCh0YXJnZXRPclNvdXJjZSkpXG4gICAgICAgICAgICBzb3VyY2VzID0gW3RhcmdldE9yU291cmNlLCAuLi5zb3VyY2VzXVxuICAgICAgICBlbHNlIGlmICh0YXJnZXRPclNvdXJjZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0T3JTb3VyY2VcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZVZhbHVlID0gKFxuICAgICAgICB0YXJnZXRWYWx1ZTogVmFsdWVPZjxUPiwgdmFsdWU6IFZhbHVlT2Y8VD5cbiAgICApOiBWYWx1ZU9mPFQ+ID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRWYWx1ZVxuXG4gICAgICAgIC8vIFRyYXZlcnNlIHJlY3Vyc2l2ZWx5IGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBtYXBzLlxuICAgICAgICBpZiAoZGVlcCAmJiB2YWx1ZSAmJiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkgfHwgaXNNYXAodmFsdWUpKSkge1xuICAgICAgICAgICAgbGV0IGNsb25lOiBWYWx1ZU9mPFQ+XG4gICAgICAgICAgICBpZiAoaXNNYXAodmFsdWUpKVxuICAgICAgICAgICAgICAgIGNsb25lID0gKHRhcmdldFZhbHVlICYmIGlzTWFwKHRhcmdldFZhbHVlKSkgP1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgIG5ldyBNYXAoKSBhcyB1bmtub3duIGFzIFZhbHVlT2Y8VD5cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjbG9uZSA9ICh0YXJnZXRWYWx1ZSAmJiBpc1BsYWluT2JqZWN0KHRhcmdldFZhbHVlKSkgP1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSA6XG4gICAgICAgICAgICAgICAgICAgIHt9IGFzIHVua25vd24gYXMgVmFsdWVPZjxUPlxuXG4gICAgICAgICAgICByZXR1cm4gZXh0ZW5kKGRlZXAsIGNsb25lIGFzIFJlY3Vyc2l2ZVBhcnRpYWw8VD4sIHZhbHVlKSBhc1xuICAgICAgICAgICAgICAgIFZhbHVlT2Y8VD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgbGV0IHRhcmdldFR5cGU6IHN0cmluZyA9IHR5cGVvZiB0YXJnZXRcbiAgICAgICAgbGV0IHNvdXJjZVR5cGU6IHN0cmluZyA9IHR5cGVvZiBzb3VyY2VcblxuICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSlcbiAgICAgICAgICAgIHRhcmdldFR5cGUgKz0gJyBNYXAnXG4gICAgICAgIGlmIChpc01hcChzb3VyY2UpKVxuICAgICAgICAgICAgc291cmNlVHlwZSArPSAnIE1hcCdcblxuICAgICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gc291cmNlVHlwZSAmJiB0YXJnZXQgIT09IHNvdXJjZSlcbiAgICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpICYmIGlzTWFwKHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygc291cmNlKVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZ2V0KGtleSkgYXMgVmFsdWVPZjxUPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBhcyBWYWx1ZU9mPFQ+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KHRhcmdldCkgJiYgIUFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICEodHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIHRhcmdldCBpbnN0YW5jZW9mIEJsb2IpICYmXG4gICAgICAgICAgICAgICAgaXNPYmplY3Qoc291cmNlKSAmJiAhQXJyYXkuaXNBcnJheShzb3VyY2UpICYmXG4gICAgICAgICAgICAgICAgISh0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgJiYgc291cmNlIGluc3RhbmNlb2YgQmxvYilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpXG4gICAgICAgICAgICAgICAgICAgIGlmICghKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVlcCA9PT0gSUdOT1JFX05VTExfQU5EX1VOREVGSU5FRF9TWU1CT0wgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKHZhbHVlIGFzIG51bGwpXG4gICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5IGFzIGtleW9mIFRdID0gbWVyZ2VWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5IGFzIGtleW9mIFRdIGFzIFZhbHVlT2Y8VD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgYXMgVmFsdWVPZjxUPlxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gc291cmNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRhcmdldCA9IHNvdXJjZVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQgYXMgVFxufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBwcm94eSBoYW5kbGVyIHdoaWNoIGZvcndhcmRzIGFsbCBvcGVyYXRpb25zIHRvIGdpdmVuIG9iamVjdFxuICogYXMgdGhlcmUgd291bGRuJ3QgYmUgYSBwcm94eS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBPYmplY3QgdG8gcHJveHkuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZXMgLSBNYXBwaW5nIG9mIG9wZXJhbmQgbmFtZSB0byBvYmplY3Qgc3BlY2lmaWMgbWV0aG9kXG4gKiBuYW1lLlxuICogQHJldHVybnMgRGV0ZXJtaW5lZCBwcm94eSBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgZ2V0UHJveHlIYW5kbGVyID0gPFQgPSB1bmtub3duPihcbiAgICB0YXJnZXQ6IFQsIG1ldGhvZE5hbWVzOiBNYXBwaW5nID0ge31cbik6IFByb3h5SGFuZGxlcjxUPiA9PiB7XG4gICAgbWV0aG9kTmFtZXMgPSB7XG4gICAgICAgIGRlbGV0ZTogJ1tdJyxcbiAgICAgICAgZ2V0OiAnW10nLFxuICAgICAgICBoYXM6ICdbXScsXG4gICAgICAgIHNldDogJ1tdJyxcbiAgICAgICAgLi4ubWV0aG9kTmFtZXNcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWxldGVQcm9wZXJ0eTogKF90YXJnZXRPYmplY3Q6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBpZiAobWV0aG9kTmFtZXMuZGVsZXRlID09PSAnW10nICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRba2V5IGFzIGtleW9mIFRdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZE5hbWVzLmRlbGV0ZSBhcyBrZXlvZiBUXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgKGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiBib29sZWFuXG4gICAgICAgICAgICAgICAgKShrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIGdldDogKF90YXJnZXRPYmplY3Q6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKTogdW5rbm93biA9PiB7XG4gICAgICAgICAgICBpZiAobWV0aG9kTmFtZXMuZ2V0ID09PSAnW10nICYmIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5IGFzIGtleW9mIFRdXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZE5hbWVzLmdldCBhcyBrZXlvZiBUXSBhc1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzXG4gICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4gdW5rbm93blxuICAgICAgICAgICAgKShrZXkpXG4gICAgICAgIH0sXG4gICAgICAgIGhhczogKF90YXJnZXRPYmplY3Q6IFQsIGtleTogc3RyaW5nIHwgc3ltYm9sKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBpZiAobWV0aG9kTmFtZXMuaGFzID09PSAnW10nKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgaW4gKHRhcmdldCBhcyBvYmplY3QpXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgdGFyZ2V0W21ldGhvZE5hbWVzLmhhcyBhcyBrZXlvZiBUXSBhc1xuICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzXG4gICAgICAgICAgICAgICAgICAgIChrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4gYm9vbGVhblxuICAgICAgICAgICAgKShrZXkpXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKFxuICAgICAgICAgICAgX3RhcmdldE9iamVjdDogVCwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duXG4gICAgICAgICk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzLnNldCA9PT0gJ1tdJyAmJiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5IGFzIGtleW9mIFRdID0gdmFsdWUgYXMgVFtrZXlvZiBUXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiAodGFyZ2V0W21ldGhvZE5hbWVzLnNldCBhcyBrZXlvZiBUXSBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgKGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogdW5rbm93bikgPT4gYm9vbGVhblxuICAgICAgICAgICAgICAgICkoa2V5LCB2YWx1ZSlcblxuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogU2xpY2VzIGFsbCBwcm9wZXJ0aWVzIGZyb20gZ2l2ZW4gb2JqZWN0IHdoaWNoIGRvZXMgbm90IG1hdGNoIHByb3ZpZGVkXG4gKiBvYmplY3QgbWFzay4gSXRlbXMgY2FuIGJlIGV4cGxpY2l0bHkgd2hpdGVsaXN0ZWQgdmlhIFwiaW5jbHVkZVwiIG1hc2tcbiAqIGNvbmZpZ3VyYXRpb24gb3IgYmxhY2sgbGlzdGVkIHZpYSBcImV4Y2x1ZGVcIiBtYXNrIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIHNsaWNlLlxuICogQHBhcmFtIG1hc2tDb25maWd1cmF0aW9uIC0gTWFzayBjb25maWd1cmF0aW9uLlxuICogQHJldHVybnMgR2l2ZW4gYnV0IHNsaWNlZCBvYmplY3QuIElmIChuZXN0ZWQpIG9iamVjdCB3aWxsIGJlIG1vZGlmaWVkIGFcbiAqIGZsYXQgY29weSBvZiB0aGF0IG9iamVjdCB3aWxsIGJlIHJldHVybmVkLlxuICovXG5leHBvcnQgY29uc3QgbWFzayA9IDxUeXBlIGV4dGVuZHMgTWFwcGluZzx1bmtub3duPiA9IE1hcHBpbmc8dW5rbm93bj4+KFxuICAgIG9iamVjdDogVHlwZSwgbWFza0NvbmZpZ3VyYXRpb246IE9iamVjdE1hc2tDb25maWd1cmF0aW9uXG4pOiBSZWN1cnNpdmVQYXJ0aWFsPFR5cGU+ID0+IHtcbiAgICBtYXNrQ29uZmlndXJhdGlvbiA9IHtleGNsdWRlOiBmYWxzZSwgaW5jbHVkZTogdHJ1ZSwgLi4ubWFza0NvbmZpZ3VyYXRpb259XG5cbiAgICBpZiAoXG4gICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUgPT09IHRydWUgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlKSAmJlxuICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5leGNsdWRlLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBtYXNrQ29uZmlndXJhdGlvbi5pbmNsdWRlID09PSBmYWxzZSB8fFxuICAgICAgICB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0J1xuICAgIClcbiAgICAgICAgcmV0dXJuIHt9XG5cbiAgICBjb25zdCBleGNsdWRlOiBOb3JtYWxpemVkT2JqZWN0TWFzayA9XG4gICAgICAgIEFycmF5LmlzQXJyYXkobWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZSkgP1xuICAgICAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uZXhjbHVkZS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1hc2ssIGtleSkgPT4gKHsuLi5tYXNrLCBba2V5XTogdHJ1ZX0pLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApIDpcbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmV4Y2x1ZGUgYXMgTm9ybWFsaXplZE9iamVjdE1hc2tcbiAgICBjb25zdCBpbmNsdWRlOiBOb3JtYWxpemVkT2JqZWN0TWFzayA9XG4gICAgICAgIEFycmF5LmlzQXJyYXkobWFza0NvbmZpZ3VyYXRpb24uaW5jbHVkZSkgP1xuICAgICAgICAgICAgbWFza0NvbmZpZ3VyYXRpb24uaW5jbHVkZS5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgKG1hc2ssIGtleSkgPT4gKHsuLi5tYXNrLCBba2V5XTogdHJ1ZX0pLFxuICAgICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApIDpcbiAgICAgICAgICAgIG1hc2tDb25maWd1cmF0aW9uLmluY2x1ZGUgYXMgTm9ybWFsaXplZE9iamVjdE1hc2tcblxuICAgIGxldCByZXN1bHQ6IFBhcnRpYWw8VHlwZT4gPSB7fVxuICAgIGlmIChpc1BsYWluT2JqZWN0KGluY2x1ZGUpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY2x1ZGUpKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIFR5cGVdID0gb2JqZWN0W2tleSBhcyBrZXlvZiBUeXBlXVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9iamVjdFtrZXkgYXMga2V5b2YgVHlwZV0gPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0IGFzIE1hcHBpbmc8TWFwcGluZzx1bmtub3duPj4pW2tleV0gPSBtYXNrKFxuICAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdCBhcyBNYXBwaW5nPE1hcHBpbmc8dW5rbm93bj4+KVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAge2luY2x1ZGU6IHZhbHVlfVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgfSBlbHNlXG4gICAgICAgIC8vIEluIHRoaXMgYnJhbmNoIFwibWFzay5pbmNsdWRlID09PSB0cnVlXCIgaG9sZHMuXG4gICAgICAgIHJlc3VsdCA9IG9iamVjdFxuXG4gICAgaWYgKGlzUGxhaW5PYmplY3QoZXhjbHVkZSkpIHtcbiAgICAgICAgbGV0IHVzZUNvcHkgPSBmYWxzZVxuICAgICAgICBjb25zdCBjb3B5OiBSZWN1cnNpdmVQYXJ0aWFsPFR5cGU+ID0gey4uLnJlc3VsdH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhleGNsdWRlKSlcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29weSwga2V5KSlcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlQ29weSA9IHRydWVcblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29weVtrZXkgYXMga2V5b2YgVHlwZV1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50OiBWYWx1ZU9mPFR5cGU+ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlba2V5IGFzIGtleW9mIFR5cGVdIGFzIFZhbHVlT2Y8VHlwZT5cblxuICAgICAgICAgICAgICAgICAgICA7KGNvcHkgYXMgTWFwcGluZzxNYXBwaW5nPHVua25vd24+Pilba2V5XSA9IG1hc2soXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29weSBhcyBNYXBwaW5nPE1hcHBpbmc8dW5rbm93bj4+KVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAge2V4Y2x1ZGU6IHZhbHVlfVxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29weVtrZXkgYXMga2V5b2YgVHlwZV0gYXMgVmFsdWVPZjxUeXBlPiAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29weSA9IHRydWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZUNvcHkpXG4gICAgICAgICAgICByZXN1bHQgPSBjb3B5XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuLyoqXG4gKiBNb2RpZmllcyBnaXZlbiB0YXJnZXQgY29ycmVzcG9uZGluZyB0byBnaXZlbiBzb3VyY2UgYW5kIHJlbW92ZXMgc291cmNlXG4gKiBtb2RpZmljYXRpb24gaW5mb3MuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gT2JqZWN0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBzb3VyY2UgLSBTb3VyY2Ugb2JqZWN0IHRvIGxvYWQgbW9kaWZpY2F0aW9ucyBmcm9tLlxuICogQHBhcmFtIHJlbW92ZUluZGljYXRvcktleSAtIEluZGljYXRvciBwcm9wZXJ0eSBuYW1lIG9yIHZhbHVlIHRvIG1hcmsgYVxuICogdmFsdWUgdG8gcmVtb3ZlIGZyb20gb2JqZWN0IG9yIGxpc3QuXG4gKiBAcGFyYW0gcHJlcGVuZEluZGljYXRvcktleSAtIEluZGljYXRvciBwcm9wZXJ0eSBuYW1lIHRvIG1hcmsgYSB2YWx1ZSB0b1xuICogcHJlcGVuZCB0byB0YXJnZXQgbGlzdC5cbiAqIEBwYXJhbSBhcHBlbmRJbmRpY2F0b3JLZXkgLSBJbmRpY2F0b3IgcHJvcGVydHkgbmFtZSB0byBtYXJrIGEgdmFsdWUgdG9cbiAqIGFwcGVuZCB0byB0YXJnZXQgbGlzdC5cbiAqIEBwYXJhbSBwb3NpdGlvblByZWZpeCAtIEluZGljYXRlcyBhIHByZWZpeCB0byB1c2UgYSB2YWx1ZSBvbiBnaXZlblxuICogcG9zaXRpb24gdG8gYWRkIG9yIHJlbW92ZS5cbiAqIEBwYXJhbSBwb3NpdGlvblN1ZmZpeCAtIEluZGljYXRlcyBhIHN1ZmZpeCB0byB1c2UgYSB2YWx1ZSBvbiBnaXZlblxuICogcG9zaXRpb24gdG8gYWRkIG9yIHJlbW92ZS5cbiAqIEBwYXJhbSBwYXJlbnRTb3VyY2UgLSBTb3VyY2UgY29udGV4dCB0byByZW1vdmUgbW9kaWZpY2F0aW9uIGluZm8gZnJvbVxuICogKHVzdWFsbHkgb25seSBuZWVkZWQgaW50ZXJuYWxseSkuXG4gKiBAcGFyYW0gcGFyZW50S2V5IC0gU291cmNlIGtleSBpbiBnaXZlbiBzb3VyY2UgY29udGV4dCB0byByZW1vdmVcbiAqIG1vZGlmaWNhdGlvbiBpbmZvIGZyb20gKHVzdWFsbHkgb25seSBuZWVkZWQgaW50ZXJuYWxseSkuXG4gKiBAcmV0dXJucyBHaXZlbiB0YXJnZXQgbW9kaWZpZWQgd2l0aCBnaXZlbiBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBtb2RpZnlPYmplY3QgPSA8VCA9IHVua25vd24+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2U6IHVua25vd24sXG4gICAgcmVtb3ZlSW5kaWNhdG9yS2V5ID0gJ19fcmVtb3ZlX18nLFxuICAgIHByZXBlbmRJbmRpY2F0b3JLZXkgPSAnX19wcmVwZW5kX18nLFxuICAgIGFwcGVuZEluZGljYXRvcktleSA9ICdfX2FwcGVuZF9fJyxcbiAgICBwb3NpdGlvblByZWZpeCA9ICdfXycsXG4gICAgcG9zaXRpb25TdWZmaXggPSAnX18nLFxuICAgIHBhcmVudFNvdXJjZTogdW5rbm93biA9IG51bGwsXG4gICAgcGFyZW50S2V5OiB1bmtub3duID0gbnVsbFxuKTogVCA9PiB7XG4gICAgaWYgKGlzTWFwKHNvdXJjZSkgJiYgaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzb3VyY2UpXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmhhcyhrZXkpKVxuICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldChrZXkpIGFzIFZhbHVlT2Y8VD4sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlIGFzIE1hcDx1bmtub3duLCB1bmtub3duPiB8IE1hcHBpbmc8dW5rbm93bj4gfCBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZW1vdmVJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgIHByZXBlbmRJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25QcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU3VmZml4LFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIClcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNvdXJjZSkgJiYgaXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBzb3VyY2VWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gTmFOXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmXG4gICAgICAgICAgICAgICAga2V5LnN0YXJ0c1dpdGgocG9zaXRpb25QcmVmaXgpICYmXG4gICAgICAgICAgICAgICAga2V5LmVuZHNXaXRoKHBvc2l0aW9uU3VmZml4KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAga2V5LnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJlZml4Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5sZW5ndGggLVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGFyZ2V0Lmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBOYU5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFtyZW1vdmVJbmRpY2F0b3JLZXksIHByZXBlbmRJbmRpY2F0b3JLZXksIGFwcGVuZEluZGljYXRvcktleV1cbiAgICAgICAgICAgICAgICAgICAgLmluY2x1ZGVzKGtleSkgfHxcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSByZW1vdmVJbmRpY2F0b3JLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlczogQXJyYXk8dW5rbm93bj4gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbXSBhcyBBcnJheTx1bmtub3duPikuY29uY2F0KHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN0YXJ0c1dpdGgocG9zaXRpb25QcmVmaXgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmVuZHNXaXRoKHBvc2l0aW9uU3VmZml4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNwbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25QcmVmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5sZW5ndGggLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblN1ZmZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0LmluY2x1ZGVzKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNwbGljZSh0YXJnZXQuaW5kZXhPZih2YWx1ZSksIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPCB0YXJnZXQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc3BsaWNlKHZhbHVlLCAxKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gYXBwZW5kSW5kaWNhdG9yS2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LmNvbmNhdChzb3VyY2VWYWx1ZSkgYXMgdW5rbm93biBhcyBUXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gcHJlcGVuZEluZGljYXRvcktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IChbXSBhcyBBcnJheTx1bmtub3duPilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodGFyZ2V0KSBhcyB1bmtub3duIGFzIFRcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodGFyZ2V0W2luZGV4XSkgJiYgaXNPYmplY3Qoc291cmNlVmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5T2JqZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbaW5kZXhdIGFzIFJlY3Vyc2l2ZVBhcnRpYWw8VmFsdWVPZjxUPj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVZhbHVlIGFzIFJlY3Vyc2l2ZVBhcnRpYWw8VmFsdWVPZjxUPj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZEluZGljYXRvcktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25TdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtpbmRleF0gYXMgUmVjdXJzaXZlUGFydGlhbDxWYWx1ZU9mPFQ+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VWYWx1ZSBhcyBSZWN1cnNpdmVQYXJ0aWFsPFZhbHVlT2Y8VD4+XG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtpbmRleF0gPSBzb3VyY2VWYWx1ZSBhcyBWYWx1ZU9mPFQ+XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09PSByZW1vdmVJbmRpY2F0b3JLZXkpXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgKFtdIGFzIEFycmF5PHVua25vd24+KS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCwgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClbdmFsdWVdXG4gICAgICAgICAgICAgICAgZGVsZXRlIHNvdXJjZVtrZXldXG5cbiAgICAgICAgICAgICAgICBpZiAocGFyZW50U291cmNlICYmIHR5cGVvZiBwYXJlbnRLZXkgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50U291cmNlIGFzIE1hcHBpbmc8dW5rbm93bj5cbiAgICAgICAgICAgICAgICAgICAgKVtwYXJlbnRLZXldXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRhcmdldCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XSA9XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQgYXMgdW5rbm93biBhcyBNYXBwaW5nPFZhbHVlT2Y8VD4+KVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVJbmRpY2F0b3JLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kSW5kaWNhdG9yS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25QcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblN1ZmZpeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRcbn1cbi8qKlxuICogUmVtb3ZlcyBnaXZlbiBrZXkgZnJvbSBnaXZlbiBvYmplY3QgcmVjdXJzaXZlbHkuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIHByb2Nlc3MuXG4gKiBAcGFyYW0ga2V5cyAtIExpc3Qgb2Yga2V5cyB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBQcm9jZXNzZWQgZ2l2ZW4gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlS2V5UHJlZml4ZXMgPSA8VD4oXG4gICAgb2JqZWN0OiBULCBrZXlzOiBBcnJheTxzdHJpbmc+IHwgc3RyaW5nID0gJyMnXG4pOiBUID0+IHtcbiAgICBjb25zdCByZXNvbHZlZEtleXM6IEFycmF5PHN0cmluZz4gPSAoW10gYXMgQXJyYXk8c3RyaW5nPikuY29uY2F0KGtleXMpXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgZm9yIChjb25zdCBzdWJPYmplY3Qgb2Ygb2JqZWN0LnNsaWNlKCkpIHtcbiAgICAgICAgICAgIGxldCBza2lwID0gZmFsc2VcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViT2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkS2V5cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk9iamVjdC5zdGFydHNXaXRoKGAke2tleX06YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIChvYmplY3QgYXMgQXJyYXk8c3RyaW5nPikuc3BsaWNlKGluZGV4LCAxKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHNraXApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIChvYmplY3QgYXMgQXJyYXk8dW5rbm93bj4pW2luZGV4XSA9XG4gICAgICAgICAgICAgICAgcmVtb3ZlS2V5UHJlZml4ZXMoc3ViT2JqZWN0LCByZXNvbHZlZEtleXMpXG5cbiAgICAgICAgICAgIGluZGV4ICs9IDFcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTZXQob2JqZWN0KSlcbiAgICAgICAgZm9yIChjb25zdCBzdWJPYmplY3Qgb2YgbmV3IFNldChvYmplY3QpKSB7XG4gICAgICAgICAgICBsZXQgc2tpcCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViT2JqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlc29sdmVkS2V5cylcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Yk9iamVjdC5zdGFydHNXaXRoKGAke2tleX06YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5kZWxldGUoc3ViT2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZW1vdmVLZXlQcmVmaXhlcyhzdWJPYmplY3QsIHJlc29sdmVkS2V5cylcbiAgICAgICAgfVxuICAgIGVsc2UgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgc3ViT2JqZWN0XSBvZiBuZXcgTWFwKG9iamVjdCkpIHtcbiAgICAgICAgICAgIGxldCBza2lwID0gZmFsc2VcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlZEtleSBvZiByZXNvbHZlZEtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZEtleSA9IGVzY2FwZVJlZ3VsYXJFeHByZXNzaW9ucyhyZXNvbHZlZEtleSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRLZXl9WzAtOV0qJGApLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZShrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChza2lwKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYmplY3Quc2V0KGtleSwgcmVtb3ZlS2V5UHJlZml4ZXMoc3ViT2JqZWN0LCByZXNvbHZlZEtleXMpKVxuICAgICAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqZWN0KSlcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LCBvYmplY3RcbiAgICAgICAgKSkpIHtcbiAgICAgICAgICAgIGxldCBza2lwID0gZmFsc2VcblxuICAgICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlZEtleSBvZiByZXNvbHZlZEtleXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkS2V5OiBzdHJpbmcgPSBlc2NhcGVSZWd1bGFyRXhwcmVzc2lvbnMocmVzb2x2ZWRLZXkpXG5cbiAgICAgICAgICAgICAgICBpZiAobmV3IFJlZ0V4cChgXiR7ZXNjYXBlZEtleX1bMC05XSokYCkudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAob2JqZWN0IGFzIHVua25vd24gYXMgTWFwcGluZzx1bmtub3duPilba2V5XVxuICAgICAgICAgICAgICAgICAgICBza2lwID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNraXApXG4gICAgICAgICAgICAgICAgY29udGludWVcblxuICAgICAgICAgICAgOyhvYmplY3QgYXMgdW5rbm93biBhcyBNYXBwaW5nPHVua25vd24+KVtrZXldID1cbiAgICAgICAgICAgICAgICByZW1vdmVLZXlQcmVmaXhlcyh2YWx1ZSwgcmVzb2x2ZWRLZXlzKVxuICAgICAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0XG59XG4vKipcbiAqIFJlcHJlc2VudHMgZ2l2ZW4gb2JqZWN0IGFzIGZvcm1hdHRlZCBzdHJpbmcuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIHJlcHJlc2VudC5cbiAqIEBwYXJhbSBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyAtIE1heGltdW0gbnVtYmVyIG9mIGFycmF5IGl0ZW0gdG8gcmVuZGVyLlxuICogQHBhcmFtIGluZGVudGlvbiAtIFN0cmluZyAodXN1YWxseSB3aGl0ZXNwYWNlcykgdG8gdXNlIGFzIGluZGVudGlvbi5cbiAqIEBwYXJhbSBpbml0aWFsSW5kZW50aW9uIC0gU3RyaW5nICh1c3VhbGx5IHdoaXRlc3BhY2VzKSB0byB1c2UgYXNcbiAqIGFkZGl0aW9uYWwgaW5kZW50aW9uIGZvciB0aGUgZmlyc3Qgb2JqZWN0IHRyYXZlcnNpbmcgbGV2ZWwuXG4gKiBAcGFyYW0gbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIgLSBSZXBsYWNlbWVudCBmb3Igb2JqZWN0c1xuICogd2hpY2ggYXJlIG91dCBvZiBzcGVjaWZpZWQgYm91bmRzIHRvIHRyYXZlcnNlLlxuICogQHBhcmFtIG51bWJlck9mTGV2ZWxzIC0gU3BlY2lmaWVzIG51bWJlciBvZiBsZXZlbHMgdG8gdHJhdmVyc2UgZ2l2ZW5cbiAqIGRhdGEgc3RydWN0dXJlLlxuICogQHJldHVybnMgUmVwcmVzZW50YXRpb24gc3RyaW5nLlxuICovXG5leHBvcnQgY29uc3QgcmVwcmVzZW50ID0gKFxuICAgIG9iamVjdDogdW5rbm93bixcbiAgICBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyA9IDMwLFxuICAgIGluZGVudGlvbiA9ICcgICAgJyxcbiAgICBpbml0aWFsSW5kZW50aW9uID0gJycsXG4gICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXI6IG51bWJlciB8IHN0cmluZyA9XG4gICAgJ19fbWF4aW11bV9udW1iZXJfb2ZfbGV2ZWxzX3JlYWNoZWRfXycsXG4gICAgbnVtYmVyT2ZMZXZlbHMgPSA4XG4pOiBzdHJpbmcgPT4ge1xuICAgIGlmIChudW1iZXJPZkxldmVscyA9PT0gMClcbiAgICAgICAgcmV0dXJuIFN0cmluZyhtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcilcblxuICAgIGlmIChvYmplY3QgPT09IG51bGwpXG4gICAgICAgIHJldHVybiAnbnVsbCdcblxuICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnXG5cbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBgXCIke29iamVjdC5yZXBsYWNlKC9cXG4vZywgYFxcbiR7aW5pdGlhbEluZGVudGlvbn1gKX1cImBcblxuICAgIGlmIChpc051bWVyaWMob2JqZWN0KSB8fCB0eXBlb2Ygb2JqZWN0ID09PSAnYm9vbGVhbicpXG4gICAgICAgIHJldHVybiBTdHJpbmcob2JqZWN0KVxuXG4gICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpXG4gICAgICAgIHJldHVybiBvYmplY3QudG9JU09TdHJpbmcoKVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJ1snXG5cbiAgICAgICAgbGV0IGZpcnN0U2VlbiA9IGZhbHNlXG4gICAgICAgIGxldCBjb3VudGVyID0gMVxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoY291bnRlciA+IG1heGltdW1MZW5ndGhPZkxpc3RzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGBcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9ICcsJ1xuXG4gICAgICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgICAgICBgXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAgK1xuICAgICAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudGlvbixcbiAgICAgICAgICAgICAgICAgICAgYCR7aW5pdGlhbEluZGVudGlvbn0ke2luZGVudGlvbn1gLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZMZXZlbHMgLSAxXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgICAgIGNvdW50ZXIgKz0gMVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgICAgIHJlc3VsdCArPSBgXFxuJHtpbml0aWFsSW5kZW50aW9ufWBcblxuICAgICAgICByZXN1bHQgKz0gJ10nXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIGlmIChpc01hcChvYmplY3QpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSAnJ1xuXG4gICAgICAgIGxldCBmaXJzdFNlZW4gPSBmYWxzZVxuICAgICAgICBsZXQgY291bnRlciA9IDFcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChjb3VudGVyID4gbWF4aW11bUxlbmd0aE9mTGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gYCxcXG4ke2luaXRpYWxJbmRlbnRpb259Li4uYFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaXJzdFNlZW4pXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGAsXFxuJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWBcblxuICAgICAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICAgICAgcmVwcmVzZW50KFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1MZW5ndGhPZkxpc3RzLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRpb24sXG4gICAgICAgICAgICAgICAgICAgIGAke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259YCxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bU51bWJlck9mTGV2ZWxzUmVhY2hlZElkZW50aWZpZXIsXG4gICAgICAgICAgICAgICAgICAgIG51bWJlck9mTGV2ZWxzIC0gMVxuICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICcgLT4gJyArXG4gICAgICAgICAgICAgICAgcmVwcmVzZW50KFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50aW9uLFxuICAgICAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxldmVscyAtIDFcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGZpcnN0U2VlbiA9IHRydWVcblxuICAgICAgICAgICAgY291bnRlciArPSAxXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpcnN0U2VlbilcbiAgICAgICAgICAgIHJlc3VsdCA9ICdFbXB0eU1hcCdcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9ICd7J1xuXG4gICAgICAgIGxldCBmaXJzdFNlZW4gPSBmYWxzZVxuICAgICAgICBsZXQgY291bnRlciA9IDFcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGNvdW50ZXIgPiBtYXhpbXVtTGVuZ3RoT2ZMaXN0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgLFxcbiR7aW5pdGlhbEluZGVudGlvbn0uLi5gXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJywnXG5cbiAgICAgICAgICAgIHJlc3VsdCArPVxuICAgICAgICAgICAgICAgIGBcXG4ke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259YCArXG4gICAgICAgICAgICAgICAgcmVwcmVzZW50KFxuICAgICAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtTGVuZ3RoT2ZMaXN0cyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50aW9uLFxuICAgICAgICAgICAgICAgICAgICBgJHtpbml0aWFsSW5kZW50aW9ufSR7aW5kZW50aW9ufWAsXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW1OdW1iZXJPZkxldmVsc1JlYWNoZWRJZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkxldmVscyAtIDFcbiAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGZpcnN0U2VlbiA9IHRydWVcblxuICAgICAgICAgICAgY291bnRlciArPSAxXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlyc3RTZWVuKVxuICAgICAgICAgICAgcmVzdWx0ICs9IGBcXG4ke2luaXRpYWxJbmRlbnRpb259fWBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzdWx0ID0gJ0VtcHR5U2V0J1xuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmplY3QpKVxuICAgICAgICByZXR1cm4gJ19fZnVuY3Rpb25fXydcblxuICAgIGxldCByZXN1bHQgPSAneydcbiAgICBjb25zdCBrZXlzOiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KS5zb3J0KClcbiAgICBsZXQgZmlyc3RTZWVuID0gZmFsc2VcbiAgICBsZXQgY291bnRlciA9IDFcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIGlmIChjb3VudGVyID4gbWF4aW11bUxlbmd0aE9mTGlzdHMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBgLFxcbiR7aW5pdGlhbEluZGVudGlvbn0uLi5gXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgICAgIHJlc3VsdCArPSAnLCdcblxuICAgICAgICByZXN1bHQgKz1cbiAgICAgICAgICAgIGBcXG4ke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259JHtrZXl9OiBgICtcbiAgICAgICAgICAgIHJlcHJlc2VudChcbiAgICAgICAgICAgICAgICAob2JqZWN0IGFzIE1hcHBpbmc8dW5rbm93bj4pW2tleV0sXG4gICAgICAgICAgICAgICAgbWF4aW11bUxlbmd0aE9mTGlzdHMsXG4gICAgICAgICAgICAgICAgaW5kZW50aW9uLFxuICAgICAgICAgICAgICAgIGAke2luaXRpYWxJbmRlbnRpb259JHtpbmRlbnRpb259YCxcbiAgICAgICAgICAgICAgICBtYXhpbXVtTnVtYmVyT2ZMZXZlbHNSZWFjaGVkSWRlbnRpZmllcixcbiAgICAgICAgICAgICAgICBudW1iZXJPZkxldmVscyAtIDFcbiAgICAgICAgICAgIClcblxuICAgICAgICBmaXJzdFNlZW4gPSB0cnVlXG5cbiAgICAgICAgY291bnRlciArPSAxXG4gICAgfVxuXG4gICAgaWYgKGZpcnN0U2VlbilcbiAgICAgICAgcmVzdWx0ICs9IGBcXG4ke2luaXRpYWxJbmRlbnRpb259YFxuXG4gICAgcmVzdWx0ICs9ICd9J1xuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuLyoqXG4gKiBTb3J0IGdpdmVuIG9iamVjdHMga2V5cy5cbiAqIEBwYXJhbSBvYmplY3QgLSBPYmplY3Qgd2hpY2gga2V5cyBzaG91bGQgYmUgc29ydGVkLlxuICogQHJldHVybnMgU29ydGVkIGxpc3Qgb2YgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGNvbnN0IHNvcnQgPSAob2JqZWN0OiB1bmtub3duKTogQXJyYXk8dW5rbm93bj4gPT4ge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHVua25vd24+ID0gW11cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmplY3QubGVuZ3RoOyBpbmRleCsrKVxuICAgICAgICAgICAga2V5cy5wdXNoKGluZGV4KVxuICAgIGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnKVxuICAgICAgICBpZiAoaXNNYXAob2JqZWN0KSlcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5VmFsdWVQYWlyIG9mIG9iamVjdClcbiAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5VmFsdWVQYWlyWzBdKVxuICAgICAgICBlbHNlIGlmIChvYmplY3QgIT09IG51bGwpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmplY3QpKVxuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpXG5cbiAgICByZXR1cm4ga2V5cy5zb3J0KClcbn1cbi8qKlxuICogUmVtb3ZlcyBhIHByb3h5IGZyb20gZ2l2ZW4gZGF0YSBzdHJ1Y3R1cmUgcmVjdXJzaXZlbHkuXG4gKiBAcGFyYW0gb2JqZWN0IC0gT2JqZWN0IHRvIHByb3h5LlxuICogQHBhcmFtIHNlZW5PYmplY3RzIC0gVHJhY2tzIGFsbCBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzIHRvIGF2b2lkXG4gKiBlbmRsZXNzIGxvb3BzICh1c3VhbGx5IG9ubHkgbmVlZGVkIGZvciBpbnRlcm5hbCBwdXJwb3NlKS5cbiAqIEByZXR1cm5zIFJldHVybnMgZ2l2ZW4gb2JqZWN0IHVud3JhcHBlZCBmcm9tIGEgZHluYW1pYyBwcm94eS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVud3JhcFByb3h5ID0gPFQgPSB1bmtub3duPihcbiAgICBvYmplY3Q6IFByb3h5VHlwZTxUPiB8IFQsIHNlZW5PYmplY3RzOiBTZXQ8dW5rbm93bj4gPSBuZXcgU2V0PHVua25vd24+KClcbik6IFQgPT4ge1xuICAgIGlmIChpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIGlmIChzZWVuT2JqZWN0cy5oYXMob2JqZWN0KSlcbiAgICAgICAgICAgIHJldHVybiBvYmplY3RcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JqZWN0Ll9fcmV2b2tlX18pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJveHkob2JqZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0Ll9fdGFyZ2V0X19cblxuICAgICAgICAgICAgICAgIDsob2JqZWN0IGFzIHVua25vd24gYXMge19fcmV2b2tlX186ICgpID0+IHZvaWR9KS5fX3Jldm9rZV9fKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBzZWVuT2JqZWN0cy5hZGQob2JqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMFxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBvYmplY3RbaW5kZXhdID0gdW53cmFwUHJveHkodmFsdWUsIHNlZW5PYmplY3RzKVxuXG4gICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzTWFwKG9iamVjdCkpXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvYmplY3QpXG4gICAgICAgICAgICAgICAgb2JqZWN0LnNldChrZXksIHVud3JhcFByb3h5KHZhbHVlLCBzZWVuT2JqZWN0cykpXG4gICAgICAgIGVsc2UgaWYgKGlzU2V0KG9iamVjdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlOiBBcnJheTx1bmtub3duPiA9IFtdXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2Ygb2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICBjYWNoZS5wdXNoKHVud3JhcFByb3h5KHZhbHVlLCBzZWVuT2JqZWN0cykpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGUpXG4gICAgICAgICAgICAgICAgb2JqZWN0LmFkZCh2YWx1ZSlcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgICBvYmplY3QgYXMgdW5rbm93biBhcyBvYmplY3RcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgb2JqZWN0W2tleSBhcyBrZXlvZiBUXSA9XG4gICAgICAgICAgICAgICAgICAgIHVud3JhcFByb3h5KHZhbHVlLCBzZWVuT2JqZWN0cykgYXMgVmFsdWVPZjxUPlxuICAgIH1cblxuICAgIHJldHVybiBvYmplY3Rcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBYkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQ0EsU0FDSSxxQkFBcUIsRUFBRSxnQ0FBZ0MsRUFBRSxpQkFBaUI7QUFFOUUsU0FDSSxVQUFVLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTO0FBRXpFLFNBQVEsWUFBWTtBQUNwQixTQUFRLHdCQUF3QixFQUFFLFFBQVE7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sTUFBTSx5QkFBeUIsR0FBRyxDQUNyQyxNQUFTLEVBQ1QsYUFBb0MsR0FBRyxJQUFJLEVBQzNDLGFBQW9DLEdBQUcsSUFBSSxFQUMzQyxXQUFvQixHQUFHLENBQUMsQ0FBQyxFQUN6QixJQUFJLEdBQUcsSUFBSSxFQUNYLGFBQTZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FDckI7RUFDbkIsSUFBSSxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUNsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7SUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQztJQUNiLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFO01BQ3hC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
|