schema-shield 0.0.5 → 0.0.6

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/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { DefineErrorFunction, ValidationError } from "./utils";
2
+ export { ValidationError } from "./utils";
3
+ export { deepClone } from "./utils";
2
4
  export type Result = void | ValidationError;
3
5
  export interface KeywordFunction {
4
6
  (schema: CompiledSchema, data: any, defineError: DefineErrorFunction, instance: SchemaShield): Result;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EAKhB,MAAM,SAAS,CAAC;AAMjB,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,eAAe,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,CACE,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,YAAY,GACrB,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAS;gBAEd,EACV,SAAiB,EAClB,GAAE;QACD,SAAS,CAAC,EAAE,OAAO,CAAC;KAChB;IAoBN,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,UAAQ;IAOhE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK;IAI3C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,UAAQ;IAOpE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,KAAK;IAIjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,UAAQ;IAOtE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,KAAK;IAIpD,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS;IA6B/B,OAAO,CAAC,aAAa;IA0IrB,YAAY,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO;CActC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EAKhB,MAAM,SAAS,CAAC;AAMjB,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,eAAe,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,CACE,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,YAAY,GACrB,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAS;gBAEd,EACV,SAAiB,EAClB,GAAE;QACD,SAAS,CAAC,EAAE,OAAO,CAAC;KAChB;IAoBN,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,UAAQ;IAOhE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK;IAI3C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,UAAQ;IAOpE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,KAAK;IAIjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,UAAQ;IAOtE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,KAAK;IAIpD,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS;IA6B/B,OAAO,CAAC,aAAa;IA0IrB,YAAY,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO;CActC"}
package/dist/index.js CHANGED
@@ -19,7 +19,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // lib/index.ts
20
20
  var lib_exports = {};
21
21
  __export(lib_exports, {
22
- SchemaShield: () => SchemaShield
22
+ SchemaShield: () => SchemaShield,
23
+ ValidationError: () => ValidationError,
24
+ deepClone: () => deepClone
23
25
  });
24
26
  module.exports = __toCommonJS(lib_exports);
25
27
 
package/dist/index.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",i="#"){let r=`${t}/${this.keyword}`,a=`${i}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(r+=`/${this.item}`),a+=`/${this.item}`),this.instancePath=a,this.schemaPath=r,this.cause&&this.cause instanceof e?this.cause._getCause(r,a):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}};function t(t,i){const r=new e(`Invalid ${t}`);r.keyword=t,r.schema=i;return s(`defineError_${t}`,(e,t={})=>(r.message=e,r.item=t.item,r.cause=t.cause,r.data=t.data,r))}function i(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const a of r)if(!i(e[a],t[a]))return!1;return!0}return e===t}function r(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function a(e){if(Array.isArray(e)){const t=[];for(let i=0;i<e.length;i++)t[i]=a(e[i]);return t}if(e&&e.constructor&&"Object"!==e.constructor.name)return e;if(r(e)){const t={...e};for(const i in e)t[i]=a(e[i]);return t}return e}function n(e){return r(e)&&"$validate"in e}function s(e,t){return Object.defineProperty(t,"name",{value:e})}var o={"date-time"(e){const t=e.match(/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i);if(!t)return!1;let i=Number(t[3]);if("02"===t[2]&&i>29)return!1;const[,r,a,,n,s,o,l,u,f]=t;let d=Number(r),m=Number(a),c=Number(n),p=Number(s),y=Number(o);if("-"===l||"+"===l){const e=Number(u),t=Number(f);if("-"===l?(c+=e,p+=t):"+"===l&&(c-=e,p-=t),p>59?(c+=1,p-=60):p<0&&(c-=1,p+=60),c>23?(i+=1,c-=24):c<0&&(i-=1,c+=24),i>31?(m+=1,i-=31):i<1&&(m-=1,i+=31),m>12?(d+=1,m-=12):m<1&&(d-=1,m+=12),d<0)return!1}return!(i>(2===m?d%4!=0||d%100==0&&d%400!=0?28:29:[31,,31,30,31,30,31,31,30,31,30,31][m-1]))&&(60!==y||59===p&&23===c)},uri:e=>/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/.test(e),email:e=>/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i.test(e),ipv4:e=>/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(t))return!1}const r=-1!==e.indexOf("::"),a=t?i.join(":"):e;if(r)return!(a.split("::").length-1>1)&&(!!/^[0-9a-fA-F:.]*$/.test(a)&&/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/.test(a));const n=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/.test(a),s=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/.test(a);return t?n||!s:n&&!s},hostname:e=>/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i.test(e),date:e=>!1!==/^(\d{4})-(\d{2})-(\d{2})$/.test(e)&&!isNaN(new Date(e).getTime()),regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||/^\/(?:[^~]|~0|~1)*$/.test(e),"relative-json-pointer":e=>""===e||/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/.test(e),time:e=>/^(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/.test(e),"uri-reference":e=>!/\\/.test(e)&&/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i.test(e),"uri-template":e=>/^(?:(?:https?:\/\/[\w.-]+)?\/?)?[\w- ;,.\/?%&=]*(?:\{[\w-]+(?::\d+)?\}[\w- ;,.\/?%&=]*)*\/?$/.test(e),duration:!1,uuid:!1,"idn-email":!1,"idn-hostname":!1,iri:!1,"iri-reference":!1},l={object:e=>r(e),array:e=>!!Array.isArray(e)||"object"==typeof e&&null!==e&&"length"in e&&"0"in e&&Object.keys(e).length-1===e.length,string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},u={...{required(e,t,i){if(r(t))for(let r=0;r<e.required.length;r++){const a=e.required[r];if(!t.hasOwnProperty(a))return i("Required property is missing",{item:a,data:t[a]})}},properties(e,t,i){if(r(t))for(const a of Object.keys(e.properties))if(t.hasOwnProperty(a)){if("boolean"!=typeof e.properties[a]){if("$validate"in e.properties[a]){const r=e.properties[a].$validate(t[a]);if(r)return i("Property is invalid",{item:a,cause:r,data:t[a]})}}else if(!1===e.properties[a])return i("Property is not allowed",{item:a,data:t[a]})}else{const i=e.properties[a];r(i)&&"default"in i&&(t[a]=i.default)}},values(e,t,i){if(!r(t)||!n(e.values))return;const a=Object.keys(t);for(const r of a){const a=e.values.$validate(t[r]);if(a)return i("Property is invalid",{item:r,cause:a,data:t[r]})}},maxProperties(e,t,i){if(r(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(r(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!r(t))return;const a=Object.keys(t),s=n(e.additionalProperties);for(const r of a)if(!e.properties||!e.properties.hasOwnProperty(r)){if(e.patternProperties){let t=!1;for(const i in e.patternProperties)if(new RegExp(i,"u").test(r)){t=!0;break}if(t)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:r,data:t[r]});if(s){const a=e.additionalProperties.$validate(t[r]);if(a)return i("Additional properties are invalid",{item:r,cause:a,data:t[r]})}}},patternProperties(e,t,i){if(!r(t))return;const a=Object.keys(e.patternProperties);for(const r of a){const a=new RegExp(r,"u");if("boolean"==typeof e.patternProperties[r]){if(!1===e.patternProperties[r])for(const e in t)if(a.test(e))return i("Property is not allowed",{item:e,data:t[e]});continue}const n=Object.keys(t);for(const s of n)if(a.test(s)&&"$validate"in e.patternProperties[r]){const a=e.patternProperties[r].$validate(t[s]);if(a)return i("Property is invalid",{item:s,cause:a,data:t[s]})}}},propertyNames(e,t,i){if(r(t)){if("boolean"==typeof e.propertyNames&&!1===e.propertyNames&&Object.keys(t).length>0)return i("Properties are not allowed",{data:t});if(n(e.propertyNames))for(let r in t){const a=e.propertyNames.$validate(r);if(a)return i("Property name is invalid",{item:r,cause:a,data:t[r]})}}},dependencies(e,t,i){if(r(t))for(const r in e.dependencies){if(r in t==!1)continue;const a=e.dependencies[r];if(Array.isArray(a)){for(let e=0;e<a.length;e++)if(!(a[e]in t))return i("Dependency is not satisfied",{item:e,data:a[e]});continue}if("boolean"==typeof a){if(a)continue;return i("Dependency is not satisfied",{data:a})}if("string"==typeof a){if(a in t)continue;return i("Dependency is not satisfied",{data:a})}const n=a.$validate(t);if(n)return i("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,$ref:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,a=t.length;if("boolean"==typeof r)return!1===r&&a>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,s=Math.min(e,a);for(let e=0;e<s;e++){const a=r[e];if("boolean"!=typeof a){if(n(a)){const r=a.$validate(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}else if(!1===a&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]})}}else if(n(r))for(let e=0;e<a;e++){const a=r.$validate(t[e]);if(a)return i("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,i){if(Array.isArray(t)&&n(e.elements))for(let r=0;r<t.length;r++){const a=e.elements.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!r(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(r(e.additionalItems)){if(n(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const a=e.additionalItems.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const a=new Set;for(const e of t){let t;if(t="string"==typeof e?`s:${e}`:r(e)?`o:${JSON.stringify(Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t))))}`:Array.isArray(e)?JSON.stringify(e):String(e),a.has(t))return i("Array items are not unique",{data:e});a.add(t)}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;const r=new RegExp(e.pattern,"u");return r instanceof RegExp==!1?i("Invalid regular expression",{data:t}):r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;const a=r.getFormat(e.format);return a&&!a(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let a=e.minimum;return"number"==typeof e.exclusiveMinimum?a=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(a+=1e-15),t<a?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let a=e.maximum;return"number"==typeof e.exclusiveMaximum?a=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(a-=1e-15),t>a?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const a=t/e.multipleOf;return isFinite(a)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(a,Math.round(a))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,r){const a=Array.isArray(t),n="object"==typeof t&&null!==t;for(let r=0;r<e.enum.length;r++){const s=e.enum[r];if(s===t)return;if((a&&Array.isArray(s)||n&&"object"==typeof s&&null!==s)&&i(s,t))return}return r("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let a=0;a<e.allOf.length;a++)if(r(e.allOf[a])){if("$validate"in e.allOf[a]){const r=e.allOf[a].$validate(t);if(r)return i("Value is not valid",{cause:r,data:t})}}else if("boolean"!=typeof e.allOf[a]){if(t!==e.allOf[a])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[a])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(r(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){let a=0;for(let i=0;i<e.oneOf.length;i++)if(r(e.oneOf[i])){if("$validate"in e.oneOf[i]){e.oneOf[i].$validate(t)||a++;continue}a++}else"boolean"!=typeof e.oneOf[i]?t===e.oneOf[i]&&a++:Boolean(t)===e.oneOf[i]&&a++;if(1!==a)return i("Value is not valid",{data:t})},const(e,t,a){if(!(t===e.const||r(t)&&r(e.const)&&i(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&i(t,e.const)))return a("Value is not valid",{data:t})},if(e,t,i){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(n(e.then))return e.then.$validate(t)}else if(n(e.else))return e.else.$validate(t);return}if(!n(e.if))return;return e.if.$validate(t)?n(e.else)?e.else.$validate(t):void 0:n(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(r(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})}}},f={SchemaShield:class{types={};formats={};keywords={};immutable=!1;constructor({immutable:e=!1}={}){this.immutable=e;for(const[e,t]of Object.entries(l))t&&this.addType(e,t);for(const[e,t]of Object.entries(u))this.addKeyword(e,t);for(const[e,t]of Object.entries(o))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}compile(t){const i=this.compileSchema(t);if(!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=s("any",()=>{})}const r=e=>{const t=this.immutable?a(e):e,r=i.$validate(t);return{data:t,error:r||null,valid:!r}};return r.compiledSchema=i,r}compileSchema(e){r(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const i=a(e),n=t("type",e),o=[];let l="";if("type"in e){const t=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim());for(const e of t){const t=this.getType(e);t&&(o.push(t),l+=(l?"_OR_":"")+t.name)}const r=o.length;if(0===r)throw n("Invalid type for schema",{data:e.type});if(1===r){const e=o[0];i.$validate=s(l,t=>{if(!e(t))return n("Invalid type",{data:t})})}else r>1&&(i.$validate=s(l,e=>{for(let t=0;t<r;t++)if(o[t](e))return;return n("Invalid type",{data:e})}))}for(const a of Object.keys(e)){if("type"===a){i.type=e.type;continue}const n=this.getKeyword(a);if(n){const r=t(a,e[a]);if(i.$validate){const e=i.$validate;l+=`_AND_${n.name}`,i.$validate=s(l,t=>{const a=e(t);return a||n(i,t,r,this)})}else l=n.name,i.$validate=s(l,e=>n(i,e,r,this))}if(r(e[a])){if("properties"===a){for(const t of Object.keys(e[a]))i[a][t]=this.compileSchema(e[a][t]);continue}i[a]=this.compileSchema(e[a])}else Array.isArray(e[a])?i[a]=e[a].map((e,t)=>this.isSchemaLike(e)?this.compileSchema(e):e):i[a]=e[a]}return i}isSchemaLike(e){if(r(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}}};"undefined"!=typeof module?module.exports=f:self.SchemaShield=f})();//# sourceMappingURL=index.min.js.map
1
+ (()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",i="#"){let r=`${t}/${this.keyword}`,a=`${i}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(r+=`/${this.item}`),a+=`/${this.item}`),this.instancePath=a,this.schemaPath=r,this.cause&&this.cause instanceof e?this.cause._getCause(r,a):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}};function t(t,i){const r=new e(`Invalid ${t}`);r.keyword=t,r.schema=i;return s(`defineError_${t}`,(e,t={})=>(r.message=e,r.item=t.item,r.cause=t.cause,r.data=t.data,r))}function i(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const a of r)if(!i(e[a],t[a]))return!1;return!0}return e===t}function r(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function a(e){if(Array.isArray(e)){const t=[];for(let i=0;i<e.length;i++)t[i]=a(e[i]);return t}if(e&&e.constructor&&"Object"!==e.constructor.name)return e;if(r(e)){const t={...e};for(const i in e)t[i]=a(e[i]);return t}return e}function n(e){return r(e)&&"$validate"in e}function s(e,t){return Object.defineProperty(t,"name",{value:e})}var o={"date-time"(e){const t=e.match(/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i);if(!t)return!1;let i=Number(t[3]);if("02"===t[2]&&i>29)return!1;const[,r,a,,n,s,o,l,u,f]=t;let d=Number(r),m=Number(a),c=Number(n),p=Number(s),y=Number(o);if("-"===l||"+"===l){const e=Number(u),t=Number(f);if("-"===l?(c+=e,p+=t):"+"===l&&(c-=e,p-=t),p>59?(c+=1,p-=60):p<0&&(c-=1,p+=60),c>23?(i+=1,c-=24):c<0&&(i-=1,c+=24),i>31?(m+=1,i-=31):i<1&&(m-=1,i+=31),m>12?(d+=1,m-=12):m<1&&(d-=1,m+=12),d<0)return!1}return!(i>(2===m?d%4!=0||d%100==0&&d%400!=0?28:29:[31,,31,30,31,30,31,31,30,31,30,31][m-1]))&&(60!==y||59===p&&23===c)},uri:e=>/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/.test(e),email:e=>/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i.test(e),ipv4:e=>/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(t))return!1}const r=-1!==e.indexOf("::"),a=t?i.join(":"):e;if(r)return!(a.split("::").length-1>1)&&(!!/^[0-9a-fA-F:.]*$/.test(a)&&/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/.test(a));const n=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/.test(a),s=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/.test(a);return t?n||!s:n&&!s},hostname:e=>/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i.test(e),date:e=>!1!==/^(\d{4})-(\d{2})-(\d{2})$/.test(e)&&!isNaN(new Date(e).getTime()),regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||/^\/(?:[^~]|~0|~1)*$/.test(e),"relative-json-pointer":e=>""===e||/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/.test(e),time:e=>/^(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/.test(e),"uri-reference":e=>!/\\/.test(e)&&/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i.test(e),"uri-template":e=>/^(?:(?:https?:\/\/[\w.-]+)?\/?)?[\w- ;,.\/?%&=]*(?:\{[\w-]+(?::\d+)?\}[\w- ;,.\/?%&=]*)*\/?$/.test(e),duration:!1,uuid:!1,"idn-email":!1,"idn-hostname":!1,iri:!1,"iri-reference":!1},l={object:e=>r(e),array:e=>!!Array.isArray(e)||"object"==typeof e&&null!==e&&"length"in e&&"0"in e&&Object.keys(e).length-1===e.length,string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},u={...{required(e,t,i){if(r(t))for(let r=0;r<e.required.length;r++){const a=e.required[r];if(!t.hasOwnProperty(a))return i("Required property is missing",{item:a,data:t[a]})}},properties(e,t,i){if(r(t))for(const a of Object.keys(e.properties))if(t.hasOwnProperty(a)){if("boolean"!=typeof e.properties[a]){if("$validate"in e.properties[a]){const r=e.properties[a].$validate(t[a]);if(r)return i("Property is invalid",{item:a,cause:r,data:t[a]})}}else if(!1===e.properties[a])return i("Property is not allowed",{item:a,data:t[a]})}else{const i=e.properties[a];r(i)&&"default"in i&&(t[a]=i.default)}},values(e,t,i){if(!r(t)||!n(e.values))return;const a=Object.keys(t);for(const r of a){const a=e.values.$validate(t[r]);if(a)return i("Property is invalid",{item:r,cause:a,data:t[r]})}},maxProperties(e,t,i){if(r(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(r(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!r(t))return;const a=Object.keys(t),s=n(e.additionalProperties);for(const r of a)if(!e.properties||!e.properties.hasOwnProperty(r)){if(e.patternProperties){let t=!1;for(const i in e.patternProperties)if(new RegExp(i,"u").test(r)){t=!0;break}if(t)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:r,data:t[r]});if(s){const a=e.additionalProperties.$validate(t[r]);if(a)return i("Additional properties are invalid",{item:r,cause:a,data:t[r]})}}},patternProperties(e,t,i){if(!r(t))return;const a=Object.keys(e.patternProperties);for(const r of a){const a=new RegExp(r,"u");if("boolean"==typeof e.patternProperties[r]){if(!1===e.patternProperties[r])for(const e in t)if(a.test(e))return i("Property is not allowed",{item:e,data:t[e]});continue}const n=Object.keys(t);for(const s of n)if(a.test(s)&&"$validate"in e.patternProperties[r]){const a=e.patternProperties[r].$validate(t[s]);if(a)return i("Property is invalid",{item:s,cause:a,data:t[s]})}}},propertyNames(e,t,i){if(r(t)){if("boolean"==typeof e.propertyNames&&!1===e.propertyNames&&Object.keys(t).length>0)return i("Properties are not allowed",{data:t});if(n(e.propertyNames))for(let r in t){const a=e.propertyNames.$validate(r);if(a)return i("Property name is invalid",{item:r,cause:a,data:t[r]})}}},dependencies(e,t,i){if(r(t))for(const r in e.dependencies){if(r in t==!1)continue;const a=e.dependencies[r];if(Array.isArray(a)){for(let e=0;e<a.length;e++)if(!(a[e]in t))return i("Dependency is not satisfied",{item:e,data:a[e]});continue}if("boolean"==typeof a){if(a)continue;return i("Dependency is not satisfied",{data:a})}if("string"==typeof a){if(a in t)continue;return i("Dependency is not satisfied",{data:a})}const n=a.$validate(t);if(n)return i("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,$ref:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,a=t.length;if("boolean"==typeof r)return!1===r&&a>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,s=Math.min(e,a);for(let e=0;e<s;e++){const a=r[e];if("boolean"!=typeof a){if(n(a)){const r=a.$validate(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}else if(!1===a&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]})}}else if(n(r))for(let e=0;e<a;e++){const a=r.$validate(t[e]);if(a)return i("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,i){if(Array.isArray(t)&&n(e.elements))for(let r=0;r<t.length;r++){const a=e.elements.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!r(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(r(e.additionalItems)){if(n(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const a=e.additionalItems.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const a=new Set;for(const e of t){let t;if(t="string"==typeof e?`s:${e}`:r(e)?`o:${JSON.stringify(Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t))))}`:Array.isArray(e)?JSON.stringify(e):String(e),a.has(t))return i("Array items are not unique",{data:e});a.add(t)}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;const r=new RegExp(e.pattern,"u");return r instanceof RegExp==!1?i("Invalid regular expression",{data:t}):r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;const a=r.getFormat(e.format);return a&&!a(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let a=e.minimum;return"number"==typeof e.exclusiveMinimum?a=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(a+=1e-15),t<a?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let a=e.maximum;return"number"==typeof e.exclusiveMaximum?a=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(a-=1e-15),t>a?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const a=t/e.multipleOf;return isFinite(a)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(a,Math.round(a))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,r){const a=Array.isArray(t),n="object"==typeof t&&null!==t;for(let r=0;r<e.enum.length;r++){const s=e.enum[r];if(s===t)return;if((a&&Array.isArray(s)||n&&"object"==typeof s&&null!==s)&&i(s,t))return}return r("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let a=0;a<e.allOf.length;a++)if(r(e.allOf[a])){if("$validate"in e.allOf[a]){const r=e.allOf[a].$validate(t);if(r)return i("Value is not valid",{cause:r,data:t})}}else if("boolean"!=typeof e.allOf[a]){if(t!==e.allOf[a])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[a])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(r(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){let a=0;for(let i=0;i<e.oneOf.length;i++)if(r(e.oneOf[i])){if("$validate"in e.oneOf[i]){e.oneOf[i].$validate(t)||a++;continue}a++}else"boolean"!=typeof e.oneOf[i]?t===e.oneOf[i]&&a++:Boolean(t)===e.oneOf[i]&&a++;if(1!==a)return i("Value is not valid",{data:t})},const(e,t,a){if(!(t===e.const||r(t)&&r(e.const)&&i(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&i(t,e.const)))return a("Value is not valid",{data:t})},if(e,t,i){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(n(e.then))return e.then.$validate(t)}else if(n(e.else))return e.else.$validate(t);return}if(!n(e.if))return;return e.if.$validate(t)?n(e.else)?e.else.$validate(t):void 0:n(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(r(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})}}},f={SchemaShield:class{types={};formats={};keywords={};immutable=!1;constructor({immutable:e=!1}={}){this.immutable=e;for(const[e,t]of Object.entries(l))t&&this.addType(e,t);for(const[e,t]of Object.entries(u))this.addKeyword(e,t);for(const[e,t]of Object.entries(o))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}compile(t){const i=this.compileSchema(t);if(!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=s("any",()=>{})}const r=e=>{const t=this.immutable?a(e):e,r=i.$validate(t);return{data:t,error:r||null,valid:!r}};return r.compiledSchema=i,r}compileSchema(e){r(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const i=a(e),n=t("type",e),o=[];let l="";if("type"in e){const t=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim());for(const e of t){const t=this.getType(e);t&&(o.push(t),l+=(l?"_OR_":"")+t.name)}const r=o.length;if(0===r)throw n("Invalid type for schema",{data:e.type});if(1===r){const e=o[0];i.$validate=s(l,t=>{if(!e(t))return n("Invalid type",{data:t})})}else r>1&&(i.$validate=s(l,e=>{for(let t=0;t<r;t++)if(o[t](e))return;return n("Invalid type",{data:e})}))}for(const a of Object.keys(e)){if("type"===a){i.type=e.type;continue}const n=this.getKeyword(a);if(n){const r=t(a,e[a]);if(i.$validate){const e=i.$validate;l+=`_AND_${n.name}`,i.$validate=s(l,t=>{const a=e(t);return a||n(i,t,r,this)})}else l=n.name,i.$validate=s(l,e=>n(i,e,r,this))}if(r(e[a])){if("properties"===a){for(const t of Object.keys(e[a]))i[a][t]=this.compileSchema(e[a][t]);continue}i[a]=this.compileSchema(e[a])}else Array.isArray(e[a])?i[a]=e[a].map((e,t)=>this.isSchemaLike(e)?this.compileSchema(e):e):i[a]=e[a]}return i}isSchemaLike(e){if(r(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}},ValidationError:e,deepClone:a};"undefined"!=typeof module?module.exports=f:self.SchemaShield=f})();//# sourceMappingURL=index.min.js.map
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSIsImtleSIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiZGVlcEVxdWFsIiwib2JqIiwib3RoZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwia2V5cyIsIk9iamVjdCIsImlzT2JqZWN0IiwiZGVlcENsb25lIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsImZuIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIkZvcm1hdHMiLCJtYXRjaCIsImRheSIsIk51bWJlciIsInllYXJTdHIiLCJtb250aFN0ciIsImhvdXJTdHIiLCJtaW51dGVTdHIiLCJzZWNvbmRTdHIiLCJ0aW1lem9uZVNpZ24iLCJ0aW1lem9uZUhvdXJTdHIiLCJ0aW1lem9uZU1pbnV0ZVN0ciIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ0aW1lem9uZUhvdXIiLCJ0aW1lem9uZU1pbnV0ZSIsInVyaSIsInRlc3QiLCJlbWFpbCIsImlwdjQiLCJpcHY2IiwiaW5kZXhPZiIsImhhc0lwdjQiLCJhZGRyZXNzUGFydHMiLCJzcGxpdCIsImlwdjRQYXJ0IiwicG9wIiwiaXNTaG9ydGVuZWQiLCJpcHY2UGFydCIsImpvaW4iLCJpc0lwdjZWYWxpZCIsImhhc0ludmFsaWRDaGFyIiwiaG9zdG5hbWUiLCJkYXRlIiwiaXNOYU4iLCJEYXRlIiwiZ2V0VGltZSIsInJlZ2V4IiwiUmVnRXhwIiwiZSIsInRpbWUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicGF0dGVybnMiLCJwcm9wZXJ0eU5hbWVzIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiJHJlZiIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIml0ZW1zIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJ1bmlxdWUiLCJTZXQiLCJpdGVtU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJTdHJpbmciLCJoYXMiLCJhZGQiLCJjb250YWlucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwiZW51bUl0ZW0iLCJhbGxPZiIsIkJvb2xlYW4iLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJpc1NjaGVtYUxpa2UiLCJ2YWxpZGF0ZSIsImNsb25lZERhdGEiLCJ2YWxpZCIsImRlZmluZVR5cGVFcnJvciIsInR5cGVWYWxpZGF0aW9ucyIsIm1ldGhvZE5hbWUiLCJtYXAiLCJ0IiwidHJpbSIsInB1c2giLCJ0eXBlVmFsaWRhdGlvbnNMZW5ndGgiLCJ0eXBlVmFsaWRhdGlvbiIsImtleXdvcmRWYWxpZGF0b3IiLCJwcmV2VmFsaWRhdG9yIiwic3ViS2V5IiwiaW5kZXgiXSwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL251bWJlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZFNjaGVtYSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yOyAvLyBDYXVzZSBvZiB0aGUgZXJyb3JcbiAgZGF0YT86IGFueTsgLy8gRGF0YSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvckZ1bmN0aW9uIHtcbiAgKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9ucyk6IFZhbGlkYXRpb25FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICBrZXk6IHN0cmluZyxcbiAgc2NoZW1hOiBDb21waWxlZFNjaGVtYVxuKSB7XG4gIGNvbnN0IEtleXdvcmRFcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgJHtrZXl9YCk7XG4gIEtleXdvcmRFcnJvci5rZXl3b3JkID0ga2V5O1xuICBLZXl3b3JkRXJyb3Iuc2NoZW1hID0gc2NoZW1hO1xuXG4gIGNvbnN0IGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIEtleXdvcmRFcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBLZXl3b3JkRXJyb3IuaXRlbSA9IG9wdGlvbnMuaXRlbTtcbiAgICBLZXl3b3JkRXJyb3IuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgb2JqOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3RoZXI6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBBcnJheS5pc0FycmF5KG90aGVyKSkge1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2ldLCBvdGhlcltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG90aGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvdGhlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2tleV0sIG90aGVyW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IG90aGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUNsb3NlRW5vdWdoKGEsIGIsIGVwc2lsb24gPSAxZS0xNSkge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IGVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVRGMTZMZW5ndGgoc3RyKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGxlbmd0aCsrO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGRlZXBDbG9uZShvYmpbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSXMgY2xhc3MgaW5zdGFuY2Ugb2YgYW55IGtpbmRcbiAgaWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5vYmpcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwQ2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGlsZWRTY2hlbWEoc3ViU2NoZW1hOiBhbnkpOiBzdWJTY2hlbWEgaXMgQ29tcGlsZWRTY2hlbWEge1xuICByZXR1cm4gaXNPYmplY3Qoc3ViU2NoZW1hKSAmJiBcIiR2YWxpZGF0ZVwiIGluIHN1YlNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVkRnVuY3Rpb248VD4obmFtZTogc3RyaW5nLCBmbjogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KTtcbn1cbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIGNvbnN0IG1hdGNoID0gZGF0YS5tYXRjaChcbiAgICAgIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2lcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBkYXkgPSBOdW1iZXIobWF0Y2hbM10pO1xuXG4gICAgaWYgKG1hdGNoWzJdID09PSBcIjAyXCIgJiYgZGF5ID4gMjkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbXG4gICAgICAsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICAsXG4gICAgICBob3VyU3RyLFxuICAgICAgbWludXRlU3RyLFxuICAgICAgc2Vjb25kU3RyLFxuICAgICAgdGltZXpvbmVTaWduLFxuICAgICAgdGltZXpvbmVIb3VyU3RyLFxuICAgICAgdGltZXpvbmVNaW51dGVTdHJcbiAgICBdID0gbWF0Y2g7XG5cbiAgICBsZXQgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBsZXQgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgIGxldCBob3VyID0gTnVtYmVyKGhvdXJTdHIpO1xuICAgIGxldCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBsZXQgc2Vjb25kID0gTnVtYmVyKHNlY29uZFN0cik7XG5cbiAgICBpZiAodGltZXpvbmVTaWduID09PSBcIi1cIiB8fCB0aW1lem9uZVNpZ24gPT09IFwiK1wiKSB7XG4gICAgICBjb25zdCB0aW1lem9uZUhvdXIgPSBOdW1iZXIodGltZXpvbmVIb3VyU3RyKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lTWludXRlID0gTnVtYmVyKHRpbWV6b25lTWludXRlU3RyKTtcblxuICAgICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIpIHtcbiAgICAgICAgaG91ciArPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSArPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAodGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgICBob3VyIC09IHRpbWV6b25lSG91cjtcbiAgICAgICAgbWludXRlIC09IHRpbWV6b25lTWludXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWludXRlID4gNTkpIHtcbiAgICAgICAgaG91ciArPSAxO1xuICAgICAgICBtaW51dGUgLT0gNjA7XG4gICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDApIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3VyID4gMjMpIHtcbiAgICAgICAgZGF5ICs9IDE7XG4gICAgICAgIGhvdXIgLT0gMjQ7XG4gICAgICB9IGVsc2UgaWYgKGhvdXIgPCAwKSB7XG4gICAgICAgIGRheSAtPSAxO1xuICAgICAgICBob3VyICs9IDI0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgbW9udGggKz0gMTtcbiAgICAgICAgZGF5IC09IDMxO1xuICAgICAgfSBlbHNlIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDE7XG4gICAgICAgIGRheSArPSAzMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAxKSB7XG4gICAgICAgIHllYXIgLT0gMTtcbiAgICAgICAgbW9udGggKz0gMTI7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ZWFyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBbMzEsICwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuICAgIGNvbnN0IG1heERheXMgPVxuICAgICAgbW9udGggPT09IDJcbiAgICAgICAgPyB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKVxuICAgICAgICAgID8gMjlcbiAgICAgICAgICA6IDI4XG4gICAgICAgIDogZGF5c0luTW9udGhbbW9udGggLSAxXTtcblxuICAgIGlmIChkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzXG4gICAgaWYgKHNlY29uZCA9PT0gNjAgJiYgKG1pbnV0ZSAhPT0gNTkgfHwgaG91ciAhPT0gMjMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC8udGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGlwdjQoZGF0YSkge1xuICAgIC8vIE1hdGNoZXMgYSBzdHJpbmcgZm9ybWVkIGJ5IDQgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDI1NSBzZXBhcmF0ZWQgYnkgZG90cyB3aXRob3V0IGxlYWRpbmcgemVyb3NcbiAgICAvLyAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC9cbiAgICByZXR1cm4gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcblxuICAvLyBpcHY2OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDYgfSksXG4gIGlwdjYoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIjo6XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEuaW5kZXhPZihcIjpcIikgPT09IC0xIHx8XG4gICAgICAvKD86XFxzK3w6OjorfF5cXHd7NSx9fFxcd3s1fSR8Xjp7MX1cXHd8XFx3OnsxfSQpLy50ZXN0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoXG4gICAgICAgICEvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC8udGVzdChcbiAgICAgICAgICBpcHY0UGFydFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvXlswLTlhLWZBLUY6Ll0qJC8udGVzdChpcHY2UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gL14oPzooPzooPzpbMC05YS1mQS1GXXsxLDR9KD86OnwkKSl7MSw2fSkpfCg/Ojo6KD86WzAtOWEtZkEtRl17MSw0fSkpezAsNX0kLy50ZXN0KFxuICAgICAgICBpcHY2UGFydFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0lwdjZWYWxpZCA9XG4gICAgICAvXig/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fSg/OlswLTlhLWZBLUZdezEsNH18OikpJC8udGVzdChpcHY2UGFydCk7XG5cbiAgICBjb25zdCBoYXNJbnZhbGlkQ2hhciA9IC8oPzpbMC05YS1mQS1GXXs1LH18XFxEWzAtOWEtZkEtRl17M306KS8udGVzdChcbiAgICAgIGlwdjZQYXJ0XG4gICAgKTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICByZXR1cm4gaXNJcHY2VmFsaWQgfHwgIWhhc0ludmFsaWRDaGFyO1xuICAgIH1cblxuICAgIHJldHVybiBpc0lwdjZWYWxpZCAmJiAhaGFzSW52YWxpZENoYXI7XG4gIH0sXG5cbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy50ZXN0KGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoZGF0YSkuZ2V0VGltZSgpKTtcbiAgfSxcbiAgcmVnZXgoZGF0YSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgUmVnRXhwKGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgXCJqc29uLXBvaW50ZXJcIihkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIC9eKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoXFwuXFxkKyk/KFp8KFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkpJC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKC9cXFxcLy50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIFwidXJpLXRlbXBsYXRlXCIoZGF0YSkge1xuICAgIHJldHVybiAvXig/Oig/Omh0dHBzPzpcXC9cXC9bXFx3Li1dKyk/XFwvPyk/W1xcdy0gOywuXFwvPyUmPV0qKD86XFx7W1xcdy1dKyg/OjpcXGQrKT9cXH1bXFx3LSA7LC5cXC8/JSY9XSopKlxcLz8kLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgZHVyYXRpb246IGZhbHNlLFxuICB1dWlkOiBmYWxzZSxcbiAgXCJpZG4tZW1haWxcIjogZmFsc2UsXG4gIFwiaWRuLWhvc3RuYW1lXCI6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICBcImlyaS1yZWZlcmVuY2VcIjogZmFsc2Vcbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICBcImxlbmd0aFwiIGluIGRhdGEgJiZcbiAgICAgIFwiMFwiIGluIGRhdGEgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCAtIDEgPT09IGRhdGEubGVuZ3RoXG4gICAgKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxuXG5cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBOdW1iZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL251bWJlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT2JqZWN0S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHNcIjtcbmltcG9ydCB7IE90aGVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgU3RyaW5nS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHNcIjtcblxuZXhwb3J0IGNvbnN0IGtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC4uLk9iamVjdEtleXdvcmRzLFxuICAuLi5BcnJheUtleXdvcmRzLFxuICAuLi5TdHJpbmdLZXl3b3JkcyxcbiAgLi4uTnVtYmVyS2V5d29yZHMsXG4gIC4uLk90aGVyS2V5d29yZHNcbn07XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE9iamVjdEtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC8vIE9iamVjdFxuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVByb3ApICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBzY2hlbWFQcm9wLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydGllc1trZXldLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHZhbHVlcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEudmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS52YWx1ZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGlzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIikudGVzdChrZXkpKSB7XG4gICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwYXR0ZXJuUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXS4kdmFsaWRhdGUoXG4gICAgICAgICAgICAgIGRhdGFba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydHlOYW1lcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnRpZXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnByb3BlcnR5TmFtZXMpKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzLiR2YWxpZGF0ZShrZXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZGVwZW5kZW5jaWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGtleSBpbiBkYXRhID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHNjaGVtYS5kZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwZW5kZW5jeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghKGRlcGVuZGVuY3lbaV0gaW4gZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRlcGVuZGVuY3lbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IGRlcGVuZGVuY3kuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8vIFJlcXVpcmVkIGJ5IG90aGVyIGtleXdvcmRzIGJ1dCBub3QgdXNlZCBhcyBhIGZ1bmN0aW9uIGl0c2VsZlxuICB0aGVuOiBmYWxzZSxcbiAgZWxzZTogZmFsc2UsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgJHJlZjogZmFsc2UsXG4gIGRlZmluaXRpb25zOiBmYWxzZSxcbiAgJGlkOiBmYWxzZSxcbiAgJHNjaGVtYTogZmFsc2UsXG5cbiAgLy8gTWV0YWRhdGEga2V5d29yZHMgKG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24pXG4gIHRpdGxlOiBmYWxzZSxcbiAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAkY29tbWVudDogZmFsc2UsXG4gIGV4YW1wbGVzOiBmYWxzZSxcbiAgY29udGVudE1lZGlhVHlwZTogZmFsc2UsXG4gIGNvbnRlbnRFbmNvZGluZzogZmFsc2UsXG5cbiAgLy8gTm90IHN1cHBvcnRlZCBPcGVuIEFQSSBrZXl3b3Jkc1xuICBkaXNjcmltaW5hdG9yOiBmYWxzZSxcbiAgbnVsbGFibGU6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE1hdGgubWluKHNjaGVtYUl0ZW1zTGVuZ3RoLCBkYXRhTGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hSXRlbSA9PT0gZmFsc2UgJiYgdHlwZW9mIGRhdGFbaV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWFJdGVtKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hSXRlbS4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZWxlbWVudHMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5lbGVtZW50cy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgIGxldCBpdGVtU3RyO1xuXG4gICAgICAvLyBDaGFuZ2Ugc3RyaW5nIHRvIFwic3RyaW5nXCIgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBzOiR7aXRlbX1gO1xuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gYG86JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIClcbiAgICAgICAgKX1gO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1TdHIgPSBTdHJpbmcoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICAgIHVuaXF1ZS5hZGQoaXRlbVN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5MZW5ndGgoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4sIFwidVwiKTtcblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwIGluc3RhbmNlb2YgUmVnRXhwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgcHJpdmF0ZSB0eXBlczogUmVjb3JkPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgZm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7fTtcbiAgcHJpdmF0ZSBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgaW1tdXRhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGltbXV0YWJsZSA9IGZhbHNlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcblxuICAgIGZvciAoY29uc3QgW3R5cGUsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoVHlwZXMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkVHlwZSh0eXBlLCB2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5d29yZHMpKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoa2V5d29yZCwgdmFsaWRhdG9yIGFzIEtleXdvcmRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZm9ybWF0LCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKEZvcm1hdHMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCwgdmFsaWRhdG9yIGFzIEZvcm1hdEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudHlwZXNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVHlwZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLnR5cGVzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0VHlwZSh0eXBlOiBzdHJpbmcpOiBUeXBlRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV07XG4gIH1cblxuICBhZGRGb3JtYXQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmZvcm1hdHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRm9ybWF0IFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGFkZEtleXdvcmQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEtleXdvcmRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5rZXl3b3Jkc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBLZXl3b3JkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMua2V5d29yZHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQ6IHN0cmluZyk6IEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiYW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjbG9uZWREYXRhID0gdGhpcy5pbW11dGFibGUgPyBkZWVwQ2xvbmUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgZXJyb3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUoY2xvbmVkRGF0YSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNsb25lZERhdGEsXG4gICAgICAgIGVycm9yOiBlcnJvciA/IGVycm9yIDogbnVsbCxcbiAgICAgICAgdmFsaWQ6ICFlcnJvclxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29tcGlsZWRTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgYW55T2Y6IFt7fV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtzY2hlbWFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hID0gZGVlcENsb25lKHNjaGVtYSkgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXkgaXMgcHJvcGVydGllcyBnbyB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIHRyeSB0byBjb21waWxlIGl0IGFzIGEgc2NoZW1hXG4gICAgICAgIGlmIChrZXkgPT09IFwicHJvcGVydGllc1wiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICAgIHNjaGVtYVtrZXldW3N1YktleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFLUCxXQUFhQSxFQUdiTyxLQUFLUixPQUFXUSxLQUFLUixpQkFBaUJMLEVBSXBDYSxLQUFLUixNQUFNSyxVQUFVSixFQUFZQyxHQUgvQk0sSUFJWCxDQUVBQyxXQUNFLE9BQU9ELEtBQUtILFdBQ2QsQ0FFUUssV0FDTixNQUFNQyxFQUFrQixDQUN0QmQsUUFBU1csS0FBS1gsUUFDZEUsUUFBU1MsS0FBS1QsUUFDZEQsS0FBTVUsS0FB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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSIsImtleSIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiZGVlcEVxdWFsIiwib2JqIiwib3RoZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwia2V5cyIsIk9iamVjdCIsImlzT2JqZWN0IiwiZGVlcENsb25lIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsImZuIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIkZvcm1hdHMiLCJtYXRjaCIsImRheSIsIk51bWJlciIsInllYXJTdHIiLCJtb250aFN0ciIsImhvdXJTdHIiLCJtaW51dGVTdHIiLCJzZWNvbmRTdHIiLCJ0aW1lem9uZVNpZ24iLCJ0aW1lem9uZUhvdXJTdHIiLCJ0aW1lem9uZU1pbnV0ZVN0ciIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ0aW1lem9uZUhvdXIiLCJ0aW1lem9uZU1pbnV0ZSIsInVyaSIsInRlc3QiLCJlbWFpbCIsImlwdjQiLCJpcHY2IiwiaW5kZXhPZiIsImhhc0lwdjQiLCJhZGRyZXNzUGFydHMiLCJzcGxpdCIsImlwdjRQYXJ0IiwicG9wIiwiaXNTaG9ydGVuZWQiLCJpcHY2UGFydCIsImpvaW4iLCJpc0lwdjZWYWxpZCIsImhhc0ludmFsaWRDaGFyIiwiaG9zdG5hbWUiLCJkYXRlIiwiaXNOYU4iLCJEYXRlIiwiZ2V0VGltZSIsInJlZ2V4IiwiUmVnRXhwIiwiZSIsInRpbWUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicGF0dGVybnMiLCJwcm9wZXJ0eU5hbWVzIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiJHJlZiIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIml0ZW1zIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJ1bmlxdWUiLCJTZXQiLCJpdGVtU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJTdHJpbmciLCJoYXMiLCJhZGQiLCJjb250YWlucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwiZW51bUl0ZW0iLCJhbGxPZiIsIkJvb2xlYW4iLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJpc1NjaGVtYUxpa2UiLCJ2YWxpZGF0ZSIsImNsb25lZERhdGEiLCJ2YWxpZCIsImRlZmluZVR5cGVFcnJvciIsInR5cGVWYWxpZGF0aW9ucyIsIm1ldGhvZE5hbWUiLCJtYXAiLCJ0IiwidHJpbSIsInB1c2giLCJ0eXBlVmFsaWRhdGlvbnNMZW5ndGgiLCJ0eXBlVmFsaWRhdGlvbiIsImtleXdvcmRWYWxpZGF0b3IiLCJwcmV2VmFsaWRhdG9yIiwic3ViS2V5IiwiaW5kZXgiXSwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL251bWJlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZFNjaGVtYSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yOyAvLyBDYXVzZSBvZiB0aGUgZXJyb3JcbiAgZGF0YT86IGFueTsgLy8gRGF0YSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvckZ1bmN0aW9uIHtcbiAgKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9ucyk6IFZhbGlkYXRpb25FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICBrZXk6IHN0cmluZyxcbiAgc2NoZW1hOiBDb21waWxlZFNjaGVtYVxuKSB7XG4gIGNvbnN0IEtleXdvcmRFcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgJHtrZXl9YCk7XG4gIEtleXdvcmRFcnJvci5rZXl3b3JkID0ga2V5O1xuICBLZXl3b3JkRXJyb3Iuc2NoZW1hID0gc2NoZW1hO1xuXG4gIGNvbnN0IGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIEtleXdvcmRFcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBLZXl3b3JkRXJyb3IuaXRlbSA9IG9wdGlvbnMuaXRlbTtcbiAgICBLZXl3b3JkRXJyb3IuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgb2JqOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3RoZXI6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBBcnJheS5pc0FycmF5KG90aGVyKSkge1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2ldLCBvdGhlcltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG90aGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvdGhlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2tleV0sIG90aGVyW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IG90aGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUNsb3NlRW5vdWdoKGEsIGIsIGVwc2lsb24gPSAxZS0xNSkge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IGVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVRGMTZMZW5ndGgoc3RyKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGxlbmd0aCsrO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGRlZXBDbG9uZShvYmpbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSXMgY2xhc3MgaW5zdGFuY2Ugb2YgYW55IGtpbmRcbiAgaWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5vYmpcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwQ2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGlsZWRTY2hlbWEoc3ViU2NoZW1hOiBhbnkpOiBzdWJTY2hlbWEgaXMgQ29tcGlsZWRTY2hlbWEge1xuICByZXR1cm4gaXNPYmplY3Qoc3ViU2NoZW1hKSAmJiBcIiR2YWxpZGF0ZVwiIGluIHN1YlNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVkRnVuY3Rpb248VD4obmFtZTogc3RyaW5nLCBmbjogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KTtcbn1cbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIGNvbnN0IG1hdGNoID0gZGF0YS5tYXRjaChcbiAgICAgIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2lcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBkYXkgPSBOdW1iZXIobWF0Y2hbM10pO1xuXG4gICAgaWYgKG1hdGNoWzJdID09PSBcIjAyXCIgJiYgZGF5ID4gMjkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbXG4gICAgICAsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICAsXG4gICAgICBob3VyU3RyLFxuICAgICAgbWludXRlU3RyLFxuICAgICAgc2Vjb25kU3RyLFxuICAgICAgdGltZXpvbmVTaWduLFxuICAgICAgdGltZXpvbmVIb3VyU3RyLFxuICAgICAgdGltZXpvbmVNaW51dGVTdHJcbiAgICBdID0gbWF0Y2g7XG5cbiAgICBsZXQgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBsZXQgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgIGxldCBob3VyID0gTnVtYmVyKGhvdXJTdHIpO1xuICAgIGxldCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBsZXQgc2Vjb25kID0gTnVtYmVyKHNlY29uZFN0cik7XG5cbiAgICBpZiAodGltZXpvbmVTaWduID09PSBcIi1cIiB8fCB0aW1lem9uZVNpZ24gPT09IFwiK1wiKSB7XG4gICAgICBjb25zdCB0aW1lem9uZUhvdXIgPSBOdW1iZXIodGltZXpvbmVIb3VyU3RyKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lTWludXRlID0gTnVtYmVyKHRpbWV6b25lTWludXRlU3RyKTtcblxuICAgICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIpIHtcbiAgICAgICAgaG91ciArPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSArPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAodGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgICBob3VyIC09IHRpbWV6b25lSG91cjtcbiAgICAgICAgbWludXRlIC09IHRpbWV6b25lTWludXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWludXRlID4gNTkpIHtcbiAgICAgICAgaG91ciArPSAxO1xuICAgICAgICBtaW51dGUgLT0gNjA7XG4gICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDApIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3VyID4gMjMpIHtcbiAgICAgICAgZGF5ICs9IDE7XG4gICAgICAgIGhvdXIgLT0gMjQ7XG4gICAgICB9IGVsc2UgaWYgKGhvdXIgPCAwKSB7XG4gICAgICAgIGRheSAtPSAxO1xuICAgICAgICBob3VyICs9IDI0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgbW9udGggKz0gMTtcbiAgICAgICAgZGF5IC09IDMxO1xuICAgICAgfSBlbHNlIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDE7XG4gICAgICAgIGRheSArPSAzMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAxKSB7XG4gICAgICAgIHllYXIgLT0gMTtcbiAgICAgICAgbW9udGggKz0gMTI7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ZWFyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBbMzEsICwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuICAgIGNvbnN0IG1heERheXMgPVxuICAgICAgbW9udGggPT09IDJcbiAgICAgICAgPyB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKVxuICAgICAgICAgID8gMjlcbiAgICAgICAgICA6IDI4XG4gICAgICAgIDogZGF5c0luTW9udGhbbW9udGggLSAxXTtcblxuICAgIGlmIChkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzXG4gICAgaWYgKHNlY29uZCA9PT0gNjAgJiYgKG1pbnV0ZSAhPT0gNTkgfHwgaG91ciAhPT0gMjMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC8udGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGlwdjQoZGF0YSkge1xuICAgIC8vIE1hdGNoZXMgYSBzdHJpbmcgZm9ybWVkIGJ5IDQgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDI1NSBzZXBhcmF0ZWQgYnkgZG90cyB3aXRob3V0IGxlYWRpbmcgemVyb3NcbiAgICAvLyAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC9cbiAgICByZXR1cm4gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcblxuICAvLyBpcHY2OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDYgfSksXG4gIGlwdjYoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIjo6XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEuaW5kZXhPZihcIjpcIikgPT09IC0xIHx8XG4gICAgICAvKD86XFxzK3w6OjorfF5cXHd7NSx9fFxcd3s1fSR8Xjp7MX1cXHd8XFx3OnsxfSQpLy50ZXN0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoXG4gICAgICAgICEvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC8udGVzdChcbiAgICAgICAgICBpcHY0UGFydFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvXlswLTlhLWZBLUY6Ll0qJC8udGVzdChpcHY2UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gL14oPzooPzooPzpbMC05YS1mQS1GXXsxLDR9KD86OnwkKSl7MSw2fSkpfCg/Ojo6KD86WzAtOWEtZkEtRl17MSw0fSkpezAsNX0kLy50ZXN0KFxuICAgICAgICBpcHY2UGFydFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0lwdjZWYWxpZCA9XG4gICAgICAvXig/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fSg/OlswLTlhLWZBLUZdezEsNH18OikpJC8udGVzdChpcHY2UGFydCk7XG5cbiAgICBjb25zdCBoYXNJbnZhbGlkQ2hhciA9IC8oPzpbMC05YS1mQS1GXXs1LH18XFxEWzAtOWEtZkEtRl17M306KS8udGVzdChcbiAgICAgIGlwdjZQYXJ0XG4gICAgKTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICByZXR1cm4gaXNJcHY2VmFsaWQgfHwgIWhhc0ludmFsaWRDaGFyO1xuICAgIH1cblxuICAgIHJldHVybiBpc0lwdjZWYWxpZCAmJiAhaGFzSW52YWxpZENoYXI7XG4gIH0sXG5cbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy50ZXN0KGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoZGF0YSkuZ2V0VGltZSgpKTtcbiAgfSxcbiAgcmVnZXgoZGF0YSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgUmVnRXhwKGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgXCJqc29uLXBvaW50ZXJcIihkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIC9eKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoXFwuXFxkKyk/KFp8KFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkpJC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKC9cXFxcLy50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIFwidXJpLXRlbXBsYXRlXCIoZGF0YSkge1xuICAgIHJldHVybiAvXig/Oig/Omh0dHBzPzpcXC9cXC9bXFx3Li1dKyk/XFwvPyk/W1xcdy0gOywuXFwvPyUmPV0qKD86XFx7W1xcdy1dKyg/OjpcXGQrKT9cXH1bXFx3LSA7LC5cXC8/JSY9XSopKlxcLz8kLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgZHVyYXRpb246IGZhbHNlLFxuICB1dWlkOiBmYWxzZSxcbiAgXCJpZG4tZW1haWxcIjogZmFsc2UsXG4gIFwiaWRuLWhvc3RuYW1lXCI6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICBcImlyaS1yZWZlcmVuY2VcIjogZmFsc2Vcbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICBcImxlbmd0aFwiIGluIGRhdGEgJiZcbiAgICAgIFwiMFwiIGluIGRhdGEgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCAtIDEgPT09IGRhdGEubGVuZ3RoXG4gICAgKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxuXG5cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBOdW1iZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL251bWJlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT2JqZWN0S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHNcIjtcbmltcG9ydCB7IE90aGVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgU3RyaW5nS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHNcIjtcblxuZXhwb3J0IGNvbnN0IGtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC4uLk9iamVjdEtleXdvcmRzLFxuICAuLi5BcnJheUtleXdvcmRzLFxuICAuLi5TdHJpbmdLZXl3b3JkcyxcbiAgLi4uTnVtYmVyS2V5d29yZHMsXG4gIC4uLk90aGVyS2V5d29yZHNcbn07XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE9iamVjdEtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC8vIE9iamVjdFxuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVByb3ApICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBzY2hlbWFQcm9wLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydGllc1trZXldLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHZhbHVlcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEudmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS52YWx1ZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGlzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIikudGVzdChrZXkpKSB7XG4gICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwYXR0ZXJuUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXS4kdmFsaWRhdGUoXG4gICAgICAgICAgICAgIGRhdGFba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydHlOYW1lcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnRpZXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnByb3BlcnR5TmFtZXMpKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzLiR2YWxpZGF0ZShrZXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZGVwZW5kZW5jaWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGtleSBpbiBkYXRhID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHNjaGVtYS5kZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwZW5kZW5jeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghKGRlcGVuZGVuY3lbaV0gaW4gZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRlcGVuZGVuY3lbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IGRlcGVuZGVuY3kuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8vIFJlcXVpcmVkIGJ5IG90aGVyIGtleXdvcmRzIGJ1dCBub3QgdXNlZCBhcyBhIGZ1bmN0aW9uIGl0c2VsZlxuICB0aGVuOiBmYWxzZSxcbiAgZWxzZTogZmFsc2UsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgJHJlZjogZmFsc2UsXG4gIGRlZmluaXRpb25zOiBmYWxzZSxcbiAgJGlkOiBmYWxzZSxcbiAgJHNjaGVtYTogZmFsc2UsXG5cbiAgLy8gTWV0YWRhdGEga2V5d29yZHMgKG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24pXG4gIHRpdGxlOiBmYWxzZSxcbiAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAkY29tbWVudDogZmFsc2UsXG4gIGV4YW1wbGVzOiBmYWxzZSxcbiAgY29udGVudE1lZGlhVHlwZTogZmFsc2UsXG4gIGNvbnRlbnRFbmNvZGluZzogZmFsc2UsXG5cbiAgLy8gTm90IHN1cHBvcnRlZCBPcGVuIEFQSSBrZXl3b3Jkc1xuICBkaXNjcmltaW5hdG9yOiBmYWxzZSxcbiAgbnVsbGFibGU6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE1hdGgubWluKHNjaGVtYUl0ZW1zTGVuZ3RoLCBkYXRhTGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hSXRlbSA9PT0gZmFsc2UgJiYgdHlwZW9mIGRhdGFbaV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWFJdGVtKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hSXRlbS4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZWxlbWVudHMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5lbGVtZW50cy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgIGxldCBpdGVtU3RyO1xuXG4gICAgICAvLyBDaGFuZ2Ugc3RyaW5nIHRvIFwic3RyaW5nXCIgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBzOiR7aXRlbX1gO1xuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gYG86JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIClcbiAgICAgICAgKX1gO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1TdHIgPSBTdHJpbmcoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICAgIHVuaXF1ZS5hZGQoaXRlbVN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5MZW5ndGgoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4sIFwidVwiKTtcblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwIGluc3RhbmNlb2YgUmVnRXhwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB7IFZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgcHJpdmF0ZSB0eXBlczogUmVjb3JkPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgZm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7fTtcbiAgcHJpdmF0ZSBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgaW1tdXRhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGltbXV0YWJsZSA9IGZhbHNlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcblxuICAgIGZvciAoY29uc3QgW3R5cGUsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoVHlwZXMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkVHlwZSh0eXBlLCB2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5d29yZHMpKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoa2V5d29yZCwgdmFsaWRhdG9yIGFzIEtleXdvcmRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZm9ybWF0LCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKEZvcm1hdHMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCwgdmFsaWRhdG9yIGFzIEZvcm1hdEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudHlwZXNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVHlwZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLnR5cGVzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0VHlwZSh0eXBlOiBzdHJpbmcpOiBUeXBlRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV07XG4gIH1cblxuICBhZGRGb3JtYXQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmZvcm1hdHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRm9ybWF0IFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGFkZEtleXdvcmQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEtleXdvcmRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5rZXl3b3Jkc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBLZXl3b3JkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMua2V5d29yZHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQ6IHN0cmluZyk6IEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiYW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjbG9uZWREYXRhID0gdGhpcy5pbW11dGFibGUgPyBkZWVwQ2xvbmUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgZXJyb3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUoY2xvbmVkRGF0YSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNsb25lZERhdGEsXG4gICAgICAgIGVycm9yOiBlcnJvciA/IGVycm9yIDogbnVsbCxcbiAgICAgICAgdmFsaWQ6ICFlcnJvclxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29tcGlsZWRTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgYW55T2Y6IFt7fV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtzY2hlbWFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hID0gZGVlcENsb25lKHNjaGVtYSkgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXkgaXMgcHJvcGVydGllcyBnbyB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIHRyeSB0byBjb21waWxlIGl0IGFzIGEgc2NoZW1hXG4gICAgICAgIGlmIChrZXkgPT09IFwicHJvcGVydGllc1wiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICAgIHNjaGVtYVtrZXldW3N1YktleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFLUCxXQUFhQSxFQUdiTyxLQUFLUixPQUFXUSxLQUFLUixpQkFBaUJMLEVBSXBDYSxLQUFLUixNQUFNSyxVQUFVSixFQUFZQyxHQUgvQk0sSUFJWCxDQUVBQyxXQUNFLE9B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
package/dist/index.mjs CHANGED
@@ -1253,5 +1253,7 @@ var SchemaShield = class {
1253
1253
  }
1254
1254
  };
1255
1255
  export {
1256
- SchemaShield
1256
+ SchemaShield,
1257
+ ValidationError,
1258
+ deepClone
1257
1259
  };
package/lib/index.ts CHANGED
@@ -11,6 +11,10 @@ import { Formats } from "./formats";
11
11
  import { Types } from "./types";
12
12
  import { keywords } from "./keywords";
13
13
 
14
+ export { ValidationError } from "./utils";
15
+
16
+ export { deepClone } from "./utils";
17
+
14
18
  export type Result = void | ValidationError;
15
19
 
16
20
  export interface KeywordFunction {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "schema-shield",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "A fast library that protects your JSON schema from invalid data.",
5
5
  "repository": "git@github.com:Masquerade-Circus/schema-shield.git",
6
6
  "author": "Masquerade <christian@masquerade-circus.net>",