inversify 6.1.4-beta.1 → 6.1.5-beta.0
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/CHANGELOG.md +20 -2
- package/README.md +6 -15
- package/es/container/container.d.ts +2 -0
- package/es/container/module_activation_store.d.ts +2 -2
- package/es/interfaces/interfaces.d.ts +2 -2
- package/es/inversify.d.ts +1 -0
- package/es/inversify.js +3 -2
- package/es/inversify.js.LICENSE.txt +14 -0
- package/lib/annotation/decorator_utils.js +31 -25
- package/lib/annotation/inject.js +20 -10
- package/lib/annotation/inject_base.js +6 -6
- package/lib/annotation/injectable.js +20 -10
- package/lib/annotation/multi_inject.js +20 -10
- package/lib/annotation/named.js +20 -10
- package/lib/annotation/optional.js +20 -10
- package/lib/annotation/post_construct.js +21 -11
- package/lib/annotation/pre_destroy.js +21 -11
- package/lib/annotation/property_event_decorator.js +4 -4
- package/lib/annotation/tagged.js +2 -2
- package/lib/annotation/target_name.js +21 -11
- package/lib/annotation/unmanaged.js +21 -11
- package/lib/bindings/binding.js +23 -10
- package/lib/constants/error_msgs.js +15 -29
- package/lib/constants/literal_types.js +3 -3
- package/lib/container/container.d.ts +2 -0
- package/lib/container/container.js +317 -566
- package/lib/container/container_module.js +11 -9
- package/lib/container/container_snapshot.js +10 -8
- package/lib/container/lookup.js +61 -56
- package/lib/container/module_activation_store.d.ts +2 -2
- package/lib/container/module_activation_store.js +21 -24
- package/lib/interfaces/interfaces.d.ts +2 -2
- package/lib/inversify.d.ts +1 -0
- package/lib/inversify.js +19 -8
- package/lib/planning/context.js +12 -9
- package/lib/planning/metadata.js +27 -16
- package/lib/planning/metadata_reader.js +29 -24
- package/lib/planning/plan.js +5 -4
- package/lib/planning/planner.js +62 -53
- package/lib/planning/queryable_string.js +16 -16
- package/lib/planning/reflection_utils.js +25 -17
- package/lib/planning/request.js +15 -8
- package/lib/resolution/instantiation.js +59 -119
- package/lib/resolution/resolver.js +89 -134
- package/lib/scope/scope.js +17 -62
- package/lib/syntax/binding_in_syntax.js +12 -12
- package/lib/syntax/binding_in_when_on_syntax.js +50 -47
- package/lib/syntax/binding_on_syntax.js +9 -9
- package/lib/syntax/binding_to_syntax.js +70 -49
- package/lib/syntax/binding_when_on_syntax.js +42 -40
- package/lib/syntax/binding_when_syntax.js +54 -76
- package/lib/syntax/constraint_helpers.js +31 -23
- package/lib/utils/async.js +1 -1
- package/lib/utils/binding_utils.js +31 -29
- package/lib/utils/exceptions.js +19 -9
- package/lib/utils/id.js +1 -1
- package/lib/utils/js.js +2 -3
- package/lib/utils/serialization.js +42 -33
- package/package.json +14 -15
- package/amd/annotation/decorator_utils.d.ts +0 -16
- package/amd/annotation/decorator_utils.js +0 -119
- package/amd/annotation/inject.d.ts +0 -5
- package/amd/annotation/inject.js +0 -31
- package/amd/annotation/inject_base.d.ts +0 -4
- package/amd/annotation/inject_base.js +0 -16
- package/amd/annotation/injectable.d.ts +0 -2
- package/amd/annotation/injectable.js +0 -40
- package/amd/annotation/lazy_service_identifier.js +0 -4
- package/amd/annotation/multi_inject.d.ts +0 -5
- package/amd/annotation/multi_inject.js +0 -31
- package/amd/annotation/named.d.ts +0 -2
- package/amd/annotation/named.js +0 -32
- package/amd/annotation/optional.d.ts +0 -2
- package/amd/annotation/optional.js +0 -32
- package/amd/annotation/post_construct.d.ts +0 -4
- package/amd/annotation/post_construct.js +0 -32
- package/amd/annotation/pre_destroy.d.ts +0 -4
- package/amd/annotation/pre_destroy.js +0 -32
- package/amd/annotation/property_event_decorator.d.ts +0 -4
- package/amd/annotation/property_event_decorator.js +0 -16
- package/amd/annotation/tagged.d.ts +0 -2
- package/amd/annotation/tagged.js +0 -8
- package/amd/annotation/target_name.d.ts +0 -3
- package/amd/annotation/target_name.js +0 -35
- package/amd/annotation/unmanaged.d.ts +0 -3
- package/amd/annotation/unmanaged.js +0 -35
- package/amd/bindings/binding.d.ts +0 -20
- package/amd/bindings/binding.js +0 -40
- package/amd/bindings/binding_count.d.ts +0 -5
- package/amd/bindings/binding_count.js +0 -11
- package/amd/constants/error_msgs.d.ts +0 -30
- package/amd/constants/error_msgs.js +0 -75
- package/amd/constants/literal_types.d.ts +0 -5
- package/amd/constants/literal_types.js +0 -28
- package/amd/constants/metadata_keys.d.ts +0 -13
- package/amd/constants/metadata_keys.js +0 -28
- package/amd/container/container.d.ts +0 -73
- package/amd/container/container.js +0 -766
- package/amd/container/container_module.d.ts +0 -11
- package/amd/container/container_module.js +0 -21
- package/amd/container/container_snapshot.d.ts +0 -10
- package/amd/container/container_snapshot.js +0 -20
- package/amd/container/lookup.d.ts +0 -17
- package/amd/container/lookup.js +0 -132
- package/amd/container/module_activation_store.d.ts +0 -10
- package/amd/container/module_activation_store.js +0 -51
- package/amd/interfaces/interfaces.d.ts +0 -269
- package/amd/interfaces/interfaces.js +0 -4
- package/amd/inversify.d.ts +0 -24
- package/amd/inversify.js +0 -57
- package/amd/planning/context.d.ts +0 -11
- package/amd/planning/context.js +0 -19
- package/amd/planning/metadata.d.ts +0 -8
- package/amd/planning/metadata.js +0 -45
- package/amd/planning/metadata_reader.d.ts +0 -6
- package/amd/planning/metadata_reader.js +0 -49
- package/amd/planning/plan.d.ts +0 -7
- package/amd/planning/plan.js +0 -13
- package/amd/planning/planner.d.ts +0 -5
- package/amd/planning/planner.js +0 -187
- package/amd/planning/queryable_string.d.ts +0 -10
- package/amd/planning/queryable_string.js +0 -33
- package/amd/planning/reflection_utils.d.ts +0 -5
- package/amd/planning/reflection_utils.js +0 -55
- package/amd/planning/request.d.ts +0 -14
- package/amd/planning/request.js +0 -24
- package/amd/planning/target.js +0 -111
- package/amd/resolution/instantiation.d.ts +0 -3
- package/amd/resolution/instantiation.js +0 -219
- package/amd/resolution/resolver.d.ts +0 -3
- package/amd/resolution/resolver.js +0 -234
- package/amd/scope/scope.d.ts +0 -3
- package/amd/scope/scope.js +0 -93
- package/amd/syntax/binding_in_syntax.d.ts +0 -9
- package/amd/syntax/binding_in_syntax.js +0 -24
- package/amd/syntax/binding_in_when_on_syntax.d.ts +0 -29
- package/amd/syntax/binding_in_when_on_syntax.js +0 -75
- package/amd/syntax/binding_on_syntax.d.ts +0 -8
- package/amd/syntax/binding_on_syntax.js +0 -20
- package/amd/syntax/binding_to_syntax.d.ts +0 -18
- package/amd/syntax/binding_to_syntax.js +0 -116
- package/amd/syntax/binding_when_on_syntax.d.ts +0 -25
- package/amd/syntax/binding_when_on_syntax.js +0 -65
- package/amd/syntax/binding_when_syntax.d.ts +0 -21
- package/amd/syntax/binding_when_syntax.js +0 -107
- package/amd/syntax/constraint_helpers.d.ts +0 -6
- package/amd/syntax/constraint_helpers.js +0 -66
- package/amd/utils/async.d.ts +0 -3
- package/amd/utils/async.js +0 -17
- package/amd/utils/binding_utils.d.ts +0 -4
- package/amd/utils/binding_utils.js +0 -86
- package/amd/utils/clonable.d.ts +0 -3
- package/amd/utils/clonable.js +0 -11
- package/amd/utils/exceptions.d.ts +0 -2
- package/amd/utils/exceptions.js +0 -46
- package/amd/utils/factory_type.d.ts +0 -5
- package/amd/utils/factory_type.js +0 -11
- package/amd/utils/id.d.ts +0 -2
- package/amd/utils/id.js +0 -9
- package/amd/utils/js.d.ts +0 -1
- package/amd/utils/js.js +0 -18
- package/amd/utils/serialization.d.ts +0 -10
- package/amd/utils/serialization.js +0 -135
- package/es6/annotation/decorator_utils.d.ts +0 -16
- package/es6/annotation/decorator_utils.js +0 -114
- package/es6/annotation/inject.d.ts +0 -5
- package/es6/annotation/inject.js +0 -30
- package/es6/annotation/inject_base.d.ts +0 -4
- package/es6/annotation/inject_base.js +0 -17
- package/es6/annotation/injectable.d.ts +0 -2
- package/es6/annotation/injectable.js +0 -38
- package/es6/annotation/lazy_service_identifier.js +0 -2
- package/es6/annotation/multi_inject.d.ts +0 -5
- package/es6/annotation/multi_inject.js +0 -30
- package/es6/annotation/named.d.ts +0 -2
- package/es6/annotation/named.js +0 -32
- package/es6/annotation/optional.d.ts +0 -2
- package/es6/annotation/optional.js +0 -32
- package/es6/annotation/post_construct.d.ts +0 -4
- package/es6/annotation/post_construct.js +0 -31
- package/es6/annotation/pre_destroy.d.ts +0 -4
- package/es6/annotation/pre_destroy.js +0 -31
- package/es6/annotation/property_event_decorator.d.ts +0 -4
- package/es6/annotation/property_event_decorator.js +0 -15
- package/es6/annotation/tagged.d.ts +0 -2
- package/es6/annotation/tagged.js +0 -8
- package/es6/annotation/target_name.d.ts +0 -3
- package/es6/annotation/target_name.js +0 -35
- package/es6/annotation/unmanaged.d.ts +0 -3
- package/es6/annotation/unmanaged.js +0 -35
- package/es6/bindings/binding.d.ts +0 -20
- package/es6/bindings/binding.js +0 -39
- package/es6/bindings/binding_count.d.ts +0 -5
- package/es6/bindings/binding_count.js +0 -9
- package/es6/constants/error_msgs.d.ts +0 -30
- package/es6/constants/error_msgs.js +0 -59
- package/es6/constants/literal_types.d.ts +0 -5
- package/es6/constants/literal_types.js +0 -26
- package/es6/constants/metadata_keys.d.ts +0 -13
- package/es6/constants/metadata_keys.js +0 -26
- package/es6/container/container.d.ts +0 -73
- package/es6/container/container.js +0 -545
- package/es6/container/container_module.d.ts +0 -11
- package/es6/container/container_module.js +0 -18
- package/es6/container/container_snapshot.d.ts +0 -10
- package/es6/container/container_snapshot.js +0 -15
- package/es6/container/lookup.d.ts +0 -17
- package/es6/container/lookup.js +0 -125
- package/es6/container/module_activation_store.d.ts +0 -10
- package/es6/container/module_activation_store.js +0 -49
- package/es6/interfaces/interfaces.d.ts +0 -269
- package/es6/interfaces/interfaces.js +0 -2
- package/es6/inversify.d.ts +0 -24
- package/es6/inversify.js +0 -76
- package/es6/planning/context.d.ts +0 -11
- package/es6/planning/context.js +0 -17
- package/es6/planning/metadata.d.ts +0 -8
- package/es6/planning/metadata.js +0 -42
- package/es6/planning/metadata_reader.d.ts +0 -6
- package/es6/planning/metadata_reader.js +0 -44
- package/es6/planning/plan.d.ts +0 -7
- package/es6/planning/plan.js +0 -10
- package/es6/planning/planner.d.ts +0 -5
- package/es6/planning/planner.js +0 -194
- package/es6/planning/queryable_string.d.ts +0 -10
- package/es6/planning/queryable_string.js +0 -30
- package/es6/planning/reflection_utils.d.ts +0 -5
- package/es6/planning/reflection_utils.js +0 -53
- package/es6/planning/request.d.ts +0 -14
- package/es6/planning/request.js +0 -22
- package/es6/planning/target.js +0 -105
- package/es6/resolution/instantiation.d.ts +0 -3
- package/es6/resolution/instantiation.js +0 -158
- package/es6/resolution/resolver.d.ts +0 -3
- package/es6/resolution/resolver.js +0 -193
- package/es6/scope/scope.d.ts +0 -3
- package/es6/scope/scope.js +0 -57
- package/es6/syntax/binding_in_syntax.d.ts +0 -9
- package/es6/syntax/binding_in_syntax.js +0 -23
- package/es6/syntax/binding_in_when_on_syntax.d.ts +0 -29
- package/es6/syntax/binding_in_when_on_syntax.js +0 -75
- package/es6/syntax/binding_on_syntax.d.ts +0 -8
- package/es6/syntax/binding_on_syntax.js +0 -18
- package/es6/syntax/binding_to_syntax.d.ts +0 -18
- package/es6/syntax/binding_to_syntax.js +0 -110
- package/es6/syntax/binding_when_on_syntax.d.ts +0 -25
- package/es6/syntax/binding_when_on_syntax.js +0 -64
- package/es6/syntax/binding_when_syntax.d.ts +0 -21
- package/es6/syntax/binding_when_syntax.js +0 -84
- package/es6/syntax/constraint_helpers.d.ts +0 -6
- package/es6/syntax/constraint_helpers.js +0 -63
- package/es6/utils/async.d.ts +0 -3
- package/es6/utils/async.js +0 -15
- package/es6/utils/binding_utils.d.ts +0 -4
- package/es6/utils/binding_utils.js +0 -79
- package/es6/utils/clonable.d.ts +0 -3
- package/es6/utils/clonable.js +0 -9
- package/es6/utils/exceptions.d.ts +0 -2
- package/es6/utils/exceptions.js +0 -44
- package/es6/utils/factory_type.d.ts +0 -5
- package/es6/utils/factory_type.js +0 -9
- package/es6/utils/id.d.ts +0 -2
- package/es6/utils/id.js +0 -7
- package/es6/utils/js.d.ts +0 -1
- package/es6/utils/js.js +0 -15
- package/es6/utils/serialization.d.ts +0 -10
- package/es6/utils/serialization.js +0 -132
package/es/inversify.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import*as t from"@inversifyjs/common";import*as n from"@inversifyjs/core";var e={d:(t,n)=>{for(var i in n)e.o(n,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:n[i]})},o:(t,n)=>Object.prototype.hasOwnProperty.call(t,n),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.d(i,{QC:()=>qt,bU:()=>m,XK:()=>A,mc:()=>Ot,i0:()=>Bt,FU:()=>b.LazyServiceIdentifier,KK:()=>on,PG:()=>j,$Z:()=>S,OZ:()=>Kt,Yi:()=>Ut,A$:()=>O,id:()=>T,WQ:()=>Qt,_G:()=>Ht,F$:()=>it,tt:()=>Xt,KT:()=>zt,dU:()=>St,lq:()=>Zt,kr:()=>en,E3:()=>rn,VK:()=>Yt,w:()=>At,je:()=>tn,Nu:()=>mt,if:()=>It,Fz:()=>Jt});var r={};e.r(r),e.d(r,{DESIGN_PARAM_TYPES:()=>p,INJECT_TAG:()=>s,MULTI_INJECT_TAG:()=>d,NAMED_TAG:()=>o,NAME_TAG:()=>a,NON_CUSTOM_TAG_KEYS:()=>g,OPTIONAL_TAG:()=>u,PARAM_TYPES:()=>h,POST_CONSTRUCT:()=>y,PRE_DESTROY:()=>v,TAGGED:()=>l,TAGGED_PROP:()=>f,UNMANAGED_TAG:()=>c});var o="named",a="name",c="unmanaged",u="optional",s="inject",d="multi_inject",l="inversify:tagged",f="inversify:tagged_props",h="inversify:paramtypes",p="design:paramtypes",y="post_construct",v="pre_destroy",g=[s,d,a,c,o,u];const b=(w={LazyServiceIdentifier:()=>t.LazyServiceIdentifier},_={},e.d(_,w),_);var w,_,m={Request:"Request",Singleton:"Singleton",Transient:"Transient"},A={ConstantValue:"ConstantValue",Constructor:"Constructor",DynamicValue:"DynamicValue",Factory:"Factory",Function:"Function",Instance:"Instance",Invalid:"Invalid",Provider:"Provider"},S={ClassProperty:"ClassProperty",ConstructorArgument:"ConstructorArgument",Variable:"Variable"},I=0;function T(){return I++}var D=function(){function t(t,n){this.id=T(),this.activated=!1,this.serviceIdentifier=t,this.scope=n,this.type=A.Invalid,this.constraint=function(t){return!0},this.implementationType=null,this.cache=null,this.factory=null,this.provider=null,this.onActivation=null,this.onDeactivation=null,this.dynamicValue=null}return t.prototype.clone=function(){var n=new t(this.serviceIdentifier,this.scope);return n.activated=n.scope===m.Singleton&&this.activated,n.implementationType=this.implementationType,n.dynamicValue=this.dynamicValue,n.scope=this.scope,n.type=this.type,n.factory=this.factory,n.provider=this.provider,n.constraint=this.constraint,n.onActivation=this.onActivation,n.onDeactivation=this.onDeactivation,n.cache=this.cache,n},t}(),C="Cannot apply @injectable decorator multiple times.",E="Metadata key was used more than once in a parameter:",x="NULL argument",N="Key Not Found",M="The @inject @multiInject @tagged and @named decorators must be applied to the parameters of a class constructor or a class property.",R=function(t,n){return"onDeactivation() error in class ".concat(t,": ").concat(n)},j=function(){function t(){}return t.prototype.getConstructorMetadata=function(t){var n,e=null!==(n=Reflect.getMetadata(p,t))&&void 0!==n?n:[],i=Reflect.getMetadata(l,t);return{compilerGeneratedMetadata:e,userGeneratedMetadata:null!=i?i:{}}},t.prototype.getPropertiesMetadata=function(t){var n;return null!==(n=Reflect.getMetadata(f,t))&&void 0!==n?n:{}},t}();const k=(t=>{var n={};return e.d(n,t),n})({ClassElementMetadataKind:()=>n.ClassElementMetadataKind,LegacyTargetImpl:()=>n.LegacyTargetImpl,getClassElementMetadataFromLegacyMetadata:()=>n.getClassElementMetadataFromLegacyMetadata,getTargets:()=>n.getTargets});var P;function F(t){return t instanceof RangeError||"Maximum call stack size exceeded"===t.message}function O(t){return"function"==typeof t?t.name:"symbol"==typeof t?t.toString():t}function B(t,n,e){var i="",r=e(t,n);return 0!==r.length&&(i="\nRegistered bindings:",r.forEach((function(t){var n="Object";null!==t.implementationType&&(n=W(t.implementationType)),i="".concat(i,"\n ").concat(n),t.constraint.metaData&&(i="".concat(i," - ").concat(t.constraint.metaData))}))),i}function q(t,n){return null!==t.parentRequest&&(t.parentRequest.serviceIdentifier===n||q(t.parentRequest,n))}function V(t){t.childRequests.forEach((function(n){if(q(t,n.serviceIdentifier)){var e=function(t){return function t(n,e){void 0===e&&(e=[]);var i=O(n.serviceIdentifier);return e.push(i),null!==n.parentRequest?t(n.parentRequest,e):e}(t).reverse().join(" --\x3e ")}(n);throw new Error("".concat("Circular dependency found:"," ").concat(e))}V(n)}))}function W(t){if(null!=t.name&&""!==t.name)return t.name;var n=t.toString(),e=n.match(/^function\s*([^\s(]+)/);return null===e?"Anonymous function: ".concat(n):e[1]}function K(t){return'{"key":"'.concat(t.key.toString(),'","value":"').concat(t.value.toString(),'"}')}!function(t){t[t.MultipleBindingsAvailable=2]="MultipleBindingsAvailable",t[t.NoBindingsAvailable=0]="NoBindingsAvailable",t[t.OnlyOneBindingAvailable=1]="OnlyOneBindingAvailable"}(P||(P={}));var G=function(){function t(t){this.id=T(),this.container=t}return t.prototype.addPlan=function(t){this.plan=t},t.prototype.setCurrentRequest=function(t){this.currentRequest=t},t}(),L=function(){function t(t,n){this.key=t,this.value=n}return t.prototype.toString=function(){return this.key===o?"named: ".concat(String(this.value).toString()," "):"tagged: { key:".concat(this.key.toString(),", value: ").concat(String(this.value)," }")},t}(),U=function(t,n){this.parentContext=t,this.rootRequest=n};function H(t,n){var e=Object.getPrototypeOf(n.prototype).constructor;if(e!==Object){var i=(0,k.getTargets)(t)(e),r=i.map((function(t){return t.metadata.filter((function(t){return t.key===c}))})),o=[].concat.apply([],r).length,a=i.length-o;return a>0?a:H(t,e)}return 0}var Y=function(){function t(t,n,e,i,r){this.id=T(),this.serviceIdentifier=t,this.parentContext=n,this.parentRequest=e,this.target=r,this.childRequests=[],this.bindings=Array.isArray(i)?i:[i],this.requestScope=null===e?new Map:null}return t.prototype.addChildRequest=function(n,e,i){var r=new t(n,this.parentContext,this,e,i);return this.childRequests.push(r),r},t}();function z(t){return t._bindingDictionary}function $(t,n,e,i,r){var o,a=J(e.container,r.serviceIdentifier);return a.length===P.NoBindingsAvailable&&!0===e.container.options.autoBindInjectable&&"function"==typeof r.serviceIdentifier&&t.getConstructorMetadata(r.serviceIdentifier).compilerGeneratedMetadata&&(e.container.bind(r.serviceIdentifier).toSelf(),a=J(e.container,r.serviceIdentifier)),o=n?a:a.filter((function(t){var n=new Y(t.serviceIdentifier,e,i,t,r);return t.constraint(n)})),function(t,n,e,i,r){switch(n.length){case P.NoBindingsAvailable:if(i.isOptional())return n;var o=O(t),a="No matching bindings found for serviceIdentifier:";throw a+=function(t,n){if(n.isTagged()||n.isNamed()){var e="",i=n.getNamedTag(),r=n.getCustomTags();return null!==i&&(e+=K(i)+"\n"),null!==r&&r.forEach((function(t){e+=K(t)+"\n"}))," ".concat(t,"\n ").concat(t," - ").concat(e)}return" ".concat(t)}(o,i),a+=B(r,o,J),null!==e&&(a+="\n".concat((c=O(e.serviceIdentifier),'Trying to resolve bindings for "'.concat(c,'"')))),new Error(a);case P.OnlyOneBindingAvailable:return n;case P.MultipleBindingsAvailable:default:if(i.isArray())return n;throw o=O(t),a="".concat("Ambiguous match found for serviceIdentifier:"," ").concat(o),a+=B(r,o,J),new Error(a)}var c}(r.serviceIdentifier,o,i,r,e.container),o}function Q(t,n,e,i){var r=[new L(t?d:s,n)];return void 0!==e&&r.push(new L(e,i)),r}function Z(t,n,e,i,r,o){var a,c;if(null===r){a=$(t,n,i,null,o),c=new Y(e,i,null,a,o);var u=new U(i,c);i.addPlan(u)}else a=$(t,n,i,r,o),c=r.addChildRequest(o.serviceIdentifier,a,o);a.forEach((function(n){var e,r=null;if(o.isArray())r=c.addChildRequest(n.serviceIdentifier,n,o);else{if(null!==n.cache)return;r=c}if(n.type===A.Instance&&null!==n.implementationType){var a=function(t,n){return(0,k.getTargets)(t)(n)}(t,n.implementationType);if(!0!==i.container.options.skipBaseClassChecks){var u=H(t,n.implementationType);if(a.length<u){var s=(e=W(n.implementationType),"The number of constructor arguments in the derived class "+"".concat(e," must be >= than the number of constructor arguments of its base class."));throw new Error(s)}}a.forEach((function(n){Z(t,!1,n.serviceIdentifier,i,r,n)}))}}))}function J(t,n){var e=[],i=z(t);return i.hasKey(n)?e=i.get(n):null!==t.parent&&(e=J(t.parent,n)),e}function X(t){return("object"==typeof t&&null!==t||"function"==typeof t)&&"function"==typeof t.then}function tt(t){return!!X(t)||Array.isArray(t)&&t.some(X)}var nt,et=function(t,n){return e=void 0,i=void 0,o=function(){var e,i;return function(t,n){var e,i,r,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(e)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(e=1,i&&(r=2&c[0]?i.return:c[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,c[1])).done)return r;switch(i=0,r&&(c=[2&c[0],r.value]),c[0]){case 0:case 1:r=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,i=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!((r=(r=o.trys).length>0&&r[r.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!r||c[1]>r[0]&&c[1]<r[3])){o.label=c[1];break}if(6===c[0]&&o.label<r[1]){o.label=r[1],r=c;break}if(r&&o.label<r[2]){o.label=r[2],o.ops.push(c);break}r[2]&&o.ops.pop(),o.trys.pop();continue}c=n.call(t,o)}catch(t){c=[6,t],i=0}finally{e=r=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}(this,(function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,n];case 1:return e=r.sent(),t.cache=e,[3,3];case 2:throw i=r.sent(),t.cache=null,t.activated=!1,i;case 3:return[2]}}))},new((r=void 0)||(r=Promise))((function(t,n){function a(t){try{u(o.next(t))}catch(t){n(t)}}function c(t){try{u(o.throw(t))}catch(t){n(t)}}function u(n){var e;n.done?t(n.value):(e=n.value,e instanceof r?e:new r((function(t){t(e)}))).then(a,c)}u((o=o.apply(e,i||[])).next())}));var e,i,r,o};!function(t){t.DynamicValue="toDynamicValue",t.Factory="toFactory",t.Provider="toProvider"}(nt||(nt={}));var it=function(t){return function(n){return function(){for(var e=[],i=0;i<arguments.length;i++)e[i]=arguments[i];e.forEach((function(e){t.bind(e).toService(n)}))}}},rt=function(){return rt=Object.assign||function(t){for(var n,e=1,i=arguments.length;e<i;e++)for(var r in n=arguments[e])Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r]);return t},rt.apply(this,arguments)},ot=function(t,n,e,i){return new(e||(e=Promise))((function(r,o){function a(t){try{u(i.next(t))}catch(t){o(t)}}function c(t){try{u(i.throw(t))}catch(t){o(t)}}function u(t){var n;t.done?r(t.value):(n=t.value,n instanceof e?n:new e((function(t){t(n)}))).then(a,c)}u((i=i.apply(t,n||[])).next())}))},at=function(t,n){var e,i,r,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(e)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(e=1,i&&(r=2&c[0]?i.return:c[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,c[1])).done)return r;switch(i=0,r&&(c=[2&c[0],r.value]),c[0]){case 0:case 1:r=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,i=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!((r=(r=o.trys).length>0&&r[r.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!r||c[1]>r[0]&&c[1]<r[3])){o.label=c[1];break}if(6===c[0]&&o.label<r[1]){o.label=r[1],r=c;break}if(r&&o.label<r[2]){o.label=r[2],o.ops.push(c);break}r[2]&&o.ops.pop(),o.trys.pop();continue}c=n.call(t,o)}catch(t){c=[6,t],i=0}finally{e=r=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}};function ct(t){var n,e=new((n=t.constr).bind.apply(n,function(t,n,e){if(e||2===arguments.length)for(var i,r=0,o=n.length;r<o;r++)!i&&r in n||(i||(i=Array.prototype.slice.call(n,0,r)),i[r]=n[r]);return t.concat(i||Array.prototype.slice.call(n))}([void 0],t.constructorInjections,!1)));return t.propertyRequests.forEach((function(n,i){var r=n.target.identifier,o=t.propertyInjections[i];n.target.isOptional()&&void 0===o||(e[r]=o)})),e}function ut(t){return ot(this,void 0,void 0,(function(){var n,e,i,r;return at(this,(function(o){for(n=[],e=0,i=t;e<i.length;e++)r=i[e],Array.isArray(r)?n.push(Promise.all(r)):n.push(r);return[2,Promise.all(n)]}))}))}function st(t,n){var e=function(t,n){var e,i,r,o;if(Reflect.hasMetadata(y,t)){var a=Reflect.getMetadata(y,t);try{return null===(i=(e=n)[a.value])||void 0===i?void 0:i.call(e)}catch(n){if(n instanceof Error)throw new Error((r=t.name,o=n.message,"@postConstruct error in class ".concat(r,": ").concat(o)))}}}(t,n);return X(e)?e.then((function(){return n})):n}var dt=function(t){return function(n){n.parentContext.setCurrentRequest(n);var e=n.bindings,i=n.childRequests,r=n.target&&n.target.isArray(),o=!(n.parentRequest&&n.parentRequest.target&&n.target&&n.parentRequest.target.matchesArray(n.target.serviceIdentifier));if(r&&o)return i.map((function(n){return dt(t)(n)}));if(!n.target.isOptional()||0!==e.length){var a=e[0];return pt(t,n,a)}}},lt=function(t,n){var e=function(t){switch(t.type){case A.Factory:return{factory:t.factory,factoryType:nt.Factory};case A.Provider:return{factory:t.provider,factoryType:nt.Provider};case A.DynamicValue:return{factory:t.dynamicValue,factoryType:nt.DynamicValue};default:throw new Error("Unexpected factory type ".concat(t.type))}}(t);return function(){try{return e.factory.bind(t)(n)}catch(t){if(F(t))throw new Error((i=e.factoryType,r=n.currentRequest.serviceIdentifier.toString(),"It looks like there is a circular dependency in one of the '".concat(i,"' bindings. Please investigate bindings with ")+"service identifier '".concat(r,"'.")));throw t}var i,r}()},ft=function(t,n,e){var i,r=n.childRequests;switch(function(t){var n=null;switch(t.type){case A.ConstantValue:case A.Function:n=t.cache;break;case A.Constructor:case A.Instance:n=t.implementationType;break;case A.DynamicValue:n=t.dynamicValue;break;case A.Provider:n=t.provider;break;case A.Factory:n=t.factory}if(null===n){var e=O(t.serviceIdentifier);throw new Error("".concat("Invalid binding type:"," ").concat(e))}}(e),e.type){case A.ConstantValue:case A.Function:i=e.cache;break;case A.Constructor:i=e.implementationType;break;case A.Instance:i=function(t,n,e,i){!function(t,n){t.scope!==m.Singleton&&function(t,n){var e,i,r="Class cannot be instantiated in ".concat(t.scope===m.Request?"request":"transient"," scope.");if("function"==typeof t.onDeactivation)throw new Error(R(n.name,r));if(Reflect.hasMetadata(v,n))throw new Error((e=n.name,i=r,"@preDestroy error in class ".concat(e,": ").concat(i)))}(t,n)}(t,n);var r=function(t,n,e){var i;if(n.length>0){var r=function(t,n){return t.reduce((function(t,e){var i=n(e);return e.target.type===S.ConstructorArgument?t.constructorInjections.push(i):(t.propertyRequests.push(e),t.propertyInjections.push(i)),t.isAsync||(t.isAsync=tt(i)),t}),{constructorInjections:[],isAsync:!1,propertyInjections:[],propertyRequests:[]})}(n,e),o=rt(rt({},r),{constr:t});i=r.isAsync?function(t){return ot(this,void 0,void 0,(function(){var n,e;return at(this,(function(i){switch(i.label){case 0:return[4,ut(t.constructorInjections)];case 1:return n=i.sent(),[4,ut(t.propertyInjections)];case 2:return e=i.sent(),[2,ct(rt(rt({},t),{constructorInjections:n,propertyInjections:e}))]}}))}))}(o):ct(o)}else i=new t;return i}(n,e,i);return X(r)?r.then((function(t){return st(n,t)})):st(n,r)}(e,e.implementationType,r,dt(t));break;default:i=lt(e,n.parentContext)}return i},ht=function(t,n,e){var i=function(t,n){return n.scope===m.Singleton&&n.activated?n.cache:n.scope===m.Request&&t.has(n.id)?t.get(n.id):null}(t,n);return null!==i||function(t,n,e){n.scope===m.Singleton&&function(t,n){t.cache=n,t.activated=!0,X(n)&&et(t,n)}(n,e),n.scope===m.Request&&function(t,n,e){t.has(n.id)||t.set(n.id,e)}(t,n,e)}(t,n,i=e()),i},pt=function(t,n,e){return ht(t,e,(function(){var i=ft(t,n,e);return X(i)?i.then((function(t){return yt(n,e,t)})):yt(n,e,i)}))};function yt(t,n,e){var i,r=vt(t.parentContext,n,e),o=_t(t.parentContext.container),a=o.next();do{i=a.value;var c=t.parentContext,u=t.serviceIdentifier,s=wt(i,u);r=X(r)?bt(s,c,r):gt(s,c,r),a=o.next()}while(!0!==a.done&&!z(i).hasKey(t.serviceIdentifier));return r}var vt=function(t,n,e){return"function"==typeof n.onActivation?n.onActivation(t,e):e},gt=function(t,n,e){for(var i=t.next();!0!==i.done;){if(X(e=i.value(n,e)))return bt(t,n,e);i=t.next()}return e},bt=function(t,n,e){return i=void 0,r=void 0,a=function(){var i,r;return function(t,n){var e,i,r,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(e)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(e=1,i&&(r=2&c[0]?i.return:c[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,c[1])).done)return r;switch(i=0,r&&(c=[2&c[0],r.value]),c[0]){case 0:case 1:r=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,i=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!((r=(r=o.trys).length>0&&r[r.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!r||c[1]>r[0]&&c[1]<r[3])){o.label=c[1];break}if(6===c[0]&&o.label<r[1]){o.label=r[1],r=c;break}if(r&&o.label<r[2]){o.label=r[2],o.ops.push(c);break}r[2]&&o.ops.pop(),o.trys.pop();continue}c=n.call(t,o)}catch(t){c=[6,t],i=0}finally{e=r=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}}(this,(function(o){switch(o.label){case 0:return[4,e];case 1:i=o.sent(),r=t.next(),o.label=2;case 2:return!0===r.done?[3,4]:[4,r.value(n,i)];case 3:return i=o.sent(),r=t.next(),[3,2];case 4:return[2,i]}}))},new((o=void 0)||(o=Promise))((function(t,n){function e(t){try{u(a.next(t))}catch(t){n(t)}}function c(t){try{u(a.throw(t))}catch(t){n(t)}}function u(n){var i;n.done?t(n.value):(i=n.value,i instanceof o?i:new o((function(t){t(i)}))).then(e,c)}u((a=a.apply(i,r||[])).next())}));var i,r,o,a},wt=function(t,n){var e=t._activations;return e.hasKey(n)?e.get(n).values():[].values()},_t=function(t){for(var n=[t],e=t.parent;null!==e;)n.push(e),e=e.parent;return{next:function(){var t=n.pop();return void 0!==t?{done:!1,value:t}:{done:!0,value:void 0}}}},mt=function(t,n){var e=t.parentRequest;return null!==e&&(!!n(e)||mt(e,n))},At=function(t){return function(n){var e=function(e){return null!==e&&null!==e.target&&e.target.matchesTag(t)(n)};return e.metaData=new L(t,n),e}},St=At(o),It=function(t){return function(n){var e=null;if(null!==n){if(e=n.bindings[0],"string"==typeof t)return e.serviceIdentifier===t;var i=n.bindings[0].implementationType;return t===i}return!1}},Tt=function(){function t(t){this._binding=t}return t.prototype.when=function(t){return this._binding.constraint=t,new Dt(this._binding)},t.prototype.whenTargetNamed=function(t){return this._binding.constraint=St(t),new Dt(this._binding)},t.prototype.whenTargetIsDefault=function(){return this._binding.constraint=function(t){return null!==t&&null!==t.target&&!t.target.isNamed()&&!t.target.isTagged()},new Dt(this._binding)},t.prototype.whenTargetTagged=function(t,n){return this._binding.constraint=At(t)(n),new Dt(this._binding)},t.prototype.whenInjectedInto=function(t){return this._binding.constraint=function(n){return null!==n&&It(t)(n.parentRequest)},new Dt(this._binding)},t.prototype.whenParentNamed=function(t){return this._binding.constraint=function(n){return null!==n&&St(t)(n.parentRequest)},new Dt(this._binding)},t.prototype.whenParentTagged=function(t,n){return this._binding.constraint=function(e){return null!==e&&At(t)(n)(e.parentRequest)},new Dt(this._binding)},t.prototype.whenAnyAncestorIs=function(t){return this._binding.constraint=function(n){return null!==n&&mt(n,It(t))},new Dt(this._binding)},t.prototype.whenNoAncestorIs=function(t){return this._binding.constraint=function(n){return null!==n&&!mt(n,It(t))},new Dt(this._binding)},t.prototype.whenAnyAncestorNamed=function(t){return this._binding.constraint=function(n){return null!==n&&mt(n,St(t))},new Dt(this._binding)},t.prototype.whenNoAncestorNamed=function(t){return this._binding.constraint=function(n){return null!==n&&!mt(n,St(t))},new Dt(this._binding)},t.prototype.whenAnyAncestorTagged=function(t,n){return this._binding.constraint=function(e){return null!==e&&mt(e,At(t)(n))},new Dt(this._binding)},t.prototype.whenNoAncestorTagged=function(t,n){return this._binding.constraint=function(e){return null!==e&&!mt(e,At(t)(n))},new Dt(this._binding)},t.prototype.whenAnyAncestorMatches=function(t){return this._binding.constraint=function(n){return null!==n&&mt(n,t)},new Dt(this._binding)},t.prototype.whenNoAncestorMatches=function(t){return this._binding.constraint=function(n){return null!==n&&!mt(n,t)},new Dt(this._binding)},t}(),Dt=function(){function t(t){this._binding=t}return t.prototype.onActivation=function(t){return this._binding.onActivation=t,new Tt(this._binding)},t.prototype.onDeactivation=function(t){return this._binding.onDeactivation=t,new Tt(this._binding)},t}(),Ct=function(){function t(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new Dt(this._binding)}return t.prototype.when=function(t){return this._bindingWhenSyntax.when(t)},t.prototype.whenTargetNamed=function(t){return this._bindingWhenSyntax.whenTargetNamed(t)},t.prototype.whenTargetIsDefault=function(){return this._bindingWhenSyntax.whenTargetIsDefault()},t.prototype.whenTargetTagged=function(t,n){return this._bindingWhenSyntax.whenTargetTagged(t,n)},t.prototype.whenInjectedInto=function(t){return this._bindingWhenSyntax.whenInjectedInto(t)},t.prototype.whenParentNamed=function(t){return this._bindingWhenSyntax.whenParentNamed(t)},t.prototype.whenParentTagged=function(t,n){return this._bindingWhenSyntax.whenParentTagged(t,n)},t.prototype.whenAnyAncestorIs=function(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)},t.prototype.whenNoAncestorIs=function(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)},t.prototype.whenAnyAncestorNamed=function(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)},t.prototype.whenAnyAncestorTagged=function(t,n){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,n)},t.prototype.whenNoAncestorNamed=function(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)},t.prototype.whenNoAncestorTagged=function(t,n){return this._bindingWhenSyntax.whenNoAncestorTagged(t,n)},t.prototype.whenAnyAncestorMatches=function(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)},t.prototype.whenNoAncestorMatches=function(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)},t.prototype.onActivation=function(t){return this._bindingOnSyntax.onActivation(t)},t.prototype.onDeactivation=function(t){return this._bindingOnSyntax.onDeactivation(t)},t}(),Et=function(){function t(t){this._binding=t}return t.prototype.inRequestScope=function(){return this._binding.scope=m.Request,new Ct(this._binding)},t.prototype.inSingletonScope=function(){return this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.inTransientScope=function(){return this._binding.scope=m.Transient,new Ct(this._binding)},t}(),xt=function(){function t(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new Dt(this._binding),this._bindingInSyntax=new Et(t)}return t.prototype.inRequestScope=function(){return this._bindingInSyntax.inRequestScope()},t.prototype.inSingletonScope=function(){return this._bindingInSyntax.inSingletonScope()},t.prototype.inTransientScope=function(){return this._bindingInSyntax.inTransientScope()},t.prototype.when=function(t){return this._bindingWhenSyntax.when(t)},t.prototype.whenTargetNamed=function(t){return this._bindingWhenSyntax.whenTargetNamed(t)},t.prototype.whenTargetIsDefault=function(){return this._bindingWhenSyntax.whenTargetIsDefault()},t.prototype.whenTargetTagged=function(t,n){return this._bindingWhenSyntax.whenTargetTagged(t,n)},t.prototype.whenInjectedInto=function(t){return this._bindingWhenSyntax.whenInjectedInto(t)},t.prototype.whenParentNamed=function(t){return this._bindingWhenSyntax.whenParentNamed(t)},t.prototype.whenParentTagged=function(t,n){return this._bindingWhenSyntax.whenParentTagged(t,n)},t.prototype.whenAnyAncestorIs=function(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)},t.prototype.whenNoAncestorIs=function(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)},t.prototype.whenAnyAncestorNamed=function(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)},t.prototype.whenAnyAncestorTagged=function(t,n){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,n)},t.prototype.whenNoAncestorNamed=function(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)},t.prototype.whenNoAncestorTagged=function(t,n){return this._bindingWhenSyntax.whenNoAncestorTagged(t,n)},t.prototype.whenAnyAncestorMatches=function(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)},t.prototype.whenNoAncestorMatches=function(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)},t.prototype.onActivation=function(t){return this._bindingOnSyntax.onActivation(t)},t.prototype.onDeactivation=function(t){return this._bindingOnSyntax.onDeactivation(t)},t}(),Nt=function(){function t(t){this._binding=t}return t.prototype.to=function(t){return this._binding.type=A.Instance,this._binding.implementationType=t,new xt(this._binding)},t.prototype.toSelf=function(){if("function"!=typeof this._binding.serviceIdentifier)throw new Error("The toSelf function can only be applied when a constructor is used as service identifier");var t=this._binding.serviceIdentifier;return this.to(t)},t.prototype.toConstantValue=function(t){return this._binding.type=A.ConstantValue,this._binding.cache=t,this._binding.dynamicValue=null,this._binding.implementationType=null,this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.toDynamicValue=function(t){return this._binding.type=A.DynamicValue,this._binding.cache=null,this._binding.dynamicValue=t,this._binding.implementationType=null,new xt(this._binding)},t.prototype.toConstructor=function(t){return this._binding.type=A.Constructor,this._binding.implementationType=t,this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.toFactory=function(t){return this._binding.type=A.Factory,this._binding.factory=t,this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.toFunction=function(t){if("function"!=typeof t)throw new Error("Value provided to function binding must be a function!");var n=this.toConstantValue(t);return this._binding.type=A.Function,this._binding.scope=m.Singleton,n},t.prototype.toAutoFactory=function(t){return this._binding.type=A.Factory,this._binding.factory=function(n){return function(){return n.container.get(t)}},this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.toAutoNamedFactory=function(t){return this._binding.type=A.Factory,this._binding.factory=function(n){return function(e){return n.container.getNamed(t,e)}},new Ct(this._binding)},t.prototype.toProvider=function(t){return this._binding.type=A.Provider,this._binding.provider=t,this._binding.scope=m.Singleton,new Ct(this._binding)},t.prototype.toService=function(t){this.toDynamicValue((function(n){return n.container.get(t)}))},t}(),Mt=function(){function t(){}return t.of=function(n,e,i,r,o){var a=new t;return a.bindings=n,a.middleware=e,a.deactivations=r,a.activations=i,a.moduleActivationStore=o,a},t}(),Rt=function(){function t(){this._map=new Map}return t.prototype.getMap=function(){return this._map},t.prototype.add=function(t,n){if(this._checkNonNulish(t),null==n)throw new Error(x);var e=this._map.get(t);void 0!==e?e.push(n):this._map.set(t,[n])},t.prototype.get=function(t){this._checkNonNulish(t);var n=this._map.get(t);if(void 0!==n)return n;throw new Error(N)},t.prototype.remove=function(t){if(this._checkNonNulish(t),!this._map.delete(t))throw new Error(N)},t.prototype.removeIntersection=function(t){var n=this;this.traverse((function(e,i){var r=t.hasKey(e)?t.get(e):void 0;if(void 0!==r){var o=i.filter((function(t){return!r.some((function(n){return t===n}))}));n._setValue(e,o)}}))},t.prototype.removeByCondition=function(t){var n=this,e=[];return this._map.forEach((function(i,r){for(var o=[],a=0,c=i;a<c.length;a++){var u=c[a];t(u)?e.push(u):o.push(u)}n._setValue(r,o)})),e},t.prototype.hasKey=function(t){return this._checkNonNulish(t),this._map.has(t)},t.prototype.clone=function(){var n=new t;return this._map.forEach((function(t,e){t.forEach((function(t){var i;n.add(e,"object"==typeof(i=t)&&null!==i&&"clone"in i&&"function"==typeof i.clone?t.clone():t)}))})),n},t.prototype.traverse=function(t){this._map.forEach((function(n,e){t(e,n)}))},t.prototype._checkNonNulish=function(t){if(null==t)throw new Error(x)},t.prototype._setValue=function(t,n){n.length>0?this._map.set(t,n):this._map.delete(t)},t}(),jt=function(){function t(){this._map=new Map}return t.prototype.remove=function(t){var n=this._map.get(t);return void 0===n?this._getEmptyHandlersStore():(this._map.delete(t),n)},t.prototype.addDeactivation=function(t,n,e){this._getModuleActivationHandlers(t).onDeactivations.add(n,e)},t.prototype.addActivation=function(t,n,e){this._getModuleActivationHandlers(t).onActivations.add(n,e)},t.prototype.clone=function(){var n=new t;return this._map.forEach((function(t,e){n._map.set(e,{onActivations:t.onActivations.clone(),onDeactivations:t.onDeactivations.clone()})})),n},t.prototype._getModuleActivationHandlers=function(t){var n=this._map.get(t);return void 0===n&&(n=this._getEmptyHandlersStore(),this._map.set(t,n)),n},t.prototype._getEmptyHandlersStore=function(){return{onActivations:new Rt,onDeactivations:new Rt}},t}(),kt=function(){return kt=Object.assign||function(t){for(var n,e=1,i=arguments.length;e<i;e++)for(var r in n=arguments[e])Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r]);return t},kt.apply(this,arguments)},Pt=function(t,n,e,i){return new(e||(e=Promise))((function(r,o){function a(t){try{u(i.next(t))}catch(t){o(t)}}function c(t){try{u(i.throw(t))}catch(t){o(t)}}function u(t){var n;t.done?r(t.value):(n=t.value,n instanceof e?n:new e((function(t){t(n)}))).then(a,c)}u((i=i.apply(t,n||[])).next())}))},Ft=function(t,n){var e,i,r,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]},a=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return a.next=c(0),a.throw=c(1),a.return=c(2),"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function c(c){return function(u){return function(c){if(e)throw new TypeError("Generator is already executing.");for(;a&&(a=0,c[0]&&(o=0)),o;)try{if(e=1,i&&(r=2&c[0]?i.return:c[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,c[1])).done)return r;switch(i=0,r&&(c=[2&c[0],r.value]),c[0]){case 0:case 1:r=c;break;case 4:return o.label++,{value:c[1],done:!1};case 5:o.label++,i=c[1],c=[0];continue;case 7:c=o.ops.pop(),o.trys.pop();continue;default:if(!((r=(r=o.trys).length>0&&r[r.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!r||c[1]>r[0]&&c[1]<r[3])){o.label=c[1];break}if(6===c[0]&&o.label<r[1]){o.label=r[1],r=c;break}if(r&&o.label<r[2]){o.label=r[2],o.ops.push(c);break}r[2]&&o.ops.pop(),o.trys.pop();continue}c=n.call(t,o)}catch(t){c=[6,t],i=0}finally{e=r=0}if(5&c[0])throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}([c,u])}}},Ot=function(){function t(t){var n=t||{};if("object"!=typeof n)throw new Error("Invalid Container constructor argument. Container options must be an object.");if(void 0===n.defaultScope)n.defaultScope=m.Transient;else if(n.defaultScope!==m.Singleton&&n.defaultScope!==m.Transient&&n.defaultScope!==m.Request)throw new Error('Invalid Container option. Default scope must be a string ("singleton" or "transient").');if(void 0===n.autoBindInjectable)n.autoBindInjectable=!1;else if("boolean"!=typeof n.autoBindInjectable)throw new Error("Invalid Container option. Auto bind injectable must be a boolean");if(void 0===n.skipBaseClassChecks)n.skipBaseClassChecks=!1;else if("boolean"!=typeof n.skipBaseClassChecks)throw new Error("Invalid Container option. Skip base check must be a boolean");this.options={autoBindInjectable:n.autoBindInjectable,defaultScope:n.defaultScope,skipBaseClassChecks:n.skipBaseClassChecks},this.id=T(),this._bindingDictionary=new Rt,this._snapshots=[],this._middleware=null,this._activations=new Rt,this._deactivations=new Rt,this.parent=null,this._metadataReader=new j,this._moduleActivationStore=new jt}return t.merge=function(n,e){for(var i=[],r=2;r<arguments.length;r++)i[r-2]=arguments[r];var o=new t,a=function(t,n,e){if(e||2===arguments.length)for(var i,r=0,o=n.length;r<o;r++)!i&&r in n||(i||(i=Array.prototype.slice.call(n,0,r)),i[r]=n[r]);return t.concat(i||Array.prototype.slice.call(n))}([n,e],i,!0).map((function(t){return z(t)})),c=z(o);return a.forEach((function(t){var n;n=c,t.traverse((function(t,e){e.forEach((function(t){n.add(t.serviceIdentifier,t.clone())}))}))})),o},t.prototype.load=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];for(var e=this._getContainerModuleHelpersFactory(),i=0,r=t;i<r.length;i++){var o=r[i],a=e(o.id);o.registry(a.bindFunction,a.unbindFunction,a.isboundFunction,a.rebindFunction,a.unbindAsyncFunction,a.onActivationFunction,a.onDeactivationFunction)}},t.prototype.loadAsync=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return Pt(this,void 0,void 0,(function(){var n,e,i,r,o;return Ft(this,(function(a){switch(a.label){case 0:n=this._getContainerModuleHelpersFactory(),e=0,i=t,a.label=1;case 1:return e<i.length?(r=i[e],o=n(r.id),[4,r.registry(o.bindFunction,o.unbindFunction,o.isboundFunction,o.rebindFunction,o.unbindAsyncFunction,o.onActivationFunction,o.onDeactivationFunction)]):[3,4];case 2:a.sent(),a.label=3;case 3:return e++,[3,1];case 4:return[2]}}))}))},t.prototype.unload=function(){for(var t=this,n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];n.forEach((function(n){var e=t._removeModuleBindings(n.id);t._deactivateSingletons(e),t._removeModuleHandlers(n.id)}))},t.prototype.unloadAsync=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return Pt(this,void 0,void 0,(function(){var n,e,i,r;return Ft(this,(function(o){switch(o.label){case 0:n=0,e=t,o.label=1;case 1:return n<e.length?(i=e[n],r=this._removeModuleBindings(i.id),[4,this._deactivateSingletonsAsync(r)]):[3,4];case 2:o.sent(),this._removeModuleHandlers(i.id),o.label=3;case 3:return n++,[3,1];case 4:return[2]}}))}))},t.prototype.bind=function(t){var n=this.options.defaultScope||m.Transient,e=new D(t,n);return this._bindingDictionary.add(t,e),new Nt(e)},t.prototype.rebind=function(t){return this.unbind(t),this.bind(t)},t.prototype.rebindAsync=function(t){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(n){switch(n.label){case 0:return[4,this.unbindAsync(t)];case 1:return n.sent(),[2,this.bind(t)]}}))}))},t.prototype.unbind=function(t){if(this._bindingDictionary.hasKey(t)){var n=this._bindingDictionary.get(t);this._deactivateSingletons(n)}this._removeServiceFromDictionary(t)},t.prototype.unbindAsync=function(t){return Pt(this,void 0,void 0,(function(){var n;return Ft(this,(function(e){switch(e.label){case 0:return this._bindingDictionary.hasKey(t)?(n=this._bindingDictionary.get(t),[4,this._deactivateSingletonsAsync(n)]):[3,2];case 1:e.sent(),e.label=2;case 2:return this._removeServiceFromDictionary(t),[2]}}))}))},t.prototype.unbindAll=function(){var t=this;this._bindingDictionary.traverse((function(n,e){t._deactivateSingletons(e)})),this._bindingDictionary=new Rt},t.prototype.unbindAllAsync=function(){return Pt(this,void 0,void 0,(function(){var t,n=this;return Ft(this,(function(e){switch(e.label){case 0:return t=[],this._bindingDictionary.traverse((function(e,i){t.push(n._deactivateSingletonsAsync(i))})),[4,Promise.all(t)];case 1:return e.sent(),this._bindingDictionary=new Rt,[2]}}))}))},t.prototype.onActivation=function(t,n){this._activations.add(t,n)},t.prototype.onDeactivation=function(t,n){this._deactivations.add(t,n)},t.prototype.isBound=function(t){var n=this._bindingDictionary.hasKey(t);return!n&&this.parent&&(n=this.parent.isBound(t)),n},t.prototype.isCurrentBound=function(t){return this._bindingDictionary.hasKey(t)},t.prototype.isBoundNamed=function(t,n){return this.isBoundTagged(t,o,n)},t.prototype.isBoundTagged=function(t,n,e){var i=!1;if(this._bindingDictionary.hasKey(t)){var r=this._bindingDictionary.get(t),o=function(t,n,e,i){var r=Q(!1,n,e,i),o=(0,k.getClassElementMetadataFromLegacyMetadata)(r);if(o.kind===k.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");var a=new k.LegacyTargetImpl("",o,"Variable"),c=new G(t);return new Y(n,c,null,[],a)}(this,t,n,e);i=r.some((function(t){return t.constraint(o)}))}return!i&&this.parent&&(i=this.parent.isBoundTagged(t,n,e)),i},t.prototype.snapshot=function(){this._snapshots.push(Mt.of(this._bindingDictionary.clone(),this._middleware,this._activations.clone(),this._deactivations.clone(),this._moduleActivationStore.clone()))},t.prototype.restore=function(){var t=this._snapshots.pop();if(void 0===t)throw new Error("No snapshot available to restore.");this._bindingDictionary=t.bindings,this._activations=t.activations,this._deactivations=t.deactivations,this._middleware=t.middleware,this._moduleActivationStore=t.moduleActivationStore},t.prototype.createChild=function(n){var e=new t(n||this.options);return e.parent=this,e},t.prototype.applyMiddleware=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var e=this._middleware?this._middleware:this._planAndResolve();this._middleware=t.reduce((function(t,n){return n(t)}),e)},t.prototype.applyCustomMetadataReader=function(t){this._metadataReader=t},t.prototype.get=function(t){var n=this._getNotAllArgs(t,!1);return this._getButThrowIfAsync(n)},t.prototype.getAsync=function(t){return Pt(this,void 0,void 0,(function(){var n;return Ft(this,(function(e){return n=this._getNotAllArgs(t,!1),[2,this._get(n)]}))}))},t.prototype.getTagged=function(t,n,e){var i=this._getNotAllArgs(t,!1,n,e);return this._getButThrowIfAsync(i)},t.prototype.getTaggedAsync=function(t,n,e){return Pt(this,void 0,void 0,(function(){var i;return Ft(this,(function(r){return i=this._getNotAllArgs(t,!1,n,e),[2,this._get(i)]}))}))},t.prototype.getNamed=function(t,n){return this.getTagged(t,o,n)},t.prototype.getNamedAsync=function(t,n){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(e){return[2,this.getTaggedAsync(t,o,n)]}))}))},t.prototype.getAll=function(t){var n=this._getAllArgs(t);return this._getButThrowIfAsync(n)},t.prototype.getAllAsync=function(t){return Pt(this,void 0,void 0,(function(){var n;return Ft(this,(function(e){return n=this._getAllArgs(t),[2,this._getAll(n)]}))}))},t.prototype.getAllTagged=function(t,n,e){var i=this._getNotAllArgs(t,!0,n,e);return this._getButThrowIfAsync(i)},t.prototype.getAllTaggedAsync=function(t,n,e){return Pt(this,void 0,void 0,(function(){var i;return Ft(this,(function(r){return i=this._getNotAllArgs(t,!0,n,e),[2,this._getAll(i)]}))}))},t.prototype.getAllNamed=function(t,n){return this.getAllTagged(t,o,n)},t.prototype.getAllNamedAsync=function(t,n){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(e){return[2,this.getAllTaggedAsync(t,o,n)]}))}))},t.prototype.resolve=function(t){var n=this.isBound(t);n||this.bind(t).toSelf();var e=this.get(t);return n||this.unbind(t),e},t.prototype._preDestroy=function(t,n){var e,i;if(void 0!==t&&Reflect.hasMetadata(v,t))return null===(i=(e=n)[Reflect.getMetadata(v,t).value])||void 0===i?void 0:i.call(e)},t.prototype._removeModuleHandlers=function(t){var n=this._moduleActivationStore.remove(t);this._activations.removeIntersection(n.onActivations),this._deactivations.removeIntersection(n.onDeactivations)},t.prototype._removeModuleBindings=function(t){return this._bindingDictionary.removeByCondition((function(n){return n.moduleId===t}))},t.prototype._deactivate=function(t,n){var e=this,i=null==n?void 0:Object.getPrototypeOf(n).constructor;try{if(this._deactivations.hasKey(t.serviceIdentifier)){var r=this._deactivateContainer(n,this._deactivations.get(t.serviceIdentifier).values());if(X(r))return this._handleDeactivationError(r.then((function(){return Pt(e,void 0,void 0,(function(){return Ft(this,(function(e){return[2,this._propagateContainerDeactivationThenBindingAndPreDestroyAsync(t,n,i)]}))}))})),t.serviceIdentifier)}var o=this._propagateContainerDeactivationThenBindingAndPreDestroy(t,n,i);if(X(o))return this._handleDeactivationError(o,t.serviceIdentifier)}catch(n){if(n instanceof Error)throw new Error(R(O(t.serviceIdentifier),n.message))}},t.prototype._handleDeactivationError=function(t,n){return Pt(this,void 0,void 0,(function(){var e;return Ft(this,(function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),[4,t];case 1:return i.sent(),[3,3];case 2:if((e=i.sent())instanceof Error)throw new Error(R(O(n),e.message));return[3,3];case 3:return[2]}}))}))},t.prototype._deactivateContainer=function(t,n){for(var e=this,i=n.next();"function"==typeof i.value;){var r=i.value(t);if(X(r))return r.then((function(){return Pt(e,void 0,void 0,(function(){return Ft(this,(function(e){return[2,this._deactivateContainerAsync(t,n)]}))}))}));i=n.next()}},t.prototype._deactivateContainerAsync=function(t,n){return Pt(this,void 0,void 0,(function(){var e;return Ft(this,(function(i){switch(i.label){case 0:e=n.next(),i.label=1;case 1:return"function"!=typeof e.value?[3,3]:[4,e.value(t)];case 2:return i.sent(),e=n.next(),[3,1];case 3:return[2]}}))}))},t.prototype._getContainerModuleHelpersFactory=function(){var t=this,n=function(t,n){t._binding.moduleId=n},e=function(e){return function(i){var r=t.rebind(i);return n(r,e),r}},i=function(n){return function(e,i){t._moduleActivationStore.addActivation(n,e,i),t.onActivation(e,i)}},r=function(n){return function(e,i){t._moduleActivationStore.addDeactivation(n,e,i),t.onDeactivation(e,i)}};return function(o){return{bindFunction:(a=o,function(e){var i=t.bind(e);return n(i,a),i}),isboundFunction:function(n){return t.isBound(n)},onActivationFunction:i(o),onDeactivationFunction:r(o),rebindFunction:e(o),unbindAsyncFunction:function(n){return Pt(t,void 0,void 0,(function(){return Ft(this,(function(t){return[2,this.unbindAsync(n)]}))}))},unbindFunction:function(n){t.unbind(n)}};var a}},t.prototype._getAll=function(t){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(n){return[2,Promise.all(this._get(t))]}))}))},t.prototype._get=function(t){var n=kt(kt({},t),{contextInterceptor:function(t){return t},targetType:S.Variable});if(this._middleware){var e=this._middleware(n);if(null==e)throw new Error("Invalid return type in middleware. Middleware must return!");return e}return this._planAndResolve()(n)},t.prototype._getButThrowIfAsync=function(t){var n,e=this._get(t);if(tt(e))throw new Error((n=t.serviceIdentifier,"You are attempting to construct ".concat(function(t){return"function"==typeof t?"[function/class ".concat(t.name||"<anonymous>","]"):"symbol"==typeof t?t.toString():"'".concat(t,"'")}(n)," in a synchronous way ")+"but it has asynchronous dependencies."));return e},t.prototype._getAllArgs=function(t){return{avoidConstraints:!0,isMultiInject:!0,serviceIdentifier:t}},t.prototype._getNotAllArgs=function(t,n,e,i){return{avoidConstraints:!1,isMultiInject:n,key:e,serviceIdentifier:t,value:i}},t.prototype._planAndResolve=function(){var t=this;return function(n){var e=function(t,n,e,i,r,o,a,c){void 0===c&&(c=!1);var u=new G(n),s=function(t,n,e,i,r,o){var a=Q(t,e,r,o),c=(0,k.getClassElementMetadataFromLegacyMetadata)(a);if(c.kind===k.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");return new k.LegacyTargetImpl("",c,n)}(e,i,r,0,o,a);try{return Z(t,c,r,u,null,s),u}catch(t){throw F(t)&&V(u.plan.rootRequest),t}}(t._metadataReader,t,n.isMultiInject,n.targetType,n.serviceIdentifier,n.key,n.value,n.avoidConstraints);return function(t){return dt(t.plan.rootRequest.requestScope)(t.plan.rootRequest)}(e=n.contextInterceptor(e))}},t.prototype._deactivateIfSingleton=function(t){var n=this;if(t.activated)return X(t.cache)?t.cache.then((function(e){return n._deactivate(t,e)})):this._deactivate(t,t.cache)},t.prototype._deactivateSingletons=function(t){for(var n=0,e=t;n<e.length;n++){var i=e[n];if(X(this._deactivateIfSingleton(i)))throw new Error("Attempting to unbind dependency with asynchronous destruction (@preDestroy or onDeactivation)")}},t.prototype._deactivateSingletonsAsync=function(t){return Pt(this,void 0,void 0,(function(){var n=this;return Ft(this,(function(e){switch(e.label){case 0:return[4,Promise.all(t.map((function(t){return Pt(n,void 0,void 0,(function(){return Ft(this,(function(n){return[2,this._deactivateIfSingleton(t)]}))}))})))];case 1:return e.sent(),[2]}}))}))},t.prototype._propagateContainerDeactivationThenBindingAndPreDestroy=function(t,n,e){return this.parent?this._deactivate.bind(this.parent)(t,n):this._bindingDeactivationAndPreDestroy(t,n,e)},t.prototype._propagateContainerDeactivationThenBindingAndPreDestroyAsync=function(t,n,e){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(i){switch(i.label){case 0:return this.parent?[4,this._deactivate.bind(this.parent)(t,n)]:[3,2];case 1:return i.sent(),[3,4];case 2:return[4,this._bindingDeactivationAndPreDestroyAsync(t,n,e)];case 3:i.sent(),i.label=4;case 4:return[2]}}))}))},t.prototype._removeServiceFromDictionary=function(t){try{this._bindingDictionary.remove(t)}catch(n){throw new Error("".concat("Could not unbind serviceIdentifier:"," ").concat(O(t)))}},t.prototype._bindingDeactivationAndPreDestroy=function(t,n,e){var i=this;if("function"==typeof t.onDeactivation){var r=t.onDeactivation(n);if(X(r))return r.then((function(){return i._preDestroy(e,n)}))}return this._preDestroy(e,n)},t.prototype._bindingDeactivationAndPreDestroyAsync=function(t,n,e){return Pt(this,void 0,void 0,(function(){return Ft(this,(function(i){switch(i.label){case 0:return"function"!=typeof t.onDeactivation?[3,2]:[4,t.onDeactivation(n)];case 1:i.sent(),i.label=2;case 2:return[4,this._preDestroy(e,n)];case 3:return i.sent(),[2]}}))}))},t}(),Bt=function(t){this.id=T(),this.registry=t},qt=function(t){this.id=T(),this.registry=t};function Vt(t,n,e,i){!function(t){if(void 0!==t)throw new Error(M)}(n),Wt(l,t,e.toString(),i)}function Wt(t,n,e,i){var r=function(t){var n=[];if(Array.isArray(t)){var e=function(t){for(var n=new Set,e=0,i=t;e<i.length;e++){var r=i[e];if(n.has(r))return r;n.add(r)}}((n=t).map((function(t){return t.key})));if(void 0!==e)throw new Error("".concat(E," ").concat(e.toString()))}else n=[t];return n}(i),o={};Reflect.hasOwnMetadata(t,n)&&(o=Reflect.getMetadata(t,n));var a=o[e];if(void 0===a)a=[];else for(var c=function(t){if(r.some((function(n){return n.key===t.key})))throw new Error("".concat(E," ").concat(t.key.toString()))},u=0,s=a;u<s.length;u++)c(s[u]);a.push.apply(a,r),o[e]=a,Reflect.defineMetadata(t,o,n)}function Kt(t){return function(n,e,i){"number"==typeof i?Vt(n,e,i,t):function(t,n,e){if(void 0!==t.prototype)throw new Error(M);Wt(f,t.constructor,n,e)}(n,e,t)}}function Gt(t,n){Reflect.decorate(t,n)}function Lt(t,n){return function(e,i){n(e,i,t)}}function Ut(t,n,e){"number"==typeof e?Gt([Lt(e,t)],n):"string"==typeof e?Reflect.decorate([t],n,e):Gt([t],n)}function Ht(){return function(t){if(Reflect.hasOwnMetadata(h,t))throw new Error(C);var n=Reflect.getMetadata(p,t)||[];return Reflect.defineMetadata(h,n,t),t}}function Yt(t,n){return Kt(new L(t,n))}function zt(t){return Kt(new L(o,t))}function $t(t){return function(n){return function(e,i,r){if(void 0===n){var o="function"==typeof e?e.name:e.constructor.name;throw new Error("@inject called with undefined this could mean that the class ".concat(o," has ")+"a circular dependency problem. You can use a LazyServiceIdentifer to overcome this limitation.")}Kt(new L(t,n))(e,i,r)}}}var Qt=$t(s);function Zt(){return Kt(new L(u,!0))}function Jt(){return function(t,n,e){Vt(t,n,e,new L(c,!0))}}var Xt=$t(d);function tn(t){return function(n,e,i){Vt(n,e,i,new L(a,t))}}function nn(t,n){return function(){return function(e,i){var r=new L(t,i);if(Reflect.hasOwnMetadata(t,e.constructor))throw new Error(n);Reflect.defineMetadata(t,r,e.constructor)}}}var en=nn(y,"Cannot apply @postConstruct decorator multiple times in the same class"),rn=nn(v,"Cannot apply @preDestroy decorator multiple times in the same class"),on=r,an=i.QC,cn=i.bU,un=i.XK,sn=i.mc,dn=i.i0,ln=i.FU,fn=i.KK,hn=i.PG,pn=i.$Z,yn=i.OZ,vn=i.Yi,gn=i.A$,bn=i.id,wn=i.WQ,_n=i._G,mn=i.F$,An=i.tt,Sn=i.KT,In=i.dU,Tn=i.lq,Dn=i.kr,Cn=i.E3,En=i.VK,xn=i.w,Nn=i.je,Mn=i.Nu,Rn=i.if,jn=i.Fz;export{an as AsyncContainerModule,cn as BindingScopeEnum,un as BindingTypeEnum,sn as Container,dn as ContainerModule,ln as LazyServiceIdentifier,fn as METADATA_KEY,hn as MetadataReader,pn as TargetTypeEnum,yn as createTaggedDecorator,vn as decorate,gn as getServiceIdentifierAsString,bn as id,wn as inject,_n as injectable,mn as multiBindToService,An as multiInject,Sn as named,In as namedConstraint,Tn as optional,Dn as postConstruct,Cn as preDestroy,En as tagged,xn as taggedConstraint,Nn as targetName,Mn as traverseAncerstors,Rn as typeConstraint,jn as unmanaged};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TCxPQUFPLFNBQVU5VSxFQUFRaWEsRUFBVy9TLEdBRWhDd1IsR0FBYTFZLEVBQVFpYSxFQUFXL1MsRUFEakIsSUFBSXRJLEVBQVMsR0FBNEIsR0FFNUQsQ0FDSixDQ05BLElBQUl1YyxHQUFjSixHQUFXLEdDQzdCLFNBQVNLLEdBQVc3ZSxHQUNoQixPQUFPLFNBQVV5RCxFQUFRaWEsRUFBVy9TLEdBRWhDd1IsR0FBYTFZLEVBQVFpYSxFQUFXL1MsRUFEakIsSUFBSXRJLEVBQVMsRUFBdUJyQyxHQUV2RCxDQUNKLENDUEEsU0FBUzhlLEdBQXVCQyxFQUFVamdCLEdBQ3RDLE9BQU8sV0FDSCxPQUFPLFNBQVUyRSxFQUFRdWIsR0FDckIsSUFBSWpkLEVBQVcsSUFBSU0sRUFBUzBjLEVBQVVDLEdBQ3RDLEdBQUkzZixRQUFRK2QsZUFBZTJCLEVBQVV0YixFQUFPWCxhQUN4QyxNQUFNLElBQUlwQixNQUFNNUMsR0FFcEJPLFFBQVFtZSxlQUFldUIsRUFBVWhkLEVBQVUwQixFQUFPWCxZQUN0RCxDQUNKLENBQ0osQ0NSQSxJQUFJbWMsR0FBZ0JILEdBQXVCLEUzQ2tDRSwwRTRDbEN6Q0ksR0FBYUosR0FBdUIsRTVDaUNFLHVFNkNsQy9CSyxHQUFlLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pbnZlcnNpZnkvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5L3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29uc3RhbnRzL21ldGFkYXRhX2tleXMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5L2V4dGVybmFsIG1vZHVsZSBcIkBpbnZlcnNpZnlqcy9jb21tb25cIiIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2lkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9iaW5kaW5ncy9iaW5kaW5nLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb25zdGFudHMvZXJyb3JfbXNncy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcGxhbm5pbmcvbWV0YWRhdGFfcmVhZGVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS9leHRlcm5hbCBtb2R1bGUgXCJAaW52ZXJzaWZ5anMvY29yZVwiIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9iaW5kaW5ncy9iaW5kaW5nX2NvdW50LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9leGNlcHRpb25zLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9jb250ZXh0LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9tZXRhZGF0YS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcGxhbm5pbmcvcGxhbi50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcGxhbm5pbmcvcmVmbGVjdGlvbl91dGlscy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcGxhbm5pbmcvcmVxdWVzdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcGxhbm5pbmcvcGxhbm5lci50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvYXN5bmMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3Njb3BlL3Njb3BlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9mYWN0b3J5X3R5cGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2JpbmRpbmdfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3Jlc29sdXRpb24vaW5zdGFudGlhdGlvbi50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcmVzb2x1dGlvbi9yZXNvbHZlci50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2NvbnN0cmFpbnRfaGVscGVycy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfd2hlbl9zeW50YXgudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3N5bnRheC9iaW5kaW5nX29uX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfd2hlbl9vbl9zeW50YXgudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3N5bnRheC9iaW5kaW5nX2luX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfaW5fd2hlbl9vbl9zeW50YXgudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3N5bnRheC9iaW5kaW5nX3RvX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL2NvbnRhaW5lcl9zbmFwc2hvdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL2xvb2t1cC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvY2xvbmFibGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2NvbnRhaW5lci9tb2R1bGVfYWN0aXZhdGlvbl9zdG9yZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL2NvbnRhaW5lci50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL2NvbnRhaW5lcl9tb2R1bGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vZGVjb3JhdG9yX3V0aWxzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9qcy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9pbmplY3RhYmxlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL3RhZ2dlZC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9uYW1lZC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9pbmplY3RfYmFzZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9pbmplY3QudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vb3B0aW9uYWwudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vdW5tYW5hZ2VkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL211bHRpX2luamVjdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi90YXJnZXRfbmFtZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3IudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vcG9zdF9jb25zdHJ1Y3QudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vcHJlX2Rlc3Ryb3kudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2ludmVyc2lmeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcmVxdWlyZSBzY29wZVxudmFyIF9fd2VicGFja19yZXF1aXJlX18gPSB7fTtcblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImV4cG9ydCB2YXIgTkFNRURfVEFHID0gJ25hbWVkJztcbmV4cG9ydCB2YXIgTkFNRV9UQUcgPSAnbmFtZSc7XG5leHBvcnQgdmFyIFVOTUFOQUdFRF9UQUcgPSAndW5tYW5hZ2VkJztcbmV4cG9ydCB2YXIgT1BUSU9OQUxfVEFHID0gJ29wdGlvbmFsJztcbmV4cG9ydCB2YXIgSU5KRUNUX1RBRyA9ICdpbmplY3QnO1xuZXhwb3J0IHZhciBNVUxUSV9JTkpFQ1RfVEFHID0gJ211bHRpX2luamVjdCc7XG5leHBvcnQgdmFyIFRBR0dFRCA9ICdpbnZlcnNpZnk6dGFnZ2VkJztcbmV4cG9ydCB2YXIgVEFHR0VEX1BST1AgPSAnaW52ZXJzaWZ5OnRhZ2dlZF9wcm9wcyc7XG5leHBvcnQgdmFyIFBBUkFNX1RZUEVTID0gJ2ludmVyc2lmeTpwYXJhbXR5cGVzJztcbmV4cG9ydCB2YXIgREVTSUdOX1BBUkFNX1RZUEVTID0gJ2Rlc2lnbjpwYXJhbXR5cGVzJztcbmV4cG9ydCB2YXIgUE9TVF9DT05TVFJVQ1QgPSAncG9zdF9jb25zdHJ1Y3QnO1xuZXhwb3J0IHZhciBQUkVfREVTVFJPWSA9ICdwcmVfZGVzdHJveSc7XG5mdW5jdGlvbiBnZXROb25DdXN0b21UYWdLZXlzKCkge1xuICAgIHJldHVybiBbXG4gICAgICAgIElOSkVDVF9UQUcsXG4gICAgICAgIE1VTFRJX0lOSkVDVF9UQUcsXG4gICAgICAgIE5BTUVfVEFHLFxuICAgICAgICBVTk1BTkFHRURfVEFHLFxuICAgICAgICBOQU1FRF9UQUcsXG4gICAgICAgIE9QVElPTkFMX1RBRyxcbiAgICBdO1xufVxuZXhwb3J0IHZhciBOT05fQ1VTVE9NX1RBR19LRVlTID0gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpO1xuIiwidmFyIHggPSAoeSkgPT4ge1xuXHR2YXIgeCA9IHt9OyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoeCwgeSk7IHJldHVybiB4XG59IFxudmFyIHkgPSAoeCkgPT4gKCgpID0+ICh4KSlcbmNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSB4KHsgW1wiTGF6eVNlcnZpY2VJZGVudGlmaWVyXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29tbW9uXzA4MWQ4YzA3X18uTGF6eVNlcnZpY2VJZGVudGlmaWVyKSB9KTsiLCJ2YXIgQmluZGluZ1Njb3BlRW51bSA9IHtcbiAgICBSZXF1ZXN0OiAnUmVxdWVzdCcsXG4gICAgU2luZ2xldG9uOiAnU2luZ2xldG9uJyxcbiAgICBUcmFuc2llbnQ6ICdUcmFuc2llbnQnLFxufTtcbnZhciBCaW5kaW5nVHlwZUVudW0gPSB7XG4gICAgQ29uc3RhbnRWYWx1ZTogJ0NvbnN0YW50VmFsdWUnLFxuICAgIENvbnN0cnVjdG9yOiAnQ29uc3RydWN0b3InLFxuICAgIER5bmFtaWNWYWx1ZTogJ0R5bmFtaWNWYWx1ZScsXG4gICAgRmFjdG9yeTogJ0ZhY3RvcnknLFxuICAgIEZ1bmN0aW9uOiAnRnVuY3Rpb24nLFxuICAgIEluc3RhbmNlOiAnSW5zdGFuY2UnLFxuICAgIEludmFsaWQ6ICdJbnZhbGlkJyxcbiAgICBQcm92aWRlcjogJ1Byb3ZpZGVyJyxcbn07XG52YXIgVGFyZ2V0VHlwZUVudW0gPSB7XG4gICAgQ2xhc3NQcm9wZXJ0eTogJ0NsYXNzUHJvcGVydHknLFxuICAgIENvbnN0cnVjdG9yQXJndW1lbnQ6ICdDb25zdHJ1Y3RvckFyZ3VtZW50JyxcbiAgICBWYXJpYWJsZTogJ1ZhcmlhYmxlJyxcbn07XG5leHBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0sIFRhcmdldFR5cGVFbnVtIH07XG4iLCJ2YXIgaWRDb3VudGVyID0gMDtcbmZ1bmN0aW9uIGlkKCkge1xuICAgIHJldHVybiBpZENvdW50ZXIrKztcbn1cbmV4cG9ydCB7IGlkIH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbnZhciBCaW5kaW5nID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nKHNlcnZpY2VJZGVudGlmaWVyLCBzY29wZSkge1xuICAgICAgICB0aGlzLmlkID0gaWQoKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXJ2aWNlSWRlbnRpZmllciA9IHNlcnZpY2VJZGVudGlmaWVyO1xuICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG4gICAgICAgIHRoaXMudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5JbnZhbGlkO1xuICAgICAgICB0aGlzLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAoX3JlcXVlc3QpIHsgcmV0dXJuIHRydWU7IH07XG4gICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25UeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5jYWNoZSA9IG51bGw7XG4gICAgICAgIHRoaXMuZmFjdG9yeSA9IG51bGw7XG4gICAgICAgIHRoaXMucHJvdmlkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLm9uQWN0aXZhdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMub25EZWFjdGl2YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmR5bmFtaWNWYWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIEJpbmRpbmcucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBuZXcgQmluZGluZyh0aGlzLnNlcnZpY2VJZGVudGlmaWVyLCB0aGlzLnNjb3BlKTtcbiAgICAgICAgY2xvbmUuYWN0aXZhdGVkID1cbiAgICAgICAgICAgIGNsb25lLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbiA/IHRoaXMuYWN0aXZhdGVkIDogZmFsc2U7XG4gICAgICAgIGNsb25lLmltcGxlbWVudGF0aW9uVHlwZSA9IHRoaXMuaW1wbGVtZW50YXRpb25UeXBlO1xuICAgICAgICBjbG9uZS5keW5hbWljVmFsdWUgPSB0aGlzLmR5bmFtaWNWYWx1ZTtcbiAgICAgICAgY2xvbmUuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgICBjbG9uZS50eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjbG9uZS5mYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuICAgICAgICBjbG9uZS5wcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgIGNsb25lLmNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XG4gICAgICAgIGNsb25lLm9uQWN0aXZhdGlvbiA9IHRoaXMub25BY3RpdmF0aW9uO1xuICAgICAgICBjbG9uZS5vbkRlYWN0aXZhdGlvbiA9IHRoaXMub25EZWFjdGl2YXRpb247XG4gICAgICAgIGNsb25lLmNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmc7XG59KCkpO1xuZXhwb3J0IHsgQmluZGluZyB9O1xuIiwiZXhwb3J0IHZhciBEVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SID0gJ0Nhbm5vdCBhcHBseSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IgbXVsdGlwbGUgdGltZXMuJztcbmV4cG9ydCB2YXIgRFVQTElDQVRFRF9NRVRBREFUQSA9ICdNZXRhZGF0YSBrZXkgd2FzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBwYXJhbWV0ZXI6JztcbmV4cG9ydCB2YXIgTlVMTF9BUkdVTUVOVCA9ICdOVUxMIGFyZ3VtZW50JztcbmV4cG9ydCB2YXIgS0VZX05PVF9GT1VORCA9ICdLZXkgTm90IEZvdW5kJztcbmV4cG9ydCB2YXIgQU1CSUdVT1VTX01BVENIID0gJ0FtYmlndW91cyBtYXRjaCBmb3VuZCBmb3Igc2VydmljZUlkZW50aWZpZXI6JztcbmV4cG9ydCB2YXIgQ0FOTk9UX1VOQklORCA9ICdDb3VsZCBub3QgdW5iaW5kIHNlcnZpY2VJZGVudGlmaWVyOic7XG5leHBvcnQgdmFyIE5PVF9SRUdJU1RFUkVEID0gJ05vIG1hdGNoaW5nIGJpbmRpbmdzIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IHZhciBUUllJTkdfVE9fUkVTT0xWRV9CSU5ESU5HUyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBcIlRyeWluZyB0byByZXNvbHZlIGJpbmRpbmdzIGZvciBcXFwiXCIuY29uY2F0KG5hbWUsIFwiXFxcIlwiKTsgfTtcbmV4cG9ydCB2YXIgVU5ERUZJTkVEX0lOSkVDVF9BTk5PVEFUSU9OID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gXCJAaW5qZWN0IGNhbGxlZCB3aXRoIHVuZGVmaW5lZCB0aGlzIGNvdWxkIG1lYW4gdGhhdCB0aGUgY2xhc3MgXCIuY29uY2F0KG5hbWUsIFwiIGhhcyBcIikgK1xuICAgICAgICAnYSBjaXJjdWxhciBkZXBlbmRlbmN5IHByb2JsZW0uIFlvdSBjYW4gdXNlIGEgTGF6eVNlcnZpY2VJZGVudGlmZXIgdG8gJyArXG4gICAgICAgICdvdmVyY29tZSB0aGlzIGxpbWl0YXRpb24uJztcbn07XG5leHBvcnQgdmFyIENJUkNVTEFSX0RFUEVOREVOQ1kgPSAnQ2lyY3VsYXIgZGVwZW5kZW5jeSBmb3VuZDonO1xuZXhwb3J0IHZhciBJTlZBTElEX0JJTkRJTkdfVFlQRSA9ICdJbnZhbGlkIGJpbmRpbmcgdHlwZTonO1xuZXhwb3J0IHZhciBOT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEUgPSAnTm8gc25hcHNob3QgYXZhaWxhYmxlIHRvIHJlc3RvcmUuJztcbmV4cG9ydCB2YXIgSU5WQUxJRF9NSURETEVXQVJFX1JFVFVSTiA9ICdJbnZhbGlkIHJldHVybiB0eXBlIGluIG1pZGRsZXdhcmUuIE1pZGRsZXdhcmUgbXVzdCByZXR1cm4hJztcbmV4cG9ydCB2YXIgSU5WQUxJRF9GVU5DVElPTl9CSU5ESU5HID0gJ1ZhbHVlIHByb3ZpZGVkIHRvIGZ1bmN0aW9uIGJpbmRpbmcgbXVzdCBiZSBhIGZ1bmN0aW9uISc7XG5leHBvcnQgdmFyIExBWllfSU5fU1lOQyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gXCJZb3UgYXJlIGF0dGVtcHRpbmcgdG8gY29uc3RydWN0IFwiLmNvbmNhdChrZXlUb1N0cmluZyhrZXkpLCBcIiBpbiBhIHN5bmNocm9ub3VzIHdheSBcIikgK1xuICAgICAgICAnYnV0IGl0IGhhcyBhc3luY2hyb25vdXMgZGVwZW5kZW5jaWVzLic7XG59O1xuZXhwb3J0IHZhciBJTlZBTElEX1RPX1NFTEZfVkFMVUUgPSAnVGhlIHRvU2VsZiBmdW5jdGlvbiBjYW4gb25seSBiZSBhcHBsaWVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyAnICtcbiAgICAndXNlZCBhcyBzZXJ2aWNlIGlkZW50aWZpZXInO1xuZXhwb3J0IHZhciBJTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04gPSAnVGhlIEBpbmplY3QgQG11bHRpSW5qZWN0IEB0YWdnZWQgYW5kIEBuYW1lZCBkZWNvcmF0b3JzICcgK1xuICAgICdtdXN0IGJlIGFwcGxpZWQgdG8gdGhlIHBhcmFtZXRlcnMgb2YgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhIGNsYXNzIHByb3BlcnR5Lic7XG5leHBvcnQgdmFyIEFSR1VNRU5UU19MRU5HVEhfTUlTTUFUQ0ggPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiAnVGhlIG51bWJlciBvZiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgJyArXG4gICAgICAgIFwiXCIuY29uY2F0KG5hbWUsIFwiIG11c3QgYmUgPj0gdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiBpdHMgYmFzZSBjbGFzcy5cIik7XG59O1xuZXhwb3J0IHZhciBDT05UQUlORVJfT1BUSU9OU19NVVNUX0JFX0FOX09CSkVDVCA9ICdJbnZhbGlkIENvbnRhaW5lciBjb25zdHJ1Y3RvciBhcmd1bWVudC4gQ29udGFpbmVyIG9wdGlvbnMgJyArXG4gICAgJ211c3QgYmUgYW4gb2JqZWN0Lic7XG5leHBvcnQgdmFyIENPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfREVGQVVMVF9TQ09QRSA9ICdJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIERlZmF1bHQgc2NvcGUgbXVzdCAnICtcbiAgICAnYmUgYSBzdHJpbmcgKFwic2luZ2xldG9uXCIgb3IgXCJ0cmFuc2llbnRcIikuJztcbmV4cG9ydCB2YXIgQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9BVVRPX0JJTkRfSU5KRUNUQUJMRSA9ICdJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIEF1dG8gYmluZCBpbmplY3RhYmxlIG11c3QgJyArICdiZSBhIGJvb2xlYW4nO1xuZXhwb3J0IHZhciBDT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSyA9ICdJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIFNraXAgYmFzZSBjaGVjayBtdXN0ICcgKyAnYmUgYSBib29sZWFuJztcbmV4cG9ydCB2YXIgTVVMVElQTEVfUFJFX0RFU1RST1lfTUVUSE9EUyA9ICdDYW5ub3QgYXBwbHkgQHByZURlc3Ryb3kgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGNsYXNzJztcbmV4cG9ydCB2YXIgTVVMVElQTEVfUE9TVF9DT05TVFJVQ1RfTUVUSE9EUyA9ICdDYW5ub3QgYXBwbHkgQHBvc3RDb25zdHJ1Y3QgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGNsYXNzJztcbmV4cG9ydCB2YXIgQVNZTkNfVU5CSU5EX1JFUVVJUkVEID0gJ0F0dGVtcHRpbmcgdG8gdW5iaW5kIGRlcGVuZGVuY3kgd2l0aCBhc3luY2hyb25vdXMgZGVzdHJ1Y3Rpb24gKEBwcmVEZXN0cm95IG9yIG9uRGVhY3RpdmF0aW9uKSc7XG5leHBvcnQgdmFyIFBPU1RfQ09OU1RSVUNUX0VSUk9SID0gZnVuY3Rpb24gKGNsYXp6LCBlcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gXCJAcG9zdENvbnN0cnVjdCBlcnJvciBpbiBjbGFzcyBcIi5jb25jYXQoY2xhenosIFwiOiBcIikuY29uY2F0KGVycm9yTWVzc2FnZSk7XG59O1xuZXhwb3J0IHZhciBQUkVfREVTVFJPWV9FUlJPUiA9IGZ1bmN0aW9uIChjbGF6eiwgZXJyb3JNZXNzYWdlKSB7XG4gICAgcmV0dXJuIFwiQHByZURlc3Ryb3kgZXJyb3IgaW4gY2xhc3MgXCIuY29uY2F0KGNsYXp6LCBcIjogXCIpLmNvbmNhdChlcnJvck1lc3NhZ2UpO1xufTtcbmV4cG9ydCB2YXIgT05fREVBQ1RJVkFUSU9OX0VSUk9SID0gZnVuY3Rpb24gKGNsYXp6LCBlcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gXCJvbkRlYWN0aXZhdGlvbigpIGVycm9yIGluIGNsYXNzIFwiLmNvbmNhdChjbGF6eiwgXCI6IFwiKS5jb25jYXQoZXJyb3JNZXNzYWdlKTtcbn07XG5leHBvcnQgdmFyIENJUkNVTEFSX0RFUEVOREVOQ1lfSU5fRkFDVE9SWSA9IGZ1bmN0aW9uIChmYWN0b3J5VHlwZSwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gXCJJdCBsb29rcyBsaWtlIHRoZXJlIGlzIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpbiBvbmUgb2YgdGhlICdcIi5jb25jYXQoZmFjdG9yeVR5cGUsIFwiJyBiaW5kaW5ncy4gUGxlYXNlIGludmVzdGlnYXRlIGJpbmRpbmdzIHdpdGggXCIpICtcbiAgICAgICAgXCJzZXJ2aWNlIGlkZW50aWZpZXIgJ1wiLmNvbmNhdChzZXJ2aWNlSWRlbnRpZmllciwgXCInLlwiKTtcbn07XG5leHBvcnQgdmFyIFNUQUNLX09WRVJGTE9XID0gJ01heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkJztcbmZ1bmN0aW9uIGtleVRvU3RyaW5nKGtleSkge1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBcIltmdW5jdGlvbi9jbGFzcyBcIi5jb25jYXQoa2V5Lm5hbWUgfHwgJzxhbm9ueW1vdXM+JywgXCJdXCIpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIGtleS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gXCInXCIuY29uY2F0KGtleSwgXCInXCIpO1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbnZhciBNZXRhZGF0YVJlYWRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWV0YWRhdGFSZWFkZXIoKSB7XG4gICAgfVxuICAgIE1ldGFkYXRhUmVhZGVyLnByb3RvdHlwZS5nZXRDb25zdHJ1Y3Rvck1ldGFkYXRhID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yRnVuYykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhID0gKF9hID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCBjb25zdHJ1Y3RvckZ1bmMpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdmFyIHVzZXJHZW5lcmF0ZWRNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTUVUQURBVEFfS0VZLlRBR0dFRCwgY29uc3RydWN0b3JGdW5jKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGE6IGNvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGEsXG4gICAgICAgICAgICB1c2VyR2VuZXJhdGVkTWV0YWRhdGE6IHVzZXJHZW5lcmF0ZWRNZXRhZGF0YSAhPT0gbnVsbCAmJiB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgIT09IHZvaWQgMCA/IHVzZXJHZW5lcmF0ZWRNZXRhZGF0YSA6IHt9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgTWV0YWRhdGFSZWFkZXIucHJvdG90eXBlLmdldFByb3BlcnRpZXNNZXRhZGF0YSA9IGZ1bmN0aW9uIChjb25zdHJ1Y3RvckZ1bmMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgdXNlckdlbmVyYXRlZE1ldGFkYXRhID0gKF9hID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGNvbnN0cnVjdG9yRnVuYykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHt9O1xuICAgICAgICByZXR1cm4gdXNlckdlbmVyYXRlZE1ldGFkYXRhO1xuICAgIH07XG4gICAgcmV0dXJuIE1ldGFkYXRhUmVhZGVyO1xufSgpKTtcbmV4cG9ydCB7IE1ldGFkYXRhUmVhZGVyIH07XG4iLCJ2YXIgeCA9ICh5KSA9PiB7XG5cdHZhciB4ID0ge307IF9fd2VicGFja19yZXF1aXJlX18uZCh4LCB5KTsgcmV0dXJuIHhcbn0gXG52YXIgeSA9ICh4KSA9PiAoKCkgPT4gKHgpKVxuY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHgoeyBbXCJDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmRcIl06ICgpID0+IChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18uQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kKSwgW1wiTGVnYWN5VGFyZ2V0SW1wbFwiXTogKCkgPT4gKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvcmVfYzA4Y2Y0YTFfXy5MZWdhY3lUYXJnZXRJbXBsKSwgW1wiZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGFcIl06ICgpID0+IChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18uZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEpLCBbXCJnZXRUYXJnZXRzXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29yZV9jMDhjZjRhMV9fLmdldFRhcmdldHMpIH0pOyIsImV4cG9ydCB2YXIgQmluZGluZ0NvdW50O1xuKGZ1bmN0aW9uIChCaW5kaW5nQ291bnQpIHtcbiAgICBCaW5kaW5nQ291bnRbQmluZGluZ0NvdW50W1wiTXVsdGlwbGVCaW5kaW5nc0F2YWlsYWJsZVwiXSA9IDJdID0gXCJNdWx0aXBsZUJpbmRpbmdzQXZhaWxhYmxlXCI7XG4gICAgQmluZGluZ0NvdW50W0JpbmRpbmdDb3VudFtcIk5vQmluZGluZ3NBdmFpbGFibGVcIl0gPSAwXSA9IFwiTm9CaW5kaW5nc0F2YWlsYWJsZVwiO1xuICAgIEJpbmRpbmdDb3VudFtCaW5kaW5nQ291bnRbXCJPbmx5T25lQmluZGluZ0F2YWlsYWJsZVwiXSA9IDFdID0gXCJPbmx5T25lQmluZGluZ0F2YWlsYWJsZVwiO1xufSkoQmluZGluZ0NvdW50IHx8IChCaW5kaW5nQ291bnQgPSB7fSkpO1xuIiwiaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5leHBvcnQgZnVuY3Rpb24gaXNTdGFja092ZXJmbG93RXhjZXB0aW9uKGVycm9yKSB7XG4gICAgcmV0dXJuIChlcnJvciBpbnN0YW5jZW9mIFJhbmdlRXJyb3IgfHxcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9PT0gRVJST1JfTVNHUy5TVEFDS19PVkVSRkxPVyk7XG59XG5leHBvcnQgdmFyIHRyeUFuZFRocm93RXJyb3JJZlN0YWNrT3ZlcmZsb3cgPSBmdW5jdGlvbiAoZm4sIGVycm9yQ2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZm4oKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24oZXJyb3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvckNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbiIsImltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuZnVuY3Rpb24gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2Ygc2VydmljZUlkZW50aWZpZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VJZGVudGlmaWVyLm5hbWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBzZXJ2aWNlSWRlbnRpZmllciA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VJZGVudGlmaWVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gc2VydmljZUlkZW50aWZpZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyKGNvbnRhaW5lciwgc2VydmljZUlkZW50aWZpZXIsIGdldEJpbmRpbmdzKSB7XG4gICAgdmFyIHJlZ2lzdGVyZWRCaW5kaW5nc0xpc3QgPSAnJztcbiAgICB2YXIgcmVnaXN0ZXJlZEJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgaWYgKHJlZ2lzdGVyZWRCaW5kaW5ncy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9ICdcXG5SZWdpc3RlcmVkIGJpbmRpbmdzOic7XG4gICAgICAgIHJlZ2lzdGVyZWRCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9ICdPYmplY3QnO1xuICAgICAgICAgICAgaWYgKGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gXCJcIi5jb25jYXQocmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCwgXCJcXG4gXCIpLmNvbmNhdChuYW1lKTtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nLmNvbnN0cmFpbnQubWV0YURhdGEpIHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gXCJcIi5jb25jYXQocmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCwgXCIgLSBcIikuY29uY2F0KGJpbmRpbmcuY29uc3RyYWludC5tZXRhRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdDtcbn1cbmZ1bmN0aW9uIGFscmVhZHlEZXBlbmRlbmN5Q2hhaW4ocmVxdWVzdCwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICBpZiAocmVxdWVzdC5wYXJlbnRSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyID09PSBzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBhbHJlYWR5RGVwZW5kZW5jeUNoYWluKHJlcXVlc3QucGFyZW50UmVxdWVzdCwgc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlcGVuZGVuY3lDaGFpblRvU3RyaW5nKHJlcXVlc3QpIHtcbiAgICBmdW5jdGlvbiBfY3JlYXRlU3RyaW5nQXJyKHJlcSwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgeyByZXN1bHQgPSBbXTsgfVxuICAgICAgICB2YXIgc2VydmljZUlkZW50aWZpZXIgPSBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHJlcS5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJlc3VsdC5wdXNoKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKHJlcS5wYXJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gX2NyZWF0ZVN0cmluZ0FycihyZXEucGFyZW50UmVxdWVzdCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc3RyaW5nQXJyID0gX2NyZWF0ZVN0cmluZ0FycihyZXF1ZXN0KTtcbiAgICByZXR1cm4gc3RyaW5nQXJyLnJldmVyc2UoKS5qb2luKCcgLS0+ICcpO1xufVxuZnVuY3Rpb24gY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24ocmVxdWVzdCkge1xuICAgIHJlcXVlc3QuY2hpbGRSZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZFJlcXVlc3QpIHtcbiAgICAgICAgaWYgKGFscmVhZHlEZXBlbmRlbmN5Q2hhaW4ocmVxdWVzdCwgY2hpbGRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdmFyIHNlcnZpY2VzID0gZGVwZW5kZW5jeUNoYWluVG9TdHJpbmcoY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChFUlJPUl9NU0dTLkNJUkNVTEFSX0RFUEVOREVOQ1ksIFwiIFwiKS5jb25jYXQoc2VydmljZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uKGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxpc3RNZXRhZGF0YUZvclRhcmdldChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgdGFyZ2V0KSB7XG4gICAgaWYgKHRhcmdldC5pc1RhZ2dlZCgpIHx8IHRhcmdldC5pc05hbWVkKCkpIHtcbiAgICAgICAgdmFyIG1fMSA9ICcnO1xuICAgICAgICB2YXIgbmFtZWRUYWcgPSB0YXJnZXQuZ2V0TmFtZWRUYWcoKTtcbiAgICAgICAgdmFyIG90aGVyVGFncyA9IHRhcmdldC5nZXRDdXN0b21UYWdzKCk7XG4gICAgICAgIGlmIChuYW1lZFRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbV8xICs9IHN0cmluZ2lmeU1ldGFkYXRhKG5hbWVkVGFnKSArICdcXG4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvdGhlclRhZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICAgIG90aGVyVGFncy5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgICAgICAgICBtXzEgKz0gc3RyaW5naWZ5TWV0YWRhdGEodGFnKSArICdcXG4nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiIFwiLmNvbmNhdChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgXCJcXG4gXCIpLmNvbmNhdChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgXCIgLSBcIikuY29uY2F0KG1fMSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gXCIgXCIuY29uY2F0KHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRGdW5jdGlvbk5hbWUoZnVuYykge1xuICAgIGlmIChmdW5jLm5hbWUgIT0gbnVsbCAmJiBmdW5jLm5hbWUgIT09ICcnKSB7XG4gICAgICAgIHJldHVybiBmdW5jLm5hbWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgbmFtZV8xID0gZnVuYy50b1N0cmluZygpO1xuICAgICAgICB2YXIgbWF0Y2ggPSBuYW1lXzEubWF0Y2goL15mdW5jdGlvblxccyooW15cXHMoXSspLyk7XG4gICAgICAgIHJldHVybiBtYXRjaCA9PT0gbnVsbFxuICAgICAgICAgICAgPyBcIkFub255bW91cyBmdW5jdGlvbjogXCIuY29uY2F0KG5hbWVfMSlcbiAgICAgICAgICAgIDogbWF0Y2hbMV07XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0U3ltYm9sRGVzY3JpcHRpb24oc3ltYm9sKSB7XG4gICAgcmV0dXJuIHN5bWJvbC50b1N0cmluZygpLnNsaWNlKDcsIC0xKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeU1ldGFkYXRhKG1ldGFkYXRhKSB7XG4gICAgcmV0dXJuIFwie1xcXCJrZXlcXFwiOlxcXCJcIi5jb25jYXQobWV0YWRhdGEua2V5LnRvU3RyaW5nKCksIFwiXFxcIixcXFwidmFsdWVcXFwiOlxcXCJcIikuY29uY2F0KG1ldGFkYXRhLnZhbHVlLnRvU3RyaW5nKCksIFwiXFxcIn1cIik7XG59XG5leHBvcnQgeyBnZXRGdW5jdGlvbk5hbWUsIGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcsIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllciwgbGlzdE1ldGFkYXRhRm9yVGFyZ2V0LCBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbiwgZ2V0U3ltYm9sRGVzY3JpcHRpb24sIH07XG4iLCJpbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbnZhciBDb250ZXh0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250ZXh0KGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmlkID0gaWQoKTtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgfVxuICAgIENvbnRleHQucHJvdG90eXBlLmFkZFBsYW4gPSBmdW5jdGlvbiAocGxhbikge1xuICAgICAgICB0aGlzLnBsYW4gPSBwbGFuO1xuICAgIH07XG4gICAgQ29udGV4dC5wcm90b3R5cGUuc2V0Q3VycmVudFJlcXVlc3QgPSBmdW5jdGlvbiAoY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IGN1cnJlbnRSZXF1ZXN0O1xuICAgIH07XG4gICAgcmV0dXJuIENvbnRleHQ7XG59KCkpO1xuZXhwb3J0IHsgQ29udGV4dCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbnZhciBNZXRhZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTWV0YWRhdGEoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBNZXRhZGF0YS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gTUVUQURBVEFfS0VZLk5BTUVEX1RBRykge1xuICAgICAgICAgICAgcmV0dXJuIFwibmFtZWQ6IFwiLmNvbmNhdChTdHJpbmcodGhpcy52YWx1ZSkudG9TdHJpbmcoKSwgXCIgXCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFwidGFnZ2VkOiB7IGtleTpcIi5jb25jYXQodGhpcy5rZXkudG9TdHJpbmcoKSwgXCIsIHZhbHVlOiBcIikuY29uY2F0KFN0cmluZyh0aGlzLnZhbHVlKSwgXCIgfVwiKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIE1ldGFkYXRhO1xufSgpKTtcbmV4cG9ydCB7IE1ldGFkYXRhIH07XG4iLCJ2YXIgUGxhbiA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGxhbihwYXJlbnRDb250ZXh0LCByb290UmVxdWVzdCkge1xuICAgICAgICB0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICB0aGlzLnJvb3RSZXF1ZXN0ID0gcm9vdFJlcXVlc3Q7XG4gICAgfVxuICAgIHJldHVybiBQbGFuO1xufSgpKTtcbmV4cG9ydCB7IFBsYW4gfTtcbiIsImltcG9ydCB7IGdldFRhcmdldHMgfSBmcm9tICdAaW52ZXJzaWZ5anMvY29yZSc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlcikoZnVuYyk7XG59XG5mdW5jdGlvbiBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICB2YXIgYmFzZUNvbnN0cnVjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmMucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICBpZiAoYmFzZUNvbnN0cnVjdG9yICE9PSBPYmplY3QpIHtcbiAgICAgICAgdmFyIHRhcmdldHMgPSBnZXRUYXJnZXRzKG1ldGFkYXRhUmVhZGVyKShiYXNlQ29uc3RydWN0b3IpO1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSB0YXJnZXRzLm1hcChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgcmV0dXJuIHQubWV0YWRhdGEuZmlsdGVyKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLmtleSA9PT0gTUVUQURBVEFfS0VZLlVOTUFOQUdFRF9UQUc7IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHVubWFuYWdlZENvdW50ID0gW10uY29uY2F0LmFwcGx5KFtdLCBtZXRhZGF0YSkubGVuZ3RoO1xuICAgICAgICB2YXIgZGVwZW5kZW5jeUNvdW50ID0gdGFyZ2V0cy5sZW5ndGggLSB1bm1hbmFnZWRDb3VudDtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3lDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmN5Q291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50KG1ldGFkYXRhUmVhZGVyLCBiYXNlQ29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5leHBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCwgZ2V0RnVuY3Rpb25OYW1lIH07XG4iLCJpbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbnZhciBSZXF1ZXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBSZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCBwYXJlbnRDb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCBiaW5kaW5ncywgdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZCgpO1xuICAgICAgICB0aGlzLnNlcnZpY2VJZGVudGlmaWVyID0gc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgIHRoaXMucGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHQ7XG4gICAgICAgIHRoaXMucGFyZW50UmVxdWVzdCA9IHBhcmVudFJlcXVlc3Q7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICB0aGlzLmNoaWxkUmVxdWVzdHMgPSBbXTtcbiAgICAgICAgdGhpcy5iaW5kaW5ncyA9IEFycmF5LmlzQXJyYXkoYmluZGluZ3MpID8gYmluZGluZ3MgOiBbYmluZGluZ3NdO1xuICAgICAgICB0aGlzLnJlcXVlc3RTY29wZSA9IHBhcmVudFJlcXVlc3QgPT09IG51bGwgPyBuZXcgTWFwKCkgOiBudWxsO1xuICAgIH1cbiAgICBSZXF1ZXN0LnByb3RvdHlwZS5hZGRDaGlsZFJlcXVlc3QgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmdzLCB0YXJnZXQpIHtcbiAgICAgICAgdmFyIGNoaWxkID0gbmV3IFJlcXVlc3Qoc2VydmljZUlkZW50aWZpZXIsIHRoaXMucGFyZW50Q29udGV4dCwgdGhpcywgYmluZGluZ3MsIHRhcmdldCk7XG4gICAgICAgIHRoaXMuY2hpbGRSZXF1ZXN0cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG4gICAgcmV0dXJuIFJlcXVlc3Q7XG59KCkpO1xuZXhwb3J0IHsgUmVxdWVzdCB9O1xuIiwiaW1wb3J0IHsgQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kLCBnZXRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21MZWdhY3lNZXRhZGF0YSwgTGVnYWN5VGFyZ2V0SW1wbCBhcyBUYXJnZXRJbXBsLCB9IGZyb20gJ0BpbnZlcnNpZnlqcy9jb3JlJztcbmltcG9ydCB7IEJpbmRpbmdDb3VudCB9IGZyb20gJy4uL2JpbmRpbmdzL2JpbmRpbmdfY291bnQnO1xuaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgaXNTdGFja092ZXJmbG93RXhjZXB0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbiwgZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZywgbGlzdE1ldGFkYXRhRm9yVGFyZ2V0LCBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIsIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YSc7XG5pbXBvcnQgeyBQbGFuIH0gZnJvbSAnLi9wbGFuJztcbmltcG9ydCB7IGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCwgZ2V0RGVwZW5kZW5jaWVzLCBnZXRGdW5jdGlvbk5hbWUsIH0gZnJvbSAnLi9yZWZsZWN0aW9uX3V0aWxzJztcbmltcG9ydCB7IFJlcXVlc3QgfSBmcm9tICcuL3JlcXVlc3QnO1xuZnVuY3Rpb24gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY250bnIpIHtcbiAgICByZXR1cm4gY250bnIuX2JpbmRpbmdEaWN0aW9uYXJ5O1xufVxuZnVuY3Rpb24gX2NyZWF0ZVRhcmdldChpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwgbmFtZSwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBtZXRhZGF0YUxpc3QgPSBfZ2V0VGFyZ2V0TWV0YWRhdGEoaXNNdWx0aUluamVjdCwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgIHZhciBjbGFzc0VsZW1lbnRNZXRhZGF0YSA9IGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhKG1ldGFkYXRhTGlzdCk7XG4gICAgaWYgKGNsYXNzRWxlbWVudE1ldGFkYXRhLmtpbmQgPT09IENsYXNzRWxlbWVudE1ldGFkYXRhS2luZC51bm1hbmFnZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1ldGFkYXRhIHdoZW4gY3JlYXRpbmcgdGFyZ2V0Jyk7XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBuZXcgVGFyZ2V0SW1wbChuYW1lLCBjbGFzc0VsZW1lbnRNZXRhZGF0YSwgdGFyZ2V0VHlwZSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF9nZXRBY3RpdmVCaW5kaW5ncyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgdGFyZ2V0KSB7XG4gICAgdmFyIGJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGV4dC5jb250YWluZXIsIHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgdmFyIGFjdGl2ZUJpbmRpbmdzID0gW107XG4gICAgaWYgKGJpbmRpbmdzLmxlbmd0aCA9PT0gQmluZGluZ0NvdW50Lk5vQmluZGluZ3NBdmFpbGFibGUgJiZcbiAgICAgICAgY29udGV4dC5jb250YWluZXIub3B0aW9ucy5hdXRvQmluZEluamVjdGFibGUgPT09IHRydWUgJiZcbiAgICAgICAgdHlwZW9mIHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICBtZXRhZGF0YVJlYWRlci5nZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKHRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcilcbiAgICAgICAgICAgIC5jb21waWxlckdlbmVyYXRlZE1ldGFkYXRhKSB7XG4gICAgICAgIGNvbnRleHQuY29udGFpbmVyLmJpbmQodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKS50b1NlbGYoKTtcbiAgICAgICAgYmluZGluZ3MgPSBnZXRCaW5kaW5ncyhjb250ZXh0LmNvbnRhaW5lciwgdGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgaWYgKCFhdm9pZENvbnN0cmFpbnRzKSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ3MuZmlsdGVyKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIHBhcmVudFJlcXVlc3QsIGJpbmRpbmcsIHRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm4gYmluZGluZy5jb25zdHJhaW50KHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gYmluZGluZ3M7XG4gICAgfVxuICAgIF92YWxpZGF0ZUFjdGl2ZUJpbmRpbmdDb3VudCh0YXJnZXQuc2VydmljZUlkZW50aWZpZXIsIGFjdGl2ZUJpbmRpbmdzLCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQsIGNvbnRleHQuY29udGFpbmVyKTtcbiAgICByZXR1cm4gYWN0aXZlQmluZGluZ3M7XG59XG5mdW5jdGlvbiBfZ2V0VGFyZ2V0TWV0YWRhdGEoaXNNdWx0aUluamVjdCwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgbWV0YWRhdGFLZXkgPSBpc011bHRpSW5qZWN0XG4gICAgICAgID8gTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUdcbiAgICAgICAgOiBNRVRBREFUQV9LRVkuSU5KRUNUX1RBRztcbiAgICB2YXIgbWV0YWRhdGFMaXN0ID0gW1xuICAgICAgICBuZXcgTWV0YWRhdGEobWV0YWRhdGFLZXksIHNlcnZpY2VJZGVudGlmaWVyKSxcbiAgICBdO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXRhZGF0YUxpc3QucHVzaChuZXcgTWV0YWRhdGEoa2V5LCB2YWx1ZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGFMaXN0O1xufVxuZnVuY3Rpb24gX3ZhbGlkYXRlQWN0aXZlQmluZGluZ0NvdW50KHNlcnZpY2VJZGVudGlmaWVyLCBiaW5kaW5ncywgcGFyZW50UmVxdWVzdCwgdGFyZ2V0LCBjb250YWluZXIpIHtcbiAgICBzd2l0Y2ggKGJpbmRpbmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIEJpbmRpbmdDb3VudC5Ob0JpbmRpbmdzQXZhaWxhYmxlOlxuICAgICAgICAgICAgaWYgKHRhcmdldC5pc09wdGlvbmFsKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VydmljZUlkZW50aWZpZXJTdHJpbmcgPSBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gRVJST1JfTVNHUy5OT1RfUkVHSVNURVJFRDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gbGlzdE1ldGFkYXRhRm9yVGFyZ2V0KHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIG1zZyArPSBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgZ2V0QmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBcIlxcblwiLmNvbmNhdChFUlJPUl9NU0dTLlRSWUlOR19UT19SRVNPTFZFX0JJTkRJTkdTKGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcocGFyZW50UmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcikpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGNhc2UgQmluZGluZ0NvdW50Lk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlOlxuICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICBjYXNlIEJpbmRpbmdDb3VudC5NdWx0aXBsZUJpbmRpbmdzQXZhaWxhYmxlOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNBcnJheSgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiXCIuY29uY2F0KEVSUk9SX01TR1MuQU1CSUdVT1VTX01BVENILCBcIiBcIikuY29uY2F0KHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nKTtcbiAgICAgICAgICAgICAgICBtc2cgKz0gbGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyKGNvbnRhaW5lciwgc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIGdldEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5ncztcbiAgICAgICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBfY3JlYXRlU3ViUmVxdWVzdHMobWV0YWRhdGFSZWFkZXIsIGF2b2lkQ29uc3RyYWludHMsIHNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQpIHtcbiAgICB2YXIgYWN0aXZlQmluZGluZ3M7XG4gICAgdmFyIGNoaWxkUmVxdWVzdDtcbiAgICBpZiAocGFyZW50UmVxdWVzdCA9PT0gbnVsbCkge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IF9nZXRBY3RpdmVCaW5kaW5ncyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgY29udGV4dCwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgY2hpbGRSZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIGFjdGl2ZUJpbmRpbmdzLCB0YXJnZXQpO1xuICAgICAgICB2YXIgdGhlUGxhbiA9IG5ldyBQbGFuKGNvbnRleHQsIGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIGNvbnRleHQuYWRkUGxhbih0aGVQbGFuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQpO1xuICAgICAgICBjaGlsZFJlcXVlc3QgPSBwYXJlbnRSZXF1ZXN0LmFkZENoaWxkUmVxdWVzdCh0YXJnZXQuc2VydmljZUlkZW50aWZpZXIsIGFjdGl2ZUJpbmRpbmdzLCB0YXJnZXQpO1xuICAgIH1cbiAgICBhY3RpdmVCaW5kaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgIHZhciBzdWJDaGlsZFJlcXVlc3QgPSBudWxsO1xuICAgICAgICBpZiAodGFyZ2V0LmlzQXJyYXkoKSkge1xuICAgICAgICAgICAgc3ViQ2hpbGRSZXF1ZXN0ID0gY2hpbGRSZXF1ZXN0LmFkZENoaWxkUmVxdWVzdChiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyLCBiaW5kaW5nLCB0YXJnZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGJpbmRpbmcuY2FjaGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJDaGlsZFJlcXVlc3QgPSBjaGlsZFJlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJpbmRpbmcudHlwZSA9PT0gQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlICYmXG4gICAgICAgICAgICBiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhtZXRhZGF0YVJlYWRlciwgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY29udGFpbmVyLm9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZhciBiYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQgPSBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmxlbmd0aCA8IGJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3IgPSBFUlJPUl9NU0dTLkFSR1VNRU5UU19MRU5HVEhfTUlTTUFUQ0goZ2V0RnVuY3Rpb25OYW1lKGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmZvckVhY2goZnVuY3Rpb24gKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICAgICAgICBfY3JlYXRlU3ViUmVxdWVzdHMobWV0YWRhdGFSZWFkZXIsIGZhbHNlLCBkZXBlbmRlbmN5LnNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBzdWJDaGlsZFJlcXVlc3QsIGRlcGVuZGVuY3kpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldEJpbmRpbmdzKGNvbnRhaW5lciwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICB2YXIgYmluZGluZ3MgPSBbXTtcbiAgICB2YXIgYmluZGluZ0RpY3Rpb25hcnkgPSBnZXRCaW5kaW5nRGljdGlvbmFyeShjb250YWluZXIpO1xuICAgIGlmIChiaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgIGJpbmRpbmdzID0gYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29udGFpbmVyLnBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKGNvbnRhaW5lci5wYXJlbnQsIHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRpbmdzO1xufVxuZnVuY3Rpb24gcGxhbihtZXRhZGF0YVJlYWRlciwgY29udGFpbmVyLCBpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSwgYXZvaWRDb25zdHJhaW50cykge1xuICAgIGlmIChhdm9pZENvbnN0cmFpbnRzID09PSB2b2lkIDApIHsgYXZvaWRDb25zdHJhaW50cyA9IGZhbHNlOyB9XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dChjb250YWluZXIpO1xuICAgIHZhciB0YXJnZXQgPSBfY3JlYXRlVGFyZ2V0KGlzTXVsdGlJbmplY3QsIHRhcmdldFR5cGUsIHNlcnZpY2VJZGVudGlmaWVyLCAnJywga2V5LCB2YWx1ZSk7XG4gICAgdHJ5IHtcbiAgICAgICAgX2NyZWF0ZVN1YlJlcXVlc3RzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBzZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgbnVsbCwgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNTdGFja092ZXJmbG93RXhjZXB0aW9uKGVycm9yKSkge1xuICAgICAgICAgICAgY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24oY29udGV4dC5wbGFuLnJvb3RSZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVNb2NrUmVxdWVzdChjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgdmFyIG1ldGFkYXRhTGlzdCA9IF9nZXRUYXJnZXRNZXRhZGF0YShmYWxzZSwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgIHZhciBjbGFzc0VsZW1lbnRNZXRhZGF0YSA9IGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhKG1ldGFkYXRhTGlzdCk7XG4gICAgaWYgKGNsYXNzRWxlbWVudE1ldGFkYXRhLmtpbmQgPT09IENsYXNzRWxlbWVudE1ldGFkYXRhS2luZC51bm1hbmFnZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1ldGFkYXRhIHdoZW4gY3JlYXRpbmcgdGFyZ2V0Jyk7XG4gICAgfVxuICAgIHZhciB0YXJnZXQgPSBuZXcgVGFyZ2V0SW1wbCgnJywgY2xhc3NFbGVtZW50TWV0YWRhdGEsICdWYXJpYWJsZScpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQoY29udGFpbmVyKTtcbiAgICB2YXIgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBudWxsLCBbXSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gcmVxdWVzdDtcbn1cbmV4cG9ydCB7IHBsYW4sIGNyZWF0ZU1vY2tSZXF1ZXN0LCBnZXRCaW5kaW5nRGljdGlvbmFyeSB9O1xuIiwiZnVuY3Rpb24gaXNQcm9taXNlKG9iamVjdCkge1xuICAgIHZhciBpc09iamVjdE9yRnVuY3Rpb24gPSAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB8fFxuICAgICAgICB0eXBlb2Ygb2JqZWN0ID09PSAnZnVuY3Rpb24nO1xuICAgIHJldHVybiAoaXNPYmplY3RPckZ1bmN0aW9uICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5mdW5jdGlvbiBpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZShvYmplY3QpIHtcbiAgICBpZiAoaXNQcm9taXNlKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9iamVjdCkgJiYgb2JqZWN0LnNvbWUoaXNQcm9taXNlKTtcbn1cbmV4cG9ydCB7IGlzUHJvbWlzZSwgaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UgfTtcbiIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG5pbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi4vdXRpbHMvYXN5bmMnO1xuZXhwb3J0IHZhciB0cnlHZXRGcm9tU2NvcGUgPSBmdW5jdGlvbiAocmVxdWVzdFNjb3BlLCBiaW5kaW5nKSB7XG4gICAgaWYgKGJpbmRpbmcuc2NvcGUgPT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uICYmIGJpbmRpbmcuYWN0aXZhdGVkKSB7XG4gICAgICAgIHJldHVybiBiaW5kaW5nLmNhY2hlO1xuICAgIH1cbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0ICYmXG4gICAgICAgIHJlcXVlc3RTY29wZS5oYXMoYmluZGluZy5pZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZS5nZXQoYmluZGluZy5pZCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufTtcbmV4cG9ydCB2YXIgc2F2ZVRvU2NvcGUgPSBmdW5jdGlvbiAocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXN1bHQpIHtcbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b24pIHtcbiAgICAgICAgX3NhdmVUb1NpbmdsZXRvblNjb3BlKGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgfVxuICAgIGlmIChiaW5kaW5nLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3QpIHtcbiAgICAgICAgX3NhdmVUb1JlcXVlc3RTY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgfVxufTtcbnZhciBfc2F2ZVRvUmVxdWVzdFNjb3BlID0gZnVuY3Rpb24gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzdWx0KSB7XG4gICAgaWYgKCFyZXF1ZXN0U2NvcGUuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgIHJlcXVlc3RTY29wZS5zZXQoYmluZGluZy5pZCwgcmVzdWx0KTtcbiAgICB9XG59O1xudmFyIF9zYXZlVG9TaW5nbGV0b25TY29wZSA9IGZ1bmN0aW9uIChiaW5kaW5nLCByZXN1bHQpIHtcbiAgICBiaW5kaW5nLmNhY2hlID0gcmVzdWx0O1xuICAgIGJpbmRpbmcuYWN0aXZhdGVkID0gdHJ1ZTtcbiAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgdm9pZCBfc2F2ZUFzeW5jUmVzdWx0VG9TaW5nbGV0b25TY29wZShiaW5kaW5nLCByZXN1bHQpO1xuICAgIH1cbn07XG52YXIgX3NhdmVBc3luY1Jlc3VsdFRvU2luZ2xldG9uU2NvcGUgPSBmdW5jdGlvbiAoYmluZGluZywgYXN5bmNSZXN1bHQpIHsgcmV0dXJuIF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCwgZXhfMTtcbiAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBfYS50cnlzLnB1c2goWzAsIDIsICwgM10pO1xuICAgICAgICAgICAgICAgIHJldHVybiBbNCwgYXN5bmNSZXN1bHRdO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBiaW5kaW5nLmNhY2hlID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgIHJldHVybiBbMywgM107XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgZXhfMSA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBiaW5kaW5nLmNhY2hlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBiaW5kaW5nLmFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRocm93IGV4XzE7XG4gICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMl07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuIiwiZXhwb3J0IHZhciBGYWN0b3J5VHlwZTtcbihmdW5jdGlvbiAoRmFjdG9yeVR5cGUpIHtcbiAgICBGYWN0b3J5VHlwZVtcIkR5bmFtaWNWYWx1ZVwiXSA9IFwidG9EeW5hbWljVmFsdWVcIjtcbiAgICBGYWN0b3J5VHlwZVtcIkZhY3RvcnlcIl0gPSBcInRvRmFjdG9yeVwiO1xuICAgIEZhY3RvcnlUeXBlW1wiUHJvdmlkZXJcIl0gPSBcInRvUHJvdmlkZXJcIjtcbn0pKEZhY3RvcnlUeXBlIHx8IChGYWN0b3J5VHlwZSA9IHt9KSk7XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCB7IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IEZhY3RvcnlUeXBlIH0gZnJvbSAnLi9mYWN0b3J5X3R5cGUnO1xuZXhwb3J0IHZhciBtdWx0aUJpbmRUb1NlcnZpY2UgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYmluZCh0KS50b1NlcnZpY2Uoc2VydmljZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xufTtcbmV4cG9ydCB2YXIgZW5zdXJlRnVsbHlCb3VuZCA9IGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgdmFyIGJvdW5kVmFsdWUgPSBudWxsO1xuICAgIHN3aXRjaCAoYmluZGluZy50eXBlKSB7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0YW50VmFsdWU6XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkZ1bmN0aW9uOlxuICAgICAgICAgICAgYm91bmRWYWx1ZSA9IGJpbmRpbmcuY2FjaGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uQ29uc3RydWN0b3I6XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlOlxuICAgICAgICAgICAgYm91bmRWYWx1ZSA9IGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkR5bmFtaWNWYWx1ZTpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLmR5bmFtaWNWYWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLnByb3ZpZGVyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk6XG4gICAgICAgICAgICBib3VuZFZhbHVlID0gYmluZGluZy5mYWN0b3J5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChib3VuZFZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KEVSUk9SX01TR1MuSU5WQUxJRF9CSU5ESU5HX1RZUEUsIFwiIFwiKS5jb25jYXQoc2VydmljZUlkZW50aWZpZXJBc1N0cmluZykpO1xuICAgIH1cbn07XG5leHBvcnQgdmFyIGdldEZhY3RvcnlEZXRhaWxzID0gZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICBzd2l0Y2ggKGJpbmRpbmcudHlwZSkge1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5OlxuICAgICAgICAgICAgcmV0dXJuIHsgZmFjdG9yeTogYmluZGluZy5mYWN0b3J5LCBmYWN0b3J5VHlwZTogRmFjdG9yeVR5cGUuRmFjdG9yeSB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjpcbiAgICAgICAgICAgIHJldHVybiB7IGZhY3Rvcnk6IGJpbmRpbmcucHJvdmlkZXIsIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5Qcm92aWRlciB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZhY3Rvcnk6IGJpbmRpbmcuZHluYW1pY1ZhbHVlLFxuICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5EeW5hbWljVmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBmYWN0b3J5IHR5cGUgXCIuY29uY2F0KGJpbmRpbmcudHlwZSkpO1xuICAgIH1cbn07XG4iLCJ2YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IE9OX0RFQUNUSVZBVElPTl9FUlJPUiwgUE9TVF9DT05TVFJVQ1RfRVJST1IsIFBSRV9ERVNUUk9ZX0VSUk9SLCB9IGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdTY29wZUVudW0sIFRhcmdldFR5cGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UgfSBmcm9tICcuLi91dGlscy9hc3luYyc7XG5mdW5jdGlvbiBfcmVzb2x2ZVJlcXVlc3RzKGNoaWxkUmVxdWVzdHMsIHJlc29sdmVSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIGNoaWxkUmVxdWVzdHMucmVkdWNlKGZ1bmN0aW9uIChyZXNvbHZlZFJlcXVlc3RzLCBjaGlsZFJlcXVlc3QpIHtcbiAgICAgICAgdmFyIGluamVjdGlvbiA9IHJlc29sdmVSZXF1ZXN0KGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIHZhciB0YXJnZXRUeXBlID0gY2hpbGRSZXF1ZXN0LnRhcmdldC50eXBlO1xuICAgICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gVGFyZ2V0VHlwZUVudW0uQ29uc3RydWN0b3JBcmd1bWVudCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5jb25zdHJ1Y3RvckluamVjdGlvbnMucHVzaChpbmplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5wcm9wZXJ0eVJlcXVlc3RzLnB1c2goY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHJlc29sdmVkUmVxdWVzdHMucHJvcGVydHlJbmplY3Rpb25zLnB1c2goaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc29sdmVkUmVxdWVzdHMuaXNBc3luYykge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5pc0FzeW5jID0gaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UoaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRSZXF1ZXN0cztcbiAgICB9LCB7XG4gICAgICAgIGNvbnN0cnVjdG9ySW5qZWN0aW9uczogW10sXG4gICAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnM6IFtdLFxuICAgICAgICBwcm9wZXJ0eVJlcXVlc3RzOiBbXSxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVJbnN0YW5jZShjb25zdHIsIGNoaWxkUmVxdWVzdHMsIHJlc29sdmVSZXF1ZXN0KSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICBpZiAoY2hpbGRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciByZXNvbHZlZCA9IF9yZXNvbHZlUmVxdWVzdHMoY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpO1xuICAgICAgICB2YXIgY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FyZyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCByZXNvbHZlZCksIHsgY29uc3RyOiBjb25zdHIgfSk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5pc0FzeW5jKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXN5bmMoY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zKGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBcmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBuZXcgY29uc3RyKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zKGFyZ3MpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGluc3RhbmNlID0gbmV3ICgoX2EgPSBhcmdzLmNvbnN0cikuYmluZC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbdm9pZCAwXSwgYXJncy5jb25zdHJ1Y3RvckluamVjdGlvbnMsIGZhbHNlKSkpKCk7XG4gICAgYXJncy5wcm9wZXJ0eVJlcXVlc3RzLmZvckVhY2goZnVuY3Rpb24gKHIsIGluZGV4KSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eSA9IHIudGFyZ2V0LmlkZW50aWZpZXI7XG4gICAgICAgIHZhciBpbmplY3Rpb24gPSBhcmdzLnByb3BlcnR5SW5qZWN0aW9uc1tpbmRleF07XG4gICAgICAgIGlmICghci50YXJnZXQuaXNPcHRpb25hbCgpIHx8IGluamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtwcm9wZXJ0eV0gPSBpbmplY3Rpb247XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXN5bmMoYXJncykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9ySW5qZWN0aW9ucywgcHJvcGVydHlJbmplY3Rpb25zO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQsIHBvc3NpYmx5V2FpdEluamVjdGlvbnMoYXJncy5jb25zdHJ1Y3RvckluamVjdGlvbnMpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9ySW5qZWN0aW9ucyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCBwb3NzaWJseVdhaXRJbmplY3Rpb25zKGFyZ3MucHJvcGVydHlJbmplY3Rpb25zKV07XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9ucyhfX2Fzc2lnbihfX2Fzc2lnbih7fSwgYXJncyksIHsgY29uc3RydWN0b3JJbmplY3Rpb25zOiBjb25zdHJ1Y3RvckluamVjdGlvbnMsIHByb3BlcnR5SW5qZWN0aW9uczogcHJvcGVydHlJbmplY3Rpb25zIH0pKV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcG9zc2libHlXYWl0SW5qZWN0aW9ucyhwb3NzaWJsZVByb21pc2VpbmplY3Rpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5qZWN0aW9ucywgX2ksIHBvc3NpYmxlUHJvbWlzZWluamVjdGlvbnNfMSwgaW5qZWN0aW9uO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBpbmplY3Rpb25zID0gW107XG4gICAgICAgICAgICBmb3IgKF9pID0gMCwgcG9zc2libGVQcm9taXNlaW5qZWN0aW9uc18xID0gcG9zc2libGVQcm9taXNlaW5qZWN0aW9uczsgX2kgPCBwb3NzaWJsZVByb21pc2VpbmplY3Rpb25zXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgaW5qZWN0aW9uID0gcG9zc2libGVQcm9taXNlaW5qZWN0aW9uc18xW19pXTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdGlvbnMucHVzaChQcm9taXNlLmFsbChpbmplY3Rpb24pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdGlvbnMucHVzaChpbmplY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbMiwgUHJvbWlzZS5hbGwoaW5qZWN0aW9ucyldO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9nZXRJbnN0YW5jZUFmdGVyUG9zdENvbnN0cnVjdChjb25zdHIsIHJlc3VsdCkge1xuICAgIHZhciBwb3N0Q29uc3RydWN0UmVzdWx0ID0gX3Bvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpO1xuICAgIGlmIChpc1Byb21pc2UocG9zdENvbnN0cnVjdFJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHBvc3RDb25zdHJ1Y3RSZXN1bHQudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiByZXN1bHQ7IH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBfcG9zdENvbnN0cnVjdChjb25zdHIsIGluc3RhbmNlKSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBpZiAoUmVmbGVjdC5oYXNNZXRhZGF0YShNRVRBREFUQV9LRVkuUE9TVF9DT05TVFJVQ1QsIGNvbnN0cikpIHtcbiAgICAgICAgdmFyIGRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QT1NUX0NPTlNUUlVDVCwgY29uc3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAoX2IgPSAoX2EgPSBpbnN0YW5jZSlbZGF0YS52YWx1ZV0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihQT1NUX0NPTlNUUlVDVF9FUlJPUihjb25zdHIubmFtZSwgZS5tZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBfdmFsaWRhdGVJbnN0YW5jZVJlc29sdXRpb24oYmluZGluZywgY29uc3RyKSB7XG4gICAgaWYgKGJpbmRpbmcuc2NvcGUgIT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uKSB7XG4gICAgICAgIF90aHJvd0lmSGFuZGxpbmdEZWFjdGl2YXRpb24oYmluZGluZywgY29uc3RyKTtcbiAgICB9XG59XG5mdW5jdGlvbiBfdGhyb3dJZkhhbmRsaW5nRGVhY3RpdmF0aW9uKGJpbmRpbmcsIGNvbnN0cikge1xuICAgIHZhciBzY29wZUVycm9yTWVzc2FnZSA9IFwiQ2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBpbiBcIi5jb25jYXQoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0ID8gJ3JlcXVlc3QnIDogJ3RyYW5zaWVudCcsIFwiIHNjb3BlLlwiKTtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcub25EZWFjdGl2YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKE9OX0RFQUNUSVZBVElPTl9FUlJPUihjb25zdHIubmFtZSwgc2NvcGVFcnJvck1lc3NhZ2UpKTtcbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBjb25zdHIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihQUkVfREVTVFJPWV9FUlJPUihjb25zdHIubmFtZSwgc2NvcGVFcnJvck1lc3NhZ2UpKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXNvbHZlSW5zdGFuY2UoYmluZGluZywgY29uc3RyLCBjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCkge1xuICAgIF92YWxpZGF0ZUluc3RhbmNlUmVzb2x1dGlvbihiaW5kaW5nLCBjb25zdHIpO1xuICAgIHZhciByZXN1bHQgPSBfY3JlYXRlSW5zdGFuY2UoY29uc3RyLCBjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCk7XG4gICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbihmdW5jdGlvbiAocmVzb2x2ZWRSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBfZ2V0SW5zdGFuY2VBZnRlclBvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXNvbHZlZFJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnN0YW5jZUFmdGVyUG9zdENvbnN0cnVjdChjb25zdHIsIHJlc3VsdCk7XG4gICAgfVxufVxuZXhwb3J0IHsgcmVzb2x2ZUluc3RhbmNlIH07XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xuaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBnZXRCaW5kaW5nRGljdGlvbmFyeSB9IGZyb20gJy4uL3BsYW5uaW5nL3BsYW5uZXInO1xuaW1wb3J0IHsgc2F2ZVRvU2NvcGUsIHRyeUdldEZyb21TY29wZSB9IGZyb20gJy4uL3Njb3BlL3Njb3BlJztcbmltcG9ydCB7IGlzUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL2FzeW5jJztcbmltcG9ydCB7IGVuc3VyZUZ1bGx5Qm91bmQsIGdldEZhY3RvcnlEZXRhaWxzIH0gZnJvbSAnLi4vdXRpbHMvYmluZGluZ191dGlscyc7XG5pbXBvcnQgeyB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93IH0gZnJvbSAnLi4vdXRpbHMvZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyByZXNvbHZlSW5zdGFuY2UgfSBmcm9tICcuL2luc3RhbnRpYXRpb24nO1xudmFyIF9yZXNvbHZlUmVxdWVzdCA9IGZ1bmN0aW9uIChyZXF1ZXN0U2NvcGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdC5wYXJlbnRDb250ZXh0LnNldEN1cnJlbnRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICB2YXIgYmluZGluZ3MgPSByZXF1ZXN0LmJpbmRpbmdzO1xuICAgICAgICB2YXIgY2hpbGRSZXF1ZXN0cyA9IHJlcXVlc3QuY2hpbGRSZXF1ZXN0cztcbiAgICAgICAgdmFyIHRhcmdldElzQW5BcnJheSA9IHJlcXVlc3QudGFyZ2V0ICYmIHJlcXVlc3QudGFyZ2V0LmlzQXJyYXkoKTtcbiAgICAgICAgdmFyIHRhcmdldFBhcmVudElzTm90QW5BcnJheSA9ICFyZXF1ZXN0LnBhcmVudFJlcXVlc3QgfHxcbiAgICAgICAgICAgICFyZXF1ZXN0LnBhcmVudFJlcXVlc3QudGFyZ2V0IHx8XG4gICAgICAgICAgICAhcmVxdWVzdC50YXJnZXQgfHxcbiAgICAgICAgICAgICFyZXF1ZXN0LnBhcmVudFJlcXVlc3QudGFyZ2V0Lm1hdGNoZXNBcnJheShyZXF1ZXN0LnRhcmdldC5zZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmICh0YXJnZXRJc0FuQXJyYXkgJiYgdGFyZ2V0UGFyZW50SXNOb3RBbkFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gY2hpbGRSZXF1ZXN0cy5tYXAoZnVuY3Rpb24gKGNoaWxkUmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHZhciByZXNvbHZlUmVxdWVzdCA9IF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUmVxdWVzdChjaGlsZFJlcXVlc3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdC50YXJnZXQuaXNPcHRpb25hbCgpICYmIGJpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdzWzBdO1xuICAgICAgICAgICAgcmV0dXJuIF9yZXNvbHZlQmluZGluZyhyZXF1ZXN0U2NvcGUsIHJlcXVlc3QsIGJpbmRpbmcpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG52YXIgX3Jlc29sdmVGYWN0b3J5RnJvbUJpbmRpbmcgPSBmdW5jdGlvbiAoYmluZGluZywgY29udGV4dCkge1xuICAgIHZhciBmYWN0b3J5RGV0YWlscyA9IGdldEZhY3RvcnlEZXRhaWxzKGJpbmRpbmcpO1xuICAgIHJldHVybiB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnlEZXRhaWxzLmZhY3RvcnkuYmluZChiaW5kaW5nKShjb250ZXh0KTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3IoRVJST1JfTVNHUy5DSVJDVUxBUl9ERVBFTkRFTkNZX0lOX0ZBQ1RPUlkoZmFjdG9yeURldGFpbHMuZmFjdG9yeVR5cGUsIGNvbnRleHQuY3VycmVudFJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIudG9TdHJpbmcoKSkpO1xuICAgIH0pO1xufTtcbnZhciBfZ2V0UmVzb2x2ZWRGcm9tQmluZGluZyA9IGZ1bmN0aW9uIChyZXF1ZXN0U2NvcGUsIHJlcXVlc3QsIGJpbmRpbmcpIHtcbiAgICB2YXIgcmVzdWx0O1xuICAgIHZhciBjaGlsZFJlcXVlc3RzID0gcmVxdWVzdC5jaGlsZFJlcXVlc3RzO1xuICAgIGVuc3VyZUZ1bGx5Qm91bmQoYmluZGluZyk7XG4gICAgc3dpdGNoIChiaW5kaW5nLnR5cGUpIHtcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uQ29uc3RhbnRWYWx1ZTpcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb246XG4gICAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nLmNhY2hlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yOlxuICAgICAgICAgICAgcmVzdWx0ID0gYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uSW5zdGFuY2U6XG4gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlSW5zdGFuY2UoYmluZGluZywgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUsIGNoaWxkUmVxdWVzdHMsIF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVzdWx0ID0gX3Jlc29sdmVGYWN0b3J5RnJvbUJpbmRpbmcoYmluZGluZywgcmVxdWVzdC5wYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX3Jlc29sdmVJblNjb3BlID0gZnVuY3Rpb24gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzb2x2ZUZyb21CaW5kaW5nKSB7XG4gICAgdmFyIHJlc3VsdCA9IHRyeUdldEZyb21TY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmVzdWx0ID0gcmVzb2x2ZUZyb21CaW5kaW5nKCk7XG4gICAgc2F2ZVRvU2NvcGUocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9yZXNvbHZlQmluZGluZyA9IGZ1bmN0aW9uIChyZXF1ZXN0U2NvcGUsIHJlcXVlc3QsIGJpbmRpbmcpIHtcbiAgICByZXR1cm4gX3Jlc29sdmVJblNjb3BlKHJlcXVlc3RTY29wZSwgYmluZGluZywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gX2dldFJlc29sdmVkRnJvbUJpbmRpbmcocmVxdWVzdFNjb3BlLCByZXF1ZXN0LCBiaW5kaW5nKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudGhlbihmdW5jdGlvbiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29uQWN0aXZhdGlvbihyZXF1ZXN0LCBiaW5kaW5nLCByZXNvbHZlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IF9vbkFjdGl2YXRpb24ocmVxdWVzdCwgYmluZGluZywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xufTtcbmZ1bmN0aW9uIF9vbkFjdGl2YXRpb24ocmVxdWVzdCwgYmluZGluZywgcmVzb2x2ZWQpIHtcbiAgICB2YXIgcmVzdWx0ID0gX2JpbmRpbmdBY3RpdmF0aW9uKHJlcXVlc3QucGFyZW50Q29udGV4dCwgYmluZGluZywgcmVzb2x2ZWQpO1xuICAgIHZhciBjb250YWluZXJzSXRlcmF0b3IgPSBfZ2V0Q29udGFpbmVyc0l0ZXJhdG9yKHJlcXVlc3QucGFyZW50Q29udGV4dC5jb250YWluZXIpO1xuICAgIHZhciBjb250YWluZXI7XG4gICAgdmFyIGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgZG8ge1xuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXJzSXRlcmF0b3JSZXN1bHQudmFsdWU7XG4gICAgICAgIHZhciBjb250ZXh0XzEgPSByZXF1ZXN0LnBhcmVudENvbnRleHQ7XG4gICAgICAgIHZhciBzZXJ2aWNlSWRlbnRpZmllciA9IHJlcXVlc3Quc2VydmljZUlkZW50aWZpZXI7XG4gICAgICAgIHZhciBhY3RpdmF0aW9uc0l0ZXJhdG9yID0gX2dldENvbnRhaW5lckFjdGl2YXRpb25zRm9yU2VydmljZShjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBfYWN0aXZhdGVDb250YWluZXJBc3luYyhhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0XzEsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBfYWN0aXZhdGVDb250YWluZXIoYWN0aXZhdGlvbnNJdGVyYXRvciwgY29udGV4dF8xLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgfSB3aGlsZSAoY29udGFpbmVyc0l0ZXJhdG9yUmVzdWx0LmRvbmUgIT09IHRydWUgJiZcbiAgICAgICAgIWdldEJpbmRpbmdEaWN0aW9uYXJ5KGNvbnRhaW5lcikuaGFzS2V5KHJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxudmFyIF9iaW5kaW5nQWN0aXZhdGlvbiA9IGZ1bmN0aW9uIChjb250ZXh0LCBiaW5kaW5nLCBwcmV2aW91c1Jlc3VsdCkge1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKHR5cGVvZiBiaW5kaW5nLm9uQWN0aXZhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXN1bHQgPSBiaW5kaW5nLm9uQWN0aXZhdGlvbihjb250ZXh0LCBwcmV2aW91c1Jlc3VsdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBwcmV2aW91c1Jlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX2FjdGl2YXRlQ29udGFpbmVyID0gZnVuY3Rpb24gKGFjdGl2YXRpb25zSXRlcmF0b3IsIGNvbnRleHQsIHJlc3VsdCkge1xuICAgIHZhciBhY3RpdmF0aW9uID0gYWN0aXZhdGlvbnNJdGVyYXRvci5uZXh0KCk7XG4gICAgd2hpbGUgKGFjdGl2YXRpb24uZG9uZSAhPT0gdHJ1ZSkge1xuICAgICAgICByZXN1bHQgPSBhY3RpdmF0aW9uLnZhbHVlKGNvbnRleHQsIHJlc3VsdCk7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIF9hY3RpdmF0ZUNvbnRhaW5lckFzeW5jKGFjdGl2YXRpb25zSXRlcmF0b3IsIGNvbnRleHQsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfYWN0aXZhdGVDb250YWluZXJBc3luYyA9IGZ1bmN0aW9uIChhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHRQcm9taXNlKSB7IHJldHVybiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXN1bHQsIGFjdGl2YXRpb247XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCwgcmVzdWx0UHJvbWlzZV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDI7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgaWYgKCEoYWN0aXZhdGlvbi5kb25lICE9PSB0cnVlKSkgcmV0dXJuIFszLCA0XTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQsIGFjdGl2YXRpb24udmFsdWUoY29udGV4dCwgcmVzdWx0KV07XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzMsIDJdO1xuICAgICAgICAgICAgY2FzZSA0OiByZXR1cm4gWzIsIHJlc3VsdF07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xudmFyIF9nZXRDb250YWluZXJBY3RpdmF0aW9uc0ZvclNlcnZpY2UgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIHZhciBhY3RpdmF0aW9ucyA9IGNvbnRhaW5lci5fYWN0aXZhdGlvbnM7XG4gICAgcmV0dXJuIGFjdGl2YXRpb25zLmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcilcbiAgICAgICAgPyBhY3RpdmF0aW9ucy5nZXQoc2VydmljZUlkZW50aWZpZXIpLnZhbHVlcygpXG4gICAgICAgIDogW10udmFsdWVzKCk7XG59O1xudmFyIF9nZXRDb250YWluZXJzSXRlcmF0b3IgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gICAgdmFyIGNvbnRhaW5lcnNTdGFjayA9IFtjb250YWluZXJdO1xuICAgIHZhciBwYXJlbnQgPSBjb250YWluZXIucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29udGFpbmVyc1N0YWNrLnB1c2gocGFyZW50KTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgdmFyIGdldE5leHRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuZXh0Q29udGFpbmVyID0gY29udGFpbmVyc1N0YWNrLnBvcCgpO1xuICAgICAgICBpZiAobmV4dENvbnRhaW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IG5leHRDb250YWluZXIgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdmFyIGNvbnRhaW5lcnNJdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZ2V0TmV4dENvbnRhaW5lcixcbiAgICB9O1xuICAgIHJldHVybiBjb250YWluZXJzSXRlcmF0b3I7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZShjb250ZXh0KSB7XG4gICAgdmFyIHJlc29sdmVSZXF1ZXN0RnVuY3Rpb24gPSBfcmVzb2x2ZVJlcXVlc3QoY29udGV4dC5wbGFuLnJvb3RSZXF1ZXN0LnJlcXVlc3RTY29wZSk7XG4gICAgcmV0dXJuIHJlc29sdmVSZXF1ZXN0RnVuY3Rpb24oY29udGV4dC5wbGFuLnJvb3RSZXF1ZXN0KTtcbn1cbmV4cG9ydCB7IHJlc29sdmUgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbnZhciB0cmF2ZXJzZUFuY2Vyc3RvcnMgPSBmdW5jdGlvbiAocmVxdWVzdCwgY29uc3RyYWludCkge1xuICAgIHZhciBwYXJlbnQgPSByZXF1ZXN0LnBhcmVudFJlcXVlc3Q7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludChwYXJlbnQpID8gdHJ1ZSA6IHRyYXZlcnNlQW5jZXJzdG9ycyhwYXJlbnQsIGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG52YXIgdGFnZ2VkQ29uc3RyYWludCA9IGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBjb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHJlcXVlc3QudGFyZ2V0ICE9PSBudWxsICYmXG4gICAgICAgICAgICByZXF1ZXN0LnRhcmdldC5tYXRjaGVzVGFnKGtleSkodmFsdWUpO1xuICAgIH07XG4gICAgY29uc3RyYWludC5tZXRhRGF0YSA9IG5ldyBNZXRhZGF0YShrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gY29uc3RyYWludDtcbn07IH07XG52YXIgbmFtZWRDb25zdHJhaW50ID0gdGFnZ2VkQ29uc3RyYWludChNRVRBREFUQV9LRVkuTkFNRURfVEFHKTtcbnZhciB0eXBlQ29uc3RyYWludCA9IGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgIHZhciBiaW5kaW5nID0gbnVsbDtcbiAgICBpZiAocmVxdWVzdCAhPT0gbnVsbCkge1xuICAgICAgICBiaW5kaW5nID0gcmVxdWVzdC5iaW5kaW5nc1swXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIgPT09IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSByZXF1ZXN0LmJpbmRpbmdzWzBdLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59OyB9O1xuZXhwb3J0IHsgdHJhdmVyc2VBbmNlcnN0b3JzLCB0YWdnZWRDb25zdHJhaW50LCBuYW1lZENvbnN0cmFpbnQsIHR5cGVDb25zdHJhaW50LCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBuYW1lZENvbnN0cmFpbnQsIHRhZ2dlZENvbnN0cmFpbnQsIHRyYXZlcnNlQW5jZXJzdG9ycywgdHlwZUNvbnN0cmFpbnQsIH0gZnJvbSAnLi9jb25zdHJhaW50X2hlbHBlcnMnO1xudmFyIEJpbmRpbmdXaGVuU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nV2hlblN5bnRheChiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcgPSBiaW5kaW5nO1xuICAgIH1cbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlbiA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IG5hbWVkQ29uc3RyYWludChuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldElzRGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHRhcmdldElzRGVmYXVsdCA9IHJlcXVlc3QudGFyZ2V0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgIXJlcXVlc3QudGFyZ2V0LmlzTmFtZWQoKSAmJlxuICAgICAgICAgICAgICAgICFyZXF1ZXN0LnRhcmdldC5pc1RhZ2dlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldElzRGVmYXVsdDtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldFRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IHRhZ2dlZENvbnN0cmFpbnQodGFnKSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5JbmplY3RlZEludG8gPSBmdW5jdGlvbiAocGFyZW50KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0eXBlQ29uc3RyYWludChwYXJlbnQpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5QYXJlbnROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJiBuYW1lZENvbnN0cmFpbnQobmFtZSkocmVxdWVzdC5wYXJlbnRSZXF1ZXN0KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlblBhcmVudFRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvcklzID0gZnVuY3Rpb24gKGFuY2VzdG9yKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdHlwZUNvbnN0cmFpbnQoYW5jZXN0b3IpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JJcyA9IGZ1bmN0aW9uIChhbmNlc3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIHR5cGVDb25zdHJhaW50KGFuY2VzdG9yKSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0ICE9PSBudWxsICYmIHRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBuYW1lZENvbnN0cmFpbnQobmFtZSkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3Rvck5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0ICE9PSBudWxsICYmICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgbmFtZWRDb25zdHJhaW50KG5hbWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yVGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gZnVuY3Rpb24gKHJlcXVlc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIHRhZ2dlZENvbnN0cmFpbnQodGFnKSh2YWx1ZSkpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdGFnZ2VkQ29uc3RyYWludCh0YWcpKHZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck1hdGNoZXMgPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBmdW5jdGlvbiAocmVxdWVzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICB0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgY29uc3RyYWludCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IGZ1bmN0aW9uIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgY29uc3RyYWludCk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdXaGVuU3ludGF4O1xufSgpKTtcbmV4cG9ydCB7IEJpbmRpbmdXaGVuU3ludGF4IH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX3N5bnRheCc7XG52YXIgQmluZGluZ09uU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nT25TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgQmluZGluZ09uU3ludGF4LnByb3RvdHlwZS5vbkFjdGl2YXRpb24gPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLm9uQWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nT25TeW50YXgucHJvdG90eXBlLm9uRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICByZXR1cm4gQmluZGluZ09uU3ludGF4O1xufSgpKTtcbmV4cG9ydCB7IEJpbmRpbmdPblN5bnRheCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX3N5bnRheCc7XG52YXIgQmluZGluZ1doZW5PblN5bnRheCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZGluZ1doZW5PblN5bnRheChiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcgPSBiaW5kaW5nO1xuICAgICAgICB0aGlzLl9iaW5kaW5nV2hlblN5bnRheCA9IG5ldyBCaW5kaW5nV2hlblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICAgICAgdGhpcy5fYmluZGluZ09uU3ludGF4ID0gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbiA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuKGNvbnN0cmFpbnQpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlblRhcmdldE5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXROYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXRJc0RlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0SXNEZWZhdWx0KCk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuVGFyZ2V0VGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXRUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuSW5qZWN0ZWRJbnRvID0gZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkluamVjdGVkSW50byhwYXJlbnQpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlblBhcmVudE5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnROYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5QYXJlbnRUYWdnZWQgPSBmdW5jdGlvbiAodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblBhcmVudFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvcklzID0gZnVuY3Rpb24gKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcik7XG4gICAgfTtcbiAgICBCaW5kaW5nV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvcklzID0gZnVuY3Rpb24gKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yVGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yVGFnZ2VkID0gZnVuY3Rpb24gKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyA9IGZ1bmN0aW9uIChjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JNYXRjaGVzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdXaGVuT25TeW50YXgucHJvdG90eXBlLm9uQWN0aXZhdGlvbiA9IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nT25TeW50YXgub25BY3RpdmF0aW9uKGhhbmRsZXIpO1xuICAgIH07XG4gICAgQmluZGluZ1doZW5PblN5bnRheC5wcm90b3R5cGUub25EZWFjdGl2YXRpb24gPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ09uU3ludGF4Lm9uRGVhY3RpdmF0aW9uKGhhbmRsZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdXaGVuT25TeW50YXg7XG59KCkpO1xuZXhwb3J0IHsgQmluZGluZ1doZW5PblN5bnRheCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ1Njb3BlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCB7IEJpbmRpbmdXaGVuT25TeW50YXggfSBmcm9tICcuL2JpbmRpbmdfd2hlbl9vbl9zeW50YXgnO1xudmFyIEJpbmRpbmdJblN5bnRheCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZGluZ0luU3ludGF4KGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIEJpbmRpbmdJblN5bnRheC5wcm90b3R5cGUuaW5SZXF1ZXN0U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3Q7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJblN5bnRheC5wcm90b3R5cGUuaW5TaW5nbGV0b25TY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5TeW50YXgucHJvdG90eXBlLmluVHJhbnNpZW50U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlRyYW5zaWVudDtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRpbmdJblN5bnRheDtcbn0oKSk7XG5leHBvcnQgeyBCaW5kaW5nSW5TeW50YXggfTtcbiIsImltcG9ydCB7IEJpbmRpbmdJblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl9zeW50YXgnO1xuaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX3N5bnRheCc7XG52YXIgQmluZGluZ0luV2hlbk9uU3ludGF4ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBCaW5kaW5nSW5XaGVuT25TeW50YXgoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgdGhpcy5fYmluZGluZ1doZW5TeW50YXggPSBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdPblN5bnRheCA9IG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdJblN5bnRheCA9IG5ldyBCaW5kaW5nSW5TeW50YXgoYmluZGluZyk7XG4gICAgfVxuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUuaW5SZXF1ZXN0U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5SZXF1ZXN0U2NvcGUoKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUuaW5TaW5nbGV0b25TY29wZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdJblN5bnRheC5pblNpbmdsZXRvblNjb3BlKCk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLmluVHJhbnNpZW50U2NvcGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5UcmFuc2llbnRTY29wZSgpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuID0gZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW4oY29uc3RyYWludCk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXROYW1lZCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0TmFtZWQobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXRJc0RlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0SXNEZWZhdWx0KCk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5UYXJnZXRUYWdnZWQgPSBmdW5jdGlvbiAodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkluamVjdGVkSW50byA9IGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5JbmplY3RlZEludG8ocGFyZW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlblBhcmVudE5hbWVkID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnROYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlblBhcmVudFRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50VGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuQW55QW5jZXN0b3JJcyA9IGZ1bmN0aW9uIChhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpO1xuICAgIH07XG4gICAgQmluZGluZ0luV2hlbk9uU3ludGF4LnByb3RvdHlwZS53aGVuTm9BbmNlc3RvcklzID0gZnVuY3Rpb24gKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbkFueUFuY2VzdG9yTmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3RvclRhZ2dlZCA9IGZ1bmN0aW9uICh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5Ob0FuY2VzdG9yTmFtZWQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JUYWdnZWQgPSBmdW5jdGlvbiAodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLndoZW5BbnlBbmNlc3Rvck1hdGNoZXMgPSBmdW5jdGlvbiAoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUud2hlbk5vQW5jZXN0b3JNYXRjaGVzID0gZnVuY3Rpb24gKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9O1xuICAgIEJpbmRpbmdJbldoZW5PblN5bnRheC5wcm90b3R5cGUub25BY3RpdmF0aW9uID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkFjdGl2YXRpb24oaGFuZGxlcik7XG4gICAgfTtcbiAgICBCaW5kaW5nSW5XaGVuT25TeW50YXgucHJvdG90eXBlLm9uRGVhY3RpdmF0aW9uID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkRlYWN0aXZhdGlvbihoYW5kbGVyKTtcbiAgICB9O1xuICAgIHJldHVybiBCaW5kaW5nSW5XaGVuT25TeW50YXg7XG59KCkpO1xuZXhwb3J0IHsgQmluZGluZ0luV2hlbk9uU3ludGF4IH07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdTY29wZUVudW0sIEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCB7IEJpbmRpbmdJbldoZW5PblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl93aGVuX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlbk9uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX3doZW5fb25fc3ludGF4JztcbnZhciBCaW5kaW5nVG9TeW50YXggPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJpbmRpbmdUb1N5bnRheChiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcgPSBiaW5kaW5nO1xuICAgIH1cbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgPSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nSW5XaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvU2VsZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9iaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX1RPX1NFTEZfVkFMVUUpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzZWxmID0gdGhpcy5fYmluZGluZ1xuICAgICAgICAgICAgLnNlcnZpY2VJZGVudGlmaWVyO1xuICAgICAgICByZXR1cm4gdGhpcy50byhzZWxmKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9Db25zdGFudFZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5Db25zdGFudFZhbHVlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNhY2hlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZHluYW1pY1ZhbHVlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9EeW5hbWljVmFsdWUgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRHluYW1pY1ZhbHVlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNhY2hlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmluZGluZy5keW5hbWljVmFsdWUgPSBmdW5jO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ0luV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50b0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5Db25zdHJ1Y3RvcjtcbiAgICAgICAgdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgPSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvRmFjdG9yeSA9IGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmZhY3RvcnkgPSBmYWN0b3J5O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9GdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuSU5WQUxJRF9GVU5DVElPTl9CSU5ESU5HKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYmluZGluZ1doZW5PblN5bnRheCA9IHRoaXMudG9Db25zdGFudFZhbHVlKGZ1bmMpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb247XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmdXaGVuT25TeW50YXg7XG4gICAgfTtcbiAgICBCaW5kaW5nVG9TeW50YXgucHJvdG90eXBlLnRvQXV0b0ZhY3RvcnkgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZmFjdG9yeSA9IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgICAgICB2YXIgYXV0b2ZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGF1dG9mYWN0b3J5O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9BdXRvTmFtZWRGYWN0b3J5ID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmZhY3RvcnkgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXROYW1lZChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH07XG4gICAgQmluZGluZ1RvU3ludGF4LnByb3RvdHlwZS50b1Byb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcudHlwZSA9IEJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjtcbiAgICAgICAgdGhpcy5fYmluZGluZy5wcm92aWRlciA9IHByb3ZpZGVyO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b247XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9O1xuICAgIEJpbmRpbmdUb1N5bnRheC5wcm90b3R5cGUudG9TZXJ2aWNlID0gZnVuY3Rpb24gKHNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy50b0R5bmFtaWNWYWx1ZShmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldChzZXJ2aWNlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQmluZGluZ1RvU3ludGF4O1xufSgpKTtcbmV4cG9ydCB7IEJpbmRpbmdUb1N5bnRheCB9O1xuIiwidmFyIENvbnRhaW5lclNuYXBzaG90ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250YWluZXJTbmFwc2hvdCgpIHtcbiAgICB9XG4gICAgQ29udGFpbmVyU25hcHNob3Qub2YgPSBmdW5jdGlvbiAoYmluZGluZ3MsIG1pZGRsZXdhcmUsIGFjdGl2YXRpb25zLCBkZWFjdGl2YXRpb25zLCBtb2R1bGVBY3RpdmF0aW9uU3RvcmUpIHtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gbmV3IENvbnRhaW5lclNuYXBzaG90KCk7XG4gICAgICAgIHNuYXBzaG90LmJpbmRpbmdzID0gYmluZGluZ3M7XG4gICAgICAgIHNuYXBzaG90Lm1pZGRsZXdhcmUgPSBtaWRkbGV3YXJlO1xuICAgICAgICBzbmFwc2hvdC5kZWFjdGl2YXRpb25zID0gZGVhY3RpdmF0aW9ucztcbiAgICAgICAgc25hcHNob3QuYWN0aXZhdGlvbnMgPSBhY3RpdmF0aW9ucztcbiAgICAgICAgc25hcHNob3QubW9kdWxlQWN0aXZhdGlvblN0b3JlID0gbW9kdWxlQWN0aXZhdGlvblN0b3JlO1xuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGFpbmVyU25hcHNob3Q7XG59KCkpO1xuZXhwb3J0IHsgQ29udGFpbmVyU25hcHNob3QgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgaXNDbG9uYWJsZSB9IGZyb20gJy4uL3V0aWxzL2Nsb25hYmxlJztcbnZhciBMb29rdXAgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIExvb2t1cCgpIHtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBMb29rdXAucHJvdG90eXBlLmdldE1hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLl9tYXAuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudHJ5LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFwLnNldChzZXJ2aWNlSWRlbnRpZmllciwgW3ZhbHVlXSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTm9uTnVsaXNoKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy5fbWFwLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5LRVlfTk9UX0ZPVU5EKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9va3VwLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tOb25OdWxpc2goc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXRoaXMuX21hcC5kZWxldGUoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5LRVlfTk9UX0ZPVU5EKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgTG9va3VwLnByb3RvdHlwZS5yZW1vdmVJbnRlcnNlY3Rpb24gPSBmdW5jdGlvbiAobG9va3VwKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMudHJhdmVyc2UoZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgICAgICAgdmFyIGxvb2t1cEFjdGl2YXRpb25zID0gbG9va3VwLmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICA/IGxvb2t1cC5nZXQoc2VydmljZUlkZW50aWZpZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAobG9va3VwQWN0aXZhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJlZFZhbHVlcyA9IHZhbHVlLmZpbHRlcihmdW5jdGlvbiAobG9va3VwVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFsb29rdXBBY3RpdmF0aW9ucy5zb21lKGZ1bmN0aW9uIChtb2R1bGVBY3RpdmF0aW9uKSB7IHJldHVybiBsb29rdXBWYWx1ZSA9PT0gbW9kdWxlQWN0aXZhdGlvbjsgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3NldFZhbHVlKHNlcnZpY2VJZGVudGlmaWVyLCBmaWx0ZXJlZFZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgTG9va3VwLnByb3RvdHlwZS5yZW1vdmVCeUNvbmRpdGlvbiA9IGZ1bmN0aW9uIChjb25kaXRpb24pIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHJlbW92YWxzID0gW107XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyaWVzLCBrZXkpIHtcbiAgICAgICAgICAgIHZhciB1cGRhdGVkRW50cmllcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBlbnRyaWVzXzEgPSBlbnRyaWVzOyBfaSA8IGVudHJpZXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzXzFbX2ldO1xuICAgICAgICAgICAgICAgIHZhciByZW1vdmUgPSBjb25kaXRpb24oZW50cnkpO1xuICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZhbHMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fc2V0VmFsdWUoa2V5LCB1cGRhdGVkRW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVtb3ZhbHM7XG4gICAgfTtcbiAgICBMb29rdXAucHJvdG90eXBlLmhhc0tleSA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjb3B5ID0gbmV3IExvb2t1cCgpO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgICAgIGNvcHkuYWRkKGtleSwgaXNDbG9uYWJsZShiKSA/IGIuY2xvbmUoKSA6IGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUudHJhdmVyc2UgPSBmdW5jdGlvbiAoZnVuYykge1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgZnVuYyhrZXksIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBMb29rdXAucHJvdG90eXBlLl9jaGVja05vbk51bGlzaCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTlVMTF9BUkdVTUVOVCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExvb2t1cC5wcm90b3R5cGUuX3NldFZhbHVlID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLnNldChzZXJ2aWNlSWRlbnRpZmllciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBMb29rdXA7XG59KCkpO1xuZXhwb3J0IHsgTG9va3VwIH07XG4iLCJmdW5jdGlvbiBpc0Nsb25hYmxlKG9iaikge1xuICAgIHJldHVybiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgb2JqICE9PSBudWxsICYmXG4gICAgICAgICdjbG9uZScgaW4gb2JqICYmXG4gICAgICAgIHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpO1xufVxuZXhwb3J0IHsgaXNDbG9uYWJsZSB9O1xuIiwiaW1wb3J0IHsgTG9va3VwIH0gZnJvbSAnLi9sb29rdXAnO1xudmFyIE1vZHVsZUFjdGl2YXRpb25TdG9yZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9kdWxlQWN0aXZhdGlvblN0b3JlKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIE1vZHVsZUFjdGl2YXRpb25TdG9yZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgIHZhciBoYW5kbGVycyA9IHRoaXMuX21hcC5nZXQobW9kdWxlSWQpO1xuICAgICAgICBpZiAoaGFuZGxlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEVtcHR5SGFuZGxlcnNTdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUobW9kdWxlSWQpO1xuICAgICAgICByZXR1cm4gaGFuZGxlcnM7XG4gICAgfTtcbiAgICBNb2R1bGVBY3RpdmF0aW9uU3RvcmUucHJvdG90eXBlLmFkZERlYWN0aXZhdGlvbiA9IGZ1bmN0aW9uIChtb2R1bGVJZCwgc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2dldE1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyhtb2R1bGVJZCkub25EZWFjdGl2YXRpb25zLmFkZChzZXJ2aWNlSWRlbnRpZmllciwgb25EZWFjdGl2YXRpb24pO1xuICAgIH07XG4gICAgTW9kdWxlQWN0aXZhdGlvblN0b3JlLnByb3RvdHlwZS5hZGRBY3RpdmF0aW9uID0gZnVuY3Rpb24gKG1vZHVsZUlkLCBzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2dldE1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyhtb2R1bGVJZCkub25BY3RpdmF0aW9ucy5hZGQoc2VydmljZUlkZW50aWZpZXIsIG9uQWN0aXZhdGlvbik7XG4gICAgfTtcbiAgICBNb2R1bGVBY3RpdmF0aW9uU3RvcmUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY2xvbmUgPSBuZXcgTW9kdWxlQWN0aXZhdGlvblN0b3JlKCk7XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKGZ1bmN0aW9uIChoYW5kbGVyc1N0b3JlLCBtb2R1bGVJZCkge1xuICAgICAgICAgICAgY2xvbmUuX21hcC5zZXQobW9kdWxlSWQsIHtcbiAgICAgICAgICAgICAgICBvbkFjdGl2YXRpb25zOiBoYW5kbGVyc1N0b3JlLm9uQWN0aXZhdGlvbnMuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICBvbkRlYWN0aXZhdGlvbnM6IGhhbmRsZXJzU3RvcmUub25EZWFjdGl2YXRpb25zLmNsb25lKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjbG9uZTtcbiAgICB9O1xuICAgIE1vZHVsZUFjdGl2YXRpb25TdG9yZS5wcm90b3R5cGUuX2dldE1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyA9IGZ1bmN0aW9uIChtb2R1bGVJZCkge1xuICAgICAgICB2YXIgbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzID0gdGhpcy5fbWFwLmdldChtb2R1bGVJZCk7XG4gICAgICAgIGlmIChtb2R1bGVBY3RpdmF0aW9uSGFuZGxlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzID0gdGhpcy5fZ2V0RW1wdHlIYW5kbGVyc1N0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLl9tYXAuc2V0KG1vZHVsZUlkLCBtb2R1bGVBY3RpdmF0aW9uSGFuZGxlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVBY3RpdmF0aW9uSGFuZGxlcnM7XG4gICAgfTtcbiAgICBNb2R1bGVBY3RpdmF0aW9uU3RvcmUucHJvdG90eXBlLl9nZXRFbXB0eUhhbmRsZXJzU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoYW5kbGVyc1N0b3JlID0ge1xuICAgICAgICAgICAgb25BY3RpdmF0aW9uczogbmV3IExvb2t1cCgpLFxuICAgICAgICAgICAgb25EZWFjdGl2YXRpb25zOiBuZXcgTG9va3VwKCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1N0b3JlO1xuICAgIH07XG4gICAgcmV0dXJuIE1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbn0oKSk7XG5leHBvcnQgeyBNb2R1bGVBY3RpdmF0aW9uU3RvcmUgfTtcbiIsInZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gICAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9fc3ByZWFkQXJyYXkgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuaW1wb3J0IHsgQmluZGluZyB9IGZyb20gJy4uL2JpbmRpbmdzL2JpbmRpbmcnO1xuaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBUYXJnZXRUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhX3JlYWRlcic7XG5pbXBvcnQgeyBjcmVhdGVNb2NrUmVxdWVzdCwgZ2V0QmluZGluZ0RpY3Rpb25hcnksIHBsYW4sIH0gZnJvbSAnLi4vcGxhbm5pbmcvcGxhbm5lcic7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAnLi4vcmVzb2x1dGlvbi9yZXNvbHZlcic7XG5pbXBvcnQgeyBCaW5kaW5nVG9TeW50YXggfSBmcm9tICcuLi9zeW50YXgvYmluZGluZ190b19zeW50YXgnO1xuaW1wb3J0IHsgaXNQcm9taXNlLCBpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL2FzeW5jJztcbmltcG9ydCB7IGlkIH0gZnJvbSAnLi4vdXRpbHMvaWQnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHsgQ29udGFpbmVyU25hcHNob3QgfSBmcm9tICcuL2NvbnRhaW5lcl9zbmFwc2hvdCc7XG5pbXBvcnQgeyBMb29rdXAgfSBmcm9tICcuL2xvb2t1cCc7XG5pbXBvcnQgeyBNb2R1bGVBY3RpdmF0aW9uU3RvcmUgfSBmcm9tICcuL21vZHVsZV9hY3RpdmF0aW9uX3N0b3JlJztcbnZhciBDb250YWluZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbnRhaW5lcihjb250YWluZXJPcHRpb25zKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gY29udGFpbmVyT3B0aW9ucyB8fCB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuQ09OVEFJTkVSX09QVElPTlNfTVVTVF9CRV9BTl9PQkpFQ1QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmRlZmF1bHRTY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSA9IEJpbmRpbmdTY29wZUVudW0uVHJhbnNpZW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZGVmYXVsdFNjb3BlICE9PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbiAmJlxuICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0U2NvcGUgIT09IEJpbmRpbmdTY29wZUVudW0uVHJhbnNpZW50ICYmXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0RFRkFVTFRfU0NPUEUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0FVVE9fQklORF9JTkpFQ1RBQkxFKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9TS0lQX0JBU0VfQ0hFQ0spO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGF1dG9CaW5kSW5qZWN0YWJsZTogb3B0aW9ucy5hdXRvQmluZEluamVjdGFibGUsXG4gICAgICAgICAgICBkZWZhdWx0U2NvcGU6IG9wdGlvbnMuZGVmYXVsdFNjb3BlLFxuICAgICAgICAgICAgc2tpcEJhc2VDbGFzc0NoZWNrczogb3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmlkID0gaWQoKTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgIHRoaXMuX3NuYXBzaG90cyA9IFtdO1xuICAgICAgICB0aGlzLl9taWRkbGV3YXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGlvbnMgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgIHRoaXMuX2RlYWN0aXZhdGlvbnMgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgIHRoaXMucGFyZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbWV0YWRhdGFSZWFkZXIgPSBuZXcgTWV0YWRhdGFSZWFkZXIoKTtcbiAgICAgICAgdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlID0gbmV3IE1vZHVsZUFjdGl2YXRpb25TdG9yZSgpO1xuICAgIH1cbiAgICBDb250YWluZXIubWVyZ2UgPSBmdW5jdGlvbiAoY29udGFpbmVyMSwgY29udGFpbmVyMikge1xuICAgICAgICB2YXIgY29udGFpbmVycyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgY29udGFpbmVyc1tfaSAtIDJdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29udGFpbmVyID0gbmV3IENvbnRhaW5lcigpO1xuICAgICAgICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IF9fc3ByZWFkQXJyYXkoW1xuICAgICAgICAgICAgY29udGFpbmVyMSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjJcbiAgICAgICAgXSwgY29udGFpbmVycywgdHJ1ZSkubWFwKGZ1bmN0aW9uICh0YXJnZXRDb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXRCaW5kaW5nRGljdGlvbmFyeSh0YXJnZXRDb250YWluZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGJpbmRpbmdEaWN0aW9uYXJ5ID0gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY29udGFpbmVyKTtcbiAgICAgICAgZnVuY3Rpb24gY29weURpY3Rpb25hcnkob3JpZ2luLCBkZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgb3JpZ2luLnRyYXZlcnNlKGZ1bmN0aW9uIChfa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKGJpbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRDb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKHRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5KSB7XG4gICAgICAgICAgICBjb3B5RGljdGlvbmFyeSh0YXJnZXRCaW5kaW5nRGljdGlvbmFyeSwgYmluZGluZ0RpY3Rpb25hcnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1vZHVsZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG1vZHVsZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZ2V0SGVscGVycyA9IHRoaXMuX2dldENvbnRhaW5lck1vZHVsZUhlbHBlcnNGYWN0b3J5KCk7XG4gICAgICAgIGZvciAodmFyIF9hID0gMCwgbW9kdWxlc18xID0gbW9kdWxlczsgX2EgPCBtb2R1bGVzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudE1vZHVsZSA9IG1vZHVsZXNfMVtfYV07XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICBjdXJyZW50TW9kdWxlLnJlZ2lzdHJ5KGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnVuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLmlzYm91bmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5yZWJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRBc3luY0Z1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uQWN0aXZhdGlvbkZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uRGVhY3RpdmF0aW9uRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmxvYWRBc3luYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG1vZHVsZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG1vZHVsZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ2V0SGVscGVycywgX2EsIG1vZHVsZXNfMiwgY3VycmVudE1vZHVsZSwgY29udGFpbmVyTW9kdWxlSGVscGVycztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2IpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9iLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlbHBlcnMgPSB0aGlzLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSAwLCBtb2R1bGVzXzIgPSBtb2R1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfYSA8IG1vZHVsZXNfMi5sZW5ndGgpKSByZXR1cm4gWzMsIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1vZHVsZSA9IG1vZHVsZXNfMltfYV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJNb2R1bGVIZWxwZXJzID0gZ2V0SGVscGVycyhjdXJyZW50TW9kdWxlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgY3VycmVudE1vZHVsZS5yZWdpc3RyeShjb250YWluZXJNb2R1bGVIZWxwZXJzLmJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5pc2JvdW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMucmViaW5kRnVuY3Rpb24sIGNvbnRhaW5lck1vZHVsZUhlbHBlcnMudW5iaW5kQXN5bmNGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5vbkFjdGl2YXRpb25GdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5vbkRlYWN0aXZhdGlvbkZ1bmN0aW9uKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2ErKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLnVubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG1vZHVsZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG1vZHVsZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBtb2R1bGVzLmZvckVhY2goZnVuY3Rpb24gKG1vZHVsZSkge1xuICAgICAgICAgICAgdmFyIGRlYWN0aXZhdGlvbnMgPSBfdGhpcy5fcmVtb3ZlTW9kdWxlQmluZGluZ3MobW9kdWxlLmlkKTtcbiAgICAgICAgICAgIF90aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9ucyhkZWFjdGl2YXRpb25zKTtcbiAgICAgICAgICAgIF90aGlzLl9yZW1vdmVNb2R1bGVIYW5kbGVycyhtb2R1bGUuaWQpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUudW5sb2FkQXN5bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtb2R1bGVzID0gW107XG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICBtb2R1bGVzW19pXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBtb2R1bGVzXzMsIG1vZHVsZV8xLCBkZWFjdGl2YXRpb25zO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2IubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EgPSAwLCBtb2R1bGVzXzMgPSBtb2R1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2IubGFiZWwgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShfYSA8IG1vZHVsZXNfMy5sZW5ndGgpKSByZXR1cm4gWzMsIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlXzEgPSBtb2R1bGVzXzNbX2FdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0aW9ucyA9IHRoaXMuX3JlbW92ZU1vZHVsZUJpbmRpbmdzKG1vZHVsZV8xLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgdGhpcy5fZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyhkZWFjdGl2YXRpb25zKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZU1vZHVsZUhhbmRsZXJzKG1vZHVsZV8xLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9iLmxhYmVsID0gMztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2ErKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdmFyIHNjb3BlID0gdGhpcy5vcHRpb25zLmRlZmF1bHRTY29wZSB8fCBCaW5kaW5nU2NvcGVFbnVtLlRyYW5zaWVudDtcbiAgICAgICAgdmFyIGJpbmRpbmcgPSBuZXcgQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllciwgc2NvcGUpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5hZGQoc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdUb1N5bnRheChiaW5kaW5nKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUucmViaW5kID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMudW5iaW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLnJlYmluZEFzeW5jID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0LCB0aGlzLnVuYmluZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5iaW5kKHNlcnZpY2VJZGVudGlmaWVyKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS51bmJpbmQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB0aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9ucyhiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUudW5iaW5kQXN5bmMgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpKSByZXR1cm4gWzMsIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCB0aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9uc0FzeW5jKGJpbmRpbmdzKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS51bmJpbmRBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LnRyYXZlcnNlKGZ1bmN0aW9uIChfa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgX3RoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5ID0gbmV3IExvb2t1cCgpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS51bmJpbmRBbGxBc3luYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHByb21pc2VzO1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS50cmF2ZXJzZShmdW5jdGlvbiAoX2tleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKF90aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9uc0FzeW5jKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgUHJvbWlzZS5hbGwocHJvbWlzZXMpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUub25BY3RpdmF0aW9uID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZhdGlvbnMuYWRkKHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5vbkRlYWN0aXZhdGlvbiA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwgb25EZWFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fZGVhY3RpdmF0aW9ucy5hZGQoc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuaXNCb3VuZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB2YXIgYm91bmQgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIWJvdW5kICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBib3VuZCA9IHRoaXMucGFyZW50LmlzQm91bmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuaXNDdXJyZW50Qm91bmQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmlzQm91bmROYW1lZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNCb3VuZFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5pc0JvdW5kVGFnZ2VkID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciBib3VuZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHZhciByZXF1ZXN0XzEgPSBjcmVhdGVNb2NrUmVxdWVzdCh0aGlzLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBib3VuZCA9IGJpbmRpbmdzLnNvbWUoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIuY29uc3RyYWludChyZXF1ZXN0XzEpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJvdW5kICYmIHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBib3VuZCA9IHRoaXMucGFyZW50LmlzQm91bmRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuc25hcHNob3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3NuYXBzaG90cy5wdXNoKENvbnRhaW5lclNuYXBzaG90Lm9mKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LmNsb25lKCksIHRoaXMuX21pZGRsZXdhcmUsIHRoaXMuX2FjdGl2YXRpb25zLmNsb25lKCksIHRoaXMuX2RlYWN0aXZhdGlvbnMuY2xvbmUoKSwgdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLmNsb25lKCkpKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUucmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3RzLnBvcCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTk9fTU9SRV9TTkFQU0hPVFNfQVZBSUxBQkxFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IHNuYXBzaG90LmJpbmRpbmdzO1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9ucyA9IHNuYXBzaG90LmFjdGl2YXRpb25zO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zID0gc25hcHNob3QuZGVhY3RpdmF0aW9ucztcbiAgICAgICAgdGhpcy5fbWlkZGxld2FyZSA9IHNuYXBzaG90Lm1pZGRsZXdhcmU7XG4gICAgICAgIHRoaXMuX21vZHVsZUFjdGl2YXRpb25TdG9yZSA9IHNuYXBzaG90Lm1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuY3JlYXRlQ2hpbGQgPSBmdW5jdGlvbiAoY29udGFpbmVyT3B0aW9ucykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgQ29udGFpbmVyKGNvbnRhaW5lck9wdGlvbnMgfHwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5hcHBseU1pZGRsZXdhcmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtaWRkbGV3YXJlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbWlkZGxld2FyZXNbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5pdGlhbCA9IHRoaXMuX21pZGRsZXdhcmVcbiAgICAgICAgICAgID8gdGhpcy5fbWlkZGxld2FyZVxuICAgICAgICAgICAgOiB0aGlzLl9wbGFuQW5kUmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLl9taWRkbGV3YXJlID0gbWlkZGxld2FyZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7IHJldHVybiBjdXJyKHByZXYpOyB9LCBpbml0aWFsKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuYXBwbHlDdXN0b21NZXRhZGF0YVJlYWRlciA9IGZ1bmN0aW9uIChtZXRhZGF0YVJlYWRlcikge1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlYWRlciA9IG1ldGFkYXRhUmVhZGVyO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdmFyIGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCdXRUaHJvd0lmQXN5bmMoZ2V0QXJncyk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldEFzeW5jID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBnZXRBcmdzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLl9nZXQoZ2V0QXJncyldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRUYWdnZWQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCBmYWxzZSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCdXRUaHJvd0lmQXN5bmMoZ2V0QXJncyk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldFRhZ2dlZEFzeW5jID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBnZXRBcmdzO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCBmYWxzZSwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLl9nZXQoZ2V0QXJncyldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXROYW1lZCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGFnZ2VkKHNlcnZpY2VJZGVudGlmaWVyLCBNRVRBREFUQV9LRVkuTkFNRURfVEFHLCBuYW1lZCk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldE5hbWVkQXN5bmMgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIsIHRoaXMuZ2V0VGFnZ2VkQXN5bmMoc2VydmljZUlkZW50aWZpZXIsIE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWVkKV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLmdldEFsbCA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB2YXIgZ2V0QXJncyA9IHRoaXMuX2dldEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnV0VGhyb3dJZkFzeW5jKGdldEFyZ3MpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRBbGxBc3luYyA9IGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZ2V0QXJncztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBnZXRBcmdzID0gdGhpcy5fZ2V0QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLl9nZXRBbGwoZ2V0QXJncyldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRBbGxUYWdnZWQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCB0cnVlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ1dFRocm93SWZBc3luYyhnZXRBcmdzKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0QWxsVGFnZ2VkQXN5bmMgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGdldEFyZ3M7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgZ2V0QXJncyA9IHRoaXMuX2dldE5vdEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIsIHRydWUsIGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5fZ2V0QWxsKGdldEFyZ3MpXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuZ2V0QWxsTmFtZWQgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5nZXRBbGxOYW1lZEFzeW5jID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLmdldEFsbFRhZ2dlZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBNRVRBREFUQV9LRVkuTkFNRURfVEFHLCBuYW1lZCldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24gKGNvbnN0cnVjdG9yRnVuY3Rpb24pIHtcbiAgICAgICAgdmFyIGlzQm91bmQgPSB0aGlzLmlzQm91bmQoY29uc3RydWN0b3JGdW5jdGlvbik7XG4gICAgICAgIGlmICghaXNCb3VuZCkge1xuICAgICAgICAgICAgdGhpcy5iaW5kKGNvbnN0cnVjdG9yRnVuY3Rpb24pLnRvU2VsZigpO1xuICAgICAgICB9XG4gICAgICAgIHZhciByZXNvbHZlZCA9IHRoaXMuZ2V0KGNvbnN0cnVjdG9yRnVuY3Rpb24pO1xuICAgICAgICBpZiAoIWlzQm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMudW5iaW5kKGNvbnN0cnVjdG9yRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX3ByZURlc3Ryb3kgPSBmdW5jdGlvbiAoY29uc3RydWN0b3IsIGluc3RhbmNlKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBSZWZsZWN0Lmhhc01ldGFkYXRhKE1FVEFEQVRBX0tFWS5QUkVfREVTVFJPWSwgY29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gKF9iID0gKF9hID0gaW5zdGFuY2UpW2RhdGEudmFsdWVdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbChfYSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX3JlbW92ZU1vZHVsZUhhbmRsZXJzID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgIHZhciBtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzID0gdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLnJlbW92ZShtb2R1bGVJZCk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uQWN0aXZhdGlvbnMpO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uRGVhY3RpdmF0aW9ucyk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9yZW1vdmVNb2R1bGVCaW5kaW5ncyA9IGZ1bmN0aW9uIChtb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlQnlDb25kaXRpb24oZnVuY3Rpb24gKGJpbmRpbmcpIHsgcmV0dXJuIGJpbmRpbmcubW9kdWxlSWQgPT09IG1vZHVsZUlkOyB9KTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2RlYWN0aXZhdGUgPSBmdW5jdGlvbiAoYmluZGluZywgaW5zdGFuY2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gaW5zdGFuY2UgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkuY29uc3RydWN0b3I7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGVhY3RpdmF0aW9ucy5oYXNLZXkoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVhY3RpdmF0ZUNvbnRhaW5lcihpbnN0YW5jZSwgdGhpcy5fZGVhY3RpdmF0aW9ucy5nZXQoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllcikudmFsdWVzKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRGVhY3RpdmF0aW9uRXJyb3IocmVzdWx0LnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5fcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95QXN5bmMoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7IH0pLCBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcHJvcGFnYXRlRGVhY3RpdmF0aW9uUmVzdWx0ID0gdGhpcy5fcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95KGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHByb3BhZ2F0ZURlYWN0aXZhdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRGVhY3RpdmF0aW9uRXJyb3IocHJvcGFnYXRlRGVhY3RpdmF0aW9uUmVzdWx0LCBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuT05fREVBQ1RJVkFUSU9OX0VSUk9SKGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllciksIGV4Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5faGFuZGxlRGVhY3RpdmF0aW9uRXJyb3IgPSBmdW5jdGlvbiAoYXN5bmNSZXN1bHQsIHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBleF8xO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2EudHJ5cy5wdXNoKFswLCAyLCAsIDNdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgYXN5bmNSZXN1bHRdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMsIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICBleF8xID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4XzEgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLk9OX0RFQUNUSVZBVElPTl9FUlJPUihnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHNlcnZpY2VJZGVudGlmaWVyKSwgZXhfMS5tZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMsIDNdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBbMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZGVhY3RpdmF0ZUNvbnRhaW5lciA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZGVhY3RpdmF0aW9uc0l0ZXJhdG9yKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBkZWFjdGl2YXRpb24gPSBkZWFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB3aGlsZSAodHlwZW9mIGRlYWN0aXZhdGlvbi52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGRlYWN0aXZhdGlvbi52YWx1ZShpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5fZGVhY3RpdmF0ZUNvbnRhaW5lckFzeW5jKGluc3RhbmNlLCBkZWFjdGl2YXRpb25zSXRlcmF0b3IpXTtcbiAgICAgICAgICAgICAgICB9KTsgfSk7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZGVhY3RpdmF0ZUNvbnRhaW5lckFzeW5jID0gZnVuY3Rpb24gKGluc3RhbmNlLCBkZWFjdGl2YXRpb25zSXRlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRlYWN0aXZhdGlvbjtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlYWN0aXZhdGlvbiA9IGRlYWN0aXZhdGlvbnNJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVvZiBkZWFjdGl2YXRpb24udmFsdWUgPT09ICdmdW5jdGlvbicpKSByZXR1cm4gWzMsIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCBkZWFjdGl2YXRpb24udmFsdWUoaW5zdGFuY2UpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgMV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHNldE1vZHVsZUlkID0gZnVuY3Rpb24gKGJpbmRpbmdUb1N5bnRheCwgbW9kdWxlSWQpIHtcbiAgICAgICAgICAgIGJpbmRpbmdUb1N5bnRheC5fYmluZGluZy5tb2R1bGVJZCA9IG1vZHVsZUlkO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0QmluZEZ1bmN0aW9uID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGJpbmRpbmdUb1N5bnRheCA9IF90aGlzLmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIHNldE1vZHVsZUlkKGJpbmRpbmdUb1N5bnRheCwgbW9kdWxlSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nVG9TeW50YXg7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0VW5iaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIF90aGlzLnVuYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH07IH07XG4gICAgICAgIHZhciBnZXRVbmJpbmRBc3luY0Z1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzZXJ2aWNlSWRlbnRpZmllcikgeyByZXR1cm4gX19hd2FpdGVyKF90aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyLCB0aGlzLnVuYmluZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyKV07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTsgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGdldElzYm91bmRGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuaXNCb3VuZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB2YXIgZ2V0UmViaW5kRnVuY3Rpb24gPSBmdW5jdGlvbiAobW9kdWxlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmluZGluZ1RvU3ludGF4ID0gX3RoaXMucmViaW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICBzZXRNb2R1bGVJZChiaW5kaW5nVG9TeW50YXgsIG1vZHVsZUlkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ1RvU3ludGF4O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIGdldE9uQWN0aXZhdGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLmFkZEFjdGl2YXRpb24obW9kdWxlSWQsIHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pO1xuICAgICAgICAgICAgICAgIF90aGlzLm9uQWN0aXZhdGlvbihzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRPbkRlYWN0aXZhdGlvbkZ1bmN0aW9uID0gZnVuY3Rpb24gKG1vZHVsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbikge1xuICAgICAgICAgICAgICAgIF90aGlzLl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUuYWRkRGVhY3RpdmF0aW9uKG1vZHVsZUlkLCBzZXJ2aWNlSWRlbnRpZmllciwgb25EZWFjdGl2YXRpb24pO1xuICAgICAgICAgICAgICAgIF90aGlzLm9uRGVhY3RpdmF0aW9uKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1JZCkgeyByZXR1cm4gKHtcbiAgICAgICAgICAgIGJpbmRGdW5jdGlvbjogZ2V0QmluZEZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICBpc2JvdW5kRnVuY3Rpb246IGdldElzYm91bmRGdW5jdGlvbigpLFxuICAgICAgICAgICAgb25BY3RpdmF0aW9uRnVuY3Rpb246IGdldE9uQWN0aXZhdGlvbkZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICBvbkRlYWN0aXZhdGlvbkZ1bmN0aW9uOiBnZXRPbkRlYWN0aXZhdGlvbkZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICByZWJpbmRGdW5jdGlvbjogZ2V0UmViaW5kRnVuY3Rpb24obUlkKSxcbiAgICAgICAgICAgIHVuYmluZEFzeW5jRnVuY3Rpb246IGdldFVuYmluZEFzeW5jRnVuY3Rpb24oKSxcbiAgICAgICAgICAgIHVuYmluZEZ1bmN0aW9uOiBnZXRVbmJpbmRGdW5jdGlvbigpLFxuICAgICAgICB9KTsgfTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2dldEFsbCA9IGZ1bmN0aW9uIChnZXRBcmdzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIsIFByb21pc2UuYWxsKHRoaXMuX2dldChnZXRBcmdzKSldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZ2V0ID0gZnVuY3Rpb24gKGdldEFyZ3MpIHtcbiAgICAgICAgdmFyIHBsYW5BbmRSZXNvbHZlQXJncyA9IF9fYXNzaWduKF9fYXNzaWduKHt9LCBnZXRBcmdzKSwgeyBjb250ZXh0SW50ZXJjZXB0b3I6IGZ1bmN0aW9uIChjb250ZXh0KSB7IHJldHVybiBjb250ZXh0OyB9LCB0YXJnZXRUeXBlOiBUYXJnZXRUeXBlRW51bS5WYXJpYWJsZSB9KTtcbiAgICAgICAgaWYgKHRoaXMuX21pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIHZhciBtaWRkbGV3YXJlUmVzdWx0ID0gdGhpcy5fbWlkZGxld2FyZShwbGFuQW5kUmVzb2x2ZUFyZ3MpO1xuICAgICAgICAgICAgaWYgKG1pZGRsZXdhcmVSZXN1bHQgPT09IHVuZGVmaW5lZCB8fCBtaWRkbGV3YXJlUmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuSU5WQUxJRF9NSURETEVXQVJFX1JFVFVSTik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcGxhbkFuZFJlc29sdmUoKShwbGFuQW5kUmVzb2x2ZUFyZ3MpO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fZ2V0QnV0VGhyb3dJZkFzeW5jID0gZnVuY3Rpb24gKGdldEFyZ3MpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2dldChnZXRBcmdzKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZU9yQ29udGFpbnNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkxBWllfSU5fU1lOQyhnZXRBcmdzLnNlcnZpY2VJZGVudGlmaWVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2dldEFsbEFyZ3MgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdmFyIGdldEFsbEFyZ3MgPSB7XG4gICAgICAgICAgICBhdm9pZENvbnN0cmFpbnRzOiB0cnVlLFxuICAgICAgICAgICAgaXNNdWx0aUluamVjdDogdHJ1ZSxcbiAgICAgICAgICAgIHNlcnZpY2VJZGVudGlmaWVyOiBzZXJ2aWNlSWRlbnRpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldEFsbEFyZ3M7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9nZXROb3RBbGxBcmdzID0gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyLCBpc011bHRpSW5qZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHZhciBnZXROb3RBbGxBcmdzID0ge1xuICAgICAgICAgICAgYXZvaWRDb25zdHJhaW50czogZmFsc2UsXG4gICAgICAgICAgICBpc011bHRpSW5qZWN0OiBpc011bHRpSW5qZWN0LFxuICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICBzZXJ2aWNlSWRlbnRpZmllcjogc2VydmljZUlkZW50aWZpZXIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXROb3RBbGxBcmdzO1xuICAgIH07XG4gICAgQ29udGFpbmVyLnByb3RvdHlwZS5fcGxhbkFuZFJlc29sdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBwbGFuKF90aGlzLl9tZXRhZGF0YVJlYWRlciwgX3RoaXMsIGFyZ3MuaXNNdWx0aUluamVjdCwgYXJncy50YXJnZXRUeXBlLCBhcmdzLnNlcnZpY2VJZGVudGlmaWVyLCBhcmdzLmtleSwgYXJncy52YWx1ZSwgYXJncy5hdm9pZENvbnN0cmFpbnRzKTtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhcmdzLmNvbnRleHRJbnRlcmNlcHRvcihjb250ZXh0KTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXNvbHZlKGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2RlYWN0aXZhdGVJZlNpbmdsZXRvbiA9IGZ1bmN0aW9uIChiaW5kaW5nKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICghYmluZGluZy5hY3RpdmF0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQcm9taXNlKGJpbmRpbmcuY2FjaGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYmluZGluZy5jYWNoZS50aGVuKGZ1bmN0aW9uIChyZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZGVhY3RpdmF0ZShiaW5kaW5nLCByZXNvbHZlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVhY3RpdmF0ZShiaW5kaW5nLCBiaW5kaW5nLmNhY2hlKTtcbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2RlYWN0aXZhdGVTaW5nbGV0b25zID0gZnVuY3Rpb24gKGJpbmRpbmdzKSB7XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgYmluZGluZ3NfMSA9IGJpbmRpbmdzOyBfaSA8IGJpbmRpbmdzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdzXzFbX2ldO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlYWN0aXZhdGVJZlNpbmdsZXRvbihiaW5kaW5nKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkFTWU5DX1VOQklORF9SRVFVSVJFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2RlYWN0aXZhdGVTaW5nbGV0b25zQXN5bmMgPSBmdW5jdGlvbiAoYmluZGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0LCBQcm9taXNlLmFsbChiaW5kaW5ncy5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiwgdGhpcy5fZGVhY3RpdmF0ZUlmU2luZ2xldG9uKGIpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB9KTsgfSkpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9wcm9wYWdhdGVDb250YWluZXJEZWFjdGl2YXRpb25UaGVuQmluZGluZ0FuZFByZURlc3Ryb3kgPSBmdW5jdGlvbiAoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlYWN0aXZhdGUuYmluZCh0aGlzLnBhcmVudCkoYmluZGluZywgaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95KGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveUFzeW5jID0gZnVuY3Rpb24gKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50KSByZXR1cm4gWzMsIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCB0aGlzLl9kZWFjdGl2YXRlLmJpbmQodGhpcy5wYXJlbnQpKGJpbmRpbmcsIGluc3RhbmNlKV07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgNF07XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFs0LCB0aGlzLl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveUFzeW5jKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3RvcildO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9yZW1vdmVTZXJ2aWNlRnJvbURpY3Rpb25hcnkgPSBmdW5jdGlvbiAoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5LnJlbW92ZShzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJcIi5jb25jYXQoRVJST1JfTVNHUy5DQU5OT1RfVU5CSU5ELCBcIiBcIikuY29uY2F0KGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoc2VydmljZUlkZW50aWZpZXIpKSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbnRhaW5lci5wcm90b3R5cGUuX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95ID0gZnVuY3Rpb24gKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAodHlwZW9mIGJpbmRpbmcub25EZWFjdGl2YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nLm9uRGVhY3RpdmF0aW9uKGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fcHJlRGVzdHJveShjb25zdHJ1Y3RvciwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wcmVEZXN0cm95KGNvbnN0cnVjdG9yLCBpbnN0YW5jZSk7XG4gICAgfTtcbiAgICBDb250YWluZXIucHJvdG90eXBlLl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveUFzeW5jID0gZnVuY3Rpb24gKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9PT0gJ2Z1bmN0aW9uJykpIHJldHVybiBbMywgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQsIGJpbmRpbmcub25EZWFjdGl2YXRpb24oaW5zdGFuY2UpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAyO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBbNCwgdGhpcy5fcHJlRGVzdHJveShjb25zdHJ1Y3RvciwgaW5zdGFuY2UpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGFpbmVyO1xufSgpKTtcbmV4cG9ydCB7IENvbnRhaW5lciB9O1xuIiwiaW1wb3J0IHsgaWQgfSBmcm9tICcuLi91dGlscy9pZCc7XG52YXIgQ29udGFpbmVyTW9kdWxlID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb250YWluZXJNb2R1bGUocmVnaXN0cnkpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG4gICAgcmV0dXJuIENvbnRhaW5lck1vZHVsZTtcbn0oKSk7XG5leHBvcnQgeyBDb250YWluZXJNb2R1bGUgfTtcbnZhciBBc3luY0NvbnRhaW5lck1vZHVsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQXN5bmNDb250YWluZXJNb2R1bGUocmVnaXN0cnkpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG4gICAgcmV0dXJuIEFzeW5jQ29udGFpbmVyTW9kdWxlO1xufSgpKTtcbmV4cG9ydCB7IEFzeW5jQ29udGFpbmVyTW9kdWxlIH07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBnZXRGaXJzdEFycmF5RHVwbGljYXRlIH0gZnJvbSAnLi4vdXRpbHMvanMnO1xuZnVuY3Rpb24gdGFyZ2V0SXNDb25zdHJ1Y3RvckZ1bmN0aW9uKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQucHJvdG90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKSB7XG4gICAgaWYgKHBhcmFtZXRlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRhZ1BhcmFtZXRlcihhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJJbmRleCwgbWV0YWRhdGEpIHtcbiAgICBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTtcbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VELCBhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJJbmRleC50b1N0cmluZygpLCBtZXRhZGF0YSk7XG59XG5mdW5jdGlvbiB0YWdQcm9wZXJ0eShhbm5vdGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHRhcmdldElzQ29uc3RydWN0b3JGdW5jdGlvbihhbm5vdGF0aW9uVGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGFubm90YXRpb25UYXJnZXQuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzKG1ldGFkYXRhKSB7XG4gICAgdmFyIG1ldGFkYXRhcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBtZXRhZGF0YXMgPSBtZXRhZGF0YTtcbiAgICAgICAgdmFyIGR1cGxpY2F0ZSA9IGdldEZpcnN0QXJyYXlEdXBsaWNhdGUobWV0YWRhdGFzLm1hcChmdW5jdGlvbiAobWQpIHsgcmV0dXJuIG1kLmtleTsgfSkpO1xuICAgICAgICBpZiAoZHVwbGljYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlwiLmNvbmNhdChFUlJPUl9NU0dTLkRVUExJQ0FURURfTUVUQURBVEEsIFwiIFwiKS5jb25jYXQoZHVwbGljYXRlLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGFzID0gW21ldGFkYXRhXTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhcztcbn1cbmZ1bmN0aW9uIF90YWdQYXJhbWV0ZXJPclByb3BlcnR5KG1ldGFkYXRhS2V5LCBhbm5vdGF0aW9uVGFyZ2V0LCBrZXksIG1ldGFkYXRhKSB7XG4gICAgdmFyIG1ldGFkYXRhcyA9IF9lbnN1cmVOb01ldGFkYXRhS2V5RHVwbGljYXRlcyhtZXRhZGF0YSk7XG4gICAgdmFyIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhID0ge307XG4gICAgaWYgKFJlZmxlY3QuaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFubm90YXRpb25UYXJnZXQpKSB7XG4gICAgICAgIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldCk7XG4gICAgfVxuICAgIHZhciBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YSA9IHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhW2tleV07XG4gICAgaWYgKHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1PclByb3BlcnR5TWV0YWRhdGEgPSBbXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YXMuc29tZShmdW5jdGlvbiAobWQpIHsgcmV0dXJuIG1kLmtleSA9PT0gbS5rZXk7IH0pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiXCIuY29uY2F0KEVSUk9SX01TR1MuRFVQTElDQVRFRF9NRVRBREFUQSwgXCIgXCIpLmNvbmNhdChtLmtleS50b1N0cmluZygpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvciAodmFyIF9pID0gMCwgcGFyYW1PclByb3BlcnR5TWV0YWRhdGFfMSA9IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhOyBfaSA8IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICB2YXIgbSA9IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhXzFbX2ldO1xuICAgICAgICAgICAgX2xvb3BfMShtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YS5wdXNoLmFwcGx5KHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhLCBtZXRhZGF0YXMpO1xuICAgIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhW2tleV0gPSBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBwYXJhbXNPclByb3BlcnRpZXNNZXRhZGF0YSwgYW5ub3RhdGlvblRhcmdldCk7XG59XG5mdW5jdGlvbiBjcmVhdGVUYWdnZWREZWNvcmF0b3IobWV0YWRhdGEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXhPclByb3BlcnR5RGVzY3JpcHRvciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRhZ1BhcmFtZXRlcih0YXJnZXQsIHRhcmdldEtleSwgaW5kZXhPclByb3BlcnR5RGVzY3JpcHRvciwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGFnUHJvcGVydHkodGFyZ2V0LCB0YXJnZXRLZXksIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBfZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9yLCB0YXJnZXQsIHBhcmFtZXRlckluZGV4T3JQcm9wZXJ0eSkge1xuICAgIGlmICh0eXBlb2YgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5ID09PSAnbnVtYmVyJykge1xuICAgICAgICBfZGVjb3JhdGUoW19wYXJhbShwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHksIGRlY29yYXRvcildLCB0YXJnZXQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5ID09PSAnc3RyaW5nJykge1xuICAgICAgICBSZWZsZWN0LmRlY29yYXRlKFtkZWNvcmF0b3JdLCB0YXJnZXQsIHBhcmFtZXRlckluZGV4T3JQcm9wZXJ0eSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBfZGVjb3JhdGUoW2RlY29yYXRvcl0sIHRhcmdldCk7XG4gICAgfVxufVxuZXhwb3J0IHsgZGVjb3JhdGUsIHRhZ1BhcmFtZXRlciwgdGFnUHJvcGVydHksIGNyZWF0ZVRhZ2dlZERlY29yYXRvciB9O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QXJyYXlEdXBsaWNhdGUoYXJyYXkpIHtcbiAgICB2YXIgc2VlblZhbHVlcyA9IG5ldyBTZXQoKTtcbiAgICBmb3IgKHZhciBfaSA9IDAsIGFycmF5XzEgPSBhcnJheTsgX2kgPCBhcnJheV8xLmxlbmd0aDsgX2krKykge1xuICAgICAgICB2YXIgZW50cnkgPSBhcnJheV8xW19pXTtcbiAgICAgICAgaWYgKHNlZW5WYWx1ZXMuaGFzKGVudHJ5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VlblZhbHVlcy5hZGQoZW50cnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgKiBhcyBFUlJPUlNfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuZnVuY3Rpb24gaW5qZWN0YWJsZSgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShNRVRBREFUQV9LRVkuUEFSQU1fVFlQRVMsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUlNfTVNHUy5EVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdHlwZXMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5ERVNJR05fUEFSQU1fVFlQRVMsIHRhcmdldCkgfHwgW107XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBBUkFNX1RZUEVTLCB0eXBlcywgdGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9O1xufVxuZXhwb3J0IHsgaW5qZWN0YWJsZSB9O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVUYWdnZWREZWNvcmF0b3IgfSBmcm9tICcuL2RlY29yYXRvcl91dGlscyc7XG5mdW5jdGlvbiB0YWdnZWQobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgICByZXR1cm4gY3JlYXRlVGFnZ2VkRGVjb3JhdG9yKG5ldyBNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkpO1xufVxuZXhwb3J0IHsgdGFnZ2VkIH07XG4iLCJpbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVUYWdnZWREZWNvcmF0b3IgfSBmcm9tICcuL2RlY29yYXRvcl91dGlscyc7XG5mdW5jdGlvbiBuYW1lZChuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihuZXcgTWV0YWRhdGEoTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZSkpO1xufVxuZXhwb3J0IHsgbmFtZWQgfTtcbiIsImltcG9ydCB7IFVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTiB9IGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEJhc2UobWV0YWRhdGFLZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4T3JQcm9wZXJ0eURlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04oY2xhc3NOYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVUYWdnZWREZWNvcmF0b3IobmV3IE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBzZXJ2aWNlSWRlbnRpZmllcikpKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IGluamVjdEJhc2UgfSBmcm9tICcuL2luamVjdF9iYXNlJztcbnZhciBpbmplY3QgPSBpbmplY3RCYXNlKE1FVEFEQVRBX0tFWS5JTkpFQ1RfVEFHKTtcbmV4cG9ydCB7IGluamVjdCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gb3B0aW9uYWwoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihuZXcgTWV0YWRhdGEoTUVUQURBVEFfS0VZLk9QVElPTkFMX1RBRywgdHJ1ZSkpO1xufVxuZXhwb3J0IHsgb3B0aW9uYWwgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IHRhZ1BhcmFtZXRlciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmZ1bmN0aW9uIHVubWFuYWdlZCgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCkge1xuICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoTUVUQURBVEFfS0VZLlVOTUFOQUdFRF9UQUcsIHRydWUpO1xuICAgICAgICB0YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgfTtcbn1cbmV4cG9ydCB7IHVubWFuYWdlZCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IGluamVjdEJhc2UgfSBmcm9tICcuL2luamVjdF9iYXNlJztcbnZhciBtdWx0aUluamVjdCA9IGluamVjdEJhc2UoTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUcpO1xuZXhwb3J0IHsgbXVsdGlJbmplY3QgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IHRhZ1BhcmFtZXRlciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmZ1bmN0aW9uIHRhcmdldE5hbWUobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBNZXRhZGF0YShNRVRBREFUQV9LRVkuTkFNRV9UQUcsIG5hbWUpO1xuICAgICAgICB0YWdQYXJhbWV0ZXIodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4LCBtZXRhZGF0YSk7XG4gICAgfTtcbn1cbmV4cG9ydCB7IHRhcmdldE5hbWUgfTtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuZnVuY3Rpb24gcHJvcGVydHlFdmVudERlY29yYXRvcihldmVudEtleSwgZXJyb3JNZXNzYWdlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGEgPSBuZXcgTWV0YWRhdGEoZXZlbnRLZXksIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmIChSZWZsZWN0Lmhhc093bk1ldGFkYXRhKGV2ZW50S2V5LCB0YXJnZXQuY29uc3RydWN0b3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKGV2ZW50S2V5LCBtZXRhZGF0YSwgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuZXhwb3J0IHsgcHJvcGVydHlFdmVudERlY29yYXRvciB9O1xuIiwiaW1wb3J0ICogYXMgRVJST1JTX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IHByb3BlcnR5RXZlbnREZWNvcmF0b3IgfSBmcm9tICcuL3Byb3BlcnR5X2V2ZW50X2RlY29yYXRvcic7XG52YXIgcG9zdENvbnN0cnVjdCA9IHByb3BlcnR5RXZlbnREZWNvcmF0b3IoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBFUlJPUlNfTVNHUy5NVUxUSVBMRV9QT1NUX0NPTlNUUlVDVF9NRVRIT0RTKTtcbmV4cG9ydCB7IHBvc3RDb25zdHJ1Y3QgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3InO1xudmFyIHByZURlc3Ryb3kgPSBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yKE1FVEFEQVRBX0tFWS5QUkVfREVTVFJPWSwgRVJST1JTX01TR1MuTVVMVElQTEVfUFJFX0RFU1RST1lfTUVUSE9EUyk7XG5leHBvcnQgeyBwcmVEZXN0cm95IH07XG4iLCJpbXBvcnQgKiBhcyBrZXlzIGZyb20gJy4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuZXhwb3J0IHsgTGF6eVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnQGludmVyc2lmeWpzL2NvbW1vbic7XG5leHBvcnQgdmFyIE1FVEFEQVRBX0tFWSA9IGtleXM7XG5leHBvcnQgeyBDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lci9jb250YWluZXInO1xuZXhwb3J0IHsgQmluZGluZ1Njb3BlRW51bSwgQmluZGluZ1R5cGVFbnVtLCBUYXJnZXRUeXBlRW51bSwgfSBmcm9tICcuL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmV4cG9ydCB7IEFzeW5jQ29udGFpbmVyTW9kdWxlLCBDb250YWluZXJNb2R1bGUsIH0gZnJvbSAnLi9jb250YWluZXIvY29udGFpbmVyX21vZHVsZSc7XG5leHBvcnQgeyBjcmVhdGVUYWdnZWREZWNvcmF0b3IgfSBmcm9tICcuL2Fubm90YXRpb24vZGVjb3JhdG9yX3V0aWxzJztcbmV4cG9ydCB7IGluamVjdGFibGUgfSBmcm9tICcuL2Fubm90YXRpb24vaW5qZWN0YWJsZSc7XG5leHBvcnQgeyB0YWdnZWQgfSBmcm9tICcuL2Fubm90YXRpb24vdGFnZ2VkJztcbmV4cG9ydCB7IG5hbWVkIH0gZnJvbSAnLi9hbm5vdGF0aW9uL25hbWVkJztcbmV4cG9ydCB7IGluamVjdCB9IGZyb20gJy4vYW5ub3RhdGlvbi9pbmplY3QnO1xuZXhwb3J0IHsgb3B0aW9uYWwgfSBmcm9tICcuL2Fubm90YXRpb24vb3B0aW9uYWwnO1xuZXhwb3J0IHsgdW5tYW5hZ2VkIH0gZnJvbSAnLi9hbm5vdGF0aW9uL3VubWFuYWdlZCc7XG5leHBvcnQgeyBtdWx0aUluamVjdCB9IGZyb20gJy4vYW5ub3RhdGlvbi9tdWx0aV9pbmplY3QnO1xuZXhwb3J0IHsgdGFyZ2V0TmFtZSB9IGZyb20gJy4vYW5ub3RhdGlvbi90YXJnZXRfbmFtZSc7XG5leHBvcnQgeyBwb3N0Q29uc3RydWN0IH0gZnJvbSAnLi9hbm5vdGF0aW9uL3Bvc3RfY29uc3RydWN0JztcbmV4cG9ydCB7IHByZURlc3Ryb3kgfSBmcm9tICcuL2Fubm90YXRpb24vcHJlX2Rlc3Ryb3knO1xuZXhwb3J0IHsgTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuL3BsYW5uaW5nL21ldGFkYXRhX3JlYWRlcic7XG5leHBvcnQgeyBpZCB9IGZyb20gJy4vdXRpbHMvaWQnO1xuZXhwb3J0IHsgZGVjb3JhdGUgfSBmcm9tICcuL2Fubm90YXRpb24vZGVjb3JhdG9yX3V0aWxzJztcbmV4cG9ydCB7IHRyYXZlcnNlQW5jZXJzdG9ycywgdGFnZ2VkQ29uc3RyYWludCwgbmFtZWRDb25zdHJhaW50LCB0eXBlQ29uc3RyYWludCwgfSBmcm9tICcuL3N5bnRheC9jb25zdHJhaW50X2hlbHBlcnMnO1xuZXhwb3J0IHsgZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyB9IGZyb20gJy4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5leHBvcnQgeyBtdWx0aUJpbmRUb1NlcnZpY2UgfSBmcm9tICcuL3V0aWxzL2JpbmRpbmdfdXRpbHMnO1xuIl0sIm5hbWVzIjpbIl9fd2VicGFja19yZXF1aXJlX18iLCJleHBvcnRzIiwiZGVmaW5pdGlvbiIsImtleSIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJvYmoiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsIk5BTUVEX1RBRyIsIk5BTUVfVEFHIiwiVU5NQU5BR0VEX1RBRyIsIk9QVElPTkFMX1RBRyIsIklOSkVDVF9UQUciLCJNVUxUSV9JTkpFQ1RfVEFHIiwiVEFHR0VEIiwiVEFHR0VEX1BST1AiLCJQQVJBTV9UWVBFUyIsIkRFU0lHTl9QQVJBTV9UWVBFUyIsIlBPU1RfQ09OU1RSVUNUIiwiUFJFX0RFU1RST1kiLCJOT05fQ1VTVE9NX1RBR19LRVlTIiwieSIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvbW1vbl8wODFkOGMwN19fIiwieCIsImQiLCJCaW5kaW5nU2NvcGVFbnVtIiwiUmVxdWVzdCIsIlNpbmdsZXRvbiIsIlRyYW5zaWVudCIsIkJpbmRpbmdUeXBlRW51bSIsIkNvbnN0YW50VmFsdWUiLCJDb25zdHJ1Y3RvciIsIkR5bmFtaWNWYWx1ZSIsIkZhY3RvcnkiLCJGdW5jdGlvbiIsIkluc3RhbmNlIiwiSW52YWxpZCIsIlByb3ZpZGVyIiwiVGFyZ2V0VHlwZUVudW0iLCJDbGFzc1Byb3BlcnR5IiwiQ29uc3RydWN0b3JBcmd1bWVudCIsIlZhcmlhYmxlIiwiaWRDb3VudGVyIiwiaWQiLCJCaW5kaW5nIiwic2VydmljZUlkZW50aWZpZXIiLCJzY29wZSIsInRoaXMiLCJhY3RpdmF0ZWQiLCJ0eXBlIiwiY29uc3RyYWludCIsIl9yZXF1ZXN0IiwiaW1wbGVtZW50YXRpb25UeXBlIiwiY2FjaGUiLCJmYWN0b3J5IiwicHJvdmlkZXIiLCJvbkFjdGl2YXRpb24iLCJvbkRlYWN0aXZhdGlvbiIsImR5bmFtaWNWYWx1ZSIsImNsb25lIiwiRFVQTElDQVRFRF9JTkpFQ1RBQkxFX0RFQ09SQVRPUiIsIkRVUExJQ0FURURfTUVUQURBVEEiLCJOVUxMX0FSR1VNRU5UIiwiS0VZX05PVF9GT1VORCIsIklOVkFMSURfREVDT1JBVE9SX09QRVJBVElPTiIsIk9OX0RFQUNUSVZBVElPTl9FUlJPUiIsImNsYXp6IiwiZXJyb3JNZXNzYWdlIiwiY29uY2F0IiwiTWV0YWRhdGFSZWFkZXIiLCJnZXRDb25zdHJ1Y3Rvck1ldGFkYXRhIiwiY29uc3RydWN0b3JGdW5jIiwiX2EiLCJjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhIiwiUmVmbGVjdCIsImdldE1ldGFkYXRhIiwidXNlckdlbmVyYXRlZE1ldGFkYXRhIiwiZ2V0UHJvcGVydGllc01ldGFkYXRhIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29yZV9jMDhjZjRhMV9fIiwiQmluZGluZ0NvdW50IiwiaXNTdGFja092ZXJmbG93RXhjZXB0aW9uIiwiZXJyb3IiLCJSYW5nZUVycm9yIiwibWVzc2FnZSIsImdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmciLCJuYW1lIiwidG9TdHJpbmciLCJsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIiLCJjb250YWluZXIiLCJnZXRCaW5kaW5ncyIsInJlZ2lzdGVyZWRCaW5kaW5nc0xpc3QiLCJyZWdpc3RlcmVkQmluZGluZ3MiLCJsZW5ndGgiLCJmb3JFYWNoIiwiYmluZGluZyIsImdldEZ1bmN0aW9uTmFtZSIsIm1ldGFEYXRhIiwiYWxyZWFkeURlcGVuZGVuY3lDaGFpbiIsInJlcXVlc3QiLCJwYXJlbnRSZXF1ZXN0IiwiY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24iLCJjaGlsZFJlcXVlc3RzIiwiY2hpbGRSZXF1ZXN0Iiwic2VydmljZXMiLCJfY3JlYXRlU3RyaW5nQXJyIiwicmVxIiwicmVzdWx0IiwicHVzaCIsInJldmVyc2UiLCJqb2luIiwiZGVwZW5kZW5jeUNoYWluVG9TdHJpbmciLCJFcnJvciIsImZ1bmMiLCJuYW1lXzEiLCJtYXRjaCIsInN0cmluZ2lmeU1ldGFkYXRhIiwibWV0YWRhdGEiLCJDb250ZXh0IiwiYWRkUGxhbiIsInBsYW4iLCJzZXRDdXJyZW50UmVxdWVzdCIsImN1cnJlbnRSZXF1ZXN0IiwiTWV0YWRhdGEiLCJTdHJpbmciLCJQbGFuIiwicGFyZW50Q29udGV4dCIsInJvb3RSZXF1ZXN0IiwiZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50IiwibWV0YWRhdGFSZWFkZXIiLCJiYXNlQ29uc3RydWN0b3IiLCJnZXRQcm90b3R5cGVPZiIsImNvbnN0cnVjdG9yIiwidGFyZ2V0cyIsImdldFRhcmdldHMiLCJtYXAiLCJ0IiwiZmlsdGVyIiwibSIsInVubWFuYWdlZENvdW50IiwiYXBwbHkiLCJkZXBlbmRlbmN5Q291bnQiLCJiaW5kaW5ncyIsInRhcmdldCIsIkFycmF5IiwiaXNBcnJheSIsInJlcXVlc3RTY29wZSIsIk1hcCIsImFkZENoaWxkUmVxdWVzdCIsImNoaWxkIiwiZ2V0QmluZGluZ0RpY3Rpb25hcnkiLCJjbnRuciIsIl9iaW5kaW5nRGljdGlvbmFyeSIsIl9nZXRBY3RpdmVCaW5kaW5ncyIsImF2b2lkQ29uc3RyYWludHMiLCJjb250ZXh0IiwiYWN0aXZlQmluZGluZ3MiLCJOb0JpbmRpbmdzQXZhaWxhYmxlIiwib3B0aW9ucyIsImF1dG9CaW5kSW5qZWN0YWJsZSIsImJpbmQiLCJ0b1NlbGYiLCJpc09wdGlvbmFsIiwic2VydmljZUlkZW50aWZpZXJTdHJpbmciLCJtc2ciLCJpc1RhZ2dlZCIsImlzTmFtZWQiLCJtXzEiLCJuYW1lZFRhZyIsImdldE5hbWVkVGFnIiwib3RoZXJUYWdzIiwiZ2V0Q3VzdG9tVGFncyIsInRhZyIsImxpc3RNZXRhZGF0YUZvclRhcmdldCIsIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlIiwiTXVsdGlwbGVCaW5kaW5nc0F2YWlsYWJsZSIsIl92YWxpZGF0ZUFjdGl2ZUJpbmRpbmdDb3VudCIsIl9nZXRUYXJnZXRNZXRhZGF0YSIsImlzTXVsdGlJbmplY3QiLCJtZXRhZGF0YUxpc3QiLCJ1bmRlZmluZWQiLCJfY3JlYXRlU3ViUmVxdWVzdHMiLCJ0aGVQbGFuIiwic3ViQ2hpbGRSZXF1ZXN0IiwiZGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwic2tpcEJhc2VDbGFzc0NoZWNrcyIsImJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCIsImRlcGVuZGVuY3kiLCJiaW5kaW5nRGljdGlvbmFyeSIsImhhc0tleSIsInBhcmVudCIsImlzUHJvbWlzZSIsIm9iamVjdCIsInRoZW4iLCJpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSIsInNvbWUiLCJGYWN0b3J5VHlwZSIsIl9zYXZlQXN5bmNSZXN1bHRUb1NpbmdsZXRvblNjb3BlIiwiYXN5bmNSZXN1bHQiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsImdlbmVyYXRvciIsImV4XzEiLCJib2R5IiwiZiIsIl8iLCJsYWJlbCIsInNlbnQiLCJ0cnlzIiwib3BzIiwiZyIsImNyZWF0ZSIsIkl0ZXJhdG9yIiwibmV4dCIsInZlcmIiLCJpdGVyYXRvciIsIm4iLCJ2Iiwib3AiLCJUeXBlRXJyb3IiLCJkb25lIiwicG9wIiwiZSIsInN0ZXAiLCJfX2dlbmVyYXRvciIsIlAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInJlamVjdGVkIiwibXVsdGlCaW5kVG9TZXJ2aWNlIiwic2VydmljZSIsInR5cGVzIiwiX2kiLCJhcmd1bWVudHMiLCJ0b1NlcnZpY2UiLCJfX2Fzc2lnbiIsImFzc2lnbiIsInMiLCJpIiwicCIsImNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnMiLCJhcmdzIiwiaW5zdGFuY2UiLCJjb25zdHIiLCJ0byIsImZyb20iLCJwYWNrIiwiYXIiLCJsIiwic2xpY2UiLCJfX3NwcmVhZEFycmF5IiwiY29uc3RydWN0b3JJbmplY3Rpb25zIiwicHJvcGVydHlSZXF1ZXN0cyIsInIiLCJpbmRleCIsInByb3BlcnR5IiwiaWRlbnRpZmllciIsImluamVjdGlvbiIsInByb3BlcnR5SW5qZWN0aW9ucyIsInBvc3NpYmx5V2FpdEluamVjdGlvbnMiLCJwb3NzaWJsZVByb21pc2VpbmplY3Rpb25zIiwiaW5qZWN0aW9ucyIsInBvc3NpYmxlUHJvbWlzZWluamVjdGlvbnNfMSIsImFsbCIsIl9nZXRJbnN0YW5jZUFmdGVyUG9zdENvbnN0cnVjdCIsInBvc3RDb25zdHJ1Y3RSZXN1bHQiLCJfYiIsImhhc01ldGFkYXRhIiwiZGF0YSIsIl9wb3N0Q29uc3RydWN0IiwiX3Jlc29sdmVSZXF1ZXN0IiwidGFyZ2V0SXNBbkFycmF5IiwidGFyZ2V0UGFyZW50SXNOb3RBbkFycmF5IiwibWF0Y2hlc0FycmF5IiwicmVzb2x2ZVJlcXVlc3QiLCJfcmVzb2x2ZUJpbmRpbmciLCJfcmVzb2x2ZUZhY3RvcnlGcm9tQmluZGluZyIsImZhY3RvcnlEZXRhaWxzIiwiZmFjdG9yeVR5cGUiLCJnZXRGYWN0b3J5RGV0YWlscyIsInRyeUFuZFRocm93RXJyb3JJZlN0YWNrT3ZlcmZsb3ciLCJfZ2V0UmVzb2x2ZWRGcm9tQmluZGluZyIsImJvdW5kVmFsdWUiLCJzZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nIiwiZW5zdXJlRnVsbHlCb3VuZCIsInNjb3BlRXJyb3JNZXNzYWdlIiwiX3Rocm93SWZIYW5kbGluZ0RlYWN0aXZhdGlvbiIsIl92YWxpZGF0ZUluc3RhbmNlUmVzb2x1dGlvbiIsInJlc29sdmVkIiwicmVkdWNlIiwicmVzb2x2ZWRSZXF1ZXN0cyIsImlzQXN5bmMiLCJfcmVzb2x2ZVJlcXVlc3RzIiwiY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FyZyIsImNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBc3luYyIsIl9jcmVhdGVJbnN0YW5jZSIsInJlc29sdmVkUmVzdWx0IiwicmVzb2x2ZUluc3RhbmNlIiwiX3Jlc29sdmVJblNjb3BlIiwicmVzb2x2ZUZyb21CaW5kaW5nIiwiaGFzIiwidHJ5R2V0RnJvbVNjb3BlIiwiX3NhdmVUb1NpbmdsZXRvblNjb3BlIiwic2V0IiwiX3NhdmVUb1JlcXVlc3RTY29wZSIsInNhdmVUb1Njb3BlIiwiX29uQWN0aXZhdGlvbiIsIl9iaW5kaW5nQWN0aXZhdGlvbiIsImNvbnRhaW5lcnNJdGVyYXRvciIsIl9nZXRDb250YWluZXJzSXRlcmF0b3IiLCJjb250YWluZXJzSXRlcmF0b3JSZXN1bHQiLCJjb250ZXh0XzEiLCJhY3RpdmF0aW9uc0l0ZXJhdG9yIiwiX2dldENvbnRhaW5lckFjdGl2YXRpb25zRm9yU2VydmljZSIsIl9hY3RpdmF0ZUNvbnRhaW5lckFzeW5jIiwiX2FjdGl2YXRlQ29udGFpbmVyIiwicHJldmlvdXNSZXN1bHQiLCJhY3RpdmF0aW9uIiwicmVzdWx0UHJvbWlzZSIsImFjdGl2YXRpb25zIiwiX2FjdGl2YXRpb25zIiwidmFsdWVzIiwiY29udGFpbmVyc1N0YWNrIiwibmV4dENvbnRhaW5lciIsInRyYXZlcnNlQW5jZXJzdG9ycyIsInRhZ2dlZENvbnN0cmFpbnQiLCJtYXRjaGVzVGFnIiwibmFtZWRDb25zdHJhaW50IiwidHlwZUNvbnN0cmFpbnQiLCJCaW5kaW5nV2hlblN5bnRheCIsIl9iaW5kaW5nIiwid2hlbiIsIkJpbmRpbmdPblN5bnRheCIsIndoZW5UYXJnZXROYW1lZCIsIndoZW5UYXJnZXRJc0RlZmF1bHQiLCJ3aGVuVGFyZ2V0VGFnZ2VkIiwid2hlbkluamVjdGVkSW50byIsIndoZW5QYXJlbnROYW1lZCIsIndoZW5QYXJlbnRUYWdnZWQiLCJ3aGVuQW55QW5jZXN0b3JJcyIsImFuY2VzdG9yIiwid2hlbk5vQW5jZXN0b3JJcyIsIndoZW5BbnlBbmNlc3Rvck5hbWVkIiwid2hlbk5vQW5jZXN0b3JOYW1lZCIsIndoZW5BbnlBbmNlc3RvclRhZ2dlZCIsIndoZW5Ob0FuY2VzdG9yVGFnZ2VkIiwid2hlbkFueUFuY2VzdG9yTWF0Y2hlcyIsIndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyIsImhhbmRsZXIiLCJCaW5kaW5nV2hlbk9uU3ludGF4IiwiX2JpbmRpbmdXaGVuU3ludGF4IiwiX2JpbmRpbmdPblN5bnRheCIsIkJpbmRpbmdJblN5bnRheCIsImluUmVxdWVzdFNjb3BlIiwiaW5TaW5nbGV0b25TY29wZSIsImluVHJhbnNpZW50U2NvcGUiLCJCaW5kaW5nSW5XaGVuT25TeW50YXgiLCJfYmluZGluZ0luU3ludGF4IiwiQmluZGluZ1RvU3ludGF4Iiwic2VsZiIsInRvQ29uc3RhbnRWYWx1ZSIsInRvRHluYW1pY1ZhbHVlIiwidG9Db25zdHJ1Y3RvciIsInRvRmFjdG9yeSIsInRvRnVuY3Rpb24iLCJiaW5kaW5nV2hlbk9uU3ludGF4IiwidG9BdXRvRmFjdG9yeSIsInRvQXV0b05hbWVkRmFjdG9yeSIsIm5hbWVkIiwiZ2V0TmFtZWQiLCJ0b1Byb3ZpZGVyIiwiQ29udGFpbmVyU25hcHNob3QiLCJvZiIsIm1pZGRsZXdhcmUiLCJkZWFjdGl2YXRpb25zIiwibW9kdWxlQWN0aXZhdGlvblN0b3JlIiwic25hcHNob3QiLCJMb29rdXAiLCJfbWFwIiwiZ2V0TWFwIiwiYWRkIiwiX2NoZWNrTm9uTnVsaXNoIiwiZW50cnkiLCJyZW1vdmUiLCJkZWxldGUiLCJyZW1vdmVJbnRlcnNlY3Rpb24iLCJsb29rdXAiLCJfdGhpcyIsInRyYXZlcnNlIiwibG9va3VwQWN0aXZhdGlvbnMiLCJmaWx0ZXJlZFZhbHVlcyIsImxvb2t1cFZhbHVlIiwibW9kdWxlQWN0aXZhdGlvbiIsIl9zZXRWYWx1ZSIsInJlbW92ZUJ5Q29uZGl0aW9uIiwiY29uZGl0aW9uIiwicmVtb3ZhbHMiLCJlbnRyaWVzIiwidXBkYXRlZEVudHJpZXMiLCJlbnRyaWVzXzEiLCJjb3B5IiwiYiIsIk1vZHVsZUFjdGl2YXRpb25TdG9yZSIsIm1vZHVsZUlkIiwiaGFuZGxlcnMiLCJfZ2V0RW1wdHlIYW5kbGVyc1N0b3JlIiwiYWRkRGVhY3RpdmF0aW9uIiwiX2dldE1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyIsIm9uRGVhY3RpdmF0aW9ucyIsImFkZEFjdGl2YXRpb24iLCJvbkFjdGl2YXRpb25zIiwiaGFuZGxlcnNTdG9yZSIsIm1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyIsIkNvbnRhaW5lciIsImNvbnRhaW5lck9wdGlvbnMiLCJkZWZhdWx0U2NvcGUiLCJfc25hcHNob3RzIiwiX21pZGRsZXdhcmUiLCJfZGVhY3RpdmF0aW9ucyIsIl9tZXRhZGF0YVJlYWRlciIsIl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUiLCJtZXJnZSIsImNvbnRhaW5lcjEiLCJjb250YWluZXIyIiwiY29udGFpbmVycyIsInRhcmdldENvbnRhaW5lcnMiLCJ0YXJnZXRDb250YWluZXIiLCJ0YXJnZXRCaW5kaW5nRGljdGlvbmFyeSIsImRlc3RpbmF0aW9uIiwiX2tleSIsImxvYWQiLCJtb2R1bGVzIiwiZ2V0SGVscGVycyIsIl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSIsIm1vZHVsZXNfMSIsImN1cnJlbnRNb2R1bGUiLCJjb250YWluZXJNb2R1bGVIZWxwZXJzIiwicmVnaXN0cnkiLCJiaW5kRnVuY3Rpb24iLCJ1bmJpbmRGdW5jdGlvbiIsImlzYm91bmRGdW5jdGlvbiIsInJlYmluZEZ1bmN0aW9uIiwidW5iaW5kQXN5bmNGdW5jdGlvbiIsIm9uQWN0aXZhdGlvbkZ1bmN0aW9uIiwib25EZWFjdGl2YXRpb25GdW5jdGlvbiIsImxvYWRBc3luYyIsIm1vZHVsZXNfMiIsInVubG9hZCIsIm1vZHVsZSIsIl9yZW1vdmVNb2R1bGVCaW5kaW5ncyIsIl9kZWFjdGl2YXRlU2luZ2xldG9ucyIsIl9yZW1vdmVNb2R1bGVIYW5kbGVycyIsInVubG9hZEFzeW5jIiwibW9kdWxlc18zIiwibW9kdWxlXzEiLCJfZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyIsInJlYmluZCIsInVuYmluZCIsInJlYmluZEFzeW5jIiwidW5iaW5kQXN5bmMiLCJfcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5IiwidW5iaW5kQWxsIiwidW5iaW5kQWxsQXN5bmMiLCJwcm9taXNlcyIsImlzQm91bmQiLCJib3VuZCIsImlzQ3VycmVudEJvdW5kIiwiaXNCb3VuZE5hbWVkIiwiaXNCb3VuZFRhZ2dlZCIsInJlcXVlc3RfMSIsImNsYXNzRWxlbWVudE1ldGFkYXRhIiwiZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEiLCJraW5kIiwiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwidW5tYW5hZ2VkIiwiY3JlYXRlTW9ja1JlcXVlc3QiLCJyZXN0b3JlIiwiY3JlYXRlQ2hpbGQiLCJhcHBseU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlcyIsImluaXRpYWwiLCJfcGxhbkFuZFJlc29sdmUiLCJwcmV2IiwiY3VyciIsImFwcGx5Q3VzdG9tTWV0YWRhdGFSZWFkZXIiLCJnZXRBcmdzIiwiX2dldE5vdEFsbEFyZ3MiLCJfZ2V0QnV0VGhyb3dJZkFzeW5jIiwiZ2V0QXN5bmMiLCJfZ2V0IiwiZ2V0VGFnZ2VkIiwiZ2V0VGFnZ2VkQXN5bmMiLCJnZXROYW1lZEFzeW5jIiwiZ2V0QWxsIiwiX2dldEFsbEFyZ3MiLCJnZXRBbGxBc3luYyIsIl9nZXRBbGwiLCJnZXRBbGxUYWdnZWQiLCJnZXRBbGxUYWdnZWRBc3luYyIsImdldEFsbE5hbWVkIiwiZ2V0QWxsTmFtZWRBc3luYyIsImNvbnN0cnVjdG9yRnVuY3Rpb24iLCJfcHJlRGVzdHJveSIsIm1vZHVsZUFjdGl2YXRpb25zSGFuZGxlcnMiLCJfZGVhY3RpdmF0ZSIsIl9kZWFjdGl2YXRlQ29udGFpbmVyIiwiX2hhbmRsZURlYWN0aXZhdGlvbkVycm9yIiwiX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveUFzeW5jIiwicHJvcGFnYXRlRGVhY3RpdmF0aW9uUmVzdWx0IiwiX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveSIsImV4IiwiZGVhY3RpdmF0aW9uc0l0ZXJhdG9yIiwiZGVhY3RpdmF0aW9uIiwiX2RlYWN0aXZhdGVDb250YWluZXJBc3luYyIsInNldE1vZHVsZUlkIiwiYmluZGluZ1RvU3ludGF4IiwiZ2V0UmViaW5kRnVuY3Rpb24iLCJnZXRPbkFjdGl2YXRpb25GdW5jdGlvbiIsImdldE9uRGVhY3RpdmF0aW9uRnVuY3Rpb24iLCJtSWQiLCJwbGFuQW5kUmVzb2x2ZUFyZ3MiLCJjb250ZXh0SW50ZXJjZXB0b3IiLCJ0YXJnZXRUeXBlIiwibWlkZGxld2FyZVJlc3VsdCIsImtleVRvU3RyaW5nIiwiX2NyZWF0ZVRhcmdldCIsInJlc29sdmVSZXF1ZXN0RnVuY3Rpb24iLCJfZGVhY3RpdmF0ZUlmU2luZ2xldG9uIiwiYmluZGluZ3NfMSIsIl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveSIsIl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveUFzeW5jIiwiX2UiLCJDb250YWluZXJNb2R1bGUiLCJBc3luY0NvbnRhaW5lck1vZHVsZSIsInRhZ1BhcmFtZXRlciIsImFubm90YXRpb25UYXJnZXQiLCJwYXJhbWV0ZXJOYW1lIiwicGFyYW1ldGVySW5kZXgiLCJfdGhyb3dJZk1ldGhvZFBhcmFtZXRlciIsIl90YWdQYXJhbWV0ZXJPclByb3BlcnR5IiwibWV0YWRhdGFLZXkiLCJtZXRhZGF0YXMiLCJkdXBsaWNhdGUiLCJhcnJheSIsInNlZW5WYWx1ZXMiLCJTZXQiLCJhcnJheV8xIiwiZ2V0Rmlyc3RBcnJheUR1cGxpY2F0ZSIsIm1kIiwiX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzIiwicGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEiLCJoYXNPd25NZXRhZGF0YSIsInBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhIiwiX2xvb3BfMSIsInBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhXzEiLCJkZWZpbmVNZXRhZGF0YSIsImNyZWF0ZVRhZ2dlZERlY29yYXRvciIsInRhcmdldEtleSIsImluZGV4T3JQcm9wZXJ0eURlc2NyaXB0b3IiLCJwcm9wZXJ0eU5hbWUiLCJ0YWdQcm9wZXJ0eSIsIl9kZWNvcmF0ZSIsImRlY29yYXRvcnMiLCJkZWNvcmF0ZSIsIl9wYXJhbSIsInBhcmFtSW5kZXgiLCJkZWNvcmF0b3IiLCJwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHkiLCJpbmplY3RhYmxlIiwidGFnZ2VkIiwibWV0YWRhdGFWYWx1ZSIsImluamVjdEJhc2UiLCJjbGFzc05hbWUiLCJpbmplY3QiLCJvcHRpb25hbCIsIm11bHRpSW5qZWN0IiwidGFyZ2V0TmFtZSIsInByb3BlcnR5RXZlbnREZWNvcmF0b3IiLCJldmVudEtleSIsInByb3BlcnR5S2V5IiwicG9zdENvbnN0cnVjdCIsInByZURlc3Ryb3kiLCJNRVRBREFUQV9LRVkiXSwic291cmNlUm9vdCI6IiJ9
|
|
1
|
+
/*! For license information please see inversify.js.LICENSE.txt */
|
|
2
|
+
import*as t from"@inversifyjs/common";import*as e from"@inversifyjs/core";var n={630:(t,e,n)=>{var i;!function(t){!function(){var e="object"==typeof globalThis?globalThis:"object"==typeof n.g?n.g:"object"==typeof self?self:"object"==typeof this?this:function(){try{return Function("return this;")()}catch(t){}}()||function(){try{return(0,eval)("(function() { return this; })()")}catch(t){}}(),i=r(t);function r(t,e){return function(n,i){Object.defineProperty(t,n,{configurable:!0,writable:!0,value:i}),e&&e(n,i)}}void 0!==e.Reflect&&(i=r(e.Reflect,i)),function(t,e){var n=Object.prototype.hasOwnProperty,i="function"==typeof Symbol,r=i&&void 0!==Symbol.toPrimitive?Symbol.toPrimitive:"@@toPrimitive",o=i&&void 0!==Symbol.iterator?Symbol.iterator:"@@iterator",a="function"==typeof Object.create,s={__proto__:[]}instanceof Array,c=!a&&!s,u={create:a?function(){return K(Object.create(null))}:s?function(){return K({__proto__:null})}:function(){return K({})},has:c?function(t,e){return n.call(t,e)}:function(t,e){return e in t},get:c?function(t,e){return n.call(t,e)?t[e]:void 0}:function(t,e){return t[e]}},d=Object.getPrototypeOf(Function),h="function"==typeof Map&&"function"==typeof Map.prototype.entries?Map:function(){var t={},e=[],n=function(){function t(t,e,n){this._index=0,this._keys=t,this._values=e,this._selector=n}return t.prototype["@@iterator"]=function(){return this},t.prototype[o]=function(){return this},t.prototype.next=function(){var t=this._index;if(t>=0&&t<this._keys.length){var n=this._selector(this._keys[t],this._values[t]);return t+1>=this._keys.length?(this._index=-1,this._keys=e,this._values=e):this._index++,{value:n,done:!1}}return{value:void 0,done:!0}},t.prototype.throw=function(t){throw this._index>=0&&(this._index=-1,this._keys=e,this._values=e),t},t.prototype.return=function(t){return this._index>=0&&(this._index=-1,this._keys=e,this._values=e),{value:t,done:!0}},t}();return function(){function e(){this._keys=[],this._values=[],this._cacheKey=t,this._cacheIndex=-2}return Object.defineProperty(e.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),e.prototype.has=function(t){return this._find(t,!1)>=0},e.prototype.get=function(t){var e=this._find(t,!1);return e>=0?this._values[e]:void 0},e.prototype.set=function(t,e){var n=this._find(t,!0);return this._values[n]=e,this},e.prototype.delete=function(e){var n=this._find(e,!1);if(n>=0){for(var i=this._keys.length,r=n+1;r<i;r++)this._keys[r-1]=this._keys[r],this._values[r-1]=this._values[r];return this._keys.length--,this._values.length--,N(e,this._cacheKey)&&(this._cacheKey=t,this._cacheIndex=-2),!0}return!1},e.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=t,this._cacheIndex=-2},e.prototype.keys=function(){return new n(this._keys,this._values,i)},e.prototype.values=function(){return new n(this._keys,this._values,r)},e.prototype.entries=function(){return new n(this._keys,this._values,a)},e.prototype["@@iterator"]=function(){return this.entries()},e.prototype[o]=function(){return this.entries()},e.prototype._find=function(t,e){if(!N(this._cacheKey,t)){this._cacheIndex=-1;for(var n=0;n<this._keys.length;n++)if(N(this._keys[n],t)){this._cacheIndex=n;break}}return this._cacheIndex<0&&e&&(this._cacheIndex=this._keys.length,this._keys.push(t),this._values.push(void 0)),this._cacheIndex},e}();function i(t,e){return t}function r(t,e){return e}function a(t,e){return[t,e]}}(),l="function"==typeof Set&&"function"==typeof Set.prototype.entries?Set:function(){function t(){this._map=new h}return Object.defineProperty(t.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),t.prototype.has=function(t){return this._map.has(t)},t.prototype.add=function(t){return this._map.set(t,t),this},t.prototype.delete=function(t){return this._map.delete(t)},t.prototype.clear=function(){this._map.clear()},t.prototype.keys=function(){return this._map.keys()},t.prototype.values=function(){return this._map.keys()},t.prototype.entries=function(){return this._map.entries()},t.prototype["@@iterator"]=function(){return this.keys()},t.prototype[o]=function(){return this.keys()},t}(),f="function"==typeof WeakMap?WeakMap:function(){var t=u.create(),e=i();return function(){function t(){this._key=i()}return t.prototype.has=function(t){var e=r(t,!1);return void 0!==e&&u.has(e,this._key)},t.prototype.get=function(t){var e=r(t,!1);return void 0!==e?u.get(e,this._key):void 0},t.prototype.set=function(t,e){return r(t,!0)[this._key]=e,this},t.prototype.delete=function(t){var e=r(t,!1);return void 0!==e&&delete e[this._key]},t.prototype.clear=function(){this._key=i()},t}();function i(){var e;do{e="@@WeakMap@@"+a()}while(u.has(t,e));return t[e]=!0,e}function r(t,i){if(!n.call(t,e)){if(!i)return;Object.defineProperty(t,e,{value:u.create()})}return t[e]}function o(t,e){for(var n=0;n<e;++n)t[n]=255*Math.random()|0;return t}function a(){var t=function(t){if("function"==typeof Uint8Array){var e=new Uint8Array(t);return"undefined"!=typeof crypto?crypto.getRandomValues(e):"undefined"!=typeof msCrypto?msCrypto.getRandomValues(e):o(e,t),e}return o(new Array(t),t)}(16);t[6]=79&t[6]|64,t[8]=191&t[8]|128;for(var e="",n=0;n<16;++n){var i=t[n];4!==n&&6!==n&&8!==n||(e+="-"),i<16&&(e+="0"),e+=i.toString(16).toLowerCase()}return e}}(),g=i?Symbol.for("@reflect-metadata:registry"):void 0,y=function(){var t;return!I(g)&&E(e.Reflect)&&Object.isExtensible(e.Reflect)&&(t=e.Reflect[g]),I(t)&&(t=function(){var t,n,i,r;I(g)||void 0===e.Reflect||g in e.Reflect||"function"!=typeof e.Reflect.defineMetadata||(t=function(t){var e=t.defineMetadata,n=t.hasOwnMetadata,i=t.getOwnMetadata,r=t.getOwnMetadataKeys,o=t.deleteMetadata,a=new f;return{isProviderFor:function(t,e){var n=a.get(t);return!(I(n)||!n.has(e))||!!r(t,e).length&&(I(n)&&(n=new l,a.set(t,n)),n.add(e),!0)},OrdinaryDefineOwnMetadata:e,OrdinaryHasOwnMetadata:n,OrdinaryGetOwnMetadata:i,OrdinaryOwnMetadataKeys:r,OrdinaryDeleteMetadata:o}}(e.Reflect));var o=new f,a={registerProvider:s,getProvider:u,setProvider:y};return a;function s(e){if(!Object.isExtensible(a))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case t===e:break;case I(n):n=e;break;case n===e:break;case I(i):i=e;break;case i===e:break;default:void 0===r&&(r=new l),r.add(e)}}function c(e,o){if(!I(n)){if(n.isProviderFor(e,o))return n;if(!I(i)){if(i.isProviderFor(e,o))return n;if(!I(r))for(var a=j(r);;){var s=q(a);if(!s)return;var c=F(s);if(c.isProviderFor(e,o))return B(a),c}}}if(!I(t)&&t.isProviderFor(e,o))return t}function u(t,e){var n,i=o.get(t);return I(i)||(n=i.get(e)),I(n)?(I(n=c(t,e))||(I(i)&&(i=new h,o.set(t,i)),i.set(e,n)),n):n}function d(t){if(I(t))throw new TypeError;return n===t||i===t||!I(r)&&r.has(t)}function y(t,e,n){if(!d(n))throw new Error("Metadata provider not registered.");var i=u(t,e);if(i!==n){if(!I(i))return!1;var r=o.get(t);I(r)&&(r=new h,o.set(t,r)),r.set(e,n)}return!0}}()),!I(g)&&E(e.Reflect)&&Object.isExtensible(e.Reflect)&&Object.defineProperty(e.Reflect,g,{enumerable:!1,configurable:!1,writable:!1,value:t}),t}(),p=function(t){var e=new f,n={isProviderFor:function(t,n){var i=e.get(t);return!I(i)&&i.has(n)},OrdinaryDefineOwnMetadata:function(t,e,n,r){i(n,r,!0).set(t,e)},OrdinaryHasOwnMetadata:function(t,e,n){var r=i(e,n,!1);return!I(r)&&C(r.has(t))},OrdinaryGetOwnMetadata:function(t,e,n){var r=i(e,n,!1);if(!I(r))return r.get(t)},OrdinaryOwnMetadataKeys:function(t,e){var n=[],r=i(t,e,!1);if(I(r))return n;for(var o=j(r.keys()),a=0;;){var s=q(o);if(!s)return n.length=a,n;var c=F(s);try{n[a]=c}catch(t){try{B(o)}finally{throw t}}a++}},OrdinaryDeleteMetadata:function(t,n,r){var o=i(n,r,!1);if(I(o))return!1;if(!o.delete(t))return!1;if(0===o.size){var a=e.get(n);I(a)||(a.delete(r),0===a.size&&e.delete(a))}return!0}};return y.registerProvider(n),n;function i(i,r,o){var a=e.get(i),s=!1;if(I(a)){if(!o)return;a=new h,e.set(i,a),s=!0}var c=a.get(r);if(I(c)){if(!o)return;if(c=new h,a.set(r,c),!t.setProvider(i,r,n))throw a.delete(r),s&&e.delete(i),new Error("Wrong provider for target.")}return c}}(y);function v(t,e,n){if(_(t,e,n))return!0;var i=$(e);return!M(i)&&v(t,i,n)}function _(t,e,n){var i=W(e,n,!1);return!I(i)&&C(i.OrdinaryHasOwnMetadata(t,e,n))}function w(t,e,n){if(_(t,e,n))return b(t,e,n);var i=$(e);return M(i)?void 0:w(t,i,n)}function b(t,e,n){var i=W(e,n,!1);if(!I(i))return i.OrdinaryGetOwnMetadata(t,e,n)}function m(t,e,n,i){W(n,i,!0).OrdinaryDefineOwnMetadata(t,e,n,i)}function A(t,e){var n=S(t,e),i=$(t);if(null===i)return n;var r=A(i,e);if(r.length<=0)return n;if(n.length<=0)return r;for(var o=new l,a=[],s=0,c=n;s<c.length;s++){var u=c[s];o.has(u)||(o.add(u),a.push(u))}for(var d=0,h=r;d<h.length;d++)u=h[d],o.has(u)||(o.add(u),a.push(u));return a}function S(t,e){var n=W(t,e,!1);return n?n.OrdinaryOwnMetadataKeys(t,e):[]}function T(t){if(null===t)return 1;switch(typeof t){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return null===t?1:6;default:return 6}}function I(t){return void 0===t}function M(t){return null===t}function E(t){return"object"==typeof t?null!==t:"function"==typeof t}function D(t,e){switch(T(t)){case 0:case 1:case 2:case 3:case 4:case 5:return t}var n=3===e?"string":5===e?"number":"default",i=P(t,r);if(void 0!==i){var o=i.call(t,n);if(E(o))throw new TypeError;return o}return function(t,e){if("string"===e){var n=t.toString;if(R(n)&&!E(r=n.call(t)))return r;if(R(i=t.valueOf)&&!E(r=i.call(t)))return r}else{var i;if(R(i=t.valueOf)&&!E(r=i.call(t)))return r;var r,o=t.toString;if(R(o)&&!E(r=o.call(t)))return r}throw new TypeError}(t,"default"===n?"number":n)}function C(t){return!!t}function x(t){var e=D(t,3);return"symbol"==typeof e?e:function(t){return""+t}(e)}function O(t){return Array.isArray?Array.isArray(t):t instanceof Object?t instanceof Array:"[object Array]"===Object.prototype.toString.call(t)}function R(t){return"function"==typeof t}function k(t){return"function"==typeof t}function N(t,e){return t===e||t!=t&&e!=e}function P(t,e){var n=t[e];if(null!=n){if(!R(n))throw new TypeError;return n}}function j(t){var e=P(t,o);if(!R(e))throw new TypeError;var n=e.call(t);if(!E(n))throw new TypeError;return n}function F(t){return t.value}function q(t){var e=t.next();return!e.done&&e}function B(t){var e=t.return;e&&e.call(t)}function $(t){var e=Object.getPrototypeOf(t);if("function"!=typeof t||t===d)return e;if(e!==d)return e;var n=t.prototype,i=n&&Object.getPrototypeOf(n);if(null==i||i===Object.prototype)return e;var r=i.constructor;return"function"!=typeof r||r===t?e:r}function W(t,e,n){var i=y.getProvider(t,e);if(!I(i))return i;if(n){if(y.setProvider(t,e,p))return p;throw new Error("Illegal state.")}}function K(t){return t.__=void 0,delete t.__,t}t("decorate",(function(t,e,n,i){if(I(n)){if(!O(t))throw new TypeError;if(!k(e))throw new TypeError;return function(t,e){for(var n=t.length-1;n>=0;--n){var i=(0,t[n])(e);if(!I(i)&&!M(i)){if(!k(i))throw new TypeError;e=i}}return e}(t,e)}if(!O(t))throw new TypeError;if(!E(e))throw new TypeError;if(!E(i)&&!I(i)&&!M(i))throw new TypeError;return M(i)&&(i=void 0),function(t,e,n,i){for(var r=t.length-1;r>=0;--r){var o=(0,t[r])(e,n,i);if(!I(o)&&!M(o)){if(!E(o))throw new TypeError;i=o}}return i}(t,e,n=x(n),i)})),t("metadata",(function(t,e){return function(n,i){if(!E(n))throw new TypeError;if(!I(i)&&!function(t){switch(T(t)){case 3:case 4:return!0;default:return!1}}(i))throw new TypeError;m(t,e,n,i)}})),t("defineMetadata",(function(t,e,n,i){if(!E(n))throw new TypeError;return I(i)||(i=x(i)),m(t,e,n,i)})),t("hasMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),v(t,e,n)})),t("hasOwnMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),_(t,e,n)})),t("getMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),w(t,e,n)})),t("getOwnMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),b(t,e,n)})),t("getMetadataKeys",(function(t,e){if(!E(t))throw new TypeError;return I(e)||(e=x(e)),A(t,e)})),t("getOwnMetadataKeys",(function(t,e){if(!E(t))throw new TypeError;return I(e)||(e=x(e)),S(t,e)})),t("deleteMetadata",(function(t,e,n){if(!E(e))throw new TypeError;if(I(n)||(n=x(n)),!E(e))throw new TypeError;I(n)||(n=x(n));var i=W(e,n,!1);return!I(i)&&i.OrdinaryDeleteMetadata(t,e,n)}))}(i,e),void 0===e.Reflect&&(e.Reflect=t)}()}(i||(i={}))}},i={};function r(t){var e=i[t];if(void 0!==e)return e.exports;var o=i[t]={exports:{}};return n[t](o,o.exports,r),o.exports}r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};r.d(o,{QC:()=>Pt,bU:()=>m,XK:()=>A,mc:()=>kt,i0:()=>Nt,FU:()=>b.LazyServiceIdentifier,KK:()=>te,PG:()=>P,$Z:()=>S,OZ:()=>qt,Yi:()=>Wt,A$:()=>B,id:()=>E,WQ:()=>Ut,_G:()=>Kt,F$:()=>ot,tt:()=>Yt,KT:()=>Gt,dU:()=>At,lq:()=>Ht,kr:()=>Jt,E3:()=>Xt,VK:()=>Vt,w:()=>mt,je:()=>Qt,Nu:()=>bt,if:()=>St,Fz:()=>zt});var a={};r.r(a),r.d(a,{DESIGN_PARAM_TYPES:()=>p,INJECT_TAG:()=>h,MULTI_INJECT_TAG:()=>l,NAMED_TAG:()=>s,NAME_TAG:()=>c,NON_CUSTOM_TAG_KEYS:()=>w,OPTIONAL_TAG:()=>d,PARAM_TYPES:()=>y,POST_CONSTRUCT:()=>v,PRE_DESTROY:()=>_,TAGGED:()=>f,TAGGED_PROP:()=>g,UNMANAGED_TAG:()=>u}),r(630);const s="named",c="name",u="unmanaged",d="optional",h="inject",l="multi_inject",f="inversify:tagged",g="inversify:tagged_props",y="inversify:paramtypes",p="design:paramtypes",v="post_construct",_="pre_destroy",w=[h,l,c,u,s,d],b=(T={LazyServiceIdentifier:()=>t.LazyServiceIdentifier},I={},r.d(I,T),I),m={Request:"Request",Singleton:"Singleton",Transient:"Transient"},A={ConstantValue:"ConstantValue",Constructor:"Constructor",DynamicValue:"DynamicValue",Factory:"Factory",Function:"Function",Instance:"Instance",Invalid:"Invalid",Provider:"Provider"},S={ClassProperty:"ClassProperty",ConstructorArgument:"ConstructorArgument",Variable:"Variable"};var T,I;let M=0;function E(){return M++}class D{id;moduleId;activated;serviceIdentifier;implementationType;cache;dynamicValue;scope;type;factory;provider;constraint;onActivation;onDeactivation;constructor(t,e){this.id=E(),this.activated=!1,this.serviceIdentifier=t,this.scope=e,this.type=A.Invalid,this.constraint=t=>!0,this.implementationType=null,this.cache=null,this.factory=null,this.provider=null,this.onActivation=null,this.onDeactivation=null,this.dynamicValue=null}clone(){const t=new D(this.serviceIdentifier,this.scope);return t.activated=t.scope===m.Singleton&&this.activated,t.implementationType=this.implementationType,t.dynamicValue=this.dynamicValue,t.scope=this.scope,t.type=this.type,t.factory=this.factory,t.provider=this.provider,t.constraint=this.constraint,t.onActivation=this.onActivation,t.onDeactivation=this.onDeactivation,t.cache=this.cache,t}}const C="Cannot apply @injectable decorator multiple times.",x="Metadata key was used more than once in a parameter:",O="NULL argument",R="Key Not Found",k="The @inject @multiInject @tagged and @named decorators must be applied to the parameters of a class constructor or a class property.",N=(t,e)=>`onDeactivation() error in class ${t}: ${e}`;class P{getConstructorMetadata(t){return{compilerGeneratedMetadata:Reflect.getMetadata(p,t)??[],userGeneratedMetadata:Reflect.getMetadata(f,t)??{}}}getPropertiesMetadata(t){return Reflect.getMetadata(g,t)??{}}}const j=(t=>{var e={};return r.d(e,t),e})({ClassElementMetadataKind:()=>e.ClassElementMetadataKind,LegacyTargetImpl:()=>e.LegacyTargetImpl,getClassElementMetadataFromLegacyMetadata:()=>e.getClassElementMetadataFromLegacyMetadata,getTargets:()=>e.getTargets});var F;function q(t){return t instanceof RangeError||"Maximum call stack size exceeded"===t.message}function B(t){return"function"==typeof t?t.name:"symbol"==typeof t?t.toString():t}function $(t,e,n){let i="";const r=n(t,e);return 0!==r.length&&(i="\nRegistered bindings:",r.forEach((t=>{let e="Object";null!==t.implementationType&&(e=V(t.implementationType)),i=`${i}\n ${e}`,t.constraint.metaData&&(i=`${i} - ${t.constraint.metaData}`)}))),i}function W(t,e){return null!==t.parentRequest&&(t.parentRequest.serviceIdentifier===e||W(t.parentRequest,e))}function K(t){t.childRequests.forEach((e=>{if(W(t,e.serviceIdentifier)){const t=function(t){return function t(e,n=[]){const i=B(e.serviceIdentifier);return n.push(i),null!==e.parentRequest?t(e.parentRequest,n):n}(t).reverse().join(" --\x3e ")}(e);throw new Error(`Circular dependency found: ${t}`)}K(e)}))}function V(t){if(null!=t.name&&""!==t.name)return t.name;{const e=t.toString(),n=e.match(/^function\s*([^\s(]+)/);return null===n?`Anonymous function: ${e}`:n[1]}}function G(t){return`{"key":"${t.key.toString()}","value":"${t.value.toString()}"}`}!function(t){t[t.MultipleBindingsAvailable=2]="MultipleBindingsAvailable",t[t.NoBindingsAvailable=0]="NoBindingsAvailable",t[t.OnlyOneBindingAvailable=1]="OnlyOneBindingAvailable"}(F||(F={}));class L{id;container;plan;currentRequest;constructor(t){this.id=E(),this.container=t}addPlan(t){this.plan=t}setCurrentRequest(t){this.currentRequest=t}}class U{key;value;constructor(t,e){this.key=t,this.value=e}toString(){return this.key===s?`named: ${String(this.value).toString()} `:`tagged: { key:${this.key.toString()}, value: ${String(this.value)} }`}}class H{parentContext;rootRequest;constructor(t,e){this.parentContext=t,this.rootRequest=e}}function z(t,e){const n=Object.getPrototypeOf(e.prototype).constructor;if(n!==Object){const e=(0,j.getTargets)(t)(n),i=e.map((t=>t.metadata.filter((t=>t.key===u)))),r=[].concat.apply([],i).length,o=e.length-r;return o>0?o:z(t,n)}return 0}class Y{id;serviceIdentifier;parentContext;parentRequest;bindings;childRequests;target;requestScope;constructor(t,e,n,i,r){this.id=E(),this.serviceIdentifier=t,this.parentContext=e,this.parentRequest=n,this.target=r,this.childRequests=[],this.bindings=Array.isArray(i)?i:[i],this.requestScope=null===n?new Map:null}addChildRequest(t,e,n){const i=new Y(t,this.parentContext,this,e,n);return this.childRequests.push(i),i}}function Q(t){return t._bindingDictionary}function Z(t,e,n,i,r){let o=tt(n.container,r.serviceIdentifier),a=[];return o.length===F.NoBindingsAvailable&&!0===n.container.options.autoBindInjectable&&"function"==typeof r.serviceIdentifier&&t.getConstructorMetadata(r.serviceIdentifier).compilerGeneratedMetadata&&(n.container.bind(r.serviceIdentifier).toSelf(),o=tt(n.container,r.serviceIdentifier)),a=e?o:o.filter((t=>{const e=new Y(t.serviceIdentifier,n,i,t,r);return t.constraint(e)})),function(t,e,n,i,r){switch(e.length){case F.NoBindingsAvailable:if(i.isOptional())return e;{const e=B(t);let o="No matching bindings found for serviceIdentifier:";throw o+=function(t,e){if(e.isTagged()||e.isNamed()){let n="";const i=e.getNamedTag(),r=e.getCustomTags();return null!==i&&(n+=G(i)+"\n"),null!==r&&r.forEach((t=>{n+=G(t)+"\n"})),` ${t}\n ${t} - ${n}`}return` ${t}`}(e,i),o+=$(r,e,tt),null!==n&&(o+=`\nTrying to resolve bindings for "${B(n.serviceIdentifier)}"`),new Error(o)}case F.OnlyOneBindingAvailable:return e;case F.MultipleBindingsAvailable:default:if(i.isArray())return e;{const e=B(t);let n=`Ambiguous match found for serviceIdentifier: ${e}`;throw n+=$(r,e,tt),new Error(n)}}}(r.serviceIdentifier,a,i,r,n.container),a}function J(t,e,n,i){const r=[new U(t?l:h,e)];return void 0!==n&&r.push(new U(n,i)),r}function X(t,e,n,i,r,o){let a,s;if(null===r){a=Z(t,e,i,null,o),s=new Y(n,i,null,a,o);const r=new H(i,s);i.addPlan(r)}else a=Z(t,e,i,r,o),s=r.addChildRequest(o.serviceIdentifier,a,o);a.forEach((e=>{let n=null;if(o.isArray())n=s.addChildRequest(e.serviceIdentifier,e,o);else{if(null!==e.cache)return;n=s}if(e.type===A.Instance&&null!==e.implementationType){const r=function(t,e){return(0,j.getTargets)(t)(e)}(t,e.implementationType);if(!0!==i.container.options.skipBaseClassChecks){const n=z(t,e.implementationType);if(r.length<n){const t=`The number of constructor arguments in the derived class ${V(e.implementationType)} must be >= than the number of constructor arguments of its base class.`;throw new Error(t)}}r.forEach((e=>{X(t,!1,e.serviceIdentifier,i,n,e)}))}}))}function tt(t,e){let n=[];const i=Q(t);return i.hasKey(e)?n=i.get(e):null!==t.parent&&(n=tt(t.parent,e)),n}function et(t){return("object"==typeof t&&null!==t||"function"==typeof t)&&"function"==typeof t.then}function nt(t){return!!et(t)||Array.isArray(t)&&t.some(et)}const it=async(t,e)=>{try{const n=await e;t.cache=n}catch(e){throw t.cache=null,t.activated=!1,e}};var rt;!function(t){t.DynamicValue="toDynamicValue",t.Factory="toFactory",t.Provider="toProvider"}(rt||(rt={}));const ot=t=>e=>(...n)=>{n.forEach((n=>{t.bind(n).toService(e)}))};function at(t){const e=new t.constr(...t.constructorInjections);return t.propertyRequests.forEach(((n,i)=>{const r=n.target.identifier,o=t.propertyInjections[i];n.target.isOptional()&&void 0===o||(e[r]=o)})),e}async function st(t){const e=[];for(const n of t)Array.isArray(n)?e.push(Promise.all(n)):e.push(n);return Promise.all(e)}function ct(t,e){const n=function(t,e){if(Reflect.hasMetadata(v,t)){const n=Reflect.getMetadata(v,t);try{return e[n.value]?.()}catch(e){if(e instanceof Error)throw new Error(`@postConstruct error in class ${t.name}: ${e.message}`)}}}(t,e);return et(n)?n.then((()=>e)):e}const ut=t=>e=>{e.parentContext.setCurrentRequest(e);const n=e.bindings,i=e.childRequests,r=e.target&&e.target.isArray(),o=!(e.parentRequest&&e.parentRequest.target&&e.target&&e.parentRequest.target.matchesArray(e.target.serviceIdentifier));if(r&&o)return i.map((e=>ut(t)(e)));{if(e.target.isOptional()&&0===n.length)return;const i=n[0];return ft(t,e,i)}},dt=(t,e)=>{const n=(t=>{switch(t.type){case A.Factory:return{factory:t.factory,factoryType:rt.Factory};case A.Provider:return{factory:t.provider,factoryType:rt.Provider};case A.DynamicValue:return{factory:t.dynamicValue,factoryType:rt.DynamicValue};default:throw new Error(`Unexpected factory type ${t.type}`)}})(t);return(()=>{try{return n.factory.bind(t)(e)}catch(t){if(q(t))throw new Error((i=n.factoryType,r=e.currentRequest.serviceIdentifier.toString(),`It looks like there is a circular dependency in one of the '${i}' bindings. Please investigate bindings with service identifier '${r}'.`));throw t}var i,r})()},ht=(t,e,n)=>{let i;const r=e.childRequests;switch((t=>{let e=null;switch(t.type){case A.ConstantValue:case A.Function:e=t.cache;break;case A.Constructor:case A.Instance:e=t.implementationType;break;case A.DynamicValue:e=t.dynamicValue;break;case A.Provider:e=t.provider;break;case A.Factory:e=t.factory}if(null===e){const e=B(t.serviceIdentifier);throw new Error(`Invalid binding type: ${e}`)}})(n),n.type){case A.ConstantValue:case A.Function:i=n.cache;break;case A.Constructor:i=n.implementationType;break;case A.Instance:i=function(t,e,n,i){!function(t,e){t.scope!==m.Singleton&&function(t,e){const n=`Class cannot be instantiated in ${t.scope===m.Request?"request":"transient"} scope.`;if("function"==typeof t.onDeactivation)throw new Error(N(e.name,n));if(Reflect.hasMetadata(_,e))throw new Error(`@preDestroy error in class ${e.name}: ${n}`)}(t,e)}(t,e);const r=function(t,e,n){let i;if(e.length>0){const r=function(t,e){return t.reduce(((t,n)=>{const i=e(n);return n.target.type===S.ConstructorArgument?t.constructorInjections.push(i):(t.propertyRequests.push(n),t.propertyInjections.push(i)),t.isAsync||(t.isAsync=nt(i)),t}),{constructorInjections:[],isAsync:!1,propertyInjections:[],propertyRequests:[]})}(e,n),o={...r,constr:t};i=r.isAsync?async function(t){const e=await st(t.constructorInjections),n=await st(t.propertyInjections);return at({...t,constructorInjections:e,propertyInjections:n})}(o):at(o)}else i=new t;return i}(e,n,i);return et(r)?r.then((t=>ct(e,t))):ct(e,r)}(n,n.implementationType,r,ut(t));break;default:i=dt(n,e.parentContext)}return i},lt=(t,e,n)=>{let i=((t,e)=>e.scope===m.Singleton&&e.activated?e.cache:e.scope===m.Request&&t.has(e.id)?t.get(e.id):null)(t,e);return null!==i||(i=n(),((t,e,n)=>{e.scope===m.Singleton&&((t,e)=>{t.cache=e,t.activated=!0,et(e)&&it(t,e)})(e,n),e.scope===m.Request&&((t,e,n)=>{t.has(e.id)||t.set(e.id,n)})(t,e,n)})(t,e,i)),i},ft=(t,e,n)=>lt(t,n,(()=>{let i=ht(t,e,n);return i=et(i)?i.then((t=>gt(e,n,t))):gt(e,n,i),i}));function gt(t,e,n){let i=yt(t.parentContext,e,n);const r=wt(t.parentContext.container);let o,a=r.next();do{o=a.value;const e=t.parentContext,n=t.serviceIdentifier,s=_t(o,n);i=et(i)?vt(s,e,i):pt(s,e,i),a=r.next()}while(!0!==a.done&&!Q(o).hasKey(t.serviceIdentifier));return i}const yt=(t,e,n)=>{let i;return i="function"==typeof e.onActivation?e.onActivation(t,n):n,i},pt=(t,e,n)=>{let i=t.next();for(;!0!==i.done;){if(et(n=i.value(e,n)))return vt(t,e,n);i=t.next()}return n},vt=async(t,e,n)=>{let i=await n,r=t.next();for(;!0!==r.done;)i=await r.value(e,i),r=t.next();return i},_t=(t,e)=>{const n=t._activations;return n.hasKey(e)?n.get(e).values():[].values()},wt=t=>{const e=[t];let n=t.parent;for(;null!==n;)e.push(n),n=n.parent;return{next:()=>{const t=e.pop();return void 0!==t?{done:!1,value:t}:{done:!0,value:void 0}}}},bt=(t,e)=>{const n=t.parentRequest;return null!==n&&(!!e(n)||bt(n,e))},mt=t=>e=>{const n=n=>null!==n&&null!==n.target&&n.target.matchesTag(t)(e);return n.metaData=new U(t,e),n},At=mt(s),St=t=>e=>{let n=null;if(null!==e){if(n=e.bindings[0],"string"==typeof t)return n.serviceIdentifier===t;{const n=e.bindings[0].implementationType;return t===n}}return!1};class Tt{_binding;constructor(t){this._binding=t}when(t){return this._binding.constraint=t,new It(this._binding)}whenTargetNamed(t){return this._binding.constraint=At(t),new It(this._binding)}whenTargetIsDefault(){return this._binding.constraint=t=>null!==t&&(null!==t.target&&!t.target.isNamed()&&!t.target.isTagged()),new It(this._binding)}whenTargetTagged(t,e){return this._binding.constraint=mt(t)(e),new It(this._binding)}whenInjectedInto(t){return this._binding.constraint=e=>null!==e&&St(t)(e.parentRequest),new It(this._binding)}whenParentNamed(t){return this._binding.constraint=e=>null!==e&&At(t)(e.parentRequest),new It(this._binding)}whenParentTagged(t,e){return this._binding.constraint=n=>null!==n&&mt(t)(e)(n.parentRequest),new It(this._binding)}whenAnyAncestorIs(t){return this._binding.constraint=e=>null!==e&&bt(e,St(t)),new It(this._binding)}whenNoAncestorIs(t){return this._binding.constraint=e=>null!==e&&!bt(e,St(t)),new It(this._binding)}whenAnyAncestorNamed(t){return this._binding.constraint=e=>null!==e&&bt(e,At(t)),new It(this._binding)}whenNoAncestorNamed(t){return this._binding.constraint=e=>null!==e&&!bt(e,At(t)),new It(this._binding)}whenAnyAncestorTagged(t,e){return this._binding.constraint=n=>null!==n&&bt(n,mt(t)(e)),new It(this._binding)}whenNoAncestorTagged(t,e){return this._binding.constraint=n=>null!==n&&!bt(n,mt(t)(e)),new It(this._binding)}whenAnyAncestorMatches(t){return this._binding.constraint=e=>null!==e&&bt(e,t),new It(this._binding)}whenNoAncestorMatches(t){return this._binding.constraint=e=>null!==e&&!bt(e,t),new It(this._binding)}}class It{_binding;constructor(t){this._binding=t}onActivation(t){return this._binding.onActivation=t,new Tt(this._binding)}onDeactivation(t){return this._binding.onDeactivation=t,new Tt(this._binding)}}class Mt{_bindingWhenSyntax;_bindingOnSyntax;_binding;constructor(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new It(this._binding)}when(t){return this._bindingWhenSyntax.when(t)}whenTargetNamed(t){return this._bindingWhenSyntax.whenTargetNamed(t)}whenTargetIsDefault(){return this._bindingWhenSyntax.whenTargetIsDefault()}whenTargetTagged(t,e){return this._bindingWhenSyntax.whenTargetTagged(t,e)}whenInjectedInto(t){return this._bindingWhenSyntax.whenInjectedInto(t)}whenParentNamed(t){return this._bindingWhenSyntax.whenParentNamed(t)}whenParentTagged(t,e){return this._bindingWhenSyntax.whenParentTagged(t,e)}whenAnyAncestorIs(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)}whenNoAncestorIs(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)}whenAnyAncestorNamed(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)}whenAnyAncestorTagged(t,e){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,e)}whenNoAncestorNamed(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)}whenNoAncestorTagged(t,e){return this._bindingWhenSyntax.whenNoAncestorTagged(t,e)}whenAnyAncestorMatches(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)}whenNoAncestorMatches(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)}onActivation(t){return this._bindingOnSyntax.onActivation(t)}onDeactivation(t){return this._bindingOnSyntax.onDeactivation(t)}}class Et{_binding;constructor(t){this._binding=t}inRequestScope(){return this._binding.scope=m.Request,new Mt(this._binding)}inSingletonScope(){return this._binding.scope=m.Singleton,new Mt(this._binding)}inTransientScope(){return this._binding.scope=m.Transient,new Mt(this._binding)}}class Dt{_bindingInSyntax;_bindingWhenSyntax;_bindingOnSyntax;_binding;constructor(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new It(this._binding),this._bindingInSyntax=new Et(t)}inRequestScope(){return this._bindingInSyntax.inRequestScope()}inSingletonScope(){return this._bindingInSyntax.inSingletonScope()}inTransientScope(){return this._bindingInSyntax.inTransientScope()}when(t){return this._bindingWhenSyntax.when(t)}whenTargetNamed(t){return this._bindingWhenSyntax.whenTargetNamed(t)}whenTargetIsDefault(){return this._bindingWhenSyntax.whenTargetIsDefault()}whenTargetTagged(t,e){return this._bindingWhenSyntax.whenTargetTagged(t,e)}whenInjectedInto(t){return this._bindingWhenSyntax.whenInjectedInto(t)}whenParentNamed(t){return this._bindingWhenSyntax.whenParentNamed(t)}whenParentTagged(t,e){return this._bindingWhenSyntax.whenParentTagged(t,e)}whenAnyAncestorIs(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)}whenNoAncestorIs(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)}whenAnyAncestorNamed(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)}whenAnyAncestorTagged(t,e){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,e)}whenNoAncestorNamed(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)}whenNoAncestorTagged(t,e){return this._bindingWhenSyntax.whenNoAncestorTagged(t,e)}whenAnyAncestorMatches(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)}whenNoAncestorMatches(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)}onActivation(t){return this._bindingOnSyntax.onActivation(t)}onDeactivation(t){return this._bindingOnSyntax.onDeactivation(t)}}class Ct{_binding;constructor(t){this._binding=t}to(t){return this._binding.type=A.Instance,this._binding.implementationType=t,new Dt(this._binding)}toSelf(){if("function"!=typeof this._binding.serviceIdentifier)throw new Error("The toSelf function can only be applied when a constructor is used as service identifier");const t=this._binding.serviceIdentifier;return this.to(t)}toConstantValue(t){return this._binding.type=A.ConstantValue,this._binding.cache=t,this._binding.dynamicValue=null,this._binding.implementationType=null,this._binding.scope=m.Singleton,new Mt(this._binding)}toDynamicValue(t){return this._binding.type=A.DynamicValue,this._binding.cache=null,this._binding.dynamicValue=t,this._binding.implementationType=null,new Dt(this._binding)}toConstructor(t){return this._binding.type=A.Constructor,this._binding.implementationType=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toFactory(t){return this._binding.type=A.Factory,this._binding.factory=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toFunction(t){if("function"!=typeof t)throw new Error("Value provided to function binding must be a function!");const e=this.toConstantValue(t);return this._binding.type=A.Function,this._binding.scope=m.Singleton,e}toAutoFactory(t){return this._binding.type=A.Factory,this._binding.factory=e=>()=>e.container.get(t),this._binding.scope=m.Singleton,new Mt(this._binding)}toAutoNamedFactory(t){return this._binding.type=A.Factory,this._binding.factory=e=>n=>e.container.getNamed(t,n),new Mt(this._binding)}toProvider(t){return this._binding.type=A.Provider,this._binding.provider=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toService(t){this._binding.type=A.DynamicValue,Object.defineProperty(this._binding,"cache",{configurable:!0,enumerable:!0,get:()=>null,set(t){}}),this._binding.dynamicValue=e=>{try{return e.container.get(t)}catch(n){return e.container.getAsync(t)}},this._binding.implementationType=null}}class xt{bindings;activations;deactivations;middleware;moduleActivationStore;static of(t,e,n,i,r){const o=new xt;return o.bindings=t,o.middleware=e,o.deactivations=i,o.activations=n,o.moduleActivationStore=r,o}}class Ot{_map;constructor(){this._map=new Map}getMap(){return this._map}add(t,e){if(this._checkNonNulish(t),null==e)throw new Error(O);const n=this._map.get(t);void 0!==n?n.push(e):this._map.set(t,[e])}get(t){this._checkNonNulish(t);const e=this._map.get(t);if(void 0!==e)return e;throw new Error(R)}remove(t){if(this._checkNonNulish(t),!this._map.delete(t))throw new Error(R)}removeIntersection(t){this.traverse(((e,n)=>{const i=t.hasKey(e)?t.get(e):void 0;if(void 0!==i){const t=n.filter((t=>!i.some((e=>t===e))));this._setValue(e,t)}}))}removeByCondition(t){const e=[];return this._map.forEach(((n,i)=>{const r=[];for(const i of n)t(i)?e.push(i):r.push(i);this._setValue(i,r)})),e}hasKey(t){return this._checkNonNulish(t),this._map.has(t)}clone(){const t=new Ot;return this._map.forEach(((e,n)=>{e.forEach((e=>{var i;t.add(n,"object"==typeof(i=e)&&null!==i&&"clone"in i&&"function"==typeof i.clone?e.clone():e)}))})),t}traverse(t){this._map.forEach(((e,n)=>{t(n,e)}))}_checkNonNulish(t){if(null==t)throw new Error(O)}_setValue(t,e){e.length>0?this._map.set(t,e):this._map.delete(t)}}class Rt{_map=new Map;remove(t){const e=this._map.get(t);return void 0===e?this._getEmptyHandlersStore():(this._map.delete(t),e)}addDeactivation(t,e,n){this._getModuleActivationHandlers(t).onDeactivations.add(e,n)}addActivation(t,e,n){this._getModuleActivationHandlers(t).onActivations.add(e,n)}clone(){const t=new Rt;return this._map.forEach(((e,n)=>{t._map.set(n,{onActivations:e.onActivations.clone(),onDeactivations:e.onDeactivations.clone()})})),t}_getModuleActivationHandlers(t){let e=this._map.get(t);return void 0===e&&(e=this._getEmptyHandlersStore(),this._map.set(t,e)),e}_getEmptyHandlersStore(){return{onActivations:new Ot,onDeactivations:new Ot}}}class kt{id;parent;options;_middleware;_bindingDictionary;_activations;_deactivations;_snapshots;_metadataReader;_moduleActivationStore;constructor(t){const e=t||{};if("object"!=typeof e)throw new Error("Invalid Container constructor argument. Container options must be an object.");if(void 0===e.defaultScope)e.defaultScope=m.Transient;else if(e.defaultScope!==m.Singleton&&e.defaultScope!==m.Transient&&e.defaultScope!==m.Request)throw new Error('Invalid Container option. Default scope must be a string ("singleton" or "transient").');if(void 0===e.autoBindInjectable)e.autoBindInjectable=!1;else if("boolean"!=typeof e.autoBindInjectable)throw new Error("Invalid Container option. Auto bind injectable must be a boolean");if(void 0===e.skipBaseClassChecks)e.skipBaseClassChecks=!1;else if("boolean"!=typeof e.skipBaseClassChecks)throw new Error("Invalid Container option. Skip base check must be a boolean");this.options={autoBindInjectable:e.autoBindInjectable,defaultScope:e.defaultScope,skipBaseClassChecks:e.skipBaseClassChecks},this.id=E(),this._bindingDictionary=new Ot,this._snapshots=[],this._middleware=null,this._activations=new Ot,this._deactivations=new Ot,this.parent=null,this._metadataReader=new P,this._moduleActivationStore=new Rt}static merge(t,e,...n){const i=new kt,r=[t,e,...n].map((t=>Q(t))),o=Q(i);return r.forEach((t=>{var e;e=o,t.traverse(((t,n)=>{n.forEach((t=>{e.add(t.serviceIdentifier,t.clone())}))}))})),i}load(...t){const e=this._getContainerModuleHelpersFactory();for(const n of t){const t=e(n.id);n.registry(t.bindFunction,t.unbindFunction,t.isboundFunction,t.rebindFunction,t.unbindAsyncFunction,t.onActivationFunction,t.onDeactivationFunction)}}async loadAsync(...t){const e=this._getContainerModuleHelpersFactory();for(const n of t){const t=e(n.id);await n.registry(t.bindFunction,t.unbindFunction,t.isboundFunction,t.rebindFunction,t.unbindAsyncFunction,t.onActivationFunction,t.onDeactivationFunction)}}unload(...t){t.forEach((t=>{const e=this._removeModuleBindings(t.id);this._deactivateSingletons(e),this._removeModuleHandlers(t.id)}))}async unloadAsync(...t){for(const e of t){const t=this._removeModuleBindings(e.id);await this._deactivateSingletonsAsync(t),this._removeModuleHandlers(e.id)}}bind(t){return this._bind(this._buildBinding(t))}rebind(t){return this.unbind(t),this.bind(t)}async rebindAsync(t){return await this.unbindAsync(t),this.bind(t)}unbind(t){if(this._bindingDictionary.hasKey(t)){const e=this._bindingDictionary.get(t);this._deactivateSingletons(e)}this._removeServiceFromDictionary(t)}async unbindAsync(t){if(this._bindingDictionary.hasKey(t)){const e=this._bindingDictionary.get(t);await this._deactivateSingletonsAsync(e)}this._removeServiceFromDictionary(t)}unbindAll(){this._bindingDictionary.traverse(((t,e)=>{this._deactivateSingletons(e)})),this._bindingDictionary=new Ot}async unbindAllAsync(){const t=[];this._bindingDictionary.traverse(((e,n)=>{t.push(this._deactivateSingletonsAsync(n))})),await Promise.all(t),this._bindingDictionary=new Ot}onActivation(t,e){this._activations.add(t,e)}onDeactivation(t,e){this._deactivations.add(t,e)}isBound(t){let e=this._bindingDictionary.hasKey(t);return!e&&this.parent&&(e=this.parent.isBound(t)),e}isCurrentBound(t){return this._bindingDictionary.hasKey(t)}isBoundNamed(t,e){return this.isBoundTagged(t,s,e)}isBoundTagged(t,e,n){let i=!1;if(this._bindingDictionary.hasKey(t)){const r=this._bindingDictionary.get(t),o=function(t,e,n,i){const r=J(!1,e,n,i),o=(0,j.getClassElementMetadataFromLegacyMetadata)(r);if(o.kind===j.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");const a=new j.LegacyTargetImpl("",o,"Variable"),s=new L(t);return new Y(e,s,null,[],a)}(this,t,e,n);i=r.some((t=>t.constraint(o)))}return!i&&this.parent&&(i=this.parent.isBoundTagged(t,e,n)),i}snapshot(){this._snapshots.push(xt.of(this._bindingDictionary.clone(),this._middleware,this._activations.clone(),this._deactivations.clone(),this._moduleActivationStore.clone()))}restore(){const t=this._snapshots.pop();if(void 0===t)throw new Error("No snapshot available to restore.");this._bindingDictionary=t.bindings,this._activations=t.activations,this._deactivations=t.deactivations,this._middleware=t.middleware,this._moduleActivationStore=t.moduleActivationStore}createChild(t){const e=new kt(t||this.options);return e.parent=this,e}applyMiddleware(...t){const e=this._middleware?this._middleware:this._planAndResolve();this._middleware=t.reduce(((t,e)=>e(t)),e)}applyCustomMetadataReader(t){this._metadataReader=t}get(t){const e=this._getNotAllArgs(t,!1);return this._getButThrowIfAsync(e)}async getAsync(t){const e=this._getNotAllArgs(t,!1);return this._get(e)}getTagged(t,e,n){const i=this._getNotAllArgs(t,!1,e,n);return this._getButThrowIfAsync(i)}async getTaggedAsync(t,e,n){const i=this._getNotAllArgs(t,!1,e,n);return this._get(i)}getNamed(t,e){return this.getTagged(t,s,e)}async getNamedAsync(t,e){return this.getTaggedAsync(t,s,e)}getAll(t){const e=this._getAllArgs(t);return this._getButThrowIfAsync(e)}async getAllAsync(t){const e=this._getAllArgs(t);return this._getAll(e)}getAllTagged(t,e,n){const i=this._getNotAllArgs(t,!0,e,n);return this._getButThrowIfAsync(i)}async getAllTaggedAsync(t,e,n){const i=this._getNotAllArgs(t,!0,e,n);return this._getAll(i)}getAllNamed(t,e){return this.getAllTagged(t,s,e)}async getAllNamedAsync(t,e){return this.getAllTaggedAsync(t,s,e)}resolve(t){const e=this.isBound(t);e||this.bind(t).toSelf();const n=this.get(t);return e||this.unbind(t),n}_preDestroy(t,e){if(void 0!==t&&Reflect.hasMetadata(_,t)){const n=Reflect.getMetadata(_,t);return e[n.value]?.()}}_removeModuleHandlers(t){const e=this._moduleActivationStore.remove(t);this._activations.removeIntersection(e.onActivations),this._deactivations.removeIntersection(e.onDeactivations)}_removeModuleBindings(t){return this._bindingDictionary.removeByCondition((e=>e.moduleId===t))}_deactivate(t,e){const n=null==e?void 0:Object.getPrototypeOf(e).constructor;try{if(this._deactivations.hasKey(t.serviceIdentifier)){const i=this._deactivateContainer(e,this._deactivations.get(t.serviceIdentifier).values());if(et(i))return this._handleDeactivationError(i.then((async()=>this._propagateContainerDeactivationThenBindingAndPreDestroyAsync(t,e,n))),t.serviceIdentifier)}const i=this._propagateContainerDeactivationThenBindingAndPreDestroy(t,e,n);if(et(i))return this._handleDeactivationError(i,t.serviceIdentifier)}catch(e){if(e instanceof Error)throw new Error(N(B(t.serviceIdentifier),e.message))}}async _handleDeactivationError(t,e){try{await t}catch(t){if(t instanceof Error)throw new Error(N(B(e),t.message))}}_deactivateContainer(t,e){let n=e.next();for(;"function"==typeof n.value;){const i=n.value(t);if(et(i))return i.then((async()=>this._deactivateContainerAsync(t,e)));n=e.next()}}async _deactivateContainerAsync(t,e){let n=e.next();for(;"function"==typeof n.value;)await n.value(t),n=e.next()}_getContainerModuleHelpersFactory(){const t=t=>e=>{const n=this._buildBinding(e);return n.moduleId=t,this._bind(n)},e=()=>t=>{this.unbind(t)},n=()=>async t=>this.unbindAsync(t),i=()=>t=>this.isBound(t),r=e=>{const n=t(e);return t=>(this.unbind(t),n(t))},o=t=>(e,n)=>{this._moduleActivationStore.addActivation(t,e,n),this.onActivation(e,n)},a=t=>(e,n)=>{this._moduleActivationStore.addDeactivation(t,e,n),this.onDeactivation(e,n)};return s=>({bindFunction:t(s),isboundFunction:i(),onActivationFunction:o(s),onDeactivationFunction:a(s),rebindFunction:r(s),unbindAsyncFunction:n(),unbindFunction:e()})}_bind(t){return this._bindingDictionary.add(t.serviceIdentifier,t),new Ct(t)}_buildBinding(t){const e=this.options.defaultScope||m.Transient;return new D(t,e)}async _getAll(t){return Promise.all(this._get(t))}_get(t){const e={...t,contextInterceptor:t=>t,targetType:S.Variable};if(this._middleware){const t=this._middleware(e);if(null==t)throw new Error("Invalid return type in middleware. Middleware must return!");return t}return this._planAndResolve()(e)}_getButThrowIfAsync(t){const e=this._get(t);if(nt(e))throw new Error(`You are attempting to construct ${n=t.serviceIdentifier,"function"==typeof n?`[function/class ${n.name||"<anonymous>"}]`:"symbol"==typeof n?n.toString():`'${n}'`} in a synchronous way but it has asynchronous dependencies.`);var n;return e}_getAllArgs(t){return{avoidConstraints:!0,isMultiInject:!0,serviceIdentifier:t}}_getNotAllArgs(t,e,n,i){return{avoidConstraints:!1,isMultiInject:e,key:n,serviceIdentifier:t,value:i}}_planAndResolve(){return t=>{let e=function(t,e,n,i,r,o,a,s=!1){const c=new L(e),u=function(t,e,n,i,r,o){const a=J(t,n,r,o),s=(0,j.getClassElementMetadataFromLegacyMetadata)(a);if(s.kind===j.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");return new j.LegacyTargetImpl("",s,e)}(n,i,r,0,o,a);try{return X(t,s,r,c,null,u),c}catch(t){throw q(t)&&K(c.plan.rootRequest),t}}(this._metadataReader,this,t.isMultiInject,t.targetType,t.serviceIdentifier,t.key,t.value,t.avoidConstraints);e=t.contextInterceptor(e);const n=function(t){return ut(t.plan.rootRequest.requestScope)(t.plan.rootRequest)}(e);return n}}_deactivateIfSingleton(t){if(t.activated)return et(t.cache)?t.cache.then((e=>this._deactivate(t,e))):this._deactivate(t,t.cache)}_deactivateSingletons(t){for(const e of t)if(et(this._deactivateIfSingleton(e)))throw new Error("Attempting to unbind dependency with asynchronous destruction (@preDestroy or onDeactivation)")}async _deactivateSingletonsAsync(t){await Promise.all(t.map((async t=>this._deactivateIfSingleton(t))))}_propagateContainerDeactivationThenBindingAndPreDestroy(t,e,n){return this.parent?this._deactivate.bind(this.parent)(t,e):this._bindingDeactivationAndPreDestroy(t,e,n)}async _propagateContainerDeactivationThenBindingAndPreDestroyAsync(t,e,n){this.parent?await this._deactivate.bind(this.parent)(t,e):await this._bindingDeactivationAndPreDestroyAsync(t,e,n)}_removeServiceFromDictionary(t){try{this._bindingDictionary.remove(t)}catch(e){throw new Error(`Could not unbind serviceIdentifier: ${B(t)}`)}}_bindingDeactivationAndPreDestroy(t,e,n){if("function"==typeof t.onDeactivation){const i=t.onDeactivation(e);if(et(i))return i.then((()=>this._preDestroy(n,e)))}return this._preDestroy(n,e)}async _bindingDeactivationAndPreDestroyAsync(t,e,n){"function"==typeof t.onDeactivation&&await t.onDeactivation(e),await this._preDestroy(n,e)}}class Nt{id;registry;constructor(t){this.id=E(),this.registry=t}}class Pt{id;registry;constructor(t){this.id=E(),this.registry=t}}function jt(t,e,n,i){!function(t){if(void 0!==t)throw new Error(k)}(e),Ft(f,t,n.toString(),i)}function Ft(t,e,n,i){const r=function(t){let e=[];if(Array.isArray(t)){e=t;const n=function(t){const e=new Set;for(const n of t){if(e.has(n))return n;e.add(n)}}(e.map((t=>t.key)));if(void 0!==n)throw new Error(`${x} ${n.toString()}`)}else e=[t];return e}(i);let o={};Reflect.hasOwnMetadata(t,e)&&(o=Reflect.getMetadata(t,e));let a=o[n];if(void 0===a)a=[];else for(const t of a)if(r.some((e=>e.key===t.key)))throw new Error(`${x} ${t.key.toString()}`);a.push(...r),o[n]=a,Reflect.defineMetadata(t,o,e)}function qt(t){return(e,n,i)=>{"number"==typeof i?jt(e,n,i,t):function(t,e,n){if(void 0!==t.prototype)throw new Error(k);Ft(g,t.constructor,e,n)}(e,n,t)}}function Bt(t,e){Reflect.decorate(t,e)}function $t(t,e){return function(n,i){e(n,i,t)}}function Wt(t,e,n){"number"==typeof n?Bt([$t(n,t)],e):"string"==typeof n?Reflect.decorate([t],e,n):Bt([t],e)}function Kt(){return function(t){if(Reflect.hasOwnMetadata(y,t))throw new Error(C);const e=Reflect.getMetadata(p,t)||[];return Reflect.defineMetadata(y,e,t),t}}function Vt(t,e){return qt(new U(t,e))}function Gt(t){return qt(new U(s,t))}function Lt(t){return e=>(n,i,r)=>{if(void 0===e){const t="function"==typeof n?n.name:n.constructor.name;throw new Error(`@inject called with undefined this could mean that the class ${t} has a circular dependency problem. You can use a LazyServiceIdentifer to overcome this limitation.`)}qt(new U(t,e))(n,i,r)}}const Ut=Lt(h);function Ht(){return qt(new U(d,!0))}function zt(){return function(t,e,n){jt(t,e,n,new U(u,!0))}}const Yt=Lt(l);function Qt(t){return function(e,n,i){jt(e,n,i,new U(c,t))}}function Zt(t,e){return()=>(n,i)=>{const r=new U(t,i);if(Reflect.hasOwnMetadata(t,n.constructor))throw new Error(e);Reflect.defineMetadata(t,r,n.constructor)}}const Jt=Zt(v,"Cannot apply @postConstruct decorator multiple times in the same class"),Xt=Zt(_,"Cannot apply @preDestroy decorator multiple times in the same class"),te=a;var ee=o.QC,ne=o.bU,ie=o.XK,re=o.mc,oe=o.i0,ae=o.FU,se=o.KK,ce=o.PG,ue=o.$Z,de=o.OZ,he=o.Yi,le=o.A$,fe=o.id,ge=o.WQ,ye=o._G,pe=o.F$,ve=o.tt,_e=o.KT,we=o.dU,be=o.lq,me=o.kr,Ae=o.E3,Se=o.VK,Te=o.w,Ie=o.je,Me=o.Nu,Ee=o.if,De=o.Fz;export{ee as AsyncContainerModule,ne as BindingScopeEnum,ie as BindingTypeEnum,re as Container,oe as ContainerModule,ae as LazyServiceIdentifier,se as METADATA_KEY,ce as MetadataReader,ue as TargetTypeEnum,de as createTaggedDecorator,he as decorate,le as getServiceIdentifierAsString,fe as id,ge as inject,ye as injectable,pe as multiBindToService,ve as multiInject,_e as named,we as namedConstraint,be as optional,me as postConstruct,Ae as preDestroy,Se as tagged,Te as taggedConstraint,Ie as targetName,Me as traverseAncerstors,Ee as typeConstraint,De as unmanaged};
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxTQUFTb1osR0FBdUJDLEVBQVVuYSxHQUN0QyxNQUFPLElBQ0ksQ0FBQ3RSLEVBQVF5TSxLQUNaLE1BQU0xRCxFQUFXLElBQUlrTCxFQUFTd1gsRUFBVWhmLEdBQ3hDLEdBQUl0TixRQUFRMEgsZUFBZTRrQixFQUFVenJCLEVBQU9xTSxhQUN4QyxNQUFNLElBQUluRSxNQUFNb0osR0FFcEJuUyxRQUFRd0gsZUFBZThrQixFQUFVMWlCLEVBQVUvSSxFQUFPcU0sWUFBWSxDQUcxRSxDQ1JBLE1BQU1xZixHQUFnQkYsR0FBdUIsRTNDNEJFLDBFNEM1QnpDRyxHQUFhSCxHQUF1QixFNUMyQkUsdUU2QzNCL0JJLEdBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9ub2RlX21vZHVsZXMvcmVmbGVjdC1tZXRhZGF0YS9SZWZsZWN0LmpzIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb25zdGFudHMvbWV0YWRhdGFfa2V5cy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvZXh0ZXJuYWwgbW9kdWxlIFwiQGludmVyc2lmeWpzL2NvbW1vblwiIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb25zdGFudHMvbGl0ZXJhbF90eXBlcy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvaWQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2JpbmRpbmdzL2JpbmRpbmcudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2NvbnN0YW50cy9lcnJvcl9tc2dzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9tZXRhZGF0YV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5L2V4dGVybmFsIG1vZHVsZSBcIkBpbnZlcnNpZnlqcy9jb3JlXCIiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2JpbmRpbmdzL2JpbmRpbmdfY291bnQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2V4Y2VwdGlvbnMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3BsYW5uaW5nL2NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3BsYW5uaW5nL21ldGFkYXRhLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9wbGFuLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9yZWZsZWN0aW9uX3V0aWxzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9yZXF1ZXN0LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9wbGFubmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9hc3luYy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc2NvcGUvc2NvcGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2ZhY3RvcnlfdHlwZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvYmluZGluZ191dGlscy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcmVzb2x1dGlvbi9pbnN0YW50aWF0aW9uLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9yZXNvbHV0aW9uL3Jlc29sdmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvY29uc3RyYWludF9oZWxwZXJzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ193aGVuX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfb25fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ193aGVuX29uX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfaW5fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ19pbl93aGVuX29uX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfdG9fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyX3NuYXBzaG90LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvbG9va3VwLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9jbG9uYWJsZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL21vZHVsZV9hY3RpdmF0aW9uX3N0b3JlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyX21vZHVsZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2pzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdGFibGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vdGFnZ2VkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL25hbWVkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdF9iYXNlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi91bm1hbmFnZWQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vbXVsdGlfaW5qZWN0LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL3RhcmdldF9uYW1lLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL3Byb3BlcnR5X2V2ZW50X2RlY29yYXRvci50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9wb3N0X2NvbnN0cnVjdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9wcmVfZGVzdHJveS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvaW52ZXJzaWZ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgwqcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJleHBvcnQgY29uc3QgTkFNRURfVEFHID0gJ25hbWVkJztcbmV4cG9ydCBjb25zdCBOQU1FX1RBRyA9ICduYW1lJztcbmV4cG9ydCBjb25zdCBVTk1BTkFHRURfVEFHID0gJ3VubWFuYWdlZCc7XG5leHBvcnQgY29uc3QgT1BUSU9OQUxfVEFHID0gJ29wdGlvbmFsJztcbmV4cG9ydCBjb25zdCBJTkpFQ1RfVEFHID0gJ2luamVjdCc7XG5leHBvcnQgY29uc3QgTVVMVElfSU5KRUNUX1RBRyA9ICdtdWx0aV9pbmplY3QnO1xuZXhwb3J0IGNvbnN0IFRBR0dFRCA9ICdpbnZlcnNpZnk6dGFnZ2VkJztcbmV4cG9ydCBjb25zdCBUQUdHRURfUFJPUCA9ICdpbnZlcnNpZnk6dGFnZ2VkX3Byb3BzJztcbmV4cG9ydCBjb25zdCBQQVJBTV9UWVBFUyA9ICdpbnZlcnNpZnk6cGFyYW10eXBlcyc7XG5leHBvcnQgY29uc3QgREVTSUdOX1BBUkFNX1RZUEVTID0gJ2Rlc2lnbjpwYXJhbXR5cGVzJztcbmV4cG9ydCBjb25zdCBQT1NUX0NPTlNUUlVDVCA9ICdwb3N0X2NvbnN0cnVjdCc7XG5leHBvcnQgY29uc3QgUFJFX0RFU1RST1kgPSAncHJlX2Rlc3Ryb3knO1xuZnVuY3Rpb24gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBJTkpFQ1RfVEFHLFxuICAgICAgICBNVUxUSV9JTkpFQ1RfVEFHLFxuICAgICAgICBOQU1FX1RBRyxcbiAgICAgICAgVU5NQU5BR0VEX1RBRyxcbiAgICAgICAgTkFNRURfVEFHLFxuICAgICAgICBPUFRJT05BTF9UQUcsXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBOT05fQ1VTVE9NX1RBR19LRVlTID0gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpO1xuIiwidmFyIHggPSAoeSkgPT4ge1xuXHR2YXIgeCA9IHt9OyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoeCwgeSk7IHJldHVybiB4XG59IFxudmFyIHkgPSAoeCkgPT4gKCgpID0+ICh4KSlcbmNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSB4KHsgW1wiTGF6eVNlcnZpY2VJZGVudGlmaWVyXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29tbW9uXzA4MWQ4YzA3X18uTGF6eVNlcnZpY2VJZGVudGlmaWVyKSB9KTsiLCJjb25zdCBCaW5kaW5nU2NvcGVFbnVtID0ge1xuICAgIFJlcXVlc3Q6ICdSZXF1ZXN0JyxcbiAgICBTaW5nbGV0b246ICdTaW5nbGV0b24nLFxuICAgIFRyYW5zaWVudDogJ1RyYW5zaWVudCcsXG59O1xuY29uc3QgQmluZGluZ1R5cGVFbnVtID0ge1xuICAgIENvbnN0YW50VmFsdWU6ICdDb25zdGFudFZhbHVlJyxcbiAgICBDb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdG9yJyxcbiAgICBEeW5hbWljVmFsdWU6ICdEeW5hbWljVmFsdWUnLFxuICAgIEZhY3Rvcnk6ICdGYWN0b3J5JyxcbiAgICBGdW5jdGlvbjogJ0Z1bmN0aW9uJyxcbiAgICBJbnN0YW5jZTogJ0luc3RhbmNlJyxcbiAgICBJbnZhbGlkOiAnSW52YWxpZCcsXG4gICAgUHJvdmlkZXI6ICdQcm92aWRlcicsXG59O1xuY29uc3QgVGFyZ2V0VHlwZUVudW0gPSB7XG4gICAgQ2xhc3NQcm9wZXJ0eTogJ0NsYXNzUHJvcGVydHknLFxuICAgIENvbnN0cnVjdG9yQXJndW1lbnQ6ICdDb25zdHJ1Y3RvckFyZ3VtZW50JyxcbiAgICBWYXJpYWJsZTogJ1ZhcmlhYmxlJyxcbn07XG5leHBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0sIFRhcmdldFR5cGVFbnVtIH07XG4iLCJsZXQgaWRDb3VudGVyID0gMDtcbmZ1bmN0aW9uIGlkKCkge1xuICAgIHJldHVybiBpZENvdW50ZXIrKztcbn1cbmV4cG9ydCB7IGlkIH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmNsYXNzIEJpbmRpbmcge1xuICAgIGlkO1xuICAgIG1vZHVsZUlkO1xuICAgIGFjdGl2YXRlZDtcbiAgICBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICBpbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgY2FjaGU7XG4gICAgZHluYW1pY1ZhbHVlO1xuICAgIHNjb3BlO1xuICAgIHR5cGU7XG4gICAgZmFjdG9yeTtcbiAgICBwcm92aWRlcjtcbiAgICBjb25zdHJhaW50O1xuICAgIG9uQWN0aXZhdGlvbjtcbiAgICBvbkRlYWN0aXZhdGlvbjtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlSWRlbnRpZmllciwgc2NvcGUpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uSW52YWxpZDtcbiAgICAgICAgdGhpcy5jb25zdHJhaW50ID0gKF9yZXF1ZXN0KSA9PiB0cnVlO1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZhY3RvcnkgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3ZpZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFjdGl2YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm9uRGVhY3RpdmF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5keW5hbWljVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgQmluZGluZyh0aGlzLnNlcnZpY2VJZGVudGlmaWVyLCB0aGlzLnNjb3BlKTtcbiAgICAgICAgY2xvbmUuYWN0aXZhdGVkID1cbiAgICAgICAgICAgIGNsb25lLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbiA/IHRoaXMuYWN0aXZhdGVkIDogZmFsc2U7XG4gICAgICAgIGNsb25lLmltcGxlbWVudGF0aW9uVHlwZSA9IHRoaXMuaW1wbGVtZW50YXRpb25UeXBlO1xuICAgICAgICBjbG9uZS5keW5hbWljVmFsdWUgPSB0aGlzLmR5bmFtaWNWYWx1ZTtcbiAgICAgICAgY2xvbmUuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgICBjbG9uZS50eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjbG9uZS5mYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuICAgICAgICBjbG9uZS5wcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgIGNsb25lLmNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XG4gICAgICAgIGNsb25lLm9uQWN0aXZhdGlvbiA9IHRoaXMub25BY3RpdmF0aW9uO1xuICAgICAgICBjbG9uZS5vbkRlYWN0aXZhdGlvbiA9IHRoaXMub25EZWFjdGl2YXRpb247XG4gICAgICAgIGNsb25lLmNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbn1cbmV4cG9ydCB7IEJpbmRpbmcgfTtcbiIsImV4cG9ydCBjb25zdCBEVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SID0gJ0Nhbm5vdCBhcHBseSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IgbXVsdGlwbGUgdGltZXMuJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVEX01FVEFEQVRBID0gJ01ldGFkYXRhIGtleSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIHBhcmFtZXRlcjonO1xuZXhwb3J0IGNvbnN0IE5VTExfQVJHVU1FTlQgPSAnTlVMTCBhcmd1bWVudCc7XG5leHBvcnQgY29uc3QgS0VZX05PVF9GT1VORCA9ICdLZXkgTm90IEZvdW5kJztcbmV4cG9ydCBjb25zdCBBTUJJR1VPVVNfTUFUQ0ggPSAnQW1iaWd1b3VzIG1hdGNoIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IENBTk5PVF9VTkJJTkQgPSAnQ291bGQgbm90IHVuYmluZCBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IE5PVF9SRUdJU1RFUkVEID0gJ05vIG1hdGNoaW5nIGJpbmRpbmdzIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IFRSWUlOR19UT19SRVNPTFZFX0JJTkRJTkdTID0gKG5hbWUpID0+IGBUcnlpbmcgdG8gcmVzb2x2ZSBiaW5kaW5ncyBmb3IgXCIke25hbWV9XCJgO1xuZXhwb3J0IGNvbnN0IFVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTiA9IChuYW1lKSA9PiBgQGluamVjdCBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdGhpcyBjb3VsZCBtZWFuIHRoYXQgdGhlIGNsYXNzICR7bmFtZX0gaGFzIGAgK1xuICAgICdhIGNpcmN1bGFyIGRlcGVuZGVuY3kgcHJvYmxlbS4gWW91IGNhbiB1c2UgYSBMYXp5U2VydmljZUlkZW50aWZlciB0byAnICtcbiAgICAnb3ZlcmNvbWUgdGhpcyBsaW1pdGF0aW9uLic7XG5leHBvcnQgY29uc3QgQ0lSQ1VMQVJfREVQRU5ERU5DWSA9ICdDaXJjdWxhciBkZXBlbmRlbmN5IGZvdW5kOic7XG5leHBvcnQgY29uc3QgSU5WQUxJRF9CSU5ESU5HX1RZUEUgPSAnSW52YWxpZCBiaW5kaW5nIHR5cGU6JztcbmV4cG9ydCBjb25zdCBOT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEUgPSAnTm8gc25hcHNob3QgYXZhaWxhYmxlIHRvIHJlc3RvcmUuJztcbmV4cG9ydCBjb25zdCBJTlZBTElEX01JRERMRVdBUkVfUkVUVVJOID0gJ0ludmFsaWQgcmV0dXJuIHR5cGUgaW4gbWlkZGxld2FyZS4gTWlkZGxld2FyZSBtdXN0IHJldHVybiEnO1xuZXhwb3J0IGNvbnN0IElOVkFMSURfRlVOQ1RJT05fQklORElORyA9ICdWYWx1ZSBwcm92aWRlZCB0byBmdW5jdGlvbiBiaW5kaW5nIG11c3QgYmUgYSBmdW5jdGlvbiEnO1xuZXhwb3J0IGNvbnN0IExBWllfSU5fU1lOQyA9IChrZXkpID0+IGBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gY29uc3RydWN0ICR7a2V5VG9TdHJpbmcoa2V5KX0gaW4gYSBzeW5jaHJvbm91cyB3YXkgYCArXG4gICAgJ2J1dCBpdCBoYXMgYXN5bmNocm9ub3VzIGRlcGVuZGVuY2llcy4nO1xuZXhwb3J0IGNvbnN0IElOVkFMSURfVE9fU0VMRl9WQUxVRSA9ICdUaGUgdG9TZWxmIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgd2hlbiBhIGNvbnN0cnVjdG9yIGlzICcgK1xuICAgICd1c2VkIGFzIHNlcnZpY2UgaWRlbnRpZmllcic7XG5leHBvcnQgY29uc3QgSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OID0gJ1RoZSBAaW5qZWN0IEBtdWx0aUluamVjdCBAdGFnZ2VkIGFuZCBAbmFtZWQgZGVjb3JhdG9ycyAnICtcbiAgICAnbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJhbWV0ZXJzIG9mIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYSBjbGFzcyBwcm9wZXJ0eS4nO1xuZXhwb3J0IGNvbnN0IEFSR1VNRU5UU19MRU5HVEhfTUlTTUFUQ0ggPSAobmFtZSkgPT4gJ1RoZSBudW1iZXIgb2YgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIHRoZSBkZXJpdmVkIGNsYXNzICcgK1xuICAgIGAke25hbWV9IG11c3QgYmUgPj0gdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiBpdHMgYmFzZSBjbGFzcy5gO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUl9PUFRJT05TX01VU1RfQkVfQU5fT0JKRUNUID0gJ0ludmFsaWQgQ29udGFpbmVyIGNvbnN0cnVjdG9yIGFyZ3VtZW50LiBDb250YWluZXIgb3B0aW9ucyAnICtcbiAgICAnbXVzdCBiZSBhbiBvYmplY3QuJztcbmV4cG9ydCBjb25zdCBDT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0RFRkFVTFRfU0NPUEUgPSAnSW52YWxpZCBDb250YWluZXIgb3B0aW9uLiBEZWZhdWx0IHNjb3BlIG11c3QgJyArXG4gICAgJ2JlIGEgc3RyaW5nIChcInNpbmdsZXRvblwiIG9yIFwidHJhbnNpZW50XCIpLic7XG5leHBvcnQgY29uc3QgQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9BVVRPX0JJTkRfSU5KRUNUQUJMRSA9ICdJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIEF1dG8gYmluZCBpbmplY3RhYmxlIG11c3QgJyArICdiZSBhIGJvb2xlYW4nO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfU0tJUF9CQVNFX0NIRUNLID0gJ0ludmFsaWQgQ29udGFpbmVyIG9wdGlvbi4gU2tpcCBiYXNlIGNoZWNrIG11c3QgJyArICdiZSBhIGJvb2xlYW4nO1xuZXhwb3J0IGNvbnN0IE1VTFRJUExFX1BSRV9ERVNUUk9ZX01FVEhPRFMgPSAnQ2Fubm90IGFwcGx5IEBwcmVEZXN0cm95IGRlY29yYXRvciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBjbGFzcyc7XG5leHBvcnQgY29uc3QgTVVMVElQTEVfUE9TVF9DT05TVFJVQ1RfTUVUSE9EUyA9ICdDYW5ub3QgYXBwbHkgQHBvc3RDb25zdHJ1Y3QgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGNsYXNzJztcbmV4cG9ydCBjb25zdCBBU1lOQ19VTkJJTkRfUkVRVUlSRUQgPSAnQXR0ZW1wdGluZyB0byB1bmJpbmQgZGVwZW5kZW5jeSB3aXRoIGFzeW5jaHJvbm91cyBkZXN0cnVjdGlvbiAoQHByZURlc3Ryb3kgb3Igb25EZWFjdGl2YXRpb24pJztcbmV4cG9ydCBjb25zdCBQT1NUX0NPTlNUUlVDVF9FUlJPUiA9IChjbGF6eiwgZXJyb3JNZXNzYWdlKSA9PiBgQHBvc3RDb25zdHJ1Y3QgZXJyb3IgaW4gY2xhc3MgJHtjbGF6en06ICR7ZXJyb3JNZXNzYWdlfWA7XG5leHBvcnQgY29uc3QgUFJFX0RFU1RST1lfRVJST1IgPSAoY2xhenosIGVycm9yTWVzc2FnZSkgPT4gYEBwcmVEZXN0cm95IGVycm9yIGluIGNsYXNzICR7Y2xhenp9OiAke2Vycm9yTWVzc2FnZX1gO1xuZXhwb3J0IGNvbnN0IE9OX0RFQUNUSVZBVElPTl9FUlJPUiA9IChjbGF6eiwgZXJyb3JNZXNzYWdlKSA9PiBgb25EZWFjdGl2YXRpb24oKSBlcnJvciBpbiBjbGFzcyAke2NsYXp6fTogJHtlcnJvck1lc3NhZ2V9YDtcbmV4cG9ydCBjb25zdCBDSVJDVUxBUl9ERVBFTkRFTkNZX0lOX0ZBQ1RPUlkgPSAoZmFjdG9yeVR5cGUsIHNlcnZpY2VJZGVudGlmaWVyKSA9PiBgSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW4gb25lIG9mIHRoZSAnJHtmYWN0b3J5VHlwZX0nIGJpbmRpbmdzLiBQbGVhc2UgaW52ZXN0aWdhdGUgYmluZGluZ3Mgd2l0aCBgICtcbiAgICBgc2VydmljZSBpZGVudGlmaWVyICcke3NlcnZpY2VJZGVudGlmaWVyfScuYDtcbmV4cG9ydCBjb25zdCBTVEFDS19PVkVSRkxPVyA9ICdNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCc7XG5mdW5jdGlvbiBrZXlUb1N0cmluZyhrZXkpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYFtmdW5jdGlvbi9jbGFzcyAke2tleS5uYW1lIHx8ICc8YW5vbnltb3VzPid9XWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4ga2V5LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBgJyR7a2V5fSdgO1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmNsYXNzIE1ldGFkYXRhUmVhZGVyIHtcbiAgICBnZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKGNvbnN0cnVjdG9yRnVuYykge1xuICAgICAgICBjb25zdCBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCBjb25zdHJ1Y3RvckZ1bmMpID8/IFtdO1xuICAgICAgICBjb25zdCB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5UQUdHRUQsIGNvbnN0cnVjdG9yRnVuYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhLFxuICAgICAgICAgICAgdXNlckdlbmVyYXRlZE1ldGFkYXRhOiB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPz8ge30sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFByb3BlcnRpZXNNZXRhZGF0YShjb25zdHJ1Y3RvckZ1bmMpIHtcbiAgICAgICAgY29uc3QgdXNlckdlbmVyYXRlZE1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGNvbnN0cnVjdG9yRnVuYykgPz8ge307XG4gICAgICAgIHJldHVybiB1c2VyR2VuZXJhdGVkTWV0YWRhdGE7XG4gICAgfVxufVxuZXhwb3J0IHsgTWV0YWRhdGFSZWFkZXIgfTtcbiIsInZhciB4ID0gKHkpID0+IHtcblx0dmFyIHggPSB7fTsgX193ZWJwYWNrX3JlcXVpcmVfXy5kKHgsIHkpOyByZXR1cm4geFxufSBcbnZhciB5ID0gKHgpID0+ICgoKSA9PiAoeCkpXG5jb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0geCh7IFtcIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZFwiXTogKCkgPT4gKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvcmVfYzA4Y2Y0YTFfXy5DbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQpLCBbXCJMZWdhY3lUYXJnZXRJbXBsXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29yZV9jMDhjZjRhMV9fLkxlZ2FjeVRhcmdldEltcGwpLCBbXCJnZXRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21MZWdhY3lNZXRhZGF0YVwiXTogKCkgPT4gKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvcmVfYzA4Y2Y0YTFfXy5nZXRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21MZWdhY3lNZXRhZGF0YSksIFtcImdldFRhcmdldHNcIl06ICgpID0+IChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18uZ2V0VGFyZ2V0cykgfSk7IiwiZXhwb3J0IHZhciBCaW5kaW5nQ291bnQ7XG4oZnVuY3Rpb24gKEJpbmRpbmdDb3VudCkge1xuICAgIEJpbmRpbmdDb3VudFtCaW5kaW5nQ291bnRbXCJNdWx0aXBsZUJpbmRpbmdzQXZhaWxhYmxlXCJdID0gMl0gPSBcIk11bHRpcGxlQmluZGluZ3NBdmFpbGFibGVcIjtcbiAgICBCaW5kaW5nQ291bnRbQmluZGluZ0NvdW50W1wiTm9CaW5kaW5nc0F2YWlsYWJsZVwiXSA9IDBdID0gXCJOb0JpbmRpbmdzQXZhaWxhYmxlXCI7XG4gICAgQmluZGluZ0NvdW50W0JpbmRpbmdDb3VudFtcIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlXCJdID0gMV0gPSBcIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlXCI7XG59KShCaW5kaW5nQ291bnQgfHwgKEJpbmRpbmdDb3VudCA9IHt9KSk7XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24oZXJyb3IpIHtcbiAgICByZXR1cm4gKGVycm9yIGluc3RhbmNlb2YgUmFuZ2VFcnJvciB8fFxuICAgICAgICBlcnJvci5tZXNzYWdlID09PSBFUlJPUl9NU0dTLlNUQUNLX09WRVJGTE9XKTtcbn1cbmV4cG9ydCBjb25zdCB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93ID0gKGZuLCBlcnJvckNhbGxiYWNrKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNTdGFja092ZXJmbG93RXhjZXB0aW9uKGVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmZ1bmN0aW9uIGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICBpZiAodHlwZW9mIHNlcnZpY2VJZGVudGlmaWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlSWRlbnRpZmllci5uYW1lO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VydmljZUlkZW50aWZpZXIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlSWRlbnRpZmllci50b1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VJZGVudGlmaWVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyLCBnZXRCaW5kaW5ncykge1xuICAgIGxldCByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gJyc7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgaWYgKHJlZ2lzdGVyZWRCaW5kaW5ncy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9ICdcXG5SZWdpc3RlcmVkIGJpbmRpbmdzOic7XG4gICAgICAgIHJlZ2lzdGVyZWRCaW5kaW5ncy5mb3JFYWNoKChiaW5kaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9ICdPYmplY3QnO1xuICAgICAgICAgICAgaWYgKGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gYCR7cmVnaXN0ZXJlZEJpbmRpbmdzTGlzdH1cXG4gJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAoYmluZGluZy5jb25zdHJhaW50Lm1ldGFEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9IGAke3JlZ2lzdGVyZWRCaW5kaW5nc0xpc3R9IC0gJHtiaW5kaW5nLmNvbnN0cmFpbnQubWV0YURhdGF9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RlcmVkQmluZGluZ3NMaXN0O1xufVxuZnVuY3Rpb24gYWxyZWFkeURlcGVuZGVuY3lDaGFpbihyZXF1ZXN0LCBzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIGlmIChyZXF1ZXN0LnBhcmVudFJlcXVlc3QgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXF1ZXN0LnBhcmVudFJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIgPT09IHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFscmVhZHlEZXBlbmRlbmN5Q2hhaW4ocmVxdWVzdC5wYXJlbnRSZXF1ZXN0LCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfVxufVxuZnVuY3Rpb24gZGVwZW5kZW5jeUNoYWluVG9TdHJpbmcocmVxdWVzdCkge1xuICAgIGZ1bmN0aW9uIF9jcmVhdGVTdHJpbmdBcnIocmVxLCByZXN1bHQgPSBbXSkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllciA9IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcocmVxLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgcmVzdWx0LnB1c2goc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVxLnBhcmVudFJlcXVlc3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlU3RyaW5nQXJyKHJlcS5wYXJlbnRSZXF1ZXN0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ0FyciA9IF9jcmVhdGVTdHJpbmdBcnIocmVxdWVzdCk7XG4gICAgcmV0dXJuIHN0cmluZ0Fyci5yZXZlcnNlKCkuam9pbignIC0tPiAnKTtcbn1cbmZ1bmN0aW9uIGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uKHJlcXVlc3QpIHtcbiAgICByZXF1ZXN0LmNoaWxkUmVxdWVzdHMuZm9yRWFjaCgoY2hpbGRSZXF1ZXN0KSA9PiB7XG4gICAgICAgIGlmIChhbHJlYWR5RGVwZW5kZW5jeUNoYWluKHJlcXVlc3QsIGNoaWxkUmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VzID0gZGVwZW5kZW5jeUNoYWluVG9TdHJpbmcoY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkNJUkNVTEFSX0RFUEVOREVOQ1l9ICR7c2VydmljZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbihjaGlsZFJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBsaXN0TWV0YWRhdGFGb3JUYXJnZXQoc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaXNUYWdnZWQoKSB8fCB0YXJnZXQuaXNOYW1lZCgpKSB7XG4gICAgICAgIGxldCBtID0gJyc7XG4gICAgICAgIGNvbnN0IG5hbWVkVGFnID0gdGFyZ2V0LmdldE5hbWVkVGFnKCk7XG4gICAgICAgIGNvbnN0IG90aGVyVGFncyA9IHRhcmdldC5nZXRDdXN0b21UYWdzKCk7XG4gICAgICAgIGlmIChuYW1lZFRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbSArPSBzdHJpbmdpZnlNZXRhZGF0YShuYW1lZFRhZykgKyAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXJUYWdzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvdGhlclRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgbSArPSBzdHJpbmdpZnlNZXRhZGF0YSh0YWcpICsgJ1xcbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCAke3NlcnZpY2VJZGVudGlmaWVyU3RyaW5nfVxcbiAke3NlcnZpY2VJZGVudGlmaWVyU3RyaW5nfSAtICR7bX1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAgJHtzZXJ2aWNlSWRlbnRpZmllclN0cmluZ31gO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmdW5jKSB7XG4gICAgaWYgKGZ1bmMubmFtZSAhPSBudWxsICYmIGZ1bmMubmFtZSAhPT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmdW5jLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbmFtZS5tYXRjaCgvXmZ1bmN0aW9uXFxzKihbXlxccyhdKykvKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID09PSBudWxsXG4gICAgICAgICAgICA/IGBBbm9ueW1vdXMgZnVuY3Rpb246ICR7bmFtZX1gXG4gICAgICAgICAgICA6IG1hdGNoWzFdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFN5bWJvbERlc2NyaXB0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBzeW1ib2wudG9TdHJpbmcoKS5zbGljZSg3LCAtMSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgIHJldHVybiBge1wia2V5XCI6XCIke21ldGFkYXRhLmtleS50b1N0cmluZygpfVwiLFwidmFsdWVcIjpcIiR7bWV0YWRhdGEudmFsdWUudG9TdHJpbmcoKX1cIn1gO1xufVxuZXhwb3J0IHsgZ2V0RnVuY3Rpb25OYW1lLCBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nLCBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIsIGxpc3RNZXRhZGF0YUZvclRhcmdldCwgY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24sIGdldFN5bWJvbERlc2NyaXB0aW9uLCB9O1xuIiwiaW1wb3J0IHsgaWQgfSBmcm9tICcuLi91dGlscy9pZCc7XG5jbGFzcyBDb250ZXh0IHtcbiAgICBpZDtcbiAgICBjb250YWluZXI7XG4gICAgcGxhbjtcbiAgICBjdXJyZW50UmVxdWVzdDtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH1cbiAgICBhZGRQbGFuKHBsYW4pIHtcbiAgICAgICAgdGhpcy5wbGFuID0gcGxhbjtcbiAgICB9XG4gICAgc2V0Q3VycmVudFJlcXVlc3QoY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IGN1cnJlbnRSZXF1ZXN0O1xuICAgIH1cbn1cbmV4cG9ydCB7IENvbnRleHQgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5jbGFzcyBNZXRhZGF0YSB7XG4gICAga2V5O1xuICAgIHZhbHVlO1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gTUVUQURBVEFfS0VZLk5BTUVEX1RBRykge1xuICAgICAgICAgICAgcmV0dXJuIGBuYW1lZDogJHtTdHJpbmcodGhpcy52YWx1ZSkudG9TdHJpbmcoKX0gYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgdGFnZ2VkOiB7IGtleToke3RoaXMua2V5LnRvU3RyaW5nKCl9LCB2YWx1ZTogJHtTdHJpbmcodGhpcy52YWx1ZSl9IH1gO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IHsgTWV0YWRhdGEgfTtcbiIsImNsYXNzIFBsYW4ge1xuICAgIHBhcmVudENvbnRleHQ7XG4gICAgcm9vdFJlcXVlc3Q7XG4gICAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcm9vdFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5yb290UmVxdWVzdCA9IHJvb3RSZXF1ZXN0O1xuICAgIH1cbn1cbmV4cG9ydCB7IFBsYW4gfTtcbiIsImltcG9ydCB7IGdldFRhcmdldHMgfSBmcm9tICdAaW52ZXJzaWZ5anMvY29yZSc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlcikoZnVuYyk7XG59XG5mdW5jdGlvbiBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICBjb25zdCBiYXNlQ29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuYy5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO1xuICAgIGlmIChiYXNlQ29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlcikoYmFzZUNvbnN0cnVjdG9yKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0YXJnZXRzLm1hcCgodCkgPT4gdC5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IG0ua2V5ID09PSBNRVRBREFUQV9LRVkuVU5NQU5BR0VEX1RBRykpO1xuICAgICAgICBjb25zdCB1bm1hbmFnZWRDb3VudCA9IFtdLmNvbmNhdC5hcHBseShbXSwgbWV0YWRhdGEpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeUNvdW50ID0gdGFyZ2V0cy5sZW5ndGggLSB1bm1hbmFnZWRDb3VudDtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3lDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmN5Q291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50KG1ldGFkYXRhUmVhZGVyLCBiYXNlQ29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5leHBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCwgZ2V0RnVuY3Rpb25OYW1lIH07XG4iLCJpbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmNsYXNzIFJlcXVlc3Qge1xuICAgIGlkO1xuICAgIHNlcnZpY2VJZGVudGlmaWVyO1xuICAgIHBhcmVudENvbnRleHQ7XG4gICAgcGFyZW50UmVxdWVzdDtcbiAgICBiaW5kaW5ncztcbiAgICBjaGlsZFJlcXVlc3RzO1xuICAgIHRhcmdldDtcbiAgICByZXF1ZXN0U2NvcGU7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZUlkZW50aWZpZXIsIHBhcmVudENvbnRleHQsIHBhcmVudFJlcXVlc3QsIGJpbmRpbmdzLCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnRSZXF1ZXN0ID0gcGFyZW50UmVxdWVzdDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuY2hpbGRSZXF1ZXN0cyA9IFtdO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gQXJyYXkuaXNBcnJheShiaW5kaW5ncykgPyBiaW5kaW5ncyA6IFtiaW5kaW5nc107XG4gICAgICAgIHRoaXMucmVxdWVzdFNjb3BlID0gcGFyZW50UmVxdWVzdCA9PT0gbnVsbCA/IG5ldyBNYXAoKSA6IG51bGw7XG4gICAgfVxuICAgIGFkZENoaWxkUmVxdWVzdChzZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZ3MsIHRhcmdldCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5ldyBSZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCB0aGlzLnBhcmVudENvbnRleHQsIHRoaXMsIGJpbmRpbmdzLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmNoaWxkUmVxdWVzdHMucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG59XG5leHBvcnQgeyBSZXF1ZXN0IH07XG4iLCJpbXBvcnQgeyBDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQsIGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhLCBMZWdhY3lUYXJnZXRJbXBsIGFzIFRhcmdldEltcGwsIH0gZnJvbSAnQGludmVyc2lmeWpzL2NvcmUnO1xuaW1wb3J0IHsgQmluZGluZ0NvdW50IH0gZnJvbSAnLi4vYmluZGluZ3MvYmluZGluZ19jb3VudCc7XG5pbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24gfSBmcm9tICcuLi91dGlscy9leGNlcHRpb25zJztcbmltcG9ydCB7IGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uLCBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nLCBsaXN0TWV0YWRhdGFGb3JUYXJnZXQsIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllciwgfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7IFBsYW4gfSBmcm9tICcuL3BsYW4nO1xuaW1wb3J0IHsgZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50LCBnZXREZXBlbmRlbmNpZXMsIGdldEZ1bmN0aW9uTmFtZSwgfSBmcm9tICcuL3JlZmxlY3Rpb25fdXRpbHMnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5mdW5jdGlvbiBnZXRCaW5kaW5nRGljdGlvbmFyeShjbnRucikge1xuICAgIHJldHVybiBjbnRuci5fYmluZGluZ0RpY3Rpb25hcnk7XG59XG5mdW5jdGlvbiBfY3JlYXRlVGFyZ2V0KGlzTXVsdGlJbmplY3QsIHRhcmdldFR5cGUsIHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgbWV0YWRhdGFMaXN0ID0gX2dldFRhcmdldE1ldGFkYXRhKGlzTXVsdGlJbmplY3QsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICBjb25zdCBjbGFzc0VsZW1lbnRNZXRhZGF0YSA9IGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhKG1ldGFkYXRhTGlzdCk7XG4gICAgaWYgKGNsYXNzRWxlbWVudE1ldGFkYXRhLmtpbmQgPT09IENsYXNzRWxlbWVudE1ldGFkYXRhS2luZC51bm1hbmFnZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1ldGFkYXRhIHdoZW4gY3JlYXRpbmcgdGFyZ2V0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBUYXJnZXRJbXBsKG5hbWUsIGNsYXNzRWxlbWVudE1ldGFkYXRhLCB0YXJnZXRUeXBlKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBnZXRCaW5kaW5ncyhjb250ZXh0LmNvbnRhaW5lciwgdGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICBsZXQgYWN0aXZlQmluZGluZ3MgPSBbXTtcbiAgICBpZiAoYmluZGluZ3MubGVuZ3RoID09PSBCaW5kaW5nQ291bnQuTm9CaW5kaW5nc0F2YWlsYWJsZSAmJlxuICAgICAgICBjb250ZXh0LmNvbnRhaW5lci5vcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSA9PT0gdHJ1ZSAmJlxuICAgICAgICB0eXBlb2YgdGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIG1ldGFkYXRhUmVhZGVyLmdldENvbnN0cnVjdG9yTWV0YWRhdGEodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKVxuICAgICAgICAgICAgLmNvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGEpIHtcbiAgICAgICAgY29udGV4dC5jb250YWluZXIuYmluZCh0YXJnZXQuc2VydmljZUlkZW50aWZpZXIpLnRvU2VsZigpO1xuICAgICAgICBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKGNvbnRleHQuY29udGFpbmVyLCB0YXJnZXQuc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBpZiAoIWF2b2lkQ29uc3RyYWludHMpIHtcbiAgICAgICAgYWN0aXZlQmluZGluZ3MgPSBiaW5kaW5ncy5maWx0ZXIoKGJpbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCBiaW5kaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuY29uc3RyYWludChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgIH1cbiAgICBfdmFsaWRhdGVBY3RpdmVCaW5kaW5nQ291bnQodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyLCBhY3RpdmVCaW5kaW5ncywgcGFyZW50UmVxdWVzdCwgdGFyZ2V0LCBjb250ZXh0LmNvbnRhaW5lcik7XG4gICAgcmV0dXJuIGFjdGl2ZUJpbmRpbmdzO1xufVxuZnVuY3Rpb24gX2dldFRhcmdldE1ldGFkYXRhKGlzTXVsdGlJbmplY3QsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgbWV0YWRhdGFLZXkgPSBpc011bHRpSW5qZWN0XG4gICAgICAgID8gTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUdcbiAgICAgICAgOiBNRVRBREFUQV9LRVkuSU5KRUNUX1RBRztcbiAgICBjb25zdCBtZXRhZGF0YUxpc3QgPSBbXG4gICAgICAgIG5ldyBNZXRhZGF0YShtZXRhZGF0YUtleSwgc2VydmljZUlkZW50aWZpZXIpLFxuICAgIF07XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhTGlzdC5wdXNoKG5ldyBNZXRhZGF0YShrZXksIHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtZXRhZGF0YUxpc3Q7XG59XG5mdW5jdGlvbiBfdmFsaWRhdGVBY3RpdmVCaW5kaW5nQ291bnQoc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmdzLCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQsIGNvbnRhaW5lcikge1xuICAgIHN3aXRjaCAoYmluZGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgQmluZGluZ0NvdW50Lk5vQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmlzT3B0aW9uYWwoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IEVSUk9SX01TR1MuTk9UX1JFR0lTVEVSRUQ7XG4gICAgICAgICAgICAgICAgbXNnICs9IGxpc3RNZXRhZGF0YUZvclRhcmdldChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBtc2cgKz0gbGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyKGNvbnRhaW5lciwgc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIGdldEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYFxcbiR7RVJST1JfTVNHUy5UUllJTkdfVE9fUkVTT0xWRV9CSU5ESU5HUyhnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHBhcmVudFJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIpKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCaW5kaW5nQ291bnQuT25seU9uZUJpbmRpbmdBdmFpbGFibGU6XG4gICAgICAgICAgICByZXR1cm4gYmluZGluZ3M7XG4gICAgICAgIGNhc2UgQmluZGluZ0NvdW50Lk11bHRpcGxlQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllclN0cmluZyA9IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgJHtFUlJPUl9NU0dTLkFNQklHVU9VU19NQVRDSH0gJHtzZXJ2aWNlSWRlbnRpZmllclN0cmluZ31gO1xuICAgICAgICAgICAgICAgIG1zZyArPSBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgZ2V0QmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVTdWJSZXF1ZXN0cyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIHBhcmVudFJlcXVlc3QsIHRhcmdldCkge1xuICAgIGxldCBhY3RpdmVCaW5kaW5ncztcbiAgICBsZXQgY2hpbGRSZXF1ZXN0O1xuICAgIGlmIChwYXJlbnRSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBudWxsLCB0YXJnZXQpO1xuICAgICAgICBjaGlsZFJlcXVlc3QgPSBuZXcgUmVxdWVzdChzZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgbnVsbCwgYWN0aXZlQmluZGluZ3MsIHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHRoZVBsYW4gPSBuZXcgUGxhbihjb250ZXh0LCBjaGlsZFJlcXVlc3QpO1xuICAgICAgICBjb250ZXh0LmFkZFBsYW4odGhlUGxhbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IF9nZXRBY3RpdmVCaW5kaW5ncyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgdGFyZ2V0KTtcbiAgICAgICAgY2hpbGRSZXF1ZXN0ID0gcGFyZW50UmVxdWVzdC5hZGRDaGlsZFJlcXVlc3QodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyLCBhY3RpdmVCaW5kaW5ncywgdGFyZ2V0KTtcbiAgICB9XG4gICAgYWN0aXZlQmluZGluZ3MuZm9yRWFjaCgoYmluZGluZykgPT4ge1xuICAgICAgICBsZXQgc3ViQ2hpbGRSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldC5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgIHN1YkNoaWxkUmVxdWVzdCA9IGNoaWxkUmVxdWVzdC5hZGRDaGlsZFJlcXVlc3QoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nLmNhY2hlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2hpbGRSZXF1ZXN0ID0gY2hpbGRSZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaW5kaW5nLnR5cGUgPT09IEJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZSAmJlxuICAgICAgICAgICAgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhtZXRhZGF0YVJlYWRlciwgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY29udGFpbmVyLm9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCA9IGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudChtZXRhZGF0YVJlYWRlciwgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoIDwgYmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRVJST1JfTVNHUy5BUkdVTUVOVFNfTEVOR1RIX01JU01BVENIKGdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgICAgICAgX2NyZWF0ZVN1YlJlcXVlc3RzKG1ldGFkYXRhUmVhZGVyLCBmYWxzZSwgZGVwZW5kZW5jeS5zZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgc3ViQ2hpbGRSZXF1ZXN0LCBkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRCaW5kaW5ncyhjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gW107XG4gICAgY29uc3QgYmluZGluZ0RpY3Rpb25hcnkgPSBnZXRCaW5kaW5nRGljdGlvbmFyeShjb250YWluZXIpO1xuICAgIGlmIChiaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgIGJpbmRpbmdzID0gYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29udGFpbmVyLnBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKGNvbnRhaW5lci5wYXJlbnQsIHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRpbmdzO1xufVxuZnVuY3Rpb24gcGxhbihtZXRhZGF0YVJlYWRlciwgY29udGFpbmVyLCBpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSwgYXZvaWRDb25zdHJhaW50cyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0KGNvbnRhaW5lcik7XG4gICAgY29uc3QgdGFyZ2V0ID0gX2NyZWF0ZVRhcmdldChpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwgJycsIGtleSwgdmFsdWUpO1xuICAgIHRyeSB7XG4gICAgICAgIF9jcmVhdGVTdWJSZXF1ZXN0cyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzU3RhY2tPdmVyZmxvd0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uKGNvbnRleHQucGxhbi5yb290UmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlTW9ja1JlcXVlc3QoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhTGlzdCA9IF9nZXRUYXJnZXRNZXRhZGF0YShmYWxzZSwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgIGNvbnN0IGNsYXNzRWxlbWVudE1ldGFkYXRhID0gZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEobWV0YWRhdGFMaXN0KTtcbiAgICBpZiAoY2xhc3NFbGVtZW50TWV0YWRhdGEua2luZCA9PT0gQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kLnVubWFuYWdlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWV0YWRhdGEgd2hlbiBjcmVhdGluZyB0YXJnZXQnKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IFRhcmdldEltcGwoJycsIGNsYXNzRWxlbWVudE1ldGFkYXRhLCAnVmFyaWFibGUnKTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IENvbnRleHQoY29udGFpbmVyKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIFtdLCB0YXJnZXQpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuZXhwb3J0IHsgcGxhbiwgY3JlYXRlTW9ja1JlcXVlc3QsIGdldEJpbmRpbmdEaWN0aW9uYXJ5IH07XG4iLCJmdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgY29uc3QgaXNPYmplY3RPckZ1bmN0aW9uID0gKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkgfHxcbiAgICAgICAgdHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gKGlzT2JqZWN0T3JGdW5jdGlvbiAmJiB0eXBlb2Ygb2JqZWN0LnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuZnVuY3Rpb24gaXNQcm9taXNlT3JDb250YWluc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgaWYgKGlzUHJvbWlzZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmplY3QpICYmIG9iamVjdC5zb21lKGlzUHJvbWlzZSk7XG59XG5leHBvcnQgeyBpc1Byb21pc2UsIGlzUHJvbWlzZU9yQ29udGFpbnNQcm9taXNlIH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi4vdXRpbHMvYXN5bmMnO1xuZXhwb3J0IGNvbnN0IHRyeUdldEZyb21TY29wZSA9IChyZXF1ZXN0U2NvcGUsIGJpbmRpbmcpID0+IHtcbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b24gJiYgYmluZGluZy5hY3RpdmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmcuY2FjaGU7XG4gICAgfVxuICAgIGlmIChiaW5kaW5nLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3QgJiZcbiAgICAgICAgcmVxdWVzdFNjb3BlLmhhcyhiaW5kaW5nLmlkKSkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlLmdldChiaW5kaW5nLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IGNvbnN0IHNhdmVUb1Njb3BlID0gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGJpbmRpbmcuc2NvcGUgPT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uKSB7XG4gICAgICAgIF9zYXZlVG9TaW5nbGV0b25TY29wZShiaW5kaW5nLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0KSB7XG4gICAgICAgIF9zYXZlVG9SZXF1ZXN0U2NvcGUocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXN1bHQpO1xuICAgIH1cbn07XG5jb25zdCBfc2F2ZVRvUmVxdWVzdFNjb3BlID0gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzdWx0KSA9PiB7XG4gICAgaWYgKCFyZXF1ZXN0U2NvcGUuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgIHJlcXVlc3RTY29wZS5zZXQoYmluZGluZy5pZCwgcmVzdWx0KTtcbiAgICB9XG59O1xuY29uc3QgX3NhdmVUb1NpbmdsZXRvblNjb3BlID0gKGJpbmRpbmcsIHJlc3VsdCkgPT4ge1xuICAgIGJpbmRpbmcuY2FjaGUgPSByZXN1bHQ7XG4gICAgYmluZGluZy5hY3RpdmF0ZWQgPSB0cnVlO1xuICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICB2b2lkIF9zYXZlQXN5bmNSZXN1bHRUb1NpbmdsZXRvblNjb3BlKGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgfVxufTtcbmNvbnN0IF9zYXZlQXN5bmNSZXN1bHRUb1NpbmdsZXRvblNjb3BlID0gYXN5bmMgKGJpbmRpbmcsIGFzeW5jUmVzdWx0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXN5bmNSZXN1bHQ7XG4gICAgICAgIGJpbmRpbmcuY2FjaGUgPSByZXN1bHQ7XG4gICAgfVxuICAgIGNhdGNoIChleCkge1xuICAgICAgICBiaW5kaW5nLmNhY2hlID0gbnVsbDtcbiAgICAgICAgYmluZGluZy5hY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgfVxufTtcbiIsImV4cG9ydCB2YXIgRmFjdG9yeVR5cGU7XG4oZnVuY3Rpb24gKEZhY3RvcnlUeXBlKSB7XG4gICAgRmFjdG9yeVR5cGVbXCJEeW5hbWljVmFsdWVcIl0gPSBcInRvRHluYW1pY1ZhbHVlXCI7XG4gICAgRmFjdG9yeVR5cGVbXCJGYWN0b3J5XCJdID0gXCJ0b0ZhY3RvcnlcIjtcbiAgICBGYWN0b3J5VHlwZVtcIlByb3ZpZGVyXCJdID0gXCJ0b1Byb3ZpZGVyXCI7XG59KShGYWN0b3J5VHlwZSB8fCAoRmFjdG9yeVR5cGUgPSB7fSkpO1xuIiwiaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBGYWN0b3J5VHlwZSB9IGZyb20gJy4vZmFjdG9yeV90eXBlJztcbmV4cG9ydCBjb25zdCBtdWx0aUJpbmRUb1NlcnZpY2UgPSAoY29udGFpbmVyKSA9PiAoc2VydmljZSkgPT4gKC4uLnR5cGVzKSA9PiB7XG4gICAgdHlwZXMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYmluZCh0KS50b1NlcnZpY2Uoc2VydmljZSk7XG4gICAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IGVuc3VyZUZ1bGx5Qm91bmQgPSAoYmluZGluZykgPT4ge1xuICAgIGxldCBib3VuZFZhbHVlID0gbnVsbDtcbiAgICBzd2l0Y2ggKGJpbmRpbmcudHlwZSkge1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Db25zdGFudFZhbHVlOlxuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GdW5jdGlvbjpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLmNhY2hlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yOlxuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZTpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU6XG4gICAgICAgICAgICBib3VuZFZhbHVlID0gYmluZGluZy5keW5hbWljVmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uUHJvdmlkZXI6XG4gICAgICAgICAgICBib3VuZFZhbHVlID0gYmluZGluZy5wcm92aWRlcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5OlxuICAgICAgICAgICAgYm91bmRWYWx1ZSA9IGJpbmRpbmcuZmFjdG9yeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoYm91bmRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VSUk9SX01TR1MuSU5WQUxJRF9CSU5ESU5HX1RZUEV9ICR7c2VydmljZUlkZW50aWZpZXJBc1N0cmluZ31gKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldEZhY3RvcnlEZXRhaWxzID0gKGJpbmRpbmcpID0+IHtcbiAgICBzd2l0Y2ggKGJpbmRpbmcudHlwZSkge1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5OlxuICAgICAgICAgICAgcmV0dXJuIHsgZmFjdG9yeTogYmluZGluZy5mYWN0b3J5LCBmYWN0b3J5VHlwZTogRmFjdG9yeVR5cGUuRmFjdG9yeSB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjpcbiAgICAgICAgICAgIHJldHVybiB7IGZhY3Rvcnk6IGJpbmRpbmcucHJvdmlkZXIsIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5Qcm92aWRlciB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZhY3Rvcnk6IGJpbmRpbmcuZHluYW1pY1ZhbHVlLFxuICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5EeW5hbWljVmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZhY3RvcnkgdHlwZSAke2JpbmRpbmcudHlwZX1gKTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgT05fREVBQ1RJVkFUSU9OX0VSUk9SLCBQT1NUX0NPTlNUUlVDVF9FUlJPUiwgUFJFX0RFU1RST1lfRVJST1IsIH0gZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1Njb3BlRW51bSwgVGFyZ2V0VHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlLCBpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL2FzeW5jJztcbmZ1bmN0aW9uIF9yZXNvbHZlUmVxdWVzdHMoY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpIHtcbiAgICByZXR1cm4gY2hpbGRSZXF1ZXN0cy5yZWR1Y2UoKHJlc29sdmVkUmVxdWVzdHMsIGNoaWxkUmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBpbmplY3Rpb24gPSByZXNvbHZlUmVxdWVzdChjaGlsZFJlcXVlc3QpO1xuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gY2hpbGRSZXF1ZXN0LnRhcmdldC50eXBlO1xuICAgICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gVGFyZ2V0VHlwZUVudW0uQ29uc3RydWN0b3JBcmd1bWVudCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5jb25zdHJ1Y3RvckluamVjdGlvbnMucHVzaChpbmplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5wcm9wZXJ0eVJlcXVlc3RzLnB1c2goY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHJlc29sdmVkUmVxdWVzdHMucHJvcGVydHlJbmplY3Rpb25zLnB1c2goaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc29sdmVkUmVxdWVzdHMuaXNBc3luYykge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5pc0FzeW5jID0gaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UoaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRSZXF1ZXN0cztcbiAgICB9LCB7XG4gICAgICAgIGNvbnN0cnVjdG9ySW5qZWN0aW9uczogW10sXG4gICAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnM6IFtdLFxuICAgICAgICBwcm9wZXJ0eVJlcXVlc3RzOiBbXSxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVJbnN0YW5jZShjb25zdHIsIGNoaWxkUmVxdWVzdHMsIHJlc29sdmVSZXF1ZXN0KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoY2hpbGRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gX3Jlc29sdmVSZXF1ZXN0cyhjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBcmcgPSB7XG4gICAgICAgICAgICAuLi5yZXNvbHZlZCxcbiAgICAgICAgICAgIGNvbnN0cixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmlzQXN5bmMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBc3luYyhjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnMoY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FyZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBjb25zdHIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGFyZ3MuY29uc3RyKC4uLmFyZ3MuY29uc3RydWN0b3JJbmplY3Rpb25zKTtcbiAgICBhcmdzLnByb3BlcnR5UmVxdWVzdHMuZm9yRWFjaCgociwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSByLnRhcmdldC5pZGVudGlmaWVyO1xuICAgICAgICBjb25zdCBpbmplY3Rpb24gPSBhcmdzLnByb3BlcnR5SW5qZWN0aW9uc1tpbmRleF07XG4gICAgICAgIGlmICghci50YXJnZXQuaXNPcHRpb25hbCgpIHx8IGluamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtwcm9wZXJ0eV0gPSBpbmplY3Rpb247XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXN5bmMoYXJncykge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ySW5qZWN0aW9ucyA9IGF3YWl0IHBvc3NpYmx5V2FpdEluamVjdGlvbnMoYXJncy5jb25zdHJ1Y3RvckluamVjdGlvbnMpO1xuICAgIGNvbnN0IHByb3BlcnR5SW5qZWN0aW9ucyA9IGF3YWl0IHBvc3NpYmx5V2FpdEluamVjdGlvbnMoYXJncy5wcm9wZXJ0eUluamVjdGlvbnMpO1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zKHtcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICAgY29uc3RydWN0b3JJbmplY3Rpb25zLFxuICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnMsXG4gICAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBwb3NzaWJseVdhaXRJbmplY3Rpb25zKHBvc3NpYmxlUHJvbWlzZWluamVjdGlvbnMpIHtcbiAgICBjb25zdCBpbmplY3Rpb25zID0gW107XG4gICAgZm9yIChjb25zdCBpbmplY3Rpb24gb2YgcG9zc2libGVQcm9taXNlaW5qZWN0aW9ucykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3Rpb24pKSB7XG4gICAgICAgICAgICBpbmplY3Rpb25zLnB1c2goUHJvbWlzZS5hbGwoaW5qZWN0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmplY3Rpb25zLnB1c2goaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5qZWN0aW9ucyk7XG59XG5mdW5jdGlvbiBfZ2V0SW5zdGFuY2VBZnRlclBvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpIHtcbiAgICBjb25zdCBwb3N0Q29uc3RydWN0UmVzdWx0ID0gX3Bvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpO1xuICAgIGlmIChpc1Byb21pc2UocG9zdENvbnN0cnVjdFJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHBvc3RDb25zdHJ1Y3RSZXN1bHQudGhlbigoKSA9PiByZXN1bHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBfcG9zdENvbnN0cnVjdChjb25zdHIsIGluc3RhbmNlKSB7XG4gICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBjb25zdHIpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QT1NUX0NPTlNUUlVDVCwgY29uc3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVtkYXRhLnZhbHVlXT8uKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoUE9TVF9DT05TVFJVQ1RfRVJST1IoY29uc3RyLm5hbWUsIGUubWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX3ZhbGlkYXRlSW5zdGFuY2VSZXNvbHV0aW9uKGJpbmRpbmcsIGNvbnN0cikge1xuICAgIGlmIChiaW5kaW5nLnNjb3BlICE9PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbikge1xuICAgICAgICBfdGhyb3dJZkhhbmRsaW5nRGVhY3RpdmF0aW9uKGJpbmRpbmcsIGNvbnN0cik7XG4gICAgfVxufVxuZnVuY3Rpb24gX3Rocm93SWZIYW5kbGluZ0RlYWN0aXZhdGlvbihiaW5kaW5nLCBjb25zdHIpIHtcbiAgICBjb25zdCBzY29wZUVycm9yTWVzc2FnZSA9IGBDbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGluICR7YmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0ID8gJ3JlcXVlc3QnIDogJ3RyYW5zaWVudCd9IHNjb3BlLmA7XG4gICAgaWYgKHR5cGVvZiBiaW5kaW5nLm9uRGVhY3RpdmF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihPTl9ERUFDVElWQVRJT05fRVJST1IoY29uc3RyLm5hbWUsIHNjb3BlRXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKE1FVEFEQVRBX0tFWS5QUkVfREVTVFJPWSwgY29uc3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoUFJFX0RFU1RST1lfRVJST1IoY29uc3RyLm5hbWUsIHNjb3BlRXJyb3JNZXNzYWdlKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUluc3RhbmNlKGJpbmRpbmcsIGNvbnN0ciwgY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpIHtcbiAgICBfdmFsaWRhdGVJbnN0YW5jZVJlc29sdXRpb24oYmluZGluZywgY29uc3RyKTtcbiAgICBjb25zdCByZXN1bHQgPSBfY3JlYXRlSW5zdGFuY2UoY29uc3RyLCBjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCk7XG4gICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzb2x2ZWRSZXN1bHQpID0+IF9nZXRJbnN0YW5jZUFmdGVyUG9zdENvbnN0cnVjdChjb25zdHIsIHJlc29sdmVkUmVzdWx0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gX2dldEluc3RhbmNlQWZ0ZXJQb3N0Q29uc3RydWN0KGNvbnN0ciwgcmVzdWx0KTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlSW5zdGFuY2UgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1R5cGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QmluZGluZ0RpY3Rpb25hcnkgfSBmcm9tICcuLi9wbGFubmluZy9wbGFubmVyJztcbmltcG9ydCB7IHNhdmVUb1Njb3BlLCB0cnlHZXRGcm9tU2NvcGUgfSBmcm9tICcuLi9zY29wZS9zY29wZSc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuLi91dGlscy9hc3luYyc7XG5pbXBvcnQgeyBlbnN1cmVGdWxseUJvdW5kLCBnZXRGYWN0b3J5RGV0YWlscyB9IGZyb20gJy4uL3V0aWxzL2JpbmRpbmdfdXRpbHMnO1xuaW1wb3J0IHsgdHJ5QW5kVGhyb3dFcnJvcklmU3RhY2tPdmVyZmxvdyB9IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgcmVzb2x2ZUluc3RhbmNlIH0gZnJvbSAnLi9pbnN0YW50aWF0aW9uJztcbmNvbnN0IF9yZXNvbHZlUmVxdWVzdCA9IChyZXF1ZXN0U2NvcGUpID0+IChyZXF1ZXN0KSA9PiB7XG4gICAgcmVxdWVzdC5wYXJlbnRDb250ZXh0LnNldEN1cnJlbnRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIGNvbnN0IGJpbmRpbmdzID0gcmVxdWVzdC5iaW5kaW5ncztcbiAgICBjb25zdCBjaGlsZFJlcXVlc3RzID0gcmVxdWVzdC5jaGlsZFJlcXVlc3RzO1xuICAgIGNvbnN0IHRhcmdldElzQW5BcnJheSA9IHJlcXVlc3QudGFyZ2V0ICYmIHJlcXVlc3QudGFyZ2V0LmlzQXJyYXkoKTtcbiAgICBjb25zdCB0YXJnZXRQYXJlbnRJc05vdEFuQXJyYXkgPSAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0IHx8XG4gICAgICAgICFyZXF1ZXN0LnBhcmVudFJlcXVlc3QudGFyZ2V0IHx8XG4gICAgICAgICFyZXF1ZXN0LnRhcmdldCB8fFxuICAgICAgICAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnRhcmdldC5tYXRjaGVzQXJyYXkocmVxdWVzdC50YXJnZXQuc2VydmljZUlkZW50aWZpZXIpO1xuICAgIGlmICh0YXJnZXRJc0FuQXJyYXkgJiYgdGFyZ2V0UGFyZW50SXNOb3RBbkFycmF5KSB7XG4gICAgICAgIHJldHVybiBjaGlsZFJlcXVlc3RzLm1hcCgoY2hpbGRSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlUmVxdWVzdCA9IF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVSZXF1ZXN0KGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHJlcXVlc3QudGFyZ2V0LmlzT3B0aW9uYWwoKSAmJiBiaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzWzBdO1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVCaW5kaW5nKHJlcXVlc3RTY29wZSwgcmVxdWVzdCwgYmluZGluZyk7XG4gICAgfVxufTtcbmNvbnN0IF9yZXNvbHZlRmFjdG9yeUZyb21CaW5kaW5nID0gKGJpbmRpbmcsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5RGV0YWlscyA9IGdldEZhY3RvcnlEZXRhaWxzKGJpbmRpbmcpO1xuICAgIHJldHVybiB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93KCgpID0+IGZhY3RvcnlEZXRhaWxzLmZhY3RvcnkuYmluZChiaW5kaW5nKShjb250ZXh0KSwgKCkgPT4gbmV3IEVycm9yKEVSUk9SX01TR1MuQ0lSQ1VMQVJfREVQRU5ERU5DWV9JTl9GQUNUT1JZKGZhY3RvcnlEZXRhaWxzLmZhY3RvcnlUeXBlLCBjb250ZXh0LmN1cnJlbnRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyLnRvU3RyaW5nKCkpKSk7XG59O1xuY29uc3QgX2dldFJlc29sdmVkRnJvbUJpbmRpbmcgPSAocmVxdWVzdFNjb3BlLCByZXF1ZXN0LCBiaW5kaW5nKSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBjaGlsZFJlcXVlc3RzID0gcmVxdWVzdC5jaGlsZFJlcXVlc3RzO1xuICAgIGVuc3VyZUZ1bGx5Qm91bmQoYmluZGluZyk7XG4gICAgc3dpdGNoIChiaW5kaW5nLnR5cGUpIHtcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uQ29uc3RhbnRWYWx1ZTpcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb246XG4gICAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nLmNhY2hlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yOlxuICAgICAgICAgICAgcmVzdWx0ID0gYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uSW5zdGFuY2U6XG4gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlSW5zdGFuY2UoYmluZGluZywgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUsIGNoaWxkUmVxdWVzdHMsIF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVzdWx0ID0gX3Jlc29sdmVGYWN0b3J5RnJvbUJpbmRpbmcoYmluZGluZywgcmVxdWVzdC5wYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfcmVzb2x2ZUluU2NvcGUgPSAocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXNvbHZlRnJvbUJpbmRpbmcpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gdHJ5R2V0RnJvbVNjb3BlKHJlcXVlc3RTY29wZSwgYmluZGluZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQgPSByZXNvbHZlRnJvbUJpbmRpbmcoKTtcbiAgICBzYXZlVG9TY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfcmVzb2x2ZUJpbmRpbmcgPSAocmVxdWVzdFNjb3BlLCByZXF1ZXN0LCBiaW5kaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9yZXNvbHZlSW5TY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcsICgpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IF9nZXRSZXNvbHZlZEZyb21CaW5kaW5nKHJlcXVlc3RTY29wZSwgcmVxdWVzdCwgYmluZGluZyk7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRoZW4oKHJlc29sdmVkKSA9PiBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc29sdmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc29sdmVkKSB7XG4gICAgbGV0IHJlc3VsdCA9IF9iaW5kaW5nQWN0aXZhdGlvbihyZXF1ZXN0LnBhcmVudENvbnRleHQsIGJpbmRpbmcsIHJlc29sdmVkKTtcbiAgICBjb25zdCBjb250YWluZXJzSXRlcmF0b3IgPSBfZ2V0Q29udGFpbmVyc0l0ZXJhdG9yKHJlcXVlc3QucGFyZW50Q29udGV4dC5jb250YWluZXIpO1xuICAgIGxldCBjb250YWluZXI7XG4gICAgbGV0IGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgZG8ge1xuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXJzSXRlcmF0b3JSZXN1bHQudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSByZXF1ZXN0LnBhcmVudENvbnRleHQ7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyID0gcmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgY29uc3QgYWN0aXZhdGlvbnNJdGVyYXRvciA9IF9nZXRDb250YWluZXJBY3RpdmF0aW9uc0ZvclNlcnZpY2UoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gX2FjdGl2YXRlQ29udGFpbmVyQXN5bmMoYWN0aXZhdGlvbnNJdGVyYXRvciwgY29udGV4dCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IF9hY3RpdmF0ZUNvbnRhaW5lcihhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgfSB3aGlsZSAoY29udGFpbmVyc0l0ZXJhdG9yUmVzdWx0LmRvbmUgIT09IHRydWUgJiZcbiAgICAgICAgIWdldEJpbmRpbmdEaWN0aW9uYXJ5KGNvbnRhaW5lcikuaGFzS2V5KHJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgX2JpbmRpbmdBY3RpdmF0aW9uID0gKGNvbnRleHQsIGJpbmRpbmcsIHByZXZpb3VzUmVzdWx0KSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcub25BY3RpdmF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGJpbmRpbmcub25BY3RpdmF0aW9uKGNvbnRleHQsIHByZXZpb3VzUmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IF9hY3RpdmF0ZUNvbnRhaW5lciA9IChhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpID0+IHtcbiAgICBsZXQgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgIHdoaWxlIChhY3RpdmF0aW9uLmRvbmUgIT09IHRydWUpIHtcbiAgICAgICAgcmVzdWx0ID0gYWN0aXZhdGlvbi52YWx1ZShjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBfYWN0aXZhdGVDb250YWluZXJBc3luYyhhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfYWN0aXZhdGVDb250YWluZXJBc3luYyA9IGFzeW5jIChhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHRQcm9taXNlKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgbGV0IGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICB3aGlsZSAoYWN0aXZhdGlvbi5kb25lICE9PSB0cnVlKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGl2YXRpb24udmFsdWUoY29udGV4dCwgcmVzdWx0KTtcbiAgICAgICAgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IF9nZXRDb250YWluZXJBY3RpdmF0aW9uc0ZvclNlcnZpY2UgPSAoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRpb25zID0gY29udGFpbmVyLl9hY3RpdmF0aW9ucztcbiAgICByZXR1cm4gYWN0aXZhdGlvbnMuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKVxuICAgICAgICA/IGFjdGl2YXRpb25zLmdldChzZXJ2aWNlSWRlbnRpZmllcikudmFsdWVzKClcbiAgICAgICAgOiBbXS52YWx1ZXMoKTtcbn07XG5jb25zdCBfZ2V0Q29udGFpbmVyc0l0ZXJhdG9yID0gKGNvbnRhaW5lcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lcnNTdGFjayA9IFtjb250YWluZXJdO1xuICAgIGxldCBwYXJlbnQgPSBjb250YWluZXIucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29udGFpbmVyc1N0YWNrLnB1c2gocGFyZW50KTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgY29uc3QgZ2V0TmV4dENvbnRhaW5lciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dENvbnRhaW5lciA9IGNvbnRhaW5lcnNTdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKG5leHRDb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBuZXh0Q29udGFpbmVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGNvbnRhaW5lcnNJdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZ2V0TmV4dENvbnRhaW5lcixcbiAgICB9O1xuICAgIHJldHVybiBjb250YWluZXJzSXRlcmF0b3I7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZShjb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZVJlcXVlc3RGdW5jdGlvbiA9IF9yZXNvbHZlUmVxdWVzdChjb250ZXh0LnBsYW4ucm9vdFJlcXVlc3QucmVxdWVzdFNjb3BlKTtcbiAgICByZXR1cm4gcmVzb2x2ZVJlcXVlc3RGdW5jdGlvbihjb250ZXh0LnBsYW4ucm9vdFJlcXVlc3QpO1xufVxuZXhwb3J0IHsgcmVzb2x2ZSB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuY29uc3QgdHJhdmVyc2VBbmNlcnN0b3JzID0gKHJlcXVlc3QsIGNvbnN0cmFpbnQpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSByZXF1ZXN0LnBhcmVudFJlcXVlc3Q7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludChwYXJlbnQpID8gdHJ1ZSA6IHRyYXZlcnNlQW5jZXJzdG9ycyhwYXJlbnQsIGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCB0YWdnZWRDb25zdHJhaW50ID0gKGtleSkgPT4gKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY29uc3RyYWludCA9IChyZXF1ZXN0KSA9PiByZXF1ZXN0ICE9PSBudWxsICYmXG4gICAgICAgIHJlcXVlc3QudGFyZ2V0ICE9PSBudWxsICYmXG4gICAgICAgIHJlcXVlc3QudGFyZ2V0Lm1hdGNoZXNUYWcoa2V5KSh2YWx1ZSk7XG4gICAgY29uc3RyYWludC5tZXRhRGF0YSA9IG5ldyBNZXRhZGF0YShrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gY29uc3RyYWludDtcbn07XG5jb25zdCBuYW1lZENvbnN0cmFpbnQgPSB0YWdnZWRDb25zdHJhaW50KE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcpO1xuY29uc3QgdHlwZUNvbnN0cmFpbnQgPSAodHlwZSkgPT4gKHJlcXVlc3QpID0+IHtcbiAgICBsZXQgYmluZGluZyA9IG51bGw7XG4gICAgaWYgKHJlcXVlc3QgIT09IG51bGwpIHtcbiAgICAgICAgYmluZGluZyA9IHJlcXVlc3QuYmluZGluZ3NbMF07XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyID09PSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSByZXF1ZXN0LmJpbmRpbmdzWzBdLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHsgdHJhdmVyc2VBbmNlcnN0b3JzLCB0YWdnZWRDb25zdHJhaW50LCBuYW1lZENvbnN0cmFpbnQsIHR5cGVDb25zdHJhaW50LCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBuYW1lZENvbnN0cmFpbnQsIHRhZ2dlZENvbnN0cmFpbnQsIHRyYXZlcnNlQW5jZXJzdG9ycywgdHlwZUNvbnN0cmFpbnQsIH0gZnJvbSAnLi9jb25zdHJhaW50X2hlbHBlcnMnO1xuY2xhc3MgQmluZGluZ1doZW5TeW50YXgge1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIHdoZW4oY29uc3RyYWludCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldE5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gbmFtZWRDb25zdHJhaW50KG5hbWUpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldElzRGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNEZWZhdWx0ID0gcmVxdWVzdC50YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhcmVxdWVzdC50YXJnZXQuaXNOYW1lZCgpICYmXG4gICAgICAgICAgICAgICAgIXJlcXVlc3QudGFyZ2V0LmlzVGFnZ2VkKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0SXNEZWZhdWx0O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldFRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IHRhZ2dlZENvbnN0cmFpbnQodGFnKSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuSW5qZWN0ZWRJbnRvKHBhcmVudCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0eXBlQ29uc3RyYWludChwYXJlbnQpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuUGFyZW50TmFtZWQobmFtZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiBuYW1lZENvbnN0cmFpbnQobmFtZSkocmVxdWVzdC5wYXJlbnRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdHlwZUNvbnN0cmFpbnQoYW5jZXN0b3IpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9ySXMoYW5jZXN0b3IpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdHlwZUNvbnN0cmFpbnQoYW5jZXN0b3IpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiYgdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIG5hbWVkQ29uc3RyYWludChuYW1lKSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiYgIXRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBuYW1lZENvbnN0cmFpbnQobmFtZSkpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCB0YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdGFnZ2VkQ29uc3RyYWludCh0YWcpKHZhbHVlKSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IChyZXF1ZXN0KSA9PiByZXF1ZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIGNvbnN0cmFpbnQpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ1doZW5TeW50YXggfSBmcm9tICcuL2JpbmRpbmdfd2hlbl9zeW50YXgnO1xuY2xhc3MgQmluZGluZ09uU3ludGF4IHtcbiAgICBfYmluZGluZztcbiAgICBjb25zdHJ1Y3RvcihiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcgPSBiaW5kaW5nO1xuICAgIH1cbiAgICBvbkFjdGl2YXRpb24oaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLm9uQWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIG9uRGVhY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ09uU3ludGF4IH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nT25TeW50YXggfSBmcm9tICcuL2JpbmRpbmdfb25fc3ludGF4JztcbmltcG9ydCB7IEJpbmRpbmdXaGVuU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX3doZW5fc3ludGF4JztcbmNsYXNzIEJpbmRpbmdXaGVuT25TeW50YXgge1xuICAgIF9iaW5kaW5nV2hlblN5bnRheDtcbiAgICBfYmluZGluZ09uU3ludGF4O1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4ID0gbmV3IEJpbmRpbmdXaGVuU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nT25TeW50YXggPSBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW4oY29uc3RyYWludCk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXROYW1lZChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0TmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXRJc0RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0SXNEZWZhdWx0KCk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9XG4gICAgd2hlbkluamVjdGVkSW50byhwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5JbmplY3RlZEludG8ocGFyZW50KTtcbiAgICB9XG4gICAgd2hlblBhcmVudE5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnROYW1lZChuYW1lKTtcbiAgICB9XG4gICAgd2hlblBhcmVudFRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50VGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9yTmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9XG4gICAgb25BY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkFjdGl2YXRpb24oaGFuZGxlcik7XG4gICAgfVxuICAgIG9uRGVhY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkRlYWN0aXZhdGlvbihoYW5kbGVyKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nV2hlbk9uU3ludGF4IH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgQmluZGluZ1doZW5PblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX29uX3N5bnRheCc7XG5jbGFzcyBCaW5kaW5nSW5TeW50YXgge1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIGluUmVxdWVzdFNjb3BlKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIGluU2luZ2xldG9uU2NvcGUoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICBpblRyYW5zaWVudFNjb3BlKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nSW5TeW50YXggfTtcbiIsImltcG9ydCB7IEJpbmRpbmdJblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl9zeW50YXgnO1xuaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX3N5bnRheCc7XG5jbGFzcyBCaW5kaW5nSW5XaGVuT25TeW50YXgge1xuICAgIF9iaW5kaW5nSW5TeW50YXg7XG4gICAgX2JpbmRpbmdXaGVuU3ludGF4O1xuICAgIF9iaW5kaW5nT25TeW50YXg7XG4gICAgX2JpbmRpbmc7XG4gICAgY29uc3RydWN0b3IoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgdGhpcy5fYmluZGluZ1doZW5TeW50YXggPSBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdPblN5bnRheCA9IG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdJblN5bnRheCA9IG5ldyBCaW5kaW5nSW5TeW50YXgoYmluZGluZyk7XG4gICAgfVxuICAgIGluUmVxdWVzdFNjb3BlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0luU3ludGF4LmluUmVxdWVzdFNjb3BlKCk7XG4gICAgfVxuICAgIGluU2luZ2xldG9uU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5TaW5nbGV0b25TY29wZSgpO1xuICAgIH1cbiAgICBpblRyYW5zaWVudFNjb3BlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0luU3ludGF4LmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICB9XG4gICAgd2hlbihjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuKGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0TmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldE5hbWVkKG5hbWUpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0SXNEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldElzRGVmYXVsdCgpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0VGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXRUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5JbmplY3RlZEludG8ocGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuSW5qZWN0ZWRJbnRvKHBhcmVudCk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnROYW1lZChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50TmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblBhcmVudFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JJcyhhbmNlc3Rvcik7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCk7XG4gICAgfVxuICAgIG9uQWN0aXZhdGlvbihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nT25TeW50YXgub25BY3RpdmF0aW9uKGhhbmRsZXIpO1xuICAgIH1cbiAgICBvbkRlYWN0aXZhdGlvbihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nT25TeW50YXgub25EZWFjdGl2YXRpb24oaGFuZGxlcik7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ0luV2hlbk9uU3ludGF4IH07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdTY29wZUVudW0sIEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCB7IEJpbmRpbmdJbldoZW5PblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl93aGVuX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlbk9uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX3doZW5fb25fc3ludGF4JztcbmNsYXNzIEJpbmRpbmdUb1N5bnRheCB7XG4gICAgX2JpbmRpbmc7XG4gICAgY29uc3RydWN0b3IoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgdG8oY29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IGNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdJbldoZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgdG9TZWxmKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2JpbmRpbmcuc2VydmljZUlkZW50aWZpZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfVE9fU0VMRl9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXMuX2JpbmRpbmdcbiAgICAgICAgICAgIC5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oc2VsZik7XG4gICAgfVxuICAgIHRvQ29uc3RhbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uQ29uc3RhbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jYWNoZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmR5bmFtaWNWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvRHluYW1pY1ZhbHVlKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkR5bmFtaWNWYWx1ZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jYWNoZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZHluYW1pY1ZhbHVlID0gZnVuYztcbiAgICAgICAgdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdJbldoZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgdG9Db25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uQ29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gY29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b0ZhY3RvcnkoZmFjdG9yeSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvRnVuY3Rpb24oZnVuYykge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfRlVOQ1RJT05fQklORElORyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmluZGluZ1doZW5PblN5bnRheCA9IHRoaXMudG9Db25zdGFudFZhbHVlKGZ1bmMpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb247XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmdXaGVuT25TeW50YXg7XG4gICAgfVxuICAgIHRvQXV0b0ZhY3Rvcnkoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZmFjdG9yeSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdXRvZmFjdG9yeSA9ICgpID0+IGNvbnRleHQuY29udGFpbmVyLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4gYXV0b2ZhY3Rvcnk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b0F1dG9OYW1lZEZhY3Rvcnkoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZmFjdG9yeSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKG5hbWVkKSA9PiBjb250ZXh0LmNvbnRhaW5lci5nZXROYW1lZChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLlByb3ZpZGVyO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b1NlcnZpY2Uoc2VydmljZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRHluYW1pY1ZhbHVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5fYmluZGluZywgJ2NhY2hlJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQoX3ZhbHVlKSB7IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmR5bmFtaWNWYWx1ZSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXQoc2VydmljZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldEFzeW5jKHNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ1RvU3ludGF4IH07XG4iLCJjbGFzcyBDb250YWluZXJTbmFwc2hvdCB7XG4gICAgYmluZGluZ3M7XG4gICAgYWN0aXZhdGlvbnM7XG4gICAgZGVhY3RpdmF0aW9ucztcbiAgICBtaWRkbGV3YXJlO1xuICAgIG1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICBzdGF0aWMgb2YoYmluZGluZ3MsIG1pZGRsZXdhcmUsIGFjdGl2YXRpb25zLCBkZWFjdGl2YXRpb25zLCBtb2R1bGVBY3RpdmF0aW9uU3RvcmUpIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgQ29udGFpbmVyU25hcHNob3QoKTtcbiAgICAgICAgc25hcHNob3QuYmluZGluZ3MgPSBiaW5kaW5ncztcbiAgICAgICAgc25hcHNob3QubWlkZGxld2FyZSA9IG1pZGRsZXdhcmU7XG4gICAgICAgIHNuYXBzaG90LmRlYWN0aXZhdGlvbnMgPSBkZWFjdGl2YXRpb25zO1xuICAgICAgICBzbmFwc2hvdC5hY3RpdmF0aW9ucyA9IGFjdGl2YXRpb25zO1xuICAgICAgICBzbmFwc2hvdC5tb2R1bGVBY3RpdmF0aW9uU3RvcmUgPSBtb2R1bGVBY3RpdmF0aW9uU3RvcmU7XG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9XG59XG5leHBvcnQgeyBDb250YWluZXJTbmFwc2hvdCB9O1xuIiwiaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBpc0Nsb25hYmxlIH0gZnJvbSAnLi4vdXRpbHMvY2xvbmFibGUnO1xuY2xhc3MgTG9va3VwIHtcbiAgICBfbWFwO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9XG4gICAgYWRkKHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX21hcC5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuc2V0KHNlcnZpY2VJZGVudGlmaWVyLCBbdmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tOb25OdWxpc2goc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX21hcC5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuS0VZX05PVF9GT1VORCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTm9uTnVsaXNoKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuZGVsZXRlKHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuS0VZX05PVF9GT1VORCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlSW50ZXJzZWN0aW9uKGxvb2t1cCkge1xuICAgICAgICB0aGlzLnRyYXZlcnNlKChzZXJ2aWNlSWRlbnRpZmllciwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvb2t1cEFjdGl2YXRpb25zID0gbG9va3VwLmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICA/IGxvb2t1cC5nZXQoc2VydmljZUlkZW50aWZpZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAobG9va3VwQWN0aXZhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkVmFsdWVzID0gdmFsdWUuZmlsdGVyKChsb29rdXBWYWx1ZSkgPT4gIWxvb2t1cEFjdGl2YXRpb25zLnNvbWUoKG1vZHVsZUFjdGl2YXRpb24pID0+IGxvb2t1cFZhbHVlID09PSBtb2R1bGVBY3RpdmF0aW9uKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VydmljZUlkZW50aWZpZXIsIGZpbHRlcmVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUJ5Q29uZGl0aW9uKGNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCByZW1vdmFscyA9IFtdO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaCgoZW50cmllcywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRW50cmllcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlID0gY29uZGl0aW9uKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92YWxzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoa2V5LCB1cGRhdGVkRW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVtb3ZhbHM7XG4gICAgfVxuICAgIGhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29weS5hZGQoa2V5LCBpc0Nsb25hYmxlKGIpID8gYi5jbG9uZSgpIDogYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICB0cmF2ZXJzZShmdW5jKSB7XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBmdW5jKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2NoZWNrTm9uTnVsaXNoKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfc2V0VmFsdWUoc2VydmljZUlkZW50aWZpZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuc2V0KHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCB7IExvb2t1cCB9O1xuIiwiZnVuY3Rpb24gaXNDbG9uYWJsZShvYmopIHtcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgICAgIG9iaiAhPT0gbnVsbCAmJlxuICAgICAgICAnY2xvbmUnIGluIG9iaiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLmNsb25lID09PSAnZnVuY3Rpb24nKTtcbn1cbmV4cG9ydCB7IGlzQ2xvbmFibGUgfTtcbiIsImltcG9ydCB7IExvb2t1cCB9IGZyb20gJy4vbG9va3VwJztcbmV4cG9ydCBjbGFzcyBNb2R1bGVBY3RpdmF0aW9uU3RvcmUge1xuICAgIF9tYXAgPSBuZXcgTWFwKCk7XG4gICAgcmVtb3ZlKG1vZHVsZUlkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fbWFwLmdldChtb2R1bGVJZCk7XG4gICAgICAgIGlmIChoYW5kbGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW1wdHlIYW5kbGVyc1N0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShtb2R1bGVJZCk7XG4gICAgICAgIHJldHVybiBoYW5kbGVycztcbiAgICB9XG4gICAgYWRkRGVhY3RpdmF0aW9uKG1vZHVsZUlkLCBzZXJ2aWNlSWRlbnRpZmllciwgb25EZWFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKG1vZHVsZUlkKS5vbkRlYWN0aXZhdGlvbnMuYWRkKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbik7XG4gICAgfVxuICAgIGFkZEFjdGl2YXRpb24obW9kdWxlSWQsIHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKG1vZHVsZUlkKS5vbkFjdGl2YXRpb25zLmFkZChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IE1vZHVsZUFjdGl2YXRpb25TdG9yZSgpO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaCgoaGFuZGxlcnNTdG9yZSwgbW9kdWxlSWQpID0+IHtcbiAgICAgICAgICAgIGNsb25lLl9tYXAuc2V0KG1vZHVsZUlkLCB7XG4gICAgICAgICAgICAgICAgb25BY3RpdmF0aW9uczogaGFuZGxlcnNTdG9yZS5vbkFjdGl2YXRpb25zLmNsb25lKCksXG4gICAgICAgICAgICAgICAgb25EZWFjdGl2YXRpb25zOiBoYW5kbGVyc1N0b3JlLm9uRGVhY3RpdmF0aW9ucy5jbG9uZSgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIF9nZXRNb2R1bGVBY3RpdmF0aW9uSGFuZGxlcnMobW9kdWxlSWQpIHtcbiAgICAgICAgbGV0IG1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyA9IHRoaXMuX21hcC5nZXQobW9kdWxlSWQpO1xuICAgICAgICBpZiAobW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyA9IHRoaXMuX2dldEVtcHR5SGFuZGxlcnNTdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLnNldChtb2R1bGVJZCwgbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzO1xuICAgIH1cbiAgICBfZ2V0RW1wdHlIYW5kbGVyc1N0b3JlKCkge1xuICAgICAgICBjb25zdCBoYW5kbGVyc1N0b3JlID0ge1xuICAgICAgICAgICAgb25BY3RpdmF0aW9uczogbmV3IExvb2t1cCgpLFxuICAgICAgICAgICAgb25EZWFjdGl2YXRpb25zOiBuZXcgTG9va3VwKCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1N0b3JlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuLi9iaW5kaW5ncy9iaW5kaW5nJztcbmltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1Njb3BlRW51bSwgVGFyZ2V0VHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YV9yZWFkZXInO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1JlcXVlc3QsIGdldEJpbmRpbmdEaWN0aW9uYXJ5LCBwbGFuLCB9IGZyb20gJy4uL3BsYW5uaW5nL3BsYW5uZXInO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJy4uL3Jlc29sdXRpb24vcmVzb2x2ZXInO1xuaW1wb3J0IHsgQmluZGluZ1RvU3ludGF4IH0gZnJvbSAnLi4vc3ludGF4L2JpbmRpbmdfdG9fc3ludGF4JztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UgfSBmcm9tICcuLi91dGlscy9hc3luYyc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmltcG9ydCB7IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IENvbnRhaW5lclNuYXBzaG90IH0gZnJvbSAnLi9jb250YWluZXJfc25hcHNob3QnO1xuaW1wb3J0IHsgTG9va3VwIH0gZnJvbSAnLi9sb29rdXAnO1xuaW1wb3J0IHsgTW9kdWxlQWN0aXZhdGlvblN0b3JlIH0gZnJvbSAnLi9tb2R1bGVfYWN0aXZhdGlvbl9zdG9yZSc7XG5jbGFzcyBDb250YWluZXIge1xuICAgIGlkO1xuICAgIHBhcmVudDtcbiAgICBvcHRpb25zO1xuICAgIF9taWRkbGV3YXJlO1xuICAgIF9iaW5kaW5nRGljdGlvbmFyeTtcbiAgICBfYWN0aXZhdGlvbnM7XG4gICAgX2RlYWN0aXZhdGlvbnM7XG4gICAgX3NuYXBzaG90cztcbiAgICBfbWV0YWRhdGFSZWFkZXI7XG4gICAgX21vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250YWluZXJPcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19NVVNUX0JFX0FOX09CSkVDVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdFNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdFNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5kZWZhdWx0U2NvcGUgIT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uICYmXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQgJiZcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdFNjb3BlICE9PSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfREVGQVVMVF9TQ09QRSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfQVVUT19CSU5EX0lOSkVDVEFCTEUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgYXV0b0JpbmRJbmplY3RhYmxlOiBvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGRlZmF1bHRTY29wZTogb3B0aW9ucy5kZWZhdWx0U2NvcGUsXG4gICAgICAgICAgICBza2lwQmFzZUNsYXNzQ2hlY2tzOiBvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaWQgPSBpZCgpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5fc25hcHNob3RzID0gW107XG4gICAgICAgIHRoaXMuX21pZGRsZXdhcmUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9ucyA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5fZGVhY3RpdmF0aW9ucyA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlYWRlciA9IG5ldyBNZXRhZGF0YVJlYWRlcigpO1xuICAgICAgICB0aGlzLl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUgPSBuZXcgTW9kdWxlQWN0aXZhdGlvblN0b3JlKCk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZShjb250YWluZXIxLCBjb250YWluZXIyLCAuLi5jb250YWluZXJzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGFpbmVycyA9IFtcbiAgICAgICAgICAgIGNvbnRhaW5lcjEsXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgLi4uY29udGFpbmVycyxcbiAgICAgICAgXS5tYXAoKHRhcmdldENvbnRhaW5lcikgPT4gZ2V0QmluZGluZ0RpY3Rpb25hcnkodGFyZ2V0Q29udGFpbmVyKSk7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdEaWN0aW9uYXJ5ID0gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY29udGFpbmVyKTtcbiAgICAgICAgZnVuY3Rpb24gY29weURpY3Rpb25hcnkob3JpZ2luLCBkZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgb3JpZ2luLnRyYXZlcnNlKChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGJpbmRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRDb250YWluZXJzLmZvckVhY2goKHRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5KSA9PiB7XG4gICAgICAgICAgICBjb3B5RGljdGlvbmFyeSh0YXJnZXRCaW5kaW5nRGljdGlvbmFyeSwgYmluZGluZ0RpY3Rpb25hcnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG4gICAgbG9hZCguLi5tb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IGdldEhlbHBlcnMgPSB0aGlzLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRNb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICBjdXJyZW50TW9kdWxlLnJlZ2lzdHJ5KGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnVuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLmlzYm91bmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5yZWJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRBc3luY0Z1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uQWN0aXZhdGlvbkZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uRGVhY3RpdmF0aW9uRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGxvYWRBc3luYyguLi5tb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IGdldEhlbHBlcnMgPSB0aGlzLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRNb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCBjdXJyZW50TW9kdWxlLnJlZ2lzdHJ5KGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnVuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLmlzYm91bmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5yZWJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRBc3luY0Z1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uQWN0aXZhdGlvbkZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uRGVhY3RpdmF0aW9uRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVubG9hZCguLi5tb2R1bGVzKSB7XG4gICAgICAgIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWFjdGl2YXRpb25zID0gdGhpcy5fcmVtb3ZlTW9kdWxlQmluZGluZ3MobW9kdWxlLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKGRlYWN0aXZhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTW9kdWxlSGFuZGxlcnMobW9kdWxlLmlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHVubG9hZEFzeW5jKC4uLm1vZHVsZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgZGVhY3RpdmF0aW9ucyA9IHRoaXMuX3JlbW92ZU1vZHVsZUJpbmRpbmdzKG1vZHVsZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9uc0FzeW5jKGRlYWN0aXZhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTW9kdWxlSGFuZGxlcnMobW9kdWxlLmlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiaW5kKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kKHRoaXMuX2J1aWxkQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllcikpO1xuICAgIH1cbiAgICByZWJpbmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy51bmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgcmViaW5kQXN5bmMoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICB1bmJpbmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdmVTZXJ2aWNlRnJvbURpY3Rpb25hcnkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBhc3luYyB1bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBpZiAodGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyhiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgdW5iaW5kQWxsKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS50cmF2ZXJzZSgoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5ID0gbmV3IExvb2t1cCgpO1xuICAgIH1cbiAgICBhc3luYyB1bmJpbmRBbGxBc3luYygpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkudHJhdmVyc2UoKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zQXN5bmModmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkgPSBuZXcgTG9va3VwKCk7XG4gICAgfVxuICAgIG9uQWN0aXZhdGlvbihzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25zLmFkZChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICB9XG4gICAgb25EZWFjdGl2YXRpb24oc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2RlYWN0aXZhdGlvbnMuYWRkKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbik7XG4gICAgfVxuICAgIGlzQm91bmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgbGV0IGJvdW5kID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCFib3VuZCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYm91bmQgPSB0aGlzLnBhcmVudC5pc0JvdW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgfVxuICAgIGlzQ3VycmVudEJvdW5kKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBpc0JvdW5kTmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQm91bmRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWVkKTtcbiAgICB9XG4gICAgaXNCb3VuZFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICBsZXQgYm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjcmVhdGVNb2NrUmVxdWVzdCh0aGlzLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBib3VuZCA9IGJpbmRpbmdzLnNvbWUoKGIpID0+IGIuY29uc3RyYWludChyZXF1ZXN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFib3VuZCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYm91bmQgPSB0aGlzLnBhcmVudC5pc0JvdW5kVGFnZ2VkKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgfVxuICAgIHNuYXBzaG90KCkge1xuICAgICAgICB0aGlzLl9zbmFwc2hvdHMucHVzaChDb250YWluZXJTbmFwc2hvdC5vZih0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5jbG9uZSgpLCB0aGlzLl9taWRkbGV3YXJlLCB0aGlzLl9hY3RpdmF0aW9ucy5jbG9uZSgpLCB0aGlzLl9kZWFjdGl2YXRpb25zLmNsb25lKCksIHRoaXMuX21vZHVsZUFjdGl2YXRpb25TdG9yZS5jbG9uZSgpKSk7XG4gICAgfVxuICAgIHJlc3RvcmUoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3RzLnBvcCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTk9fTU9SRV9TTkFQU0hPVFNfQVZBSUxBQkxFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IHNuYXBzaG90LmJpbmRpbmdzO1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9ucyA9IHNuYXBzaG90LmFjdGl2YXRpb25zO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zID0gc25hcHNob3QuZGVhY3RpdmF0aW9ucztcbiAgICAgICAgdGhpcy5fbWlkZGxld2FyZSA9IHNuYXBzaG90Lm1pZGRsZXdhcmU7XG4gICAgICAgIHRoaXMuX21vZHVsZUFjdGl2YXRpb25TdG9yZSA9IHNuYXBzaG90Lm1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICB9XG4gICAgY3JlYXRlQ2hpbGQoY29udGFpbmVyT3B0aW9ucykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5ldyBDb250YWluZXIoY29udGFpbmVyT3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgIGFwcGx5TWlkZGxld2FyZSguLi5taWRkbGV3YXJlcykge1xuICAgICAgICBjb25zdCBpbml0aWFsID0gdGhpcy5fbWlkZGxld2FyZVxuICAgICAgICAgICAgPyB0aGlzLl9taWRkbGV3YXJlXG4gICAgICAgICAgICA6IHRoaXMuX3BsYW5BbmRSZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuX21pZGRsZXdhcmUgPSBtaWRkbGV3YXJlcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IGN1cnIocHJldiksIGluaXRpYWwpO1xuICAgIH1cbiAgICBhcHBseUN1c3RvbU1ldGFkYXRhUmVhZGVyKG1ldGFkYXRhUmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhUmVhZGVyID0gbWV0YWRhdGFSZWFkZXI7XG4gICAgfVxuICAgIGdldChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnV0VGhyb3dJZkFzeW5jKGdldEFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGdldEFyZ3MpO1xuICAgIH1cbiAgICBnZXRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldE5vdEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIsIGZhbHNlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ1dFRocm93SWZBc3luYyhnZXRBcmdzKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0VGFnZ2VkQXN5bmMoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldE5vdEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIsIGZhbHNlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChnZXRBcmdzKTtcbiAgICB9XG4gICAgZ2V0TmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBhc3luYyBnZXROYW1lZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUYWdnZWRBc3luYyhzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBnZXRBbGwoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnV0VGhyb3dJZkFzeW5jKGdldEFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBbGxBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbGwoZ2V0QXJncyk7XG4gICAgfVxuICAgIGdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgdHJ1ZSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCdXRUaHJvd0lmQXN5bmMoZ2V0QXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGdldEFsbFRhZ2dlZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCB0cnVlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFsbChnZXRBcmdzKTtcbiAgICB9XG4gICAgZ2V0QWxsTmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBbGxOYW1lZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxUYWdnZWRBc3luYyhzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICByZXNvbHZlKGNvbnN0cnVjdG9yRnVuY3Rpb24pIHtcbiAgICAgICAgY29uc3QgaXNCb3VuZCA9IHRoaXMuaXNCb3VuZChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmQoY29uc3RydWN0b3JGdW5jdGlvbikudG9TZWxmKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLmdldChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIF9wcmVEZXN0cm95KGNvbnN0cnVjdG9yLCBpbnN0YW5jZSkge1xuICAgICAgICBpZiAoY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgUmVmbGVjdC5oYXNNZXRhZGF0YShNRVRBREFUQV9LRVkuUFJFX0RFU1RST1ksIGNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbZGF0YS52YWx1ZV0/LigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9yZW1vdmVNb2R1bGVIYW5kbGVycyhtb2R1bGVJZCkge1xuICAgICAgICBjb25zdCBtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzID0gdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLnJlbW92ZShtb2R1bGVJZCk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uQWN0aXZhdGlvbnMpO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uRGVhY3RpdmF0aW9ucyk7XG4gICAgfVxuICAgIF9yZW1vdmVNb2R1bGVCaW5kaW5ncyhtb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlQnlDb25kaXRpb24oKGJpbmRpbmcpID0+IGJpbmRpbmcubW9kdWxlSWQgPT09IG1vZHVsZUlkKTtcbiAgICB9XG4gICAgX2RlYWN0aXZhdGUoYmluZGluZywgaW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBpbnN0YW5jZSA9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3RhbmNlKS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWFjdGl2YXRpb25zLmhhc0tleShiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlYWN0aXZhdGVDb250YWluZXIoaW5zdGFuY2UsIHRoaXMuX2RlYWN0aXZhdGlvbnMuZ2V0KGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIpLnZhbHVlcygpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZURlYWN0aXZhdGlvbkVycm9yKHJlc3VsdC50aGVuKGFzeW5jICgpID0+IHRoaXMuX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveUFzeW5jKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3RvcikpLCBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLl9wcm9wYWdhdGVDb250YWluZXJEZWFjdGl2YXRpb25UaGVuQmluZGluZ0FuZFByZURlc3Ryb3koYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocHJvcGFnYXRlRGVhY3RpdmF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVEZWFjdGl2YXRpb25FcnJvcihwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQsIGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5PTl9ERUFDVElWQVRJT05fRVJST1IoZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKSwgZXgubWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9oYW5kbGVEZWFjdGl2YXRpb25FcnJvcihhc3luY1Jlc3VsdCwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFzeW5jUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5PTl9ERUFDVElWQVRJT05fRVJST1IoZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllciksIGV4Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVhY3RpdmF0ZUNvbnRhaW5lcihpbnN0YW5jZSwgZGVhY3RpdmF0aW9uc0l0ZXJhdG9yKSB7XG4gICAgICAgIGxldCBkZWFjdGl2YXRpb24gPSBkZWFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB3aGlsZSAodHlwZW9mIGRlYWN0aXZhdGlvbi52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVhY3RpdmF0aW9uLnZhbHVlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihhc3luYyAoKSA9PiB0aGlzLl9kZWFjdGl2YXRlQ29udGFpbmVyQXN5bmMoaW5zdGFuY2UsIGRlYWN0aXZhdGlvbnNJdGVyYXRvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfZGVhY3RpdmF0ZUNvbnRhaW5lckFzeW5jKGluc3RhbmNlLCBkZWFjdGl2YXRpb25zSXRlcmF0b3IpIHtcbiAgICAgICAgbGV0IGRlYWN0aXZhdGlvbiA9IGRlYWN0aXZhdGlvbnNJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHdoaWxlICh0eXBlb2YgZGVhY3RpdmF0aW9uLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWFjdGl2YXRpb24udmFsdWUoaW5zdGFuY2UpO1xuICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkoKSB7XG4gICAgICAgIGNvbnN0IGdldEJpbmRGdW5jdGlvbiA9IChtb2R1bGVJZCkgPT4gKHNlcnZpY2VJZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy5fYnVpbGRCaW5kaW5nKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGJpbmRpbmcubW9kdWxlSWQgPSBtb2R1bGVJZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kKGJpbmRpbmcpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRVbmJpbmRGdW5jdGlvbiA9ICgpID0+IChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgdGhpcy51bmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRVbmJpbmRBc3luY0Z1bmN0aW9uID0gKCkgPT4gYXN5bmMgKHNlcnZpY2VJZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdldElzYm91bmRGdW5jdGlvbiA9ICgpID0+IChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNCb3VuZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdldFJlYmluZEZ1bmN0aW9uID0gKG1vZHVsZUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5kID0gZ2V0QmluZEZ1bmN0aW9uKG1vZHVsZUlkKTtcbiAgICAgICAgICAgIHJldHVybiAoc2VydmljZUlkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0T25BY3RpdmF0aW9uRnVuY3Rpb24gPSAobW9kdWxlSWQpID0+IChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUuYWRkQWN0aXZhdGlvbihtb2R1bGVJZCwgc2VydmljZUlkZW50aWZpZXIsIG9uQWN0aXZhdGlvbik7XG4gICAgICAgICAgICB0aGlzLm9uQWN0aXZhdGlvbihzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0T25EZWFjdGl2YXRpb25GdW5jdGlvbiA9IChtb2R1bGVJZCkgPT4gKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLmFkZERlYWN0aXZhdGlvbihtb2R1bGVJZCwgc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMub25EZWFjdGl2YXRpb24oc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChtSWQpID0+ICh7XG4gICAgICAgICAgICBiaW5kRnVuY3Rpb246IGdldEJpbmRGdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgaXNib3VuZEZ1bmN0aW9uOiBnZXRJc2JvdW5kRnVuY3Rpb24oKSxcbiAgICAgICAgICAgIG9uQWN0aXZhdGlvbkZ1bmN0aW9uOiBnZXRPbkFjdGl2YXRpb25GdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgb25EZWFjdGl2YXRpb25GdW5jdGlvbjogZ2V0T25EZWFjdGl2YXRpb25GdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgcmViaW5kRnVuY3Rpb246IGdldFJlYmluZEZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICB1bmJpbmRBc3luY0Z1bmN0aW9uOiBnZXRVbmJpbmRBc3luY0Z1bmN0aW9uKCksXG4gICAgICAgICAgICB1bmJpbmRGdW5jdGlvbjogZ2V0VW5iaW5kRnVuY3Rpb24oKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9iaW5kKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuYWRkKGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdUb1N5bnRheChiaW5kaW5nKTtcbiAgICB9XG4gICAgX2J1aWxkQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBzY29wZSA9IHRoaXMub3B0aW9ucy5kZWZhdWx0U2NvcGUgfHwgQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllciwgc2NvcGUpO1xuICAgIH1cbiAgICBhc3luYyBfZ2V0QWxsKGdldEFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX2dldChnZXRBcmdzKSk7XG4gICAgfVxuICAgIF9nZXQoZ2V0QXJncykge1xuICAgICAgICBjb25zdCBwbGFuQW5kUmVzb2x2ZUFyZ3MgPSB7XG4gICAgICAgICAgICAuLi5nZXRBcmdzLFxuICAgICAgICAgICAgY29udGV4dEludGVyY2VwdG9yOiAoY29udGV4dCkgPT4gY29udGV4dCxcbiAgICAgICAgICAgIHRhcmdldFR5cGU6IFRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fbWlkZGxld2FyZSkge1xuICAgICAgICAgICAgY29uc3QgbWlkZGxld2FyZVJlc3VsdCA9IHRoaXMuX21pZGRsZXdhcmUocGxhbkFuZFJlc29sdmVBcmdzKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlUmVzdWx0ID09PSB1bmRlZmluZWQgfHwgbWlkZGxld2FyZVJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYW5BbmRSZXNvbHZlKCkocGxhbkFuZFJlc29sdmVBcmdzKTtcbiAgICB9XG4gICAgX2dldEJ1dFRocm93SWZBc3luYyhnZXRBcmdzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2dldChnZXRBcmdzKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZU9yQ29udGFpbnNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkxBWllfSU5fU1lOQyhnZXRBcmdzLnNlcnZpY2VJZGVudGlmaWVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgZ2V0QWxsQXJncyA9IHtcbiAgICAgICAgICAgIGF2b2lkQ29uc3RyYWludHM6IHRydWUsXG4gICAgICAgICAgICBpc011bHRpSW5qZWN0OiB0cnVlLFxuICAgICAgICAgICAgc2VydmljZUlkZW50aWZpZXIsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRBbGxBcmdzO1xuICAgIH1cbiAgICBfZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgaXNNdWx0aUluamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBnZXROb3RBbGxBcmdzID0ge1xuICAgICAgICAgICAgYXZvaWRDb25zdHJhaW50czogZmFsc2UsXG4gICAgICAgICAgICBpc011bHRpSW5qZWN0LFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc2VydmljZUlkZW50aWZpZXIsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldE5vdEFsbEFyZ3M7XG4gICAgfVxuICAgIF9wbGFuQW5kUmVzb2x2ZSgpIHtcbiAgICAgICAgcmV0dXJuIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29udGV4dCA9IHBsYW4odGhpcy5fbWV0YWRhdGFSZWFkZXIsIHRoaXMsIGFyZ3MuaXNNdWx0aUluamVjdCwgYXJncy50YXJnZXRUeXBlLCBhcmdzLnNlcnZpY2VJZGVudGlmaWVyLCBhcmdzLmtleSwgYXJncy52YWx1ZSwgYXJncy5hdm9pZENvbnN0cmFpbnRzKTtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhcmdzLmNvbnRleHRJbnRlcmNlcHRvcihjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmUoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBfZGVhY3RpdmF0ZUlmU2luZ2xldG9uKGJpbmRpbmcpIHtcbiAgICAgICAgaWYgKCFiaW5kaW5nLmFjdGl2YXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoYmluZGluZy5jYWNoZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLmNhY2hlLnRoZW4oKHJlc29sdmVkKSA9PiB0aGlzLl9kZWFjdGl2YXRlKGJpbmRpbmcsIHJlc29sdmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlYWN0aXZhdGUoYmluZGluZywgYmluZGluZy5jYWNoZSk7XG4gICAgfVxuICAgIF9kZWFjdGl2YXRlU2luZ2xldG9ucyhiaW5kaW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlYWN0aXZhdGVJZlNpbmdsZXRvbihiaW5kaW5nKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkFTWU5DX1VOQklORF9SRVFVSVJFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2RlYWN0aXZhdGVTaW5nbGV0b25zQXN5bmMoYmluZGluZ3MpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYmluZGluZ3MubWFwKGFzeW5jIChiKSA9PiB0aGlzLl9kZWFjdGl2YXRlSWZTaW5nbGV0b24oYikpKTtcbiAgICB9XG4gICAgX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveShiaW5kaW5nLCBpbnN0YW5jZSwgY29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVhY3RpdmF0ZS5iaW5kKHRoaXMucGFyZW50KShiaW5kaW5nLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3koYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95QXN5bmMoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVhY3RpdmF0ZS5iaW5kKHRoaXMucGFyZW50KShiaW5kaW5nLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveUFzeW5jKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlbW92ZVNlcnZpY2VGcm9tRGljdGlvbmFyeShzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkNBTk5PVF9VTkJJTkR9ICR7Z2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95KGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgICBpZiAodHlwZW9mIGJpbmRpbmcub25EZWFjdGl2YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJpbmRpbmcub25EZWFjdGl2YXRpb24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKCgpID0+IHRoaXMuX3ByZURlc3Ryb3koY29uc3RydWN0b3IsIGluc3RhbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZURlc3Ryb3koY29uc3RydWN0b3IsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgYXN5bmMgX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95QXN5bmMoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZy5vbkRlYWN0aXZhdGlvbihpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlRGVzdHJveShjb25zdHJ1Y3RvciwgaW5zdGFuY2UpO1xuICAgIH1cbn1cbmV4cG9ydCB7IENvbnRhaW5lciB9O1xuIiwiaW1wb3J0IHsgaWQgfSBmcm9tICcuLi91dGlscy9pZCc7XG5leHBvcnQgY2xhc3MgQ29udGFpbmVyTW9kdWxlIHtcbiAgICBpZDtcbiAgICByZWdpc3RyeTtcbiAgICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgICAgICB0aGlzLmlkID0gaWQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBc3luY0NvbnRhaW5lck1vZHVsZSB7XG4gICAgaWQ7XG4gICAgcmVnaXN0cnk7XG4gICAgY29uc3RydWN0b3IocmVnaXN0cnkpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBnZXRGaXJzdEFycmF5RHVwbGljYXRlIH0gZnJvbSAnLi4vdXRpbHMvanMnO1xuZnVuY3Rpb24gdGFyZ2V0SXNDb25zdHJ1Y3RvckZ1bmN0aW9uKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQucHJvdG90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKSB7XG4gICAgaWYgKHBhcmFtZXRlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRhZ1BhcmFtZXRlcihhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJJbmRleCwgbWV0YWRhdGEpIHtcbiAgICBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTtcbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VELCBhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJJbmRleC50b1N0cmluZygpLCBtZXRhZGF0YSk7XG59XG5mdW5jdGlvbiB0YWdQcm9wZXJ0eShhbm5vdGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHRhcmdldElzQ29uc3RydWN0b3JGdW5jdGlvbihhbm5vdGF0aW9uVGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGFubm90YXRpb25UYXJnZXQuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzKG1ldGFkYXRhKSB7XG4gICAgbGV0IG1ldGFkYXRhcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBtZXRhZGF0YXMgPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlID0gZ2V0Rmlyc3RBcnJheUR1cGxpY2F0ZShtZXRhZGF0YXMubWFwKChtZCkgPT4gbWQua2V5KSk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VSUk9SX01TR1MuRFVQTElDQVRFRF9NRVRBREFUQX0gJHtkdXBsaWNhdGUudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGFzID0gW21ldGFkYXRhXTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhcztcbn1cbmZ1bmN0aW9uIF90YWdQYXJhbWV0ZXJPclByb3BlcnR5KG1ldGFkYXRhS2V5LCBhbm5vdGF0aW9uVGFyZ2V0LCBrZXksIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgbWV0YWRhdGFzID0gX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzKG1ldGFkYXRhKTtcbiAgICBsZXQgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEgPSB7fTtcbiAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldCkpIHtcbiAgICAgICAgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbm5vdGF0aW9uVGFyZ2V0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhID0gcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGFba2V5XTtcbiAgICBpZiAocGFyYW1PclByb3BlcnR5TWV0YWRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YSA9IFtdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFzLnNvbWUoKG1kKSA9PiBtZC5rZXkgPT09IG0ua2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkRVUExJQ0FURURfTUVUQURBVEF9ICR7bS5rZXkudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YS5wdXNoKC4uLm1ldGFkYXRhcyk7XG4gICAgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGFba2V5XSA9IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhLCBhbm5vdGF0aW9uVGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihtZXRhZGF0YSkge1xuICAgIHJldHVybiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4T3JQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGFnUGFyYW1ldGVyKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yLCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YWdQcm9wZXJ0eSh0YXJnZXQsIHRhcmdldEtleSwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQpIHtcbiAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBfcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgICAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3IsIHRhcmdldCwgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5KSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIF9kZWNvcmF0ZShbX3BhcmFtKHBhcmFtZXRlckluZGV4T3JQcm9wZXJ0eSwgZGVjb3JhdG9yKV0sIHRhcmdldCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoW2RlY29yYXRvcl0sIHRhcmdldCwgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIF9kZWNvcmF0ZShbZGVjb3JhdG9yXSwgdGFyZ2V0KTtcbiAgICB9XG59XG5leHBvcnQgeyBkZWNvcmF0ZSwgdGFnUGFyYW1ldGVyLCB0YWdQcm9wZXJ0eSwgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBcnJheUR1cGxpY2F0ZShhcnJheSkge1xuICAgIGNvbnN0IHNlZW5WYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhcnJheSkge1xuICAgICAgICBpZiAoc2VlblZhbHVlcy5oYXMoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWVuVmFsdWVzLmFkZChlbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5mdW5jdGlvbiBpbmplY3RhYmxlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc093bk1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QQVJBTV9UWVBFUywgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SU19NU0dTLkRVUExJQ0FURURfSU5KRUNUQUJMRV9ERUNPUkFUT1IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QQVJBTV9UWVBFUywgdHlwZXMsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbmV4cG9ydCB7IGluamVjdGFibGUgfTtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gdGFnZ2VkKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihuZXcgTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpKTtcbn1cbmV4cG9ydCB7IHRhZ2dlZCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gbmFtZWQobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVUYWdnZWREZWNvcmF0b3IobmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWUpKTtcbn1cbmV4cG9ydCB7IG5hbWVkIH07XG4iLCJpbXBvcnQgeyBVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04gfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IGNyZWF0ZVRhZ2dlZERlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlKG1ldGFkYXRhS2V5KSB7XG4gICAgcmV0dXJuIChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmljZUlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04oY2xhc3NOYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVUYWdnZWREZWNvcmF0b3IobmV3IE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBzZXJ2aWNlSWRlbnRpZmllcikpKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IGluamVjdEJhc2UgfSBmcm9tICcuL2luamVjdF9iYXNlJztcbmNvbnN0IGluamVjdCA9IGluamVjdEJhc2UoTUVUQURBVEFfS0VZLklOSkVDVF9UQUcpO1xuZXhwb3J0IHsgaW5qZWN0IH07XG4iLCJpbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVUYWdnZWREZWNvcmF0b3IgfSBmcm9tICcuL2RlY29yYXRvcl91dGlscyc7XG5mdW5jdGlvbiBvcHRpb25hbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlVGFnZ2VkRGVjb3JhdG9yKG5ldyBNZXRhZGF0YShNRVRBREFUQV9LRVkuT1BUSU9OQUxfVEFHLCB0cnVlKSk7XG59XG5leHBvcnQgeyBvcHRpb25hbCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgdGFnUGFyYW1ldGVyIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gdW5tYW5hZ2VkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5VTk1BTkFHRURfVEFHLCB0cnVlKTtcbiAgICAgICAgdGFnUGFyYW1ldGVyKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCwgbWV0YWRhdGEpO1xuICAgIH07XG59XG5leHBvcnQgeyB1bm1hbmFnZWQgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBpbmplY3RCYXNlIH0gZnJvbSAnLi9pbmplY3RfYmFzZSc7XG5jb25zdCBtdWx0aUluamVjdCA9IGluamVjdEJhc2UoTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUcpO1xuZXhwb3J0IHsgbXVsdGlJbmplY3QgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IHRhZ1BhcmFtZXRlciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmZ1bmN0aW9uIHRhcmdldE5hbWUobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5OQU1FX1RBRywgbmFtZSk7XG4gICAgICAgIHRhZ1BhcmFtZXRlcih0YXJnZXQsIHRhcmdldEtleSwgaW5kZXgsIG1ldGFkYXRhKTtcbiAgICB9O1xufVxuZXhwb3J0IHsgdGFyZ2V0TmFtZSB9O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5mdW5jdGlvbiBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yKGV2ZW50S2V5LCBlcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKGV2ZW50S2V5LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShldmVudEtleSwgdGFyZ2V0LmNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShldmVudEtleSwgbWV0YWRhdGEsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCB7IHByb3BlcnR5RXZlbnREZWNvcmF0b3IgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3InO1xuY29uc3QgcG9zdENvbnN0cnVjdCA9IHByb3BlcnR5RXZlbnREZWNvcmF0b3IoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBFUlJPUlNfTVNHUy5NVUxUSVBMRV9QT1NUX0NPTlNUUlVDVF9NRVRIT0RTKTtcbmV4cG9ydCB7IHBvc3RDb25zdHJ1Y3QgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3InO1xuY29uc3QgcHJlRGVzdHJveSA9IHByb3BlcnR5RXZlbnREZWNvcmF0b3IoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBFUlJPUlNfTVNHUy5NVUxUSVBMRV9QUkVfREVTVFJPWV9NRVRIT0RTKTtcbmV4cG9ydCB7IHByZURlc3Ryb3kgfTtcbiIsImltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5pbXBvcnQgKiBhcyBrZXlzIGZyb20gJy4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuZXhwb3J0IHsgTGF6eVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnQGludmVyc2lmeWpzL2NvbW1vbic7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfS0VZID0ga2V5cztcbmV4cG9ydCB7IENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbnRhaW5lcic7XG5leHBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0sIFRhcmdldFR5cGVFbnVtLCB9IGZyb20gJy4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuZXhwb3J0IHsgQXN5bmNDb250YWluZXJNb2R1bGUsIENvbnRhaW5lck1vZHVsZSwgfSBmcm9tICcuL2NvbnRhaW5lci9jb250YWluZXJfbW9kdWxlJztcbmV4cG9ydCB7IGNyZWF0ZVRhZ2dlZERlY29yYXRvciB9IGZyb20gJy4vYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMnO1xuZXhwb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJy4vYW5ub3RhdGlvbi9pbmplY3RhYmxlJztcbmV4cG9ydCB7IHRhZ2dlZCB9IGZyb20gJy4vYW5ub3RhdGlvbi90YWdnZWQnO1xuZXhwb3J0IHsgbmFtZWQgfSBmcm9tICcuL2Fubm90YXRpb24vbmFtZWQnO1xuZXhwb3J0IHsgaW5qZWN0IH0gZnJvbSAnLi9hbm5vdGF0aW9uL2luamVjdCc7XG5leHBvcnQgeyBvcHRpb25hbCB9IGZyb20gJy4vYW5ub3RhdGlvbi9vcHRpb25hbCc7XG5leHBvcnQgeyB1bm1hbmFnZWQgfSBmcm9tICcuL2Fubm90YXRpb24vdW5tYW5hZ2VkJztcbmV4cG9ydCB7IG11bHRpSW5qZWN0IH0gZnJvbSAnLi9hbm5vdGF0aW9uL211bHRpX2luamVjdCc7XG5leHBvcnQgeyB0YXJnZXROYW1lIH0gZnJvbSAnLi9hbm5vdGF0aW9uL3RhcmdldF9uYW1lJztcbmV4cG9ydCB7IHBvc3RDb25zdHJ1Y3QgfSBmcm9tICcuL2Fubm90YXRpb24vcG9zdF9jb25zdHJ1Y3QnO1xuZXhwb3J0IHsgcHJlRGVzdHJveSB9IGZyb20gJy4vYW5ub3RhdGlvbi9wcmVfZGVzdHJveSc7XG5leHBvcnQgeyBNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4vcGxhbm5pbmcvbWV0YWRhdGFfcmVhZGVyJztcbmV4cG9ydCB7IGlkIH0gZnJvbSAnLi91dGlscy9pZCc7XG5leHBvcnQgeyBkZWNvcmF0ZSB9IGZyb20gJy4vYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMnO1xuZXhwb3J0IHsgdHJhdmVyc2VBbmNlcnN0b3JzLCB0YWdnZWRDb25zdHJhaW50LCBuYW1lZENvbnN0cmFpbnQsIHR5cGVDb25zdHJhaW50LCB9IGZyb20gJy4vc3ludGF4L2NvbnN0cmFpbnRfaGVscGVycyc7XG5leHBvcnQgeyBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nIH0gZnJvbSAnLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmV4cG9ydCB7IG11bHRpQmluZFRvU2VydmljZSB9IGZyb20gJy4vdXRpbHMvYmluZGluZ191dGlscyc7XG4iXSwibmFtZXMiOlsiUmVmbGVjdCIsInJvb3QiLCJnbG9iYWxUaGlzIiwiZyIsInNlbGYiLCJ0aGlzIiwiRnVuY3Rpb24iLCJfIiwiZnVuY3Rpb25UaGlzIiwiZXZhbCIsImluZGlyZWN0RXZhbFRoaXMiLCJleHBvcnRlciIsIm1ha2VFeHBvcnRlciIsInRhcmdldCIsInByZXZpb3VzIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaGFzT3duIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJzdXBwb3J0c1N5bWJvbCIsIlN5bWJvbCIsInRvUHJpbWl0aXZlU3ltYm9sIiwidG9QcmltaXRpdmUiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwic3VwcG9ydHNDcmVhdGUiLCJjcmVhdGUiLCJzdXBwb3J0c1Byb3RvIiwiX19wcm90b19fIiwiQXJyYXkiLCJkb3duTGV2ZWwiLCJIYXNoTWFwIiwiTWFrZURpY3Rpb25hcnkiLCJoYXMiLCJtYXAiLCJjYWxsIiwiZ2V0IiwidW5kZWZpbmVkIiwiZnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsIl9NYXAiLCJNYXAiLCJlbnRyaWVzIiwiY2FjaGVTZW50aW5lbCIsImFycmF5U2VudGluZWwiLCJNYXBJdGVyYXRvciIsImtleXMiLCJ2YWx1ZXMiLCJzZWxlY3RvciIsIl9pbmRleCIsIl9rZXlzIiwiX3ZhbHVlcyIsIl9zZWxlY3RvciIsIm5leHQiLCJpbmRleCIsImxlbmd0aCIsInJlc3VsdCIsImRvbmUiLCJ0aHJvdyIsImVycm9yIiwicmV0dXJuIiwiX2NhY2hlS2V5IiwiX2NhY2hlSW5kZXgiLCJlbnVtZXJhYmxlIiwiX2ZpbmQiLCJzZXQiLCJkZWxldGUiLCJzaXplIiwiaSIsIlNhbWVWYWx1ZVplcm8iLCJjbGVhciIsImdldEtleSIsImdldFZhbHVlIiwiZ2V0RW50cnkiLCJpbnNlcnQiLCJwdXNoIiwiQ3JlYXRlTWFwUG9seWZpbGwiLCJfU2V0IiwiU2V0IiwiX21hcCIsImFkZCIsIl9XZWFrTWFwIiwiV2Vha01hcCIsInJvb3RLZXkiLCJDcmVhdGVVbmlxdWVLZXkiLCJfa2V5IiwidGFibGUiLCJHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSIsIkNyZWF0ZVVVSUQiLCJGaWxsUmFuZG9tQnl0ZXMiLCJidWZmZXIiLCJNYXRoIiwicmFuZG9tIiwiZGF0YSIsIlVpbnQ4QXJyYXkiLCJhcnJheSIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsIm1zQ3J5cHRvIiwiR2VuUmFuZG9tQnl0ZXMiLCJvZmZzZXQiLCJieXRlIiwidG9TdHJpbmciLCJ0b0xvd2VyQ2FzZSIsIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsInJlZ2lzdHJ5U3ltYm9sIiwiZm9yIiwibWV0YWRhdGFSZWdpc3RyeSIsIklzVW5kZWZpbmVkIiwiSXNPYmplY3QiLCJpc0V4dGVuc2libGUiLCJmYWxsYmFjayIsImZpcnN0Iiwic2Vjb25kIiwicmVzdCIsImRlZmluZU1ldGFkYXRhIiwicmVmbGVjdCIsImhhc093bk1ldGFkYXRhIiwiZ2V0T3duTWV0YWRhdGEiLCJnZXRPd25NZXRhZGF0YUtleXMiLCJkZWxldGVNZXRhZGF0YSIsIm1ldGFkYXRhT3duZXIiLCJpc1Byb3ZpZGVyRm9yIiwiTyIsIlAiLCJtZXRhZGF0YVByb3BlcnR5U2V0IiwiT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSIsIk9yZGluYXJ5SGFzT3duTWV0YWRhdGEiLCJPcmRpbmFyeUdldE93bk1ldGFkYXRhIiwiT3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCJPcmRpbmFyeURlbGV0ZU1ldGFkYXRhIiwiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsInRhcmdldFByb3ZpZGVyTWFwIiwicmVnaXN0cnkiLCJyZWdpc3RlclByb3ZpZGVyIiwiZ2V0UHJvdmlkZXIiLCJzZXRQcm92aWRlciIsInByb3ZpZGVyIiwiRXJyb3IiLCJnZXRQcm92aWRlck5vQ2FjaGUiLCJHZXRJdGVyYXRvciIsIkl0ZXJhdG9yU3RlcCIsIkl0ZXJhdG9yVmFsdWUiLCJJdGVyYXRvckNsb3NlIiwicHJvdmlkZXJNYXAiLCJoYXNQcm92aWRlciIsIlR5cGVFcnJvciIsImV4aXN0aW5nUHJvdmlkZXIiLCJDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwiR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwibWV0YWRhdGFQcm92aWRlciIsIm1ldGFkYXRhIiwidGFyZ2V0TWV0YWRhdGEiLCJNZXRhZGF0YUtleSIsIk1ldGFkYXRhVmFsdWUiLCJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwibWV0YWRhdGFNYXAiLCJUb0Jvb2xlYW4iLCJrIiwibmV4dFZhbHVlIiwiZSIsIkNyZWF0ZSIsImNyZWF0ZWRUYXJnZXRNZXRhZGF0YSIsIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCJPcmRpbmFyeUhhc01ldGFkYXRhIiwicGFyZW50IiwiT3JkaW5hcnlHZXRQcm90b3R5cGVPZiIsIklzTnVsbCIsIkdldE1ldGFkYXRhUHJvdmlkZXIiLCJPcmRpbmFyeUdldE1ldGFkYXRhIiwiT3JkaW5hcnlNZXRhZGF0YUtleXMiLCJvd25LZXlzIiwicGFyZW50S2V5cyIsIl9pIiwib3duS2V5c18xIiwiX2EiLCJwYXJlbnRLZXlzXzEiLCJUeXBlIiwieCIsIlRvUHJpbWl0aXZlIiwiaW5wdXQiLCJQcmVmZXJyZWRUeXBlIiwiaGludCIsImV4b3RpY1RvUHJpbSIsIkdldE1ldGhvZCIsInRvU3RyaW5nXzEiLCJJc0NhbGxhYmxlIiwidmFsdWVPZiIsInRvU3RyaW5nXzIiLCJPcmRpbmFyeVRvUHJpbWl0aXZlIiwiYXJndW1lbnQiLCJUb1Byb3BlcnR5S2V5IiwiVG9TdHJpbmciLCJJc0FycmF5IiwiaXNBcnJheSIsIklzQ29uc3RydWN0b3IiLCJ5IiwiViIsImZ1bmMiLCJvYmoiLCJtZXRob2QiLCJpdGVyUmVzdWx0IiwiZiIsInByb3RvIiwicHJvdG90eXBlUHJvdG8iLCJjb25zdHJ1Y3RvciIsInJlZ2lzdGVyZWRQcm92aWRlciIsIl9fIiwiZGVjb3JhdG9ycyIsInByb3BlcnR5S2V5IiwiYXR0cmlidXRlcyIsImRlY29yYXRlZCIsImRlY29yYXRvciIsIkRlY29yYXRlQ29uc3RydWN0b3IiLCJkZXNjcmlwdG9yIiwiRGVjb3JhdGVQcm9wZXJ0eSIsIm1ldGFkYXRhS2V5IiwibWV0YWRhdGFWYWx1ZSIsIklzUHJvcGVydHlLZXkiLCJmYWN0b3J5IiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJ3aW5kb3ciLCJwcm9wIiwiciIsInRvU3RyaW5nVGFnIiwiTkFNRURfVEFHIiwiTkFNRV9UQUciLCJVTk1BTkFHRURfVEFHIiwiT1BUSU9OQUxfVEFHIiwiSU5KRUNUX1RBRyIsIk1VTFRJX0lOSkVDVF9UQUciLCJUQUdHRUQiLCJUQUdHRURfUFJPUCIsIlBBUkFNX1RZUEVTIiwiREVTSUdOX1BBUkFNX1RZUEVTIiwiUE9TVF9DT05TVFJVQ1QiLCJQUkVfREVTVFJPWSIsIk5PTl9DVVNUT01fVEFHX0tFWVMiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb21tb25fMDgxZDhjMDdfXyIsIkJpbmRpbmdTY29wZUVudW0iLCJSZXF1ZXN0IiwiU2luZ2xldG9uIiwiVHJhbnNpZW50IiwiQmluZGluZ1R5cGVFbnVtIiwiQ29uc3RhbnRWYWx1ZSIsIkNvbnN0cnVjdG9yIiwiRHluYW1pY1ZhbHVlIiwiRmFjdG9yeSIsIkluc3RhbmNlIiwiSW52YWxpZCIsIlByb3ZpZGVyIiwiVGFyZ2V0VHlwZUVudW0iLCJDbGFzc1Byb3BlcnR5IiwiQ29uc3RydWN0b3JBcmd1bWVudCIsIlZhcmlhYmxlIiwiaWRDb3VudGVyIiwiaWQiLCJCaW5kaW5nIiwiYWN0aXZhdGVkIiwic2VydmljZUlkZW50aWZpZXIiLCJpbXBsZW1lbnRhdGlvblR5cGUiLCJjYWNoZSIsImR5bmFtaWNWYWx1ZSIsInNjb3BlIiwidHlwZSIsImNvbnN0cmFpbnQiLCJvbkFjdGl2YXRpb24iLCJvbkRlYWN0aXZhdGlvbiIsIl9yZXF1ZXN0IiwiY2xvbmUiLCJEVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SIiwiRFVQTElDQVRFRF9NRVRBREFUQSIsIk5VTExfQVJHVU1FTlQiLCJLRVlfTk9UX0ZPVU5EIiwiSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OIiwiT05fREVBQ1RJVkFUSU9OX0VSUk9SIiwiY2xhenoiLCJlcnJvck1lc3NhZ2UiLCJNZXRhZGF0YVJlYWRlciIsImdldENvbnN0cnVjdG9yTWV0YWRhdGEiLCJjb25zdHJ1Y3RvckZ1bmMiLCJjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJ1c2VyR2VuZXJhdGVkTWV0YWRhdGEiLCJnZXRQcm9wZXJ0aWVzTWV0YWRhdGEiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18iLCJCaW5kaW5nQ291bnQiLCJpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24iLCJSYW5nZUVycm9yIiwibWVzc2FnZSIsImdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmciLCJuYW1lIiwibGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyIiwiY29udGFpbmVyIiwiZ2V0QmluZGluZ3MiLCJyZWdpc3RlcmVkQmluZGluZ3NMaXN0IiwicmVnaXN0ZXJlZEJpbmRpbmdzIiwiZm9yRWFjaCIsImJpbmRpbmciLCJnZXRGdW5jdGlvbk5hbWUiLCJtZXRhRGF0YSIsImFscmVhZHlEZXBlbmRlbmN5Q2hhaW4iLCJyZXF1ZXN0IiwicGFyZW50UmVxdWVzdCIsImNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uIiwiY2hpbGRSZXF1ZXN0cyIsImNoaWxkUmVxdWVzdCIsInNlcnZpY2VzIiwiX2NyZWF0ZVN0cmluZ0FyciIsInJlcSIsInJldmVyc2UiLCJqb2luIiwiZGVwZW5kZW5jeUNoYWluVG9TdHJpbmciLCJtYXRjaCIsInN0cmluZ2lmeU1ldGFkYXRhIiwiQ29udGV4dCIsInBsYW4iLCJjdXJyZW50UmVxdWVzdCIsImFkZFBsYW4iLCJzZXRDdXJyZW50UmVxdWVzdCIsIk1ldGFkYXRhIiwiU3RyaW5nIiwiUGxhbiIsInBhcmVudENvbnRleHQiLCJyb290UmVxdWVzdCIsImdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCIsIm1ldGFkYXRhUmVhZGVyIiwiYmFzZUNvbnN0cnVjdG9yIiwidGFyZ2V0cyIsImdldFRhcmdldHMiLCJ0IiwiZmlsdGVyIiwibSIsInVubWFuYWdlZENvdW50IiwiY29uY2F0IiwiYXBwbHkiLCJkZXBlbmRlbmN5Q291bnQiLCJiaW5kaW5ncyIsInJlcXVlc3RTY29wZSIsImFkZENoaWxkUmVxdWVzdCIsImNoaWxkIiwiZ2V0QmluZGluZ0RpY3Rpb25hcnkiLCJjbnRuciIsIl9iaW5kaW5nRGljdGlvbmFyeSIsIl9nZXRBY3RpdmVCaW5kaW5ncyIsImF2b2lkQ29uc3RyYWludHMiLCJjb250ZXh0IiwiYWN0aXZlQmluZGluZ3MiLCJOb0JpbmRpbmdzQXZhaWxhYmxlIiwib3B0aW9ucyIsImF1dG9CaW5kSW5qZWN0YWJsZSIsImJpbmQiLCJ0b1NlbGYiLCJpc09wdGlvbmFsIiwic2VydmljZUlkZW50aWZpZXJTdHJpbmciLCJtc2ciLCJpc1RhZ2dlZCIsImlzTmFtZWQiLCJuYW1lZFRhZyIsImdldE5hbWVkVGFnIiwib3RoZXJUYWdzIiwiZ2V0Q3VzdG9tVGFncyIsInRhZyIsImxpc3RNZXRhZGF0YUZvclRhcmdldCIsIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlIiwiTXVsdGlwbGVCaW5kaW5nc0F2YWlsYWJsZSIsIl92YWxpZGF0ZUFjdGl2ZUJpbmRpbmdDb3VudCIsIl9nZXRUYXJnZXRNZXRhZGF0YSIsImlzTXVsdGlJbmplY3QiLCJtZXRhZGF0YUxpc3QiLCJfY3JlYXRlU3ViUmVxdWVzdHMiLCJ0aGVQbGFuIiwic3ViQ2hpbGRSZXF1ZXN0IiwiZGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwic2tpcEJhc2VDbGFzc0NoZWNrcyIsImJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCIsImRlcGVuZGVuY3kiLCJiaW5kaW5nRGljdGlvbmFyeSIsImhhc0tleSIsImlzUHJvbWlzZSIsIm9iamVjdCIsInRoZW4iLCJpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSIsInNvbWUiLCJfc2F2ZUFzeW5jUmVzdWx0VG9TaW5nbGV0b25TY29wZSIsImFzeW5jIiwiYXN5bmNSZXN1bHQiLCJleCIsIkZhY3RvcnlUeXBlIiwibXVsdGlCaW5kVG9TZXJ2aWNlIiwic2VydmljZSIsInR5cGVzIiwidG9TZXJ2aWNlIiwiY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9ucyIsImFyZ3MiLCJpbnN0YW5jZSIsImNvbnN0ciIsImNvbnN0cnVjdG9ySW5qZWN0aW9ucyIsInByb3BlcnR5UmVxdWVzdHMiLCJwcm9wZXJ0eSIsImlkZW50aWZpZXIiLCJpbmplY3Rpb24iLCJwcm9wZXJ0eUluamVjdGlvbnMiLCJwb3NzaWJseVdhaXRJbmplY3Rpb25zIiwicG9zc2libGVQcm9taXNlaW5qZWN0aW9ucyIsImluamVjdGlvbnMiLCJQcm9taXNlIiwiYWxsIiwiX2dldEluc3RhbmNlQWZ0ZXJQb3N0Q29uc3RydWN0IiwicG9zdENvbnN0cnVjdFJlc3VsdCIsImhhc01ldGFkYXRhIiwiX3Bvc3RDb25zdHJ1Y3QiLCJfcmVzb2x2ZVJlcXVlc3QiLCJ0YXJnZXRJc0FuQXJyYXkiLCJ0YXJnZXRQYXJlbnRJc05vdEFuQXJyYXkiLCJtYXRjaGVzQXJyYXkiLCJyZXNvbHZlUmVxdWVzdCIsIl9yZXNvbHZlQmluZGluZyIsIl9yZXNvbHZlRmFjdG9yeUZyb21CaW5kaW5nIiwiZmFjdG9yeURldGFpbHMiLCJmYWN0b3J5VHlwZSIsImdldEZhY3RvcnlEZXRhaWxzIiwidHJ5QW5kVGhyb3dFcnJvcklmU3RhY2tPdmVyZmxvdyIsIl9nZXRSZXNvbHZlZEZyb21CaW5kaW5nIiwiYm91bmRWYWx1ZSIsInNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmciLCJlbnN1cmVGdWxseUJvdW5kIiwic2NvcGVFcnJvck1lc3NhZ2UiLCJfdGhyb3dJZkhhbmRsaW5nRGVhY3RpdmF0aW9uIiwiX3ZhbGlkYXRlSW5zdGFuY2VSZXNvbHV0aW9uIiwicmVzb2x2ZWQiLCJyZWR1Y2UiLCJyZXNvbHZlZFJlcXVlc3RzIiwiaXNBc3luYyIsIl9yZXNvbHZlUmVxdWVzdHMiLCJjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXJnIiwiY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FzeW5jIiwiX2NyZWF0ZUluc3RhbmNlIiwicmVzb2x2ZWRSZXN1bHQiLCJyZXNvbHZlSW5zdGFuY2UiLCJfcmVzb2x2ZUluU2NvcGUiLCJyZXNvbHZlRnJvbUJpbmRpbmciLCJ0cnlHZXRGcm9tU2NvcGUiLCJfc2F2ZVRvU2luZ2xldG9uU2NvcGUiLCJfc2F2ZVRvUmVxdWVzdFNjb3BlIiwic2F2ZVRvU2NvcGUiLCJfb25BY3RpdmF0aW9uIiwiX2JpbmRpbmdBY3RpdmF0aW9uIiwiY29udGFpbmVyc0l0ZXJhdG9yIiwiX2dldENvbnRhaW5lcnNJdGVyYXRvciIsImNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCIsImFjdGl2YXRpb25zSXRlcmF0b3IiLCJfZ2V0Q29udGFpbmVyQWN0aXZhdGlvbnNGb3JTZXJ2aWNlIiwiX2FjdGl2YXRlQ29udGFpbmVyQXN5bmMiLCJfYWN0aXZhdGVDb250YWluZXIiLCJwcmV2aW91c1Jlc3VsdCIsImFjdGl2YXRpb24iLCJyZXN1bHRQcm9taXNlIiwiYWN0aXZhdGlvbnMiLCJfYWN0aXZhdGlvbnMiLCJjb250YWluZXJzU3RhY2siLCJuZXh0Q29udGFpbmVyIiwicG9wIiwidHJhdmVyc2VBbmNlcnN0b3JzIiwidGFnZ2VkQ29uc3RyYWludCIsIm1hdGNoZXNUYWciLCJuYW1lZENvbnN0cmFpbnQiLCJ0eXBlQ29uc3RyYWludCIsIkJpbmRpbmdXaGVuU3ludGF4IiwiX2JpbmRpbmciLCJ3aGVuIiwiQmluZGluZ09uU3ludGF4Iiwid2hlblRhcmdldE5hbWVkIiwid2hlblRhcmdldElzRGVmYXVsdCIsIndoZW5UYXJnZXRUYWdnZWQiLCJ3aGVuSW5qZWN0ZWRJbnRvIiwid2hlblBhcmVudE5hbWVkIiwid2hlblBhcmVudFRhZ2dlZCIsIndoZW5BbnlBbmNlc3RvcklzIiwiYW5jZXN0b3IiLCJ3aGVuTm9BbmNlc3RvcklzIiwid2hlbkFueUFuY2VzdG9yTmFtZWQiLCJ3aGVuTm9BbmNlc3Rvck5hbWVkIiwid2hlbkFueUFuY2VzdG9yVGFnZ2VkIiwid2hlbk5vQW5jZXN0b3JUYWdnZWQiLCJ3aGVuQW55QW5jZXN0b3JNYXRjaGVzIiwid2hlbk5vQW5jZXN0b3JNYXRjaGVzIiwiaGFuZGxlciIsIkJpbmRpbmdXaGVuT25TeW50YXgiLCJfYmluZGluZ1doZW5TeW50YXgiLCJfYmluZGluZ09uU3ludGF4IiwiQmluZGluZ0luU3ludGF4IiwiaW5SZXF1ZXN0U2NvcGUiLCJpblNpbmdsZXRvblNjb3BlIiwiaW5UcmFuc2llbnRTY29wZSIsIkJpbmRpbmdJbldoZW5PblN5bnRheCIsIl9iaW5kaW5nSW5TeW50YXgiLCJCaW5kaW5nVG9TeW50YXgiLCJ0byIsInRvQ29uc3RhbnRWYWx1ZSIsInRvRHluYW1pY1ZhbHVlIiwidG9Db25zdHJ1Y3RvciIsInRvRmFjdG9yeSIsInRvRnVuY3Rpb24iLCJiaW5kaW5nV2hlbk9uU3ludGF4IiwidG9BdXRvRmFjdG9yeSIsInRvQXV0b05hbWVkRmFjdG9yeSIsIm5hbWVkIiwiZ2V0TmFtZWQiLCJ0b1Byb3ZpZGVyIiwiX3ZhbHVlIiwiX2Vycm9yIiwiZ2V0QXN5bmMiLCJDb250YWluZXJTbmFwc2hvdCIsImRlYWN0aXZhdGlvbnMiLCJtaWRkbGV3YXJlIiwibW9kdWxlQWN0aXZhdGlvblN0b3JlIiwib2YiLCJzbmFwc2hvdCIsIkxvb2t1cCIsImdldE1hcCIsIl9jaGVja05vbk51bGlzaCIsImVudHJ5IiwicmVtb3ZlIiwicmVtb3ZlSW50ZXJzZWN0aW9uIiwibG9va3VwIiwidHJhdmVyc2UiLCJsb29rdXBBY3RpdmF0aW9ucyIsImZpbHRlcmVkVmFsdWVzIiwibG9va3VwVmFsdWUiLCJtb2R1bGVBY3RpdmF0aW9uIiwiX3NldFZhbHVlIiwicmVtb3ZlQnlDb25kaXRpb24iLCJjb25kaXRpb24iLCJyZW1vdmFscyIsInVwZGF0ZWRFbnRyaWVzIiwiY29weSIsImIiLCJNb2R1bGVBY3RpdmF0aW9uU3RvcmUiLCJoYW5kbGVycyIsIl9nZXRFbXB0eUhhbmRsZXJzU3RvcmUiLCJhZGREZWFjdGl2YXRpb24iLCJfZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzIiwib25EZWFjdGl2YXRpb25zIiwiYWRkQWN0aXZhdGlvbiIsIm9uQWN0aXZhdGlvbnMiLCJoYW5kbGVyc1N0b3JlIiwibW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzIiwiQ29udGFpbmVyIiwiX21pZGRsZXdhcmUiLCJfZGVhY3RpdmF0aW9ucyIsIl9zbmFwc2hvdHMiLCJfbWV0YWRhdGFSZWFkZXIiLCJfbW9kdWxlQWN0aXZhdGlvblN0b3JlIiwiY29udGFpbmVyT3B0aW9ucyIsImRlZmF1bHRTY29wZSIsIm1lcmdlIiwiY29udGFpbmVyMSIsImNvbnRhaW5lcjIiLCJjb250YWluZXJzIiwidGFyZ2V0Q29udGFpbmVycyIsInRhcmdldENvbnRhaW5lciIsInRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5IiwiZGVzdGluYXRpb24iLCJsb2FkIiwibW9kdWxlcyIsImdldEhlbHBlcnMiLCJfZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkiLCJjdXJyZW50TW9kdWxlIiwiY29udGFpbmVyTW9kdWxlSGVscGVycyIsImJpbmRGdW5jdGlvbiIsInVuYmluZEZ1bmN0aW9uIiwiaXNib3VuZEZ1bmN0aW9uIiwicmViaW5kRnVuY3Rpb24iLCJ1bmJpbmRBc3luY0Z1bmN0aW9uIiwib25BY3RpdmF0aW9uRnVuY3Rpb24iLCJvbkRlYWN0aXZhdGlvbkZ1bmN0aW9uIiwibG9hZEFzeW5jIiwidW5sb2FkIiwiX3JlbW92ZU1vZHVsZUJpbmRpbmdzIiwiX2RlYWN0aXZhdGVTaW5nbGV0b25zIiwiX3JlbW92ZU1vZHVsZUhhbmRsZXJzIiwidW5sb2FkQXN5bmMiLCJfZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyIsIl9iaW5kIiwiX2J1aWxkQmluZGluZyIsInJlYmluZCIsInVuYmluZCIsInJlYmluZEFzeW5jIiwidW5iaW5kQXN5bmMiLCJfcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5IiwidW5iaW5kQWxsIiwidW5iaW5kQWxsQXN5bmMiLCJwcm9taXNlcyIsImlzQm91bmQiLCJib3VuZCIsImlzQ3VycmVudEJvdW5kIiwiaXNCb3VuZE5hbWVkIiwiaXNCb3VuZFRhZ2dlZCIsImNsYXNzRWxlbWVudE1ldGFkYXRhIiwiZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEiLCJraW5kIiwiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwidW5tYW5hZ2VkIiwiY3JlYXRlTW9ja1JlcXVlc3QiLCJyZXN0b3JlIiwiY3JlYXRlQ2hpbGQiLCJhcHBseU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlcyIsImluaXRpYWwiLCJfcGxhbkFuZFJlc29sdmUiLCJwcmV2IiwiY3VyciIsImFwcGx5Q3VzdG9tTWV0YWRhdGFSZWFkZXIiLCJnZXRBcmdzIiwiX2dldE5vdEFsbEFyZ3MiLCJfZ2V0QnV0VGhyb3dJZkFzeW5jIiwiX2dldCIsImdldFRhZ2dlZCIsImdldFRhZ2dlZEFzeW5jIiwiZ2V0TmFtZWRBc3luYyIsImdldEFsbCIsIl9nZXRBbGxBcmdzIiwiZ2V0QWxsQXN5bmMiLCJfZ2V0QWxsIiwiZ2V0QWxsVGFnZ2VkIiwiZ2V0QWxsVGFnZ2VkQXN5bmMiLCJnZXRBbGxOYW1lZCIsImdldEFsbE5hbWVkQXN5bmMiLCJyZXNvbHZlIiwiY29uc3RydWN0b3JGdW5jdGlvbiIsIl9wcmVEZXN0cm95IiwibW9kdWxlQWN0aXZhdGlvbnNIYW5kbGVycyIsIl9kZWFjdGl2YXRlIiwiX2RlYWN0aXZhdGVDb250YWluZXIiLCJfaGFuZGxlRGVhY3RpdmF0aW9uRXJyb3IiLCJfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95QXN5bmMiLCJwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQiLCJfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95IiwiZGVhY3RpdmF0aW9uc0l0ZXJhdG9yIiwiZGVhY3RpdmF0aW9uIiwiX2RlYWN0aXZhdGVDb250YWluZXJBc3luYyIsImdldEJpbmRGdW5jdGlvbiIsImdldFVuYmluZEZ1bmN0aW9uIiwiZ2V0VW5iaW5kQXN5bmNGdW5jdGlvbiIsImdldElzYm91bmRGdW5jdGlvbiIsImdldFJlYmluZEZ1bmN0aW9uIiwiZ2V0T25BY3RpdmF0aW9uRnVuY3Rpb24iLCJnZXRPbkRlYWN0aXZhdGlvbkZ1bmN0aW9uIiwibUlkIiwicGxhbkFuZFJlc29sdmVBcmdzIiwiY29udGV4dEludGVyY2VwdG9yIiwidGFyZ2V0VHlwZSIsIm1pZGRsZXdhcmVSZXN1bHQiLCJfY3JlYXRlVGFyZ2V0IiwicmVzb2x2ZVJlcXVlc3RGdW5jdGlvbiIsIl9kZWFjdGl2YXRlSWZTaW5nbGV0b24iLCJfYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3kiLCJfYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3lBc3luYyIsIl9lIiwiQ29udGFpbmVyTW9kdWxlIiwiQXN5bmNDb250YWluZXJNb2R1bGUiLCJ0YWdQYXJhbWV0ZXIiLCJhbm5vdGF0aW9uVGFyZ2V0IiwicGFyYW1ldGVyTmFtZSIsInBhcmFtZXRlckluZGV4IiwiX3Rocm93SWZNZXRob2RQYXJhbWV0ZXIiLCJfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eSIsIm1ldGFkYXRhcyIsImR1cGxpY2F0ZSIsInNlZW5WYWx1ZXMiLCJnZXRGaXJzdEFycmF5RHVwbGljYXRlIiwibWQiLCJfZW5zdXJlTm9NZXRhZGF0YUtleUR1cGxpY2F0ZXMiLCJwYXJhbXNPclByb3BlcnRpZXNNZXRhZGF0YSIsInBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhIiwiY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIiwidGFyZ2V0S2V5IiwiaW5kZXhPclByb3BlcnR5RGVzY3JpcHRvciIsInByb3BlcnR5TmFtZSIsInRhZ1Byb3BlcnR5IiwiX2RlY29yYXRlIiwiZGVjb3JhdGUiLCJfcGFyYW0iLCJwYXJhbUluZGV4IiwicGFyYW1ldGVySW5kZXhPclByb3BlcnR5IiwiaW5qZWN0YWJsZSIsInRhZ2dlZCIsImluamVjdEJhc2UiLCJjbGFzc05hbWUiLCJpbmplY3QiLCJvcHRpb25hbCIsIm11bHRpSW5qZWN0IiwidGFyZ2V0TmFtZSIsInByb3BlcnR5RXZlbnREZWNvcmF0b3IiLCJldmVudEtleSIsInBvc3RDb25zdHJ1Y3QiLCJwcmVEZXN0cm95IiwiTUVUQURBVEFfS0VZIl0sInNvdXJjZVJvb3QiOiIifQ==
|