@regle/core 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +46 -21
- package/dist/index.js +1642 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1 +1,1642 @@
|
|
|
1
|
-
import {unref,isRef,toRef,computed,ref,toRaw,reactive,shallowRef,onScopeDispose,triggerRef,watch,effectScope,toRefs}from'vue';function F(e){return e.map(t=>t instanceof Function?t():unref(t))}function Ie(e){return e.map(t=>t instanceof Function||isRef(t)?t:toRef(()=>t))}function Ce(e){let t=e.toString();return (t.includes("=>")?t.split("=>")[0]:t).slice(t.indexOf("(")+1,t.indexOf(")")).split(",").map(i=>i.trim()).filter(i=>i.includes("=")).length+e.length}function se(e,...t){let{message:r,validator:n,active:a,...i}=e,$=n.constructor.name==="AsyncFunction";return {...{validator(v,...l){return e.validator(v,...F(l.length?l:t))},message(v,l){return typeof e.message=="function"?e.message(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.message},active(v,l){return typeof e.active=="function"?e.active(v,{...l,$params:F(l.$params?.length?l.$params:t)}):e.active??!0},exec(v){let l=e.validator(v,...F(t)),o;return l instanceof Promise?l.then(C=>(o=C,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)):(o=l,typeof o=="object"&&"$valid"in o?o.$valid:typeof o=="boolean"?o:!1)}},...i,_validator:e.validator,_message:e.message,_active:e.active,_type:e.type,_patched:!1,_async:$,_params:Ie(t)}}function ue(e){if(typeof e.validator=="function"){let r=se(e,...[]),n=e.validator.constructor.name==="AsyncFunction";if(Ce(e.validator)>1){let a=function(...i){return se(e,...i)};return a.validator=r.validator,a.message=r.message,a.active=r.active,a.type=r.type,a.exec=r.exec,a._validator=r.validator,a._message=r.message,a._active=r.active,a._type=e.type,a._patched=!1,a._async=n,a}else return r}throw new Error("Validator must be a function")}function k(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function De(e){return k(e.value)}function B(e){let t=e,r={}.toString.call(e).slice(8,-1);if(r=="Set"&&(t=new Set([...e].map(n=>B(n)))),r=="Map"&&(t=new Map([...e].map(n=>[B(n[0]),B(n[1])]))),r=="Date"&&(t=new Date(e.getTime())),r=="RegExp"&&(t=RegExp(e.source,Ze(e))),r=="Array"||r=="Object"){t=Array.isArray(e)?[]:{};for(let n in e)t[n]=B(e[n]);}return t}function Ze(e){if(typeof e.source.flags=="string")return e.source.flags;{let t=[];return e.global&&t.push("g"),e.ignoreCase&&t.push("i"),e.multiline&&t.push("m"),e.sticky&&t.push("y"),e.unicode&&t.push("u"),t.join("")}}function ce(e,t,r){return e instanceof Function?e(t,r??0):e}function ee(e){return e==null?!0:e===!1?!1:e instanceof Date?isNaN(e.getTime()):Array.isArray(e)?e.length===0:typeof e=="object"&&e!=null?Object.keys(e).length===0:typeof e=="string"?!String(e.trim()).length:!1}function fe(e,t,r){let n,a=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},t);});return a.cancel=()=>{clearTimeout(n),n=void 0;},a.doImmediately=(...i)=>new Promise($=>{clearTimeout(n),n=setTimeout(()=>{n=void 0,Promise.resolve(e.apply(this,[...i])).then($);},0);}),a}function Re(){let e=shallowRef(new Map),t=shallowRef(new Map),r=shallowRef(new Map),n=shallowRef(new Map),a=shallowRef(new Map),i=shallowRef(new Map);function $(p){let R=t.value.get(p);if(R)return R;{let u=ref({});return t.value.set(p,u),u}}function x(p){let R=r.value.get(p);if(R)return R;{let u=ref([]);return r.value.set(p,u),u}}function D(p,R,u){i.value.set(`${p}-${R}`,u);}function v(p,R){return i.value.get(`${p}-${R}`)}function l(p,R){p&&R!=null&&i.value.delete(`${p}-${R}`);}function o(p,R){n.value.set(p,R);}function C(p){return n.value.get(p)??!1}function b(p,R){e.value.set(p,R);}function g(p,R){let u=e.value.get(p);return u?s(R,u)?{valid:!0}:{valid:!1}:void 0}function s(p,R){let u=Object.keys(R),I=Object.keys(p);return I.length!==u.length||!I.every(y=>u.includes(y))?!1:I.every(y=>{let d=p[y],c=R[y];return !c||!d||typeof d=="function"||typeof c=="function"||typeof d=="number"||typeof d=="boolean"?!1:d._params?d._params?.every((f,h)=>{if(typeof c=="number"||typeof c=="boolean")return !0;{let m=F(c._params),P=F(d._params);return m?.[h]===P?.[h]}}):!0})}function A(p){let R=a.value.get(p);if(R)return R;{let u=ref(!1),I=ref(!0),E=ref({}),y=ref(!1);return a.value.set(p,{$pending:u,$valid:I,$metadata:E,$validating:y}),{$pending:u,$valid:I,$metadata:E,$validating:y}}}return onScopeDispose(()=>{e.value.clear(),t.value.clear(),r.value.clear(),n.value.clear(),a.value.clear(),i.value.clear();}),{addRuleDeclEntry:b,setDirtyEntry:o,checkRuleDeclEntry:g,getDirtyState:C,trySetRuleStatusRef:A,getFieldsEntry:$,getCollectionsEntry:x,getArrayStatus:v,addArrayStatus:D,deleteArrayStatus:l,arrayStatusStorage:i}}function Pe(e,t){return k(e.value)&&k(t.value)&&!Object.entries(t.value).some(r=>pe(r))}function we(e){return !!e.value&&"$each"in e.value}function Oe(e){return !!e.value&&k(e.value)}function pe(e){return k(e)&&"_validator"in e}function X(e){return typeof e.value!="function"}function de(e){return k(e)&&"$fields"in e}function me(e){return !!e&&"$each"in e}function ge(e){return !!e&&"$rules"in e}function $e(e){return "$each"in e||"$errors"in e}function G({field:e,silent:t=!1}){return Object.entries(e.$rules??{}).map(([r,n])=>t||!n.$valid&&e.$dirty?n.$message:null).filter(r=>!!r).reduce((r,n)=>typeof n=="string"?r?.concat([n]):r?.concat(n),[]).concat(e.$externalErrors??[])}function Ae(e,t=!1){return de(e)?q(e.$fields):me(e)?{$errors:e.$field.$rules?G({field:e.$field,silent:t}):[],$each:e.$each.map(r=>Ae(r,t))}:ge(e)?e.$error?G({field:e,silent:t}):e.$externalErrors??[]:[]}function te(e,t=!1){return e.map(r=>Ae(r,t))}function q(e,t=!1){return Object.fromEntries(Object.entries(e).map(([r,n])=>de(n)?[r,q(n.$fields,t)]:me(n)?[r,{$errors:G({field:n.$field,silent:t}),$each:te(n.$each,t)}]:ge(n)?n.$error?[r,G({field:n,silent:t})]:[r,n.$externalErrors??[]]:[r,[]]))}function Me(e){return computed(()=>q(e.$fields))}var re=(r=>(r.Inline="__inline",r.Async="__async",r))(re||{});function je(e,t){return computed(()=>e.value.some(r=>r[t]))}function Ve(e,t){return computed(()=>e.value.reduce((r,n)=>{let a=n[t]||[];return r.concat(a)},[]))}function tt(){return Math.floor(Math.random()*Date.now()).toString()}function ve(){return typeof window>"u"?tt():window.crypto.getRandomValues(new Uint32Array(1))[0].toString(10)}function ke({$dirty:e,customMessages:t,rule:r,ruleKey:n,state:a,path:i,storage:$}){let x=effectScope(),D,v,{$pending:l,$valid:o,$metadata:C,$validating:b}=$.trySetRuleStatusRef(`${i}.${n}`);function g(){D=x.run(()=>{let R=computed(()=>({$invalid:!o.value,$params:d.value,...C.value})),u=computed(()=>X(r)?typeof r.value.active=="function"?r.value.active(a.value,R.value):r.value.active:!0),I=computed(()=>{let f="",h=t?t[n]?.message:void 0;return h&&(typeof h=="function"?f=h(a.value,R.value):f=h),X(r)&&(h&&!r.value._patched||(typeof r.value.message=="function"?f=r.value.message(a.value,R.value):f=r.value.message)),ee(f)&&(f="Error",console.warn(`No error message defined for ${i}.${n}`)),f}),E=computed(()=>X(r)&&r.value.type?Object.values(re).includes(r.value.type)?n:r.value.type:n),y=computed(()=>X(r)?r.value.validator:r.value),d=computed(()=>typeof r.value=="function"?[]:F(r.value._params??[])),c=computed(()=>`${i}.${E.value}`);return {$active:u,$message:I,$type:E,$validator:y,$params:d,$path:c}}),v=watch(D.$params,s,{deep:!0});}g();async function s(){b.value=!0;let R=D.$validator.value,u=!1,I=R(a.value,...D.$params.value);if(I instanceof Promise)try{o.value=!0,e.value&&(l.value=!0);let E=await I;if(typeof E=="boolean")u=E;else {let{$valid:y,...d}=E;u=y,C.value=d;}}catch{u=!1;}finally{l.value=!1;}else if(I!=null)if(typeof I=="boolean")u=I;else {let{$valid:E,...y}=I;u=E,C.value=y;}return o.value=u,b.value=!1,console.log(n,u),u}function A(){o.value=!0,C.value={},l.value=!1,b.value=!1,g();}function p(){v(),x.stop(),x=effectScope();}return reactive({...D,$pending:l,$valid:o,$metadata:C,$validate:s,$unwatch:p,$watch:g,$reset:A})}function ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){let v=effectScope(),l,o=ref(!1),C=ref(!1),b=ref([]),g,s,A,p,R=()=>{};function u(){b.value=$.value??[];}u();function I(){let S=t.value,T=a.checkRuleDeclEntry(n,S);f.value=Object.fromEntries(Object.entries(S).filter(([O])=>O.startsWith("$"))),c.value=Object.fromEntries(Object.entries(t.value).filter(([O])=>!O.startsWith("$")).map(([O,_])=>{if(_){let oe=toRef(()=>_);return [O,ke({$dirty:o,customMessages:r,rule:oe,ruleKey:O,state:e,path:n,storage:a})]}return []}).filter(O=>!!O.length)),y(),R=l.$debounce.value?fe(d,l.$debounce.value??0):d,T?.valid!=null&&(o.value=a.getDirtyState(n),o.value&&R()),a.addRuleDeclEntry(n,S);}function E(){c.value&&Object.entries(c.value).forEach(([S,T])=>{T.$unwatch();}),p(),o.value&&a.setDirtyEntry(n,o.value),g(),s(),A(),v.stop(),v=effectScope(),D?.();}function y(){c.value&&Object.entries(c.value).forEach(([S,T])=>{T.$watch();}),l=v.run(()=>{let S=computed(()=>o.value),T=computed(()=>f.value.$debounce),O=computed(()=>f.value.$lazy!=null?f.value.$lazy:unref(i.lazy)),_=computed(()=>f.value.$rewardEarly!=null?f.value.$rewardEarly:unref(i.rewardEarly)),oe=computed(()=>f.value.$autoDirty!=null?f.value.$autoDirty:unref(i.autoDirty)),qe=computed(()=>ie.value&&!xe.value&&o.value),Le=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:c.value}})),Je=computed(()=>G({field:{$dirty:o.value,$externalErrors:b.value,$rules:c.value},silent:!0})),xe=computed(()=>C.value||!_.value?Object.entries(c.value).some(([K,Q])=>Q.$pending):!1),ie=computed(()=>b.value?.length?!0:!_.value||_.value&&C.value?Object.entries(c.value).some(([K,Q])=>!Q.$valid):!1),Te=computed(()=>o.value&&!ee(e.value)?b.value?.length?!1:_.value?Object.entries(c.value).every(([K,Q])=>Q.$valid):!ie.value:!1);return watch(Te,K=>{K&&(C.value=!1);}),{$error:qe,$pending:xe,$invalid:ie,$valid:Te,$debounce:T,$lazy:O,$errors:Le,$silentErrors:Je,$rewardEarly:_,$autoDirty:oe,$anyDirty:S}}),A=watch($,u),g=watch(e,()=>{l.$autoDirty.value&&(o.value||(o.value=!0)),t.value instanceof Function&&I(),R(),l.$rewardEarly.value;},{deep:!0}),p=watch(o,()=>{a.setDirtyEntry(n,o.value);}),s=watch(l.$valid,S=>{l.$rewardEarly.value&&S&&(C.value=!1);});}function d(){Object.entries(c.value).forEach(([S,T])=>{T.$validate();});}let c=ref(),f=ref();I();function h(){o.value=!1,b.value=[],Object.entries(c.value).forEach(([S,T])=>{T.$reset();}),l.$lazy.value||Object.entries(c.value).map(([S,T])=>T.$validate());}function m(){o.value=!0,l.$rewardEarly.value,R();}let P=l.$debounce.value?fe(w,l.$debounce.value??0):w;async function w(){try{if(C.value=!0,l.$anyDirty.value&&!l.$pending)return !l.$error.value;{let S=Object.entries(c.value).map(([O,_])=>_.$validate());return (await Promise.allSettled(S)).every(O=>O.status==="fulfilled"?O.value:!1)}}catch{return !1}}function M(){b.value=[];}return l.$lazy.value||w(),reactive({$dirty:o,$anyDirty:l.$anyDirty,$invalid:l.$invalid,$error:l.$error,$pending:l.$pending,$valid:l.$valid,$errors:l.$errors,$silentErrors:l.$silentErrors,$externalErrors:b,$value:e,$rules:c,$reset:h,$touch:m,$validate:P,$unwatch:E,$watch:y,$clearExternalErrors:M})}function Be({$id:e,path:t,index:r,options:n,storage:a,value:i,customMessages:$,rules:x,externalErrors:D}){let v=x.$key?x.$key:ve(),l=`${t}.${String(v)}`;typeof i[r]=="object"&&i[r]!=null&&(i[r].$id?l=`${t}.${i[r].$id}`:Object.defineProperties(i[r],{$id:{value:v,enumerable:!1,configurable:!1,writable:!1}}));let o=toRefs(i),C=toRef(()=>D.value?.[r]),b=le({state:o[r],rulesDef:toRef(()=>x),customMessages:$,path:l,storage:a,options:n,externalErrors:C});if(b){let g=i[r]?.$id;b.$id=g??String(v),a.addArrayStatus(e,b.$id,b);}return b}function We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$}){let x=effectScope(),D,v=effectScope(),l;if(Array.isArray(e.value)&&!t.value.$each)return null;let o=ref(),C=ref(e.value),b=null,g=ref({}),s=a.getCollectionsEntry(n);l=v.run(()=>{let c=computed(()=>Array.isArray(e.value)&&e.value.length?e.value.some(m=>typeof m!="object"):t.value.$each&&!(t.value.$each instanceof Function)?Object.values(t.value.$each).every(m=>pe(m)):!1),f=computed(()=>$.value?$e($.value)?$.value.$errors??[]:[]:[]),h=computed(()=>$.value?$e($.value)?$.value.$each??[]:[]:[]);return {isPrimitiveArray:c,$externalErrorsField:f,$externalErrorsEach:h}}),A(),R();function A(){typeof e.value=="object"&&(e.value!=null&&!e.value?.$id&&e.value!==null?(o.value=ve(),Object.defineProperties(e.value,{$id:{value:o.value,enumerable:!1,configurable:!1,writable:!1}})):e.value?.$id&&(o.value=e.value.$id)),!l.isPrimitiveArray.value&&(C.value=g.value.$value,Array.isArray(e.value)&&t.value.$each?s.value=e.value.map((c,f)=>{let h=ce(t.value.$each,toRef(()=>e.value[f]),f);if(h){let m=Be({$id:o.value,path:n,rules:h,value:e.value,index:f,options:i,storage:a,externalErrors:l.$externalErrorsEach});return m||null}}).filter(c=>!!c):s.value=[],g.value=ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:l.$externalErrorsField}));}function p(){if(Array.isArray(e.value)){let c=B(s.value);s.value=e.value.map((f,h)=>{if(f.$id&&s.value.find(m=>m.$id===f.$id)){let m=a.getArrayStatus(o.value,f.$id);return m?(m.$value=toRef(()=>f),m):null}else {let m=ce(t.value.$each,toRef(()=>toRef(()=>f)),h);if(m){let P=Be({$id:o.value,path:n,rules:m,value:e.value,index:h,options:i,storage:a,externalErrors:l.$externalErrorsEach});return P||null}}}).filter(f=>!!f),c.filter(f=>!e.value.find(h=>f.$id===h.$id)).forEach((f,h)=>{a.deleteArrayStatus(o.value,h.toString());});}else s.value=[];}function R(){b=watch(e,()=>{e.value!=null&&!Object.hasOwn(e.value,"$id")?A():p();},{deep:!0,flush:"pre"}),D=x.run(()=>{let c=computed(()=>g.value.$dirty&&s.value.every(T=>T.$dirty)),f=computed(()=>g.value.$anyDirty||s.value.some(T=>T.$dirty)),h=computed(()=>g.value.$invalid||s.value.some(T=>T.$invalid)),m=computed(()=>g.value.$valid&&s.value.every(T=>T.$valid)),P=computed(()=>g.value.$error||s.value.some(T=>T.$error)),w=computed(()=>g.value.$pending||s.value.some(T=>T.$pending)),M=computed(()=>({$errors:G({field:g.value,silent:!1}),$each:te(s.value)})),S=computed(()=>({$errors:G({field:g.value,silent:!0}),$each:te(s.value,!0)}));return {$dirty:c,$anyDirty:f,$invalid:h,$valid:m,$error:P,$pending:w,$errors:M,$silentErrors:S}}),l.isPrimitiveArray.value&&(console.warn(`${n} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`),b());}function u(){b&&b(),g.value&&g.value.$unwatch(),s.value&&s.value.forEach(c=>{"$dirty"in c&&c.$unwatch();}),x.stop(),x=effectScope(),v.stop(),v=effectScope(!0);}function I(){g.value.$touch(),s.value.forEach(c=>{c.$touch();});}function E(){g.value.$reset(),s.value.forEach(c=>{c.$reset();});}async function y(){try{return (await Promise.all([g.value.$validate(),...s.value.map(f=>f.$validate())])).every(f=>!!f)}catch{return !1}}function d(){}return reactive({$field:g,...D,$each:s,$value:e,$validate:y,$unwatch:u,$watch:R,$touch:I,$reset:E,$clearExternalErrors:d})}function Ee({scopeRules:e,state:t,customMessages:r,path:n="",rootRules:a,storage:i,options:$,externalErrors:x,validationGroups:D}){let v,l,o;function g(y=!0,d=!1){s.value=null,triggerRef(s);let c=Object.fromEntries(Object.entries(e.value).map(([m,P])=>{if(P){let w=toRef(t.value,m),M=toRef(()=>P),S=toRef(()=>x.value?.[m]);return [m,le({state:w,rulesDef:M,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:S})]}return []}).filter(m=>!!m.length&&m[1]!=null)),f=Object.fromEntries(Object.entries(unref(x)??{}).filter(([m])=>!(m in e.value)).map(([m,P])=>{if(P){let w=toRef(()=>({})),M=toRef(()=>P);return [m,le({state:ref(void 0),rulesDef:w,customMessages:r,path:n?`${n}.${m}`:m,storage:i,options:$,externalErrors:M})]}return []})),h=Object.fromEntries(Object.entries(D?.(c)??{}).map(([m,P])=>P.length?[m,{...Object.fromEntries(["$invalid","$error","$pending","$dirty","$valid"].map(w=>[w,je(toRef(()=>P),w)])),...Object.fromEntries(["$errors","$silentErrors"].map(w=>[w,Ve(toRef(()=>P),w)]))}]:[]));s.value={...c,...f,...h},y&&u();}let s=i.getFieldsEntry(n);g();function A(){g(!1),Object.entries(s.value).forEach(([y,d])=>{d.$reset();}),u();}function p(){Object.entries(s.value).forEach(([y,d])=>{d.$touch();});}async function R(){try{return (await Promise.allSettled(Object.entries(s.value).map(([d,c])=>c.$validate()))).every(d=>d.status==="fulfilled"?d.value:!1)}catch{return !1}}function u(){a&&(o=watch(a,()=>{I(),g();},{deep:!0,flush:"post"})),v=effectScope(),l=v.run(()=>{let y=computed(()=>!!Object.entries(s.value).length&&Object.entries(s.value).every(([M,S])=>S.$dirty)),d=computed(()=>Object.entries(s.value).some(([M,S])=>S.$dirty)),c=computed(()=>Object.entries(s.value).some(([M,S])=>S.$invalid)),f=computed(()=>Object.entries(s.value).every(([M,S])=>S.$valid)),h=computed(()=>Object.entries(s.value).some(([M,S])=>S.$error)),m=computed(()=>Object.entries(s.value).some(([M,S])=>S.$pending)),P=computed(()=>q(s.value)),w=computed(()=>q(s.value,!0));return {$dirty:y,$anyDirty:d,$invalid:c,$valid:f,$error:h,$pending:m,$errors:P,$silentErrors:w}});}function I(){s.value&&Object.entries(s.value).forEach(([y,d])=>{d.$unwatch();}),o?.(),v.stop(),v=effectScope();}function E(){Object.entries(s.value).forEach(([y,d])=>{d.$clearExternalErrors();});}return reactive({...l,$fields:s,$value:t,$reset:A,$touch:p,$validate:R,$unwatch:I,$watch:u,$clearExternalErrors:E})}function le({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,externalErrors:$,index:x,onUnwatch:D}){return we(t)?We({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Pe(e,t)&&De(e)?Ee({scopeRules:t,state:e,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$}):Oe(t)?ne({state:e,rulesDef:t,customMessages:r,path:n,storage:a,options:i,index:x,externalErrors:$,onUnwatch:D}):null}function be(e,t,r,n){let a=Re(),i=computed(()=>unref(r.externalErrors)),$=reactive(Ee({rootRules:e,scopeRules:e,state:t,customMessages:n?.(),storage:a,options:r,externalErrors:i,validationGroups:r.validationGroups})),x=Me($);return {regle:$,errors:x}}function he(e,t){let r={autoDirty:t?.autoDirty??!0,lazy:t?.lazy??!1,rewardEarly:t?.rewardEarly??!1};function n(a,i,$){let x=isRef(i)?i:computed(typeof i=="function"?i:()=>i),D={...r,...$},v=isRef(a)?a:ref(a),l=B(toRaw(v.value)),{regle:o,errors:C}=be(x,v,D,e);function b(){o.$unwatch(),g(a,l),o.$reset();}function g(p,R){Object.entries(R).forEach(([u,I])=>{let E=isRef(p)?p.value:p,y=isRef(E[u])?E[u].value:E[u],d=isRef(R[u])?R[u]._value:R[u];Array.isArray(d)&&Array.isArray(y)?(E[u]=[],d.forEach((c,f)=>{E[u][f]={},g(E[u][f],d[f]);})):k(d)?g(y,d):isRef(E[u])?E[u].value=d:E[u]=d;});}let s=computed(()=>!(o.$invalid||o.$pending));async function A(){return o.$touch(),await o.$validate()?v.value:!1}return {regle:o,errors:C,resetAll:b,validateState:A,ready:s,state:v}}return n}var He=he();function ze({rules:e,modifiers:t}){return he(e,t)}export{re as InternalRuleType,ue as createRule,ze as defineRegleConfig,F as unwrapRuleParameters,He as useRegle};
|
|
1
|
+
import { unref, isRef, toRef, computed, ref, toRaw, reactive, shallowRef, onScopeDispose, triggerRef, watch, effectScope } from 'vue';
|
|
2
|
+
|
|
3
|
+
// src/core/createRule/unwrapRuleParameters.ts
|
|
4
|
+
function unwrapRuleParameters(params) {
|
|
5
|
+
return params.map((param) => {
|
|
6
|
+
if (param instanceof Function) {
|
|
7
|
+
return param();
|
|
8
|
+
}
|
|
9
|
+
return unref(param);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function createReactiveParams(params) {
|
|
13
|
+
return params.map((param) => {
|
|
14
|
+
if (param instanceof Function) {
|
|
15
|
+
return param;
|
|
16
|
+
} else if (isRef(param)) {
|
|
17
|
+
return param;
|
|
18
|
+
}
|
|
19
|
+
return toRef(() => param);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function getFunctionParametersLength(func) {
|
|
23
|
+
const funcStr = func.toString();
|
|
24
|
+
const isArrowFunction = funcStr.includes("=>");
|
|
25
|
+
const params = (isArrowFunction ? funcStr.split("=>")[0] : funcStr).slice(funcStr.indexOf("(") + 1, funcStr.indexOf(")")).split(",").map((param) => param.trim());
|
|
26
|
+
const defaults = params.filter((param) => param.includes("="));
|
|
27
|
+
return defaults.length + func.length;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// src/core/createRule/defineRuleProcessors.ts
|
|
31
|
+
function defineRuleProcessors(definition, ...params) {
|
|
32
|
+
const { message, validator, active, ...properties } = definition;
|
|
33
|
+
const isAsync = validator.constructor.name === "AsyncFunction";
|
|
34
|
+
const defaultProcessors = {
|
|
35
|
+
validator(value, ...args) {
|
|
36
|
+
return definition.validator(value, ...unwrapRuleParameters(args.length ? args : params));
|
|
37
|
+
},
|
|
38
|
+
message(value, metadata) {
|
|
39
|
+
if (typeof definition.message === "function") {
|
|
40
|
+
return definition.message(value, {
|
|
41
|
+
...metadata,
|
|
42
|
+
$params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
|
|
43
|
+
});
|
|
44
|
+
} else {
|
|
45
|
+
return definition.message;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
active(value, metadata) {
|
|
49
|
+
if (typeof definition.active === "function") {
|
|
50
|
+
return definition.active(value, {
|
|
51
|
+
...metadata,
|
|
52
|
+
$params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
return definition.active ?? true;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
exec(value) {
|
|
59
|
+
const validator2 = definition.validator(value, ...unwrapRuleParameters(params));
|
|
60
|
+
let rawResult;
|
|
61
|
+
if (validator2 instanceof Promise) {
|
|
62
|
+
return validator2.then((result) => {
|
|
63
|
+
rawResult = result;
|
|
64
|
+
if (typeof rawResult === "object" && "$valid" in rawResult) {
|
|
65
|
+
return rawResult.$valid;
|
|
66
|
+
} else if (typeof rawResult === "boolean") {
|
|
67
|
+
return rawResult;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
rawResult = validator2;
|
|
73
|
+
}
|
|
74
|
+
if (typeof rawResult === "object" && "$valid" in rawResult) {
|
|
75
|
+
return rawResult.$valid;
|
|
76
|
+
} else if (typeof rawResult === "boolean") {
|
|
77
|
+
return rawResult;
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const processors = {
|
|
83
|
+
...defaultProcessors,
|
|
84
|
+
...properties,
|
|
85
|
+
...{
|
|
86
|
+
_validator: definition.validator,
|
|
87
|
+
_message: definition.message,
|
|
88
|
+
_active: definition.active,
|
|
89
|
+
_type: definition.type,
|
|
90
|
+
_patched: false,
|
|
91
|
+
_async: isAsync,
|
|
92
|
+
_params: createReactiveParams(params)
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
return processors;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// src/core/createRule/createRule.ts
|
|
99
|
+
function createRule(definition) {
|
|
100
|
+
if (typeof definition.validator === "function") {
|
|
101
|
+
let fakeParams = [];
|
|
102
|
+
const staticProcessors = defineRuleProcessors(definition, ...fakeParams);
|
|
103
|
+
const isAsync = definition.validator.constructor.name === "AsyncFunction";
|
|
104
|
+
if (getFunctionParametersLength(definition.validator) > 1) {
|
|
105
|
+
const ruleFactory = function(...params) {
|
|
106
|
+
return defineRuleProcessors(definition, ...params);
|
|
107
|
+
};
|
|
108
|
+
ruleFactory.validator = staticProcessors.validator;
|
|
109
|
+
ruleFactory.message = staticProcessors.message;
|
|
110
|
+
ruleFactory.active = staticProcessors.active;
|
|
111
|
+
ruleFactory.type = staticProcessors.type;
|
|
112
|
+
ruleFactory.exec = staticProcessors.exec;
|
|
113
|
+
ruleFactory._validator = staticProcessors.validator;
|
|
114
|
+
ruleFactory._message = staticProcessors.message;
|
|
115
|
+
ruleFactory._active = staticProcessors.active;
|
|
116
|
+
ruleFactory._type = definition.type;
|
|
117
|
+
ruleFactory._patched = false;
|
|
118
|
+
ruleFactory._async = isAsync;
|
|
119
|
+
return ruleFactory;
|
|
120
|
+
} else {
|
|
121
|
+
return staticProcessors;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new Error("Validator must be a function");
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// src/utils/object.utils.ts
|
|
128
|
+
function isObject(obj) {
|
|
129
|
+
return typeof obj === "object" && obj !== null && !Array.isArray(obj);
|
|
130
|
+
}
|
|
131
|
+
function isRefObject(obj) {
|
|
132
|
+
return isObject(obj.value);
|
|
133
|
+
}
|
|
134
|
+
function cloneDeep(obj) {
|
|
135
|
+
let result = obj;
|
|
136
|
+
let type = {}.toString.call(obj).slice(8, -1);
|
|
137
|
+
if (type == "Set") {
|
|
138
|
+
result = new Set([...obj].map((value) => cloneDeep(value)));
|
|
139
|
+
}
|
|
140
|
+
if (type == "Map") {
|
|
141
|
+
result = new Map([...obj].map((kv) => [cloneDeep(kv[0]), cloneDeep(kv[1])]));
|
|
142
|
+
}
|
|
143
|
+
if (type == "Date") {
|
|
144
|
+
result = new Date(obj.getTime());
|
|
145
|
+
}
|
|
146
|
+
if (type == "RegExp") {
|
|
147
|
+
result = RegExp(obj.source, getRegExpFlags(obj));
|
|
148
|
+
}
|
|
149
|
+
if (type == "Array" || type == "Object") {
|
|
150
|
+
result = Array.isArray(obj) ? [] : {};
|
|
151
|
+
for (let key in obj) {
|
|
152
|
+
result[key] = cloneDeep(obj[key]);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
function getRegExpFlags(regExp) {
|
|
158
|
+
if (typeof regExp.source.flags == "string") {
|
|
159
|
+
return regExp.source.flags;
|
|
160
|
+
} else {
|
|
161
|
+
let flags = [];
|
|
162
|
+
regExp.global && flags.push("g");
|
|
163
|
+
regExp.ignoreCase && flags.push("i");
|
|
164
|
+
regExp.multiline && flags.push("m");
|
|
165
|
+
regExp.sticky && flags.push("y");
|
|
166
|
+
regExp.unicode && flags.push("u");
|
|
167
|
+
return flags.join("");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function unwrapGetter(getter, value, index) {
|
|
171
|
+
if (getter instanceof Function) {
|
|
172
|
+
return getter(value, index ?? 0);
|
|
173
|
+
}
|
|
174
|
+
return getter;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// src/utils/isEmpty.ts
|
|
178
|
+
function isEmpty(value) {
|
|
179
|
+
if (value === void 0 || value === null) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
if (value === false) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
if (value instanceof Date) {
|
|
186
|
+
return isNaN(value.getTime());
|
|
187
|
+
}
|
|
188
|
+
if (Array.isArray(value)) {
|
|
189
|
+
return value.length === 0;
|
|
190
|
+
}
|
|
191
|
+
if (typeof value === "object" && value != null) {
|
|
192
|
+
return Object.keys(value).length === 0;
|
|
193
|
+
}
|
|
194
|
+
if (typeof value === "string") {
|
|
195
|
+
return !String(value.trim()).length;
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// src/utils/debounce.ts
|
|
201
|
+
function debounce(func, wait, immediate) {
|
|
202
|
+
let timeout;
|
|
203
|
+
const debouncedFn = (...args) => new Promise((resolve) => {
|
|
204
|
+
clearTimeout(timeout);
|
|
205
|
+
timeout = setTimeout(() => {
|
|
206
|
+
timeout = void 0;
|
|
207
|
+
{
|
|
208
|
+
Promise.resolve(func.apply(this, [...args])).then(resolve);
|
|
209
|
+
}
|
|
210
|
+
}, wait);
|
|
211
|
+
});
|
|
212
|
+
debouncedFn.cancel = () => {
|
|
213
|
+
clearTimeout(timeout);
|
|
214
|
+
timeout = void 0;
|
|
215
|
+
};
|
|
216
|
+
debouncedFn.doImmediately = (...args) => new Promise((resolve) => {
|
|
217
|
+
clearTimeout(timeout);
|
|
218
|
+
timeout = setTimeout(() => {
|
|
219
|
+
timeout = void 0;
|
|
220
|
+
Promise.resolve(func.apply(this, [...args])).then(resolve);
|
|
221
|
+
}, 0);
|
|
222
|
+
});
|
|
223
|
+
return debouncedFn;
|
|
224
|
+
}
|
|
225
|
+
function useStorage() {
|
|
226
|
+
const ruleDeclStorage = shallowRef(/* @__PURE__ */ new Map());
|
|
227
|
+
const fieldsStorage = shallowRef(
|
|
228
|
+
/* @__PURE__ */ new Map()
|
|
229
|
+
);
|
|
230
|
+
const collectionsStorage = shallowRef(/* @__PURE__ */ new Map());
|
|
231
|
+
const dirtyStorage = shallowRef(/* @__PURE__ */ new Map());
|
|
232
|
+
const ruleStatusStorage = shallowRef(/* @__PURE__ */ new Map());
|
|
233
|
+
const arrayStatusStorage = shallowRef(/* @__PURE__ */ new Map());
|
|
234
|
+
function getFieldsEntry($path) {
|
|
235
|
+
const existingFields = fieldsStorage.value.get($path);
|
|
236
|
+
if (existingFields) {
|
|
237
|
+
return existingFields;
|
|
238
|
+
} else {
|
|
239
|
+
const $fields = ref({});
|
|
240
|
+
fieldsStorage.value.set($path, $fields);
|
|
241
|
+
return $fields;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
function getCollectionsEntry($path) {
|
|
245
|
+
const existingEach = collectionsStorage.value.get($path);
|
|
246
|
+
if (existingEach) {
|
|
247
|
+
return existingEach;
|
|
248
|
+
} else {
|
|
249
|
+
const $each = ref([]);
|
|
250
|
+
collectionsStorage.value.set($path, $each);
|
|
251
|
+
return $each;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function addArrayStatus($arrayId, itemId, value) {
|
|
255
|
+
arrayStatusStorage.value.set(`${$arrayId}-${itemId}`, value);
|
|
256
|
+
}
|
|
257
|
+
function getArrayStatus($arrayId, itemId) {
|
|
258
|
+
return arrayStatusStorage.value.get(`${$arrayId}-${itemId}`);
|
|
259
|
+
}
|
|
260
|
+
function deleteArrayStatus($arrayId, itemId) {
|
|
261
|
+
if ($arrayId && itemId != null) {
|
|
262
|
+
arrayStatusStorage.value.delete(`${$arrayId}-${itemId}`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
function setDirtyEntry($path, dirty) {
|
|
266
|
+
dirtyStorage.value.set($path, dirty);
|
|
267
|
+
}
|
|
268
|
+
function getDirtyState(path) {
|
|
269
|
+
return dirtyStorage.value.get(path) ?? false;
|
|
270
|
+
}
|
|
271
|
+
function addRuleDeclEntry($path, options) {
|
|
272
|
+
ruleDeclStorage.value.set($path, options);
|
|
273
|
+
}
|
|
274
|
+
function checkRuleDeclEntry($path, newRules) {
|
|
275
|
+
const storedRulesDefs = ruleDeclStorage.value.get($path);
|
|
276
|
+
if (!storedRulesDefs) return void 0;
|
|
277
|
+
const storedRules = storedRulesDefs;
|
|
278
|
+
const isValidCache = areRulesChanged(newRules, storedRules);
|
|
279
|
+
if (!isValidCache) return { valid: false };
|
|
280
|
+
return { valid: true };
|
|
281
|
+
}
|
|
282
|
+
function areRulesChanged(newRules, storedRules) {
|
|
283
|
+
const storedRulesKeys = Object.keys(storedRules);
|
|
284
|
+
const newRulesKeys = Object.keys(newRules);
|
|
285
|
+
if (newRulesKeys.length !== storedRulesKeys.length) return false;
|
|
286
|
+
const hasAllValidators = newRulesKeys.every((ruleKey) => storedRulesKeys.includes(ruleKey));
|
|
287
|
+
if (!hasAllValidators) return false;
|
|
288
|
+
return newRulesKeys.every((ruleKey) => {
|
|
289
|
+
const newRuleElement = newRules[ruleKey];
|
|
290
|
+
const storedRuleElement = storedRules[ruleKey];
|
|
291
|
+
if (!storedRuleElement || !newRuleElement || typeof newRuleElement === "function" || typeof storedRuleElement === "function")
|
|
292
|
+
return false;
|
|
293
|
+
if (typeof newRuleElement === "number") {
|
|
294
|
+
return false;
|
|
295
|
+
} else if (typeof newRuleElement === "boolean") {
|
|
296
|
+
return false;
|
|
297
|
+
} else if (!newRuleElement._params) return true;
|
|
298
|
+
else {
|
|
299
|
+
return newRuleElement._params?.every((paramKey, index) => {
|
|
300
|
+
if (typeof storedRuleElement === "number" || typeof storedRuleElement === "boolean") {
|
|
301
|
+
return true;
|
|
302
|
+
} else {
|
|
303
|
+
const storedParams = unwrapRuleParameters(storedRuleElement._params);
|
|
304
|
+
const newParams = unwrapRuleParameters(newRuleElement._params);
|
|
305
|
+
return storedParams?.[index] === newParams?.[index];
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
function trySetRuleStatusRef(path) {
|
|
312
|
+
const ruleStatus = ruleStatusStorage.value.get(path);
|
|
313
|
+
if (ruleStatus) {
|
|
314
|
+
return ruleStatus;
|
|
315
|
+
} else {
|
|
316
|
+
const $pending = ref(false);
|
|
317
|
+
const $valid = ref(true);
|
|
318
|
+
const $metadata = ref({});
|
|
319
|
+
const $validating = ref(false);
|
|
320
|
+
ruleStatusStorage.value.set(path, { $pending, $valid, $metadata, $validating });
|
|
321
|
+
return { $pending, $valid, $metadata, $validating };
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
onScopeDispose(() => {
|
|
325
|
+
ruleDeclStorage.value.clear();
|
|
326
|
+
fieldsStorage.value.clear();
|
|
327
|
+
collectionsStorage.value.clear();
|
|
328
|
+
dirtyStorage.value.clear();
|
|
329
|
+
ruleStatusStorage.value.clear();
|
|
330
|
+
arrayStatusStorage.value.clear();
|
|
331
|
+
});
|
|
332
|
+
return {
|
|
333
|
+
addRuleDeclEntry,
|
|
334
|
+
setDirtyEntry,
|
|
335
|
+
checkRuleDeclEntry,
|
|
336
|
+
getDirtyState,
|
|
337
|
+
trySetRuleStatusRef,
|
|
338
|
+
getFieldsEntry,
|
|
339
|
+
getCollectionsEntry,
|
|
340
|
+
getArrayStatus,
|
|
341
|
+
addArrayStatus,
|
|
342
|
+
deleteArrayStatus,
|
|
343
|
+
arrayStatusStorage
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// src/core/useRegle/guards/ruleDef.guards.ts
|
|
348
|
+
function isNestedRulesDef(state, rules) {
|
|
349
|
+
return isObject(state.value) && isObject(rules.value) && !Object.entries(rules.value).some((rule) => isRuleDef(rule));
|
|
350
|
+
}
|
|
351
|
+
function isCollectionRulesDef(rules) {
|
|
352
|
+
return !!rules.value && "$each" in rules.value;
|
|
353
|
+
}
|
|
354
|
+
function isValidatorRulesDef(rules) {
|
|
355
|
+
return !!rules.value && isObject(rules.value);
|
|
356
|
+
}
|
|
357
|
+
function isRuleDef(rule) {
|
|
358
|
+
return isObject(rule) && "_validator" in rule;
|
|
359
|
+
}
|
|
360
|
+
function isFormRuleDefinition(rule) {
|
|
361
|
+
return !(typeof rule.value === "function");
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// src/core/useRegle/guards/rule.status.guards.ts
|
|
365
|
+
function isNestedRulesStatus(rule) {
|
|
366
|
+
return isObject(rule) && "$fields" in rule;
|
|
367
|
+
}
|
|
368
|
+
function isCollectionRulesStatus(rule) {
|
|
369
|
+
return !!rule && "$each" in rule;
|
|
370
|
+
}
|
|
371
|
+
function isFieldStatus(rule) {
|
|
372
|
+
return !!rule && "$rules" in rule;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// src/core/useRegle/guards/rule.errors.guards.ts
|
|
376
|
+
function isExternalErrorCollection(value) {
|
|
377
|
+
return "$each" in value || "$errors" in value;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// src/core/useRegle/useErrors.ts
|
|
381
|
+
function extractRulesErrors({
|
|
382
|
+
field,
|
|
383
|
+
silent = false
|
|
384
|
+
}) {
|
|
385
|
+
return Object.entries(field.$rules ?? {}).map(([ruleKey, rule]) => {
|
|
386
|
+
if (silent) {
|
|
387
|
+
return rule.$message;
|
|
388
|
+
} else if (!rule.$valid && field.$dirty) {
|
|
389
|
+
return rule.$message;
|
|
390
|
+
}
|
|
391
|
+
return null;
|
|
392
|
+
}).filter((msg) => !!msg).reduce((acc, value) => {
|
|
393
|
+
if (typeof value === "string") {
|
|
394
|
+
return acc?.concat([value]);
|
|
395
|
+
} else {
|
|
396
|
+
return acc?.concat(value);
|
|
397
|
+
}
|
|
398
|
+
}, []).concat(field.$externalErrors ?? []);
|
|
399
|
+
}
|
|
400
|
+
function processFieldErrors(fieldStatus, silent = false) {
|
|
401
|
+
if (isNestedRulesStatus(fieldStatus)) {
|
|
402
|
+
return extractNestedErrors(fieldStatus.$fields);
|
|
403
|
+
} else if (isCollectionRulesStatus(fieldStatus)) {
|
|
404
|
+
return {
|
|
405
|
+
$errors: fieldStatus.$field.$rules ? extractRulesErrors({ field: fieldStatus.$field, silent }) : [],
|
|
406
|
+
$each: fieldStatus.$each.map((field) => processFieldErrors(field, silent))
|
|
407
|
+
};
|
|
408
|
+
} else if (isFieldStatus(fieldStatus)) {
|
|
409
|
+
if (fieldStatus.$error) {
|
|
410
|
+
return extractRulesErrors({
|
|
411
|
+
field: fieldStatus,
|
|
412
|
+
silent
|
|
413
|
+
});
|
|
414
|
+
} else {
|
|
415
|
+
return fieldStatus.$externalErrors ?? [];
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return [];
|
|
419
|
+
}
|
|
420
|
+
function extractCollectionError(each, silent = false) {
|
|
421
|
+
return each.map((field) => processFieldErrors(field, silent));
|
|
422
|
+
}
|
|
423
|
+
function extractNestedErrors(fields, silent = false) {
|
|
424
|
+
return Object.fromEntries(
|
|
425
|
+
Object.entries(fields).map(([fieldKey, fieldStatus]) => {
|
|
426
|
+
if (isNestedRulesStatus(fieldStatus)) {
|
|
427
|
+
return [fieldKey, extractNestedErrors(fieldStatus.$fields, silent)];
|
|
428
|
+
} else if (isCollectionRulesStatus(fieldStatus)) {
|
|
429
|
+
return [
|
|
430
|
+
fieldKey,
|
|
431
|
+
{
|
|
432
|
+
$errors: extractRulesErrors({ field: fieldStatus.$field, silent }),
|
|
433
|
+
$each: extractCollectionError(fieldStatus.$each, silent)
|
|
434
|
+
}
|
|
435
|
+
];
|
|
436
|
+
} else if (isFieldStatus(fieldStatus)) {
|
|
437
|
+
if (fieldStatus.$error) {
|
|
438
|
+
return [
|
|
439
|
+
fieldKey,
|
|
440
|
+
extractRulesErrors({
|
|
441
|
+
field: fieldStatus,
|
|
442
|
+
silent
|
|
443
|
+
})
|
|
444
|
+
];
|
|
445
|
+
} else {
|
|
446
|
+
return [fieldKey, fieldStatus.$externalErrors ?? []];
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return [fieldKey, []];
|
|
450
|
+
})
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
function useErrors($regle) {
|
|
454
|
+
const errors = computed(() => {
|
|
455
|
+
return extractNestedErrors($regle.$fields);
|
|
456
|
+
});
|
|
457
|
+
return errors;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// src/types/rules/rule.internal.types.ts
|
|
461
|
+
var InternalRuleType = /* @__PURE__ */ ((InternalRuleType3) => {
|
|
462
|
+
InternalRuleType3["Inline"] = "__inline";
|
|
463
|
+
InternalRuleType3["Async"] = "__async";
|
|
464
|
+
return InternalRuleType3;
|
|
465
|
+
})(InternalRuleType || {});
|
|
466
|
+
function mergeBooleanGroupProperties(entries, property) {
|
|
467
|
+
return computed(() => {
|
|
468
|
+
return entries.value.some((entry) => {
|
|
469
|
+
return entry[property];
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
function mergeArrayGroupProperties(entries, property) {
|
|
474
|
+
return computed(() => {
|
|
475
|
+
return entries.value.reduce((all, entry) => {
|
|
476
|
+
const fetchedProperty = entry[property] || [];
|
|
477
|
+
return all.concat(fetchedProperty);
|
|
478
|
+
}, []);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// src/utils/randomId.ts
|
|
483
|
+
function uniqueIDNuxt() {
|
|
484
|
+
return Math.floor(Math.random() * Date.now()).toString();
|
|
485
|
+
}
|
|
486
|
+
function randomId() {
|
|
487
|
+
if (typeof window === "undefined") {
|
|
488
|
+
return uniqueIDNuxt();
|
|
489
|
+
} else {
|
|
490
|
+
const uint32 = window.crypto.getRandomValues(new Uint32Array(1))[0];
|
|
491
|
+
return uint32.toString(10);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
function createReactiveRuleStatus({
|
|
495
|
+
$dirty,
|
|
496
|
+
customMessages,
|
|
497
|
+
rule,
|
|
498
|
+
ruleKey,
|
|
499
|
+
state,
|
|
500
|
+
path,
|
|
501
|
+
storage,
|
|
502
|
+
$debounce
|
|
503
|
+
}) {
|
|
504
|
+
let scope = effectScope();
|
|
505
|
+
let scopeState;
|
|
506
|
+
let $unwatchState;
|
|
507
|
+
const { $pending, $valid, $metadata, $validating } = storage.trySetRuleStatusRef(
|
|
508
|
+
`${path}.${ruleKey}`
|
|
509
|
+
);
|
|
510
|
+
function $watch() {
|
|
511
|
+
scopeState = scope.run(() => {
|
|
512
|
+
const $defaultMetadata = computed(() => ({
|
|
513
|
+
$invalid: !$valid.value,
|
|
514
|
+
$params: $params.value,
|
|
515
|
+
...$metadata.value
|
|
516
|
+
}));
|
|
517
|
+
const $active = computed(() => {
|
|
518
|
+
if (isFormRuleDefinition(rule)) {
|
|
519
|
+
if (typeof rule.value.active === "function") {
|
|
520
|
+
return rule.value.active(state.value, $defaultMetadata.value);
|
|
521
|
+
} else {
|
|
522
|
+
return rule.value.active;
|
|
523
|
+
}
|
|
524
|
+
} else {
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
const $message = computed(() => {
|
|
529
|
+
let message = "";
|
|
530
|
+
const customMessageRule = customMessages ? customMessages[ruleKey]?.message : void 0;
|
|
531
|
+
if (customMessageRule) {
|
|
532
|
+
if (typeof customMessageRule === "function") {
|
|
533
|
+
message = customMessageRule(state.value, $defaultMetadata.value);
|
|
534
|
+
} else {
|
|
535
|
+
message = customMessageRule;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (isFormRuleDefinition(rule)) {
|
|
539
|
+
if (!(customMessageRule && !rule.value._patched)) {
|
|
540
|
+
if (typeof rule.value.message === "function") {
|
|
541
|
+
message = rule.value.message(state.value, $defaultMetadata.value);
|
|
542
|
+
} else {
|
|
543
|
+
message = rule.value.message;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
if (isEmpty(message)) {
|
|
548
|
+
message = "Error";
|
|
549
|
+
console.warn(`No error message defined for ${path}.${ruleKey}`);
|
|
550
|
+
}
|
|
551
|
+
return message;
|
|
552
|
+
});
|
|
553
|
+
const $type = computed(() => {
|
|
554
|
+
if (isFormRuleDefinition(rule) && rule.value.type) {
|
|
555
|
+
return rule.value.type;
|
|
556
|
+
} else {
|
|
557
|
+
return ruleKey;
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
const $validator = computed(() => {
|
|
561
|
+
if (isFormRuleDefinition(rule)) {
|
|
562
|
+
return rule.value.validator;
|
|
563
|
+
} else {
|
|
564
|
+
return rule.value;
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
const $params = computed(() => {
|
|
568
|
+
if (typeof rule.value === "function") {
|
|
569
|
+
return [];
|
|
570
|
+
}
|
|
571
|
+
return unwrapRuleParameters(rule.value._params ?? []);
|
|
572
|
+
});
|
|
573
|
+
const $path = computed(() => `${path}.${$type.value}`);
|
|
574
|
+
return {
|
|
575
|
+
$active,
|
|
576
|
+
$message,
|
|
577
|
+
$type,
|
|
578
|
+
$validator,
|
|
579
|
+
$params,
|
|
580
|
+
$path
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
$unwatchState = watch(scopeState.$params, $validate, {
|
|
584
|
+
deep: true
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
$watch();
|
|
588
|
+
async function computeAsyncResult(promise) {
|
|
589
|
+
let ruleResult = false;
|
|
590
|
+
try {
|
|
591
|
+
$valid.value = true;
|
|
592
|
+
if ($dirty.value) {
|
|
593
|
+
$pending.value = true;
|
|
594
|
+
}
|
|
595
|
+
const promiseResult = await promise;
|
|
596
|
+
if (typeof promiseResult === "boolean") {
|
|
597
|
+
ruleResult = promiseResult;
|
|
598
|
+
} else {
|
|
599
|
+
const { $valid: $valid2, ...rest } = promiseResult;
|
|
600
|
+
ruleResult = $valid2;
|
|
601
|
+
$metadata.value = rest;
|
|
602
|
+
}
|
|
603
|
+
} catch (e) {
|
|
604
|
+
ruleResult = false;
|
|
605
|
+
} finally {
|
|
606
|
+
$pending.value = false;
|
|
607
|
+
}
|
|
608
|
+
return ruleResult;
|
|
609
|
+
}
|
|
610
|
+
const $computeAsyncDebounce = debounce(computeAsyncResult, $debounce ?? 100);
|
|
611
|
+
async function $validate() {
|
|
612
|
+
$validating.value = true;
|
|
613
|
+
const validator = scopeState.$validator.value;
|
|
614
|
+
let ruleResult = false;
|
|
615
|
+
const resultOrPromise = validator(state.value, ...scopeState.$params.value);
|
|
616
|
+
if (resultOrPromise instanceof Promise) {
|
|
617
|
+
const promiseDebounce = $computeAsyncDebounce(resultOrPromise);
|
|
618
|
+
ruleResult = await promiseDebounce;
|
|
619
|
+
} else {
|
|
620
|
+
if (resultOrPromise != null) {
|
|
621
|
+
if (typeof resultOrPromise === "boolean") {
|
|
622
|
+
ruleResult = resultOrPromise;
|
|
623
|
+
} else {
|
|
624
|
+
const { $valid: $valid2, ...rest } = resultOrPromise;
|
|
625
|
+
ruleResult = $valid2;
|
|
626
|
+
$metadata.value = rest;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
$valid.value = ruleResult;
|
|
631
|
+
$validating.value = false;
|
|
632
|
+
return ruleResult;
|
|
633
|
+
}
|
|
634
|
+
function $reset() {
|
|
635
|
+
$valid.value = true;
|
|
636
|
+
$metadata.value = {};
|
|
637
|
+
$pending.value = false;
|
|
638
|
+
$validating.value = false;
|
|
639
|
+
$watch();
|
|
640
|
+
}
|
|
641
|
+
function $unwatch() {
|
|
642
|
+
$unwatchState();
|
|
643
|
+
scope.stop();
|
|
644
|
+
scope = effectScope();
|
|
645
|
+
}
|
|
646
|
+
return reactive({
|
|
647
|
+
...scopeState,
|
|
648
|
+
$pending,
|
|
649
|
+
$valid,
|
|
650
|
+
$metadata,
|
|
651
|
+
$validate,
|
|
652
|
+
$unwatch,
|
|
653
|
+
$watch,
|
|
654
|
+
$reset
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
// src/core/useRegle/useStateProperties/createReactiveFieldStatus.ts
|
|
659
|
+
function createReactiveFieldStatus({
|
|
660
|
+
state,
|
|
661
|
+
rulesDef,
|
|
662
|
+
customMessages,
|
|
663
|
+
path,
|
|
664
|
+
storage,
|
|
665
|
+
options,
|
|
666
|
+
externalErrors,
|
|
667
|
+
index,
|
|
668
|
+
onUnwatch
|
|
669
|
+
}) {
|
|
670
|
+
let scope = effectScope();
|
|
671
|
+
let scopeState;
|
|
672
|
+
const $dirty = ref(false);
|
|
673
|
+
const triggerPunishment = ref(false);
|
|
674
|
+
const $externalErrors = ref([]);
|
|
675
|
+
let $unwatchState;
|
|
676
|
+
let $unwatchValid;
|
|
677
|
+
let $unwatchExternalErrors;
|
|
678
|
+
let $unwatchDirty;
|
|
679
|
+
let $commit = () => {
|
|
680
|
+
};
|
|
681
|
+
function collectExternalErrors() {
|
|
682
|
+
$externalErrors.value = externalErrors.value ?? [];
|
|
683
|
+
}
|
|
684
|
+
collectExternalErrors();
|
|
685
|
+
function createReactiveRulesResult() {
|
|
686
|
+
const declaredRules = rulesDef.value;
|
|
687
|
+
const storeResult = storage.checkRuleDeclEntry(path, declaredRules);
|
|
688
|
+
$localOptions.value = Object.fromEntries(
|
|
689
|
+
Object.entries(declaredRules).filter(([ruleKey]) => ruleKey.startsWith("$"))
|
|
690
|
+
);
|
|
691
|
+
$rules.value = Object.fromEntries(
|
|
692
|
+
Object.entries(rulesDef.value).filter(([ruleKey]) => !ruleKey.startsWith("$")).map(([ruleKey, rule]) => {
|
|
693
|
+
if (rule) {
|
|
694
|
+
const ruleRef = toRef(() => rule);
|
|
695
|
+
return [
|
|
696
|
+
ruleKey,
|
|
697
|
+
createReactiveRuleStatus({
|
|
698
|
+
$dirty,
|
|
699
|
+
customMessages,
|
|
700
|
+
rule: ruleRef,
|
|
701
|
+
ruleKey,
|
|
702
|
+
state,
|
|
703
|
+
path,
|
|
704
|
+
storage,
|
|
705
|
+
$debounce: $localOptions.value.$debounce
|
|
706
|
+
})
|
|
707
|
+
];
|
|
708
|
+
}
|
|
709
|
+
return [];
|
|
710
|
+
}).filter((ruleDef) => !!ruleDef.length)
|
|
711
|
+
);
|
|
712
|
+
$watch();
|
|
713
|
+
$commit = scopeState.$debounce.value ? debounce($commitHandler, scopeState.$debounce.value ?? 0) : $commitHandler;
|
|
714
|
+
if (storeResult?.valid != null) {
|
|
715
|
+
$dirty.value = storage.getDirtyState(path);
|
|
716
|
+
if ($dirty.value) {
|
|
717
|
+
$commit();
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
storage.addRuleDeclEntry(path, declaredRules);
|
|
721
|
+
}
|
|
722
|
+
function $unwatch() {
|
|
723
|
+
if ($rules.value) {
|
|
724
|
+
Object.entries($rules.value).forEach(([_, rule]) => {
|
|
725
|
+
rule.$unwatch();
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
$unwatchDirty();
|
|
729
|
+
if ($dirty.value) {
|
|
730
|
+
storage.setDirtyEntry(path, $dirty.value);
|
|
731
|
+
}
|
|
732
|
+
$unwatchState();
|
|
733
|
+
$unwatchValid();
|
|
734
|
+
$unwatchExternalErrors();
|
|
735
|
+
scope.stop();
|
|
736
|
+
scope = effectScope();
|
|
737
|
+
onUnwatch?.();
|
|
738
|
+
}
|
|
739
|
+
function $watch() {
|
|
740
|
+
if ($rules.value) {
|
|
741
|
+
Object.entries($rules.value).forEach(([_, rule]) => {
|
|
742
|
+
rule.$watch();
|
|
743
|
+
});
|
|
744
|
+
}
|
|
745
|
+
scopeState = scope.run(() => {
|
|
746
|
+
const $anyDirty = computed(() => $dirty.value);
|
|
747
|
+
const $debounce = computed(() => {
|
|
748
|
+
return $localOptions.value.$debounce;
|
|
749
|
+
});
|
|
750
|
+
const $lazy = computed(() => {
|
|
751
|
+
if ($localOptions.value.$lazy != null) {
|
|
752
|
+
return $localOptions.value.$lazy;
|
|
753
|
+
}
|
|
754
|
+
return unref(options.lazy);
|
|
755
|
+
});
|
|
756
|
+
const $rewardEarly = computed(() => {
|
|
757
|
+
if ($localOptions.value.$rewardEarly != null) {
|
|
758
|
+
return $localOptions.value.$rewardEarly;
|
|
759
|
+
}
|
|
760
|
+
return unref(options.rewardEarly);
|
|
761
|
+
});
|
|
762
|
+
const $autoDirty = computed(() => {
|
|
763
|
+
if ($localOptions.value.$autoDirty != null) {
|
|
764
|
+
return $localOptions.value.$autoDirty;
|
|
765
|
+
}
|
|
766
|
+
return unref(options.autoDirty);
|
|
767
|
+
});
|
|
768
|
+
const $error = computed(() => {
|
|
769
|
+
return $invalid.value && !$pending.value && $dirty.value;
|
|
770
|
+
});
|
|
771
|
+
const $errors = computed(() => {
|
|
772
|
+
return extractRulesErrors({
|
|
773
|
+
field: {
|
|
774
|
+
$dirty: $dirty.value,
|
|
775
|
+
$externalErrors: $externalErrors.value,
|
|
776
|
+
$rules: $rules.value
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
});
|
|
780
|
+
const $silentErrors = computed(() => {
|
|
781
|
+
return extractRulesErrors({
|
|
782
|
+
field: {
|
|
783
|
+
$dirty: $dirty.value,
|
|
784
|
+
$externalErrors: $externalErrors.value,
|
|
785
|
+
$rules: $rules.value
|
|
786
|
+
},
|
|
787
|
+
silent: true
|
|
788
|
+
});
|
|
789
|
+
});
|
|
790
|
+
const $pending = computed(() => {
|
|
791
|
+
if (triggerPunishment.value || !$rewardEarly.value) {
|
|
792
|
+
return Object.entries($rules.value).some(([key, ruleResult]) => {
|
|
793
|
+
return ruleResult.$pending;
|
|
794
|
+
});
|
|
795
|
+
}
|
|
796
|
+
return false;
|
|
797
|
+
});
|
|
798
|
+
const $invalid = computed(() => {
|
|
799
|
+
if ($externalErrors.value?.length) {
|
|
800
|
+
return true;
|
|
801
|
+
} else if (!$rewardEarly.value || $rewardEarly.value && triggerPunishment.value) {
|
|
802
|
+
return Object.entries($rules.value).some(([key, ruleResult]) => {
|
|
803
|
+
return !ruleResult.$valid;
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
return false;
|
|
807
|
+
});
|
|
808
|
+
const $valid = computed(() => {
|
|
809
|
+
if ($dirty.value && !isEmpty(state.value)) {
|
|
810
|
+
if ($externalErrors.value?.length) {
|
|
811
|
+
return false;
|
|
812
|
+
} else if ($rewardEarly.value) {
|
|
813
|
+
return Object.entries($rules.value).every(([key, ruleResult]) => {
|
|
814
|
+
return ruleResult.$valid;
|
|
815
|
+
});
|
|
816
|
+
} else {
|
|
817
|
+
return !$invalid.value;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
return false;
|
|
821
|
+
});
|
|
822
|
+
watch($valid, (value) => {
|
|
823
|
+
if (value) {
|
|
824
|
+
triggerPunishment.value = false;
|
|
825
|
+
}
|
|
826
|
+
});
|
|
827
|
+
return {
|
|
828
|
+
$error,
|
|
829
|
+
$pending,
|
|
830
|
+
$invalid,
|
|
831
|
+
$valid,
|
|
832
|
+
$debounce,
|
|
833
|
+
$lazy,
|
|
834
|
+
$errors,
|
|
835
|
+
$silentErrors,
|
|
836
|
+
$rewardEarly,
|
|
837
|
+
$autoDirty,
|
|
838
|
+
$anyDirty
|
|
839
|
+
};
|
|
840
|
+
});
|
|
841
|
+
$unwatchExternalErrors = watch(externalErrors, collectExternalErrors);
|
|
842
|
+
$unwatchState = watch(
|
|
843
|
+
state,
|
|
844
|
+
() => {
|
|
845
|
+
if (scopeState.$autoDirty.value) {
|
|
846
|
+
if (!$dirty.value) {
|
|
847
|
+
$dirty.value = true;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
if (rulesDef.value instanceof Function) {
|
|
851
|
+
createReactiveRulesResult();
|
|
852
|
+
}
|
|
853
|
+
$commit();
|
|
854
|
+
if (!scopeState.$rewardEarly.value !== false) ;
|
|
855
|
+
},
|
|
856
|
+
{ deep: true }
|
|
857
|
+
);
|
|
858
|
+
$unwatchDirty = watch($dirty, () => {
|
|
859
|
+
storage.setDirtyEntry(path, $dirty.value);
|
|
860
|
+
});
|
|
861
|
+
$unwatchValid = watch(scopeState.$valid, (valid) => {
|
|
862
|
+
if (scopeState.$rewardEarly.value && valid) {
|
|
863
|
+
triggerPunishment.value = false;
|
|
864
|
+
}
|
|
865
|
+
});
|
|
866
|
+
}
|
|
867
|
+
function $commitHandler() {
|
|
868
|
+
Object.entries($rules.value).forEach(([key, rule]) => {
|
|
869
|
+
rule.$validate();
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
const $rules = ref();
|
|
873
|
+
const $localOptions = ref();
|
|
874
|
+
createReactiveRulesResult();
|
|
875
|
+
function $reset() {
|
|
876
|
+
$dirty.value = false;
|
|
877
|
+
$externalErrors.value = [];
|
|
878
|
+
Object.entries($rules.value).forEach(([key, rule]) => {
|
|
879
|
+
rule.$reset();
|
|
880
|
+
});
|
|
881
|
+
if (!scopeState.$lazy.value) {
|
|
882
|
+
Object.entries($rules.value).map(([key, rule]) => {
|
|
883
|
+
return rule.$validate();
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
function $touch() {
|
|
888
|
+
if (!$dirty.value) {
|
|
889
|
+
$dirty.value = true;
|
|
890
|
+
if (!scopeState.$rewardEarly.value !== false) ;
|
|
891
|
+
$commit();
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
const $validate = scopeState.$debounce.value ? debounce($validateHandler, scopeState.$debounce.value ?? 0) : $validateHandler;
|
|
895
|
+
async function $validateHandler() {
|
|
896
|
+
try {
|
|
897
|
+
triggerPunishment.value = true;
|
|
898
|
+
if (scopeState.$autoDirty.value && $dirty.value && !scopeState.$pending.value) {
|
|
899
|
+
return !scopeState.$error.value;
|
|
900
|
+
} else {
|
|
901
|
+
const promises = Object.entries($rules.value).map(([key, rule]) => {
|
|
902
|
+
return rule.$validate();
|
|
903
|
+
});
|
|
904
|
+
const results = await Promise.allSettled(promises);
|
|
905
|
+
return results.every((value) => {
|
|
906
|
+
if (value.status === "fulfilled") {
|
|
907
|
+
return value.value;
|
|
908
|
+
} else {
|
|
909
|
+
return false;
|
|
910
|
+
}
|
|
911
|
+
});
|
|
912
|
+
}
|
|
913
|
+
} catch (e) {
|
|
914
|
+
return false;
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
function $clearExternalErrors() {
|
|
918
|
+
$externalErrors.value = [];
|
|
919
|
+
}
|
|
920
|
+
if (!scopeState.$lazy.value) {
|
|
921
|
+
$validateHandler();
|
|
922
|
+
}
|
|
923
|
+
return reactive({
|
|
924
|
+
$dirty,
|
|
925
|
+
...scopeState,
|
|
926
|
+
$externalErrors,
|
|
927
|
+
$value: state,
|
|
928
|
+
$rules,
|
|
929
|
+
$reset,
|
|
930
|
+
$touch,
|
|
931
|
+
$validate,
|
|
932
|
+
$unwatch,
|
|
933
|
+
$watch,
|
|
934
|
+
$clearExternalErrors
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// src/core/useRegle/useStateProperties/createReactiveCollectionStatus.ts
|
|
939
|
+
function createCollectionElement({
|
|
940
|
+
$id,
|
|
941
|
+
path,
|
|
942
|
+
index,
|
|
943
|
+
options,
|
|
944
|
+
storage,
|
|
945
|
+
stateValue,
|
|
946
|
+
customMessages,
|
|
947
|
+
rules,
|
|
948
|
+
externalErrors
|
|
949
|
+
}) {
|
|
950
|
+
const $fieldId = rules.$key ? rules.$key : randomId();
|
|
951
|
+
let $path = `${path}.${String($fieldId)}`;
|
|
952
|
+
if (typeof stateValue.value === "object" && stateValue.value != null) {
|
|
953
|
+
if (!stateValue.value.$id) {
|
|
954
|
+
Object.defineProperties(stateValue.value, {
|
|
955
|
+
$id: {
|
|
956
|
+
value: $fieldId,
|
|
957
|
+
enumerable: false,
|
|
958
|
+
configurable: false,
|
|
959
|
+
writable: false
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
} else {
|
|
963
|
+
$path = `${path}.${stateValue.value.$id}`;
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
const $externalErrors = toRef(() => externalErrors.value?.[index]);
|
|
967
|
+
const $status = createReactiveChildrenStatus({
|
|
968
|
+
state: stateValue,
|
|
969
|
+
rulesDef: toRef(() => rules),
|
|
970
|
+
customMessages,
|
|
971
|
+
path: $path,
|
|
972
|
+
storage,
|
|
973
|
+
options,
|
|
974
|
+
externalErrors: $externalErrors
|
|
975
|
+
});
|
|
976
|
+
if ($status) {
|
|
977
|
+
const valueId = stateValue.value?.$id;
|
|
978
|
+
$status.$id = valueId ?? String($fieldId);
|
|
979
|
+
storage.addArrayStatus($id, $status.$id, $status);
|
|
980
|
+
}
|
|
981
|
+
return $status;
|
|
982
|
+
}
|
|
983
|
+
function createReactiveCollectionStatus({
|
|
984
|
+
state,
|
|
985
|
+
rulesDef,
|
|
986
|
+
customMessages,
|
|
987
|
+
path,
|
|
988
|
+
storage,
|
|
989
|
+
options,
|
|
990
|
+
externalErrors
|
|
991
|
+
}) {
|
|
992
|
+
let scope = effectScope();
|
|
993
|
+
let scopeState;
|
|
994
|
+
let immediateScope = effectScope();
|
|
995
|
+
let immediateScopeState;
|
|
996
|
+
if (Array.isArray(state.value) && !rulesDef.value.$each) {
|
|
997
|
+
return null;
|
|
998
|
+
}
|
|
999
|
+
const $id = ref();
|
|
1000
|
+
const $value = ref(state.value);
|
|
1001
|
+
let $unwatchState = null;
|
|
1002
|
+
const $fieldStatus = ref({});
|
|
1003
|
+
const $eachStatus = storage.getCollectionsEntry(path);
|
|
1004
|
+
immediateScopeState = immediateScope.run(() => {
|
|
1005
|
+
const isPrimitiveArray = computed(() => {
|
|
1006
|
+
if (Array.isArray(state.value) && state.value.length) {
|
|
1007
|
+
return state.value.some((s) => typeof s !== "object");
|
|
1008
|
+
} else if (rulesDef.value.$each && !(rulesDef.value.$each instanceof Function)) {
|
|
1009
|
+
return Object.values(rulesDef.value.$each).every((rule) => isRuleDef(rule));
|
|
1010
|
+
}
|
|
1011
|
+
return false;
|
|
1012
|
+
});
|
|
1013
|
+
const $externalErrorsField = computed(() => {
|
|
1014
|
+
if (externalErrors.value) {
|
|
1015
|
+
if (isExternalErrorCollection(externalErrors.value)) {
|
|
1016
|
+
return externalErrors.value.$errors ?? [];
|
|
1017
|
+
}
|
|
1018
|
+
return [];
|
|
1019
|
+
}
|
|
1020
|
+
return [];
|
|
1021
|
+
});
|
|
1022
|
+
const $externalErrorsEach = computed(() => {
|
|
1023
|
+
if (externalErrors.value) {
|
|
1024
|
+
if (isExternalErrorCollection(externalErrors.value)) {
|
|
1025
|
+
return externalErrors.value.$each ?? [];
|
|
1026
|
+
}
|
|
1027
|
+
return [];
|
|
1028
|
+
}
|
|
1029
|
+
return [];
|
|
1030
|
+
});
|
|
1031
|
+
return {
|
|
1032
|
+
isPrimitiveArray,
|
|
1033
|
+
$externalErrorsField,
|
|
1034
|
+
$externalErrorsEach
|
|
1035
|
+
};
|
|
1036
|
+
});
|
|
1037
|
+
createStatus();
|
|
1038
|
+
$watch();
|
|
1039
|
+
function createStatus() {
|
|
1040
|
+
if (typeof state.value === "object") {
|
|
1041
|
+
if (state.value != null && !state.value?.$id && state.value !== null) {
|
|
1042
|
+
$id.value = randomId();
|
|
1043
|
+
Object.defineProperties(state.value, {
|
|
1044
|
+
$id: {
|
|
1045
|
+
value: $id.value,
|
|
1046
|
+
enumerable: false,
|
|
1047
|
+
configurable: false,
|
|
1048
|
+
writable: false
|
|
1049
|
+
}
|
|
1050
|
+
});
|
|
1051
|
+
} else if (state.value?.$id) {
|
|
1052
|
+
$id.value = state.value.$id;
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
if (immediateScopeState.isPrimitiveArray.value) {
|
|
1056
|
+
return;
|
|
1057
|
+
}
|
|
1058
|
+
$value.value = $fieldStatus.value.$value;
|
|
1059
|
+
if (Array.isArray(state.value) && rulesDef.value.$each) {
|
|
1060
|
+
$eachStatus.value = state.value.map((value, index) => {
|
|
1061
|
+
const unwrapped$Each = unwrapGetter(
|
|
1062
|
+
rulesDef.value.$each,
|
|
1063
|
+
toRef(() => value),
|
|
1064
|
+
index
|
|
1065
|
+
);
|
|
1066
|
+
if (unwrapped$Each) {
|
|
1067
|
+
const element = createCollectionElement({
|
|
1068
|
+
$id: $id.value,
|
|
1069
|
+
path,
|
|
1070
|
+
rules: unwrapped$Each,
|
|
1071
|
+
stateValue: toRef(() => value),
|
|
1072
|
+
index,
|
|
1073
|
+
options,
|
|
1074
|
+
storage,
|
|
1075
|
+
externalErrors: immediateScopeState.$externalErrorsEach
|
|
1076
|
+
});
|
|
1077
|
+
if (element) {
|
|
1078
|
+
return element;
|
|
1079
|
+
}
|
|
1080
|
+
return null;
|
|
1081
|
+
}
|
|
1082
|
+
}).filter((each) => !!each);
|
|
1083
|
+
} else {
|
|
1084
|
+
$eachStatus.value = [];
|
|
1085
|
+
}
|
|
1086
|
+
$fieldStatus.value = createReactiveFieldStatus({
|
|
1087
|
+
state,
|
|
1088
|
+
rulesDef,
|
|
1089
|
+
customMessages,
|
|
1090
|
+
path,
|
|
1091
|
+
storage,
|
|
1092
|
+
options,
|
|
1093
|
+
externalErrors: immediateScopeState.$externalErrorsField
|
|
1094
|
+
});
|
|
1095
|
+
}
|
|
1096
|
+
function updateStatus() {
|
|
1097
|
+
if (Array.isArray(state.value)) {
|
|
1098
|
+
const previousStatus = cloneDeep($eachStatus.value);
|
|
1099
|
+
$eachStatus.value = state.value.map((value, index) => {
|
|
1100
|
+
const currentValue = toRef(() => value);
|
|
1101
|
+
if (value.$id && $eachStatus.value.find((each) => each.$id === value.$id)) {
|
|
1102
|
+
const existingStatus = storage.getArrayStatus($id.value, value.$id);
|
|
1103
|
+
if (existingStatus) {
|
|
1104
|
+
existingStatus.$value = currentValue;
|
|
1105
|
+
return existingStatus;
|
|
1106
|
+
}
|
|
1107
|
+
return null;
|
|
1108
|
+
} else {
|
|
1109
|
+
const unwrapped$Each = unwrapGetter(rulesDef.value.$each, currentValue, index);
|
|
1110
|
+
if (unwrapped$Each) {
|
|
1111
|
+
const element = createCollectionElement({
|
|
1112
|
+
$id: $id.value,
|
|
1113
|
+
path,
|
|
1114
|
+
rules: unwrapped$Each,
|
|
1115
|
+
stateValue: currentValue,
|
|
1116
|
+
index,
|
|
1117
|
+
options,
|
|
1118
|
+
storage,
|
|
1119
|
+
externalErrors: immediateScopeState.$externalErrorsEach
|
|
1120
|
+
});
|
|
1121
|
+
if (element) {
|
|
1122
|
+
return element;
|
|
1123
|
+
}
|
|
1124
|
+
return null;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
}).filter((each) => !!each);
|
|
1128
|
+
previousStatus.filter(($each) => !state.value.find((f) => $each.$id === f.$id)).forEach(($each, index) => {
|
|
1129
|
+
storage.deleteArrayStatus($id.value, index.toString());
|
|
1130
|
+
});
|
|
1131
|
+
} else {
|
|
1132
|
+
$eachStatus.value = [];
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
function $watch() {
|
|
1136
|
+
$unwatchState = watch(
|
|
1137
|
+
state,
|
|
1138
|
+
() => {
|
|
1139
|
+
if (state.value != null && !Object.hasOwn(state.value, "$id")) {
|
|
1140
|
+
createStatus();
|
|
1141
|
+
} else {
|
|
1142
|
+
updateStatus();
|
|
1143
|
+
}
|
|
1144
|
+
},
|
|
1145
|
+
{ deep: true, flush: "pre" }
|
|
1146
|
+
);
|
|
1147
|
+
scopeState = scope.run(() => {
|
|
1148
|
+
const $dirty = computed(() => {
|
|
1149
|
+
return $fieldStatus.value.$dirty && $eachStatus.value.every((statusOrField) => {
|
|
1150
|
+
return statusOrField.$dirty;
|
|
1151
|
+
});
|
|
1152
|
+
});
|
|
1153
|
+
const $anyDirty = computed(() => {
|
|
1154
|
+
return $fieldStatus.value.$anyDirty || $eachStatus.value.some((statusOrField) => {
|
|
1155
|
+
return statusOrField.$dirty;
|
|
1156
|
+
});
|
|
1157
|
+
});
|
|
1158
|
+
const $invalid = computed(() => {
|
|
1159
|
+
return $fieldStatus.value.$invalid || $eachStatus.value.some((statusOrField) => {
|
|
1160
|
+
return statusOrField.$invalid;
|
|
1161
|
+
});
|
|
1162
|
+
});
|
|
1163
|
+
const $valid = computed(
|
|
1164
|
+
() => $fieldStatus.value.$valid && $eachStatus.value.every((statusOrField) => {
|
|
1165
|
+
return statusOrField.$valid;
|
|
1166
|
+
})
|
|
1167
|
+
);
|
|
1168
|
+
const $error = computed(() => {
|
|
1169
|
+
return $fieldStatus.value.$error || $eachStatus.value.some((statusOrField) => {
|
|
1170
|
+
return statusOrField.$error;
|
|
1171
|
+
});
|
|
1172
|
+
});
|
|
1173
|
+
const $pending = computed(() => {
|
|
1174
|
+
return $fieldStatus.value.$pending || $eachStatus.value.some((statusOrField) => {
|
|
1175
|
+
return statusOrField.$pending;
|
|
1176
|
+
});
|
|
1177
|
+
});
|
|
1178
|
+
const $errors = computed(() => {
|
|
1179
|
+
return {
|
|
1180
|
+
$errors: extractRulesErrors({ field: $fieldStatus.value, silent: false }),
|
|
1181
|
+
$each: extractCollectionError($eachStatus.value)
|
|
1182
|
+
};
|
|
1183
|
+
});
|
|
1184
|
+
const $silentErrors = computed(() => {
|
|
1185
|
+
return {
|
|
1186
|
+
$errors: extractRulesErrors({ field: $fieldStatus.value, silent: true }),
|
|
1187
|
+
$each: extractCollectionError($eachStatus.value, true)
|
|
1188
|
+
};
|
|
1189
|
+
});
|
|
1190
|
+
return {
|
|
1191
|
+
$dirty,
|
|
1192
|
+
$anyDirty,
|
|
1193
|
+
$invalid,
|
|
1194
|
+
$valid,
|
|
1195
|
+
$error,
|
|
1196
|
+
$pending,
|
|
1197
|
+
$errors,
|
|
1198
|
+
$silentErrors
|
|
1199
|
+
};
|
|
1200
|
+
});
|
|
1201
|
+
if (immediateScopeState.isPrimitiveArray.value) {
|
|
1202
|
+
console.warn(
|
|
1203
|
+
`${path} is a Array of primitives. Tracking can be lost when reassigning the Array. We advise to use an Array of objects instead`
|
|
1204
|
+
);
|
|
1205
|
+
$unwatchState();
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
function $unwatch() {
|
|
1209
|
+
if ($unwatchState) {
|
|
1210
|
+
$unwatchState();
|
|
1211
|
+
}
|
|
1212
|
+
if ($fieldStatus.value) {
|
|
1213
|
+
$fieldStatus.value.$unwatch();
|
|
1214
|
+
}
|
|
1215
|
+
if ($eachStatus.value) {
|
|
1216
|
+
$eachStatus.value.forEach((element) => {
|
|
1217
|
+
if ("$dirty" in element) {
|
|
1218
|
+
element.$unwatch();
|
|
1219
|
+
}
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
scope.stop();
|
|
1223
|
+
scope = effectScope();
|
|
1224
|
+
immediateScope.stop();
|
|
1225
|
+
immediateScope = effectScope(true);
|
|
1226
|
+
}
|
|
1227
|
+
function $touch() {
|
|
1228
|
+
$fieldStatus.value.$touch();
|
|
1229
|
+
$eachStatus.value.forEach(($each) => {
|
|
1230
|
+
$each.$touch();
|
|
1231
|
+
});
|
|
1232
|
+
}
|
|
1233
|
+
function $reset() {
|
|
1234
|
+
$fieldStatus.value.$reset();
|
|
1235
|
+
$eachStatus.value.forEach(($each) => {
|
|
1236
|
+
$each.$reset();
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
async function $validate() {
|
|
1240
|
+
try {
|
|
1241
|
+
const results = await Promise.all([
|
|
1242
|
+
$fieldStatus.value.$validate(),
|
|
1243
|
+
...$eachStatus.value.map((rule) => {
|
|
1244
|
+
return rule.$validate();
|
|
1245
|
+
})
|
|
1246
|
+
]);
|
|
1247
|
+
return results.every((value) => !!value);
|
|
1248
|
+
} catch (e) {
|
|
1249
|
+
return false;
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
function $clearExternalErrors() {
|
|
1253
|
+
}
|
|
1254
|
+
return reactive({
|
|
1255
|
+
$field: $fieldStatus,
|
|
1256
|
+
...scopeState,
|
|
1257
|
+
$each: $eachStatus,
|
|
1258
|
+
$value: state,
|
|
1259
|
+
$validate,
|
|
1260
|
+
$unwatch,
|
|
1261
|
+
$watch,
|
|
1262
|
+
$touch,
|
|
1263
|
+
$reset,
|
|
1264
|
+
$clearExternalErrors
|
|
1265
|
+
});
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
// src/core/useRegle/useStateProperties/createReactiveNestedStatus.ts
|
|
1269
|
+
function createReactiveNestedStatus({
|
|
1270
|
+
scopeRules,
|
|
1271
|
+
state,
|
|
1272
|
+
customMessages,
|
|
1273
|
+
path = "",
|
|
1274
|
+
rootRules,
|
|
1275
|
+
storage,
|
|
1276
|
+
options,
|
|
1277
|
+
externalErrors,
|
|
1278
|
+
validationGroups
|
|
1279
|
+
}) {
|
|
1280
|
+
let scope;
|
|
1281
|
+
let scopeState;
|
|
1282
|
+
let $unwatchFields;
|
|
1283
|
+
function createReactiveFieldsStatus(watch5 = true, forceFromGetter = false) {
|
|
1284
|
+
$fields.value = null;
|
|
1285
|
+
triggerRef($fields);
|
|
1286
|
+
const scopedRulesStatus = Object.fromEntries(
|
|
1287
|
+
Object.entries(scopeRules.value).map(([statePropKey, statePropRules]) => {
|
|
1288
|
+
if (statePropRules) {
|
|
1289
|
+
const stateRef = toRef(state.value, statePropKey);
|
|
1290
|
+
const statePropRulesRef = toRef(() => statePropRules);
|
|
1291
|
+
const $externalErrors = toRef(() => externalErrors.value?.[statePropKey]);
|
|
1292
|
+
return [
|
|
1293
|
+
statePropKey,
|
|
1294
|
+
createReactiveChildrenStatus({
|
|
1295
|
+
state: stateRef,
|
|
1296
|
+
rulesDef: statePropRulesRef,
|
|
1297
|
+
customMessages,
|
|
1298
|
+
path: path ? `${path}.${statePropKey}` : statePropKey,
|
|
1299
|
+
storage,
|
|
1300
|
+
options,
|
|
1301
|
+
externalErrors: $externalErrors
|
|
1302
|
+
})
|
|
1303
|
+
];
|
|
1304
|
+
}
|
|
1305
|
+
return [];
|
|
1306
|
+
}).filter(
|
|
1307
|
+
(rule) => !!rule.length && rule[1] != null
|
|
1308
|
+
)
|
|
1309
|
+
);
|
|
1310
|
+
const externalRulesStatus = Object.fromEntries(
|
|
1311
|
+
Object.entries(unref(externalErrors) ?? {}).filter(([key]) => !(key in scopeRules.value)).map(([key, errors]) => {
|
|
1312
|
+
if (errors) {
|
|
1313
|
+
const statePropRulesRef = toRef(() => ({}));
|
|
1314
|
+
const $externalErrors = toRef(() => errors);
|
|
1315
|
+
return [
|
|
1316
|
+
key,
|
|
1317
|
+
createReactiveChildrenStatus({
|
|
1318
|
+
state: ref(void 0),
|
|
1319
|
+
rulesDef: statePropRulesRef,
|
|
1320
|
+
customMessages,
|
|
1321
|
+
path: path ? `${path}.${key}` : key,
|
|
1322
|
+
storage,
|
|
1323
|
+
options,
|
|
1324
|
+
externalErrors: $externalErrors
|
|
1325
|
+
})
|
|
1326
|
+
];
|
|
1327
|
+
}
|
|
1328
|
+
return [];
|
|
1329
|
+
})
|
|
1330
|
+
);
|
|
1331
|
+
const groups = Object.fromEntries(
|
|
1332
|
+
Object.entries(validationGroups?.(scopedRulesStatus) ?? {}).map(([key, entries]) => {
|
|
1333
|
+
if (entries.length) {
|
|
1334
|
+
return [
|
|
1335
|
+
key,
|
|
1336
|
+
{
|
|
1337
|
+
...Object.fromEntries(
|
|
1338
|
+
["$invalid", "$error", "$pending", "$dirty", "$valid"].map(
|
|
1339
|
+
(property) => [
|
|
1340
|
+
property,
|
|
1341
|
+
mergeBooleanGroupProperties(
|
|
1342
|
+
toRef(() => entries),
|
|
1343
|
+
property
|
|
1344
|
+
)
|
|
1345
|
+
]
|
|
1346
|
+
)
|
|
1347
|
+
),
|
|
1348
|
+
...Object.fromEntries(
|
|
1349
|
+
["$errors", "$silentErrors"].map((property) => [
|
|
1350
|
+
property,
|
|
1351
|
+
mergeArrayGroupProperties(
|
|
1352
|
+
toRef(() => entries),
|
|
1353
|
+
property
|
|
1354
|
+
)
|
|
1355
|
+
])
|
|
1356
|
+
)
|
|
1357
|
+
}
|
|
1358
|
+
];
|
|
1359
|
+
}
|
|
1360
|
+
return [];
|
|
1361
|
+
})
|
|
1362
|
+
);
|
|
1363
|
+
$fields.value = { ...scopedRulesStatus, ...externalRulesStatus, ...groups };
|
|
1364
|
+
if (watch5) {
|
|
1365
|
+
$watch();
|
|
1366
|
+
}
|
|
1367
|
+
}
|
|
1368
|
+
let $fields = storage.getFieldsEntry(path);
|
|
1369
|
+
createReactiveFieldsStatus();
|
|
1370
|
+
function $reset() {
|
|
1371
|
+
createReactiveFieldsStatus(false);
|
|
1372
|
+
Object.entries($fields.value).forEach(([_, statusOrField]) => {
|
|
1373
|
+
statusOrField.$reset();
|
|
1374
|
+
});
|
|
1375
|
+
$watch();
|
|
1376
|
+
}
|
|
1377
|
+
function $touch() {
|
|
1378
|
+
Object.entries($fields.value).forEach(([_, statusOrField]) => {
|
|
1379
|
+
statusOrField.$touch();
|
|
1380
|
+
});
|
|
1381
|
+
}
|
|
1382
|
+
async function $validate() {
|
|
1383
|
+
try {
|
|
1384
|
+
const results = await Promise.allSettled(
|
|
1385
|
+
Object.entries($fields.value).map(([_, statusOrField]) => {
|
|
1386
|
+
return statusOrField.$validate();
|
|
1387
|
+
})
|
|
1388
|
+
);
|
|
1389
|
+
return results.every((value) => {
|
|
1390
|
+
if (value.status === "fulfilled") {
|
|
1391
|
+
return value.value;
|
|
1392
|
+
} else {
|
|
1393
|
+
return false;
|
|
1394
|
+
}
|
|
1395
|
+
});
|
|
1396
|
+
} catch (e) {
|
|
1397
|
+
return false;
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
function $watch() {
|
|
1401
|
+
if (rootRules) {
|
|
1402
|
+
$unwatchFields = watch(
|
|
1403
|
+
rootRules,
|
|
1404
|
+
() => {
|
|
1405
|
+
$unwatch();
|
|
1406
|
+
createReactiveFieldsStatus();
|
|
1407
|
+
},
|
|
1408
|
+
{ deep: true, flush: "post" }
|
|
1409
|
+
);
|
|
1410
|
+
}
|
|
1411
|
+
scope = effectScope();
|
|
1412
|
+
scopeState = scope.run(() => {
|
|
1413
|
+
const $dirty = computed(() => {
|
|
1414
|
+
return !!Object.entries($fields.value).length && Object.entries($fields.value).every(([key, statusOrField]) => {
|
|
1415
|
+
return statusOrField.$dirty;
|
|
1416
|
+
});
|
|
1417
|
+
});
|
|
1418
|
+
const $anyDirty = computed(() => {
|
|
1419
|
+
return Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1420
|
+
return statusOrField.$dirty;
|
|
1421
|
+
});
|
|
1422
|
+
});
|
|
1423
|
+
const $invalid = computed(() => {
|
|
1424
|
+
return Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1425
|
+
return statusOrField.$invalid;
|
|
1426
|
+
});
|
|
1427
|
+
});
|
|
1428
|
+
const $valid = computed(() => {
|
|
1429
|
+
return Object.entries($fields.value).every(([key, statusOrField]) => {
|
|
1430
|
+
return statusOrField.$valid;
|
|
1431
|
+
});
|
|
1432
|
+
});
|
|
1433
|
+
const $error = computed(() => {
|
|
1434
|
+
return Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1435
|
+
return statusOrField.$error;
|
|
1436
|
+
});
|
|
1437
|
+
});
|
|
1438
|
+
const $pending = computed(() => {
|
|
1439
|
+
return Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1440
|
+
return statusOrField.$pending;
|
|
1441
|
+
});
|
|
1442
|
+
});
|
|
1443
|
+
const $errors = computed(() => {
|
|
1444
|
+
return extractNestedErrors($fields.value);
|
|
1445
|
+
});
|
|
1446
|
+
const $silentErrors = computed(() => {
|
|
1447
|
+
return extractNestedErrors($fields.value, true);
|
|
1448
|
+
});
|
|
1449
|
+
return {
|
|
1450
|
+
$dirty,
|
|
1451
|
+
$anyDirty,
|
|
1452
|
+
$invalid,
|
|
1453
|
+
$valid,
|
|
1454
|
+
$error,
|
|
1455
|
+
$pending,
|
|
1456
|
+
$errors,
|
|
1457
|
+
$silentErrors
|
|
1458
|
+
};
|
|
1459
|
+
});
|
|
1460
|
+
}
|
|
1461
|
+
function $unwatch() {
|
|
1462
|
+
if ($fields.value) {
|
|
1463
|
+
Object.entries($fields.value).forEach(([_, field]) => {
|
|
1464
|
+
field.$unwatch();
|
|
1465
|
+
});
|
|
1466
|
+
}
|
|
1467
|
+
$unwatchFields?.();
|
|
1468
|
+
scope.stop();
|
|
1469
|
+
scope = effectScope();
|
|
1470
|
+
}
|
|
1471
|
+
function $clearExternalErrors() {
|
|
1472
|
+
Object.entries($fields.value).forEach(([_, field]) => {
|
|
1473
|
+
field.$clearExternalErrors();
|
|
1474
|
+
});
|
|
1475
|
+
}
|
|
1476
|
+
return reactive({
|
|
1477
|
+
...scopeState,
|
|
1478
|
+
$fields,
|
|
1479
|
+
$value: state,
|
|
1480
|
+
$reset,
|
|
1481
|
+
$touch,
|
|
1482
|
+
$validate,
|
|
1483
|
+
$unwatch,
|
|
1484
|
+
$watch,
|
|
1485
|
+
$clearExternalErrors
|
|
1486
|
+
});
|
|
1487
|
+
}
|
|
1488
|
+
function createReactiveChildrenStatus({
|
|
1489
|
+
state,
|
|
1490
|
+
rulesDef,
|
|
1491
|
+
customMessages,
|
|
1492
|
+
path,
|
|
1493
|
+
storage,
|
|
1494
|
+
options,
|
|
1495
|
+
externalErrors,
|
|
1496
|
+
index,
|
|
1497
|
+
onUnwatch
|
|
1498
|
+
}) {
|
|
1499
|
+
if (isCollectionRulesDef(rulesDef)) {
|
|
1500
|
+
return createReactiveCollectionStatus({
|
|
1501
|
+
state,
|
|
1502
|
+
rulesDef,
|
|
1503
|
+
customMessages,
|
|
1504
|
+
path,
|
|
1505
|
+
storage,
|
|
1506
|
+
options,
|
|
1507
|
+
index,
|
|
1508
|
+
externalErrors
|
|
1509
|
+
});
|
|
1510
|
+
} else if (isNestedRulesDef(state, rulesDef) && isRefObject(state)) {
|
|
1511
|
+
return createReactiveNestedStatus({
|
|
1512
|
+
scopeRules: rulesDef,
|
|
1513
|
+
state,
|
|
1514
|
+
customMessages,
|
|
1515
|
+
path,
|
|
1516
|
+
storage,
|
|
1517
|
+
options,
|
|
1518
|
+
index,
|
|
1519
|
+
externalErrors
|
|
1520
|
+
});
|
|
1521
|
+
} else if (isValidatorRulesDef(rulesDef)) {
|
|
1522
|
+
return createReactiveFieldStatus({
|
|
1523
|
+
state,
|
|
1524
|
+
rulesDef,
|
|
1525
|
+
customMessages,
|
|
1526
|
+
path,
|
|
1527
|
+
storage,
|
|
1528
|
+
options,
|
|
1529
|
+
index,
|
|
1530
|
+
externalErrors,
|
|
1531
|
+
onUnwatch
|
|
1532
|
+
});
|
|
1533
|
+
}
|
|
1534
|
+
return null;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
// src/core/useRegle/useStateProperties/useStateProperties.ts
|
|
1538
|
+
function useStateProperties(scopeRules, state, options, customRules) {
|
|
1539
|
+
const storage = useStorage();
|
|
1540
|
+
const externalErrors = computed(() => unref(options.externalErrors));
|
|
1541
|
+
const regle = reactive(
|
|
1542
|
+
createReactiveNestedStatus({
|
|
1543
|
+
rootRules: scopeRules,
|
|
1544
|
+
scopeRules,
|
|
1545
|
+
state,
|
|
1546
|
+
customMessages: customRules?.(),
|
|
1547
|
+
storage,
|
|
1548
|
+
options,
|
|
1549
|
+
externalErrors,
|
|
1550
|
+
validationGroups: options.validationGroups
|
|
1551
|
+
})
|
|
1552
|
+
);
|
|
1553
|
+
const errors = useErrors(regle);
|
|
1554
|
+
return { regle, errors };
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
// src/core/useRegle/useRegle.ts
|
|
1558
|
+
function createUseRegleComposable(customRules, options) {
|
|
1559
|
+
const globalOptions = {
|
|
1560
|
+
autoDirty: options?.autoDirty ?? true,
|
|
1561
|
+
lazy: options?.lazy ?? false,
|
|
1562
|
+
rewardEarly: options?.rewardEarly ?? false
|
|
1563
|
+
};
|
|
1564
|
+
function useRegle2(state, rulesFactory, options2) {
|
|
1565
|
+
const scopeRules = isRef(rulesFactory) ? rulesFactory : computed(
|
|
1566
|
+
typeof rulesFactory === "function" ? rulesFactory : () => rulesFactory
|
|
1567
|
+
);
|
|
1568
|
+
const resolvedOptions = {
|
|
1569
|
+
...globalOptions,
|
|
1570
|
+
...options2
|
|
1571
|
+
};
|
|
1572
|
+
const processedState = isRef(state) ? state : ref(state);
|
|
1573
|
+
const initialState = cloneDeep(toRaw(processedState.value));
|
|
1574
|
+
const { regle, errors } = useStateProperties(
|
|
1575
|
+
scopeRules,
|
|
1576
|
+
processedState,
|
|
1577
|
+
resolvedOptions,
|
|
1578
|
+
customRules
|
|
1579
|
+
);
|
|
1580
|
+
function resetAll() {
|
|
1581
|
+
regle.$unwatch();
|
|
1582
|
+
resetValuesRecursively(state, initialState);
|
|
1583
|
+
regle.$reset();
|
|
1584
|
+
}
|
|
1585
|
+
function resetValuesRecursively(current, initial) {
|
|
1586
|
+
Object.entries(initial).forEach(([key, value]) => {
|
|
1587
|
+
let currentRef = isRef(current) ? current.value : current;
|
|
1588
|
+
let currentValue = isRef(currentRef[key]) ? currentRef[key].value : currentRef[key];
|
|
1589
|
+
let initialRef = isRef(initial[key]) ? initial[key]._value : initial[key];
|
|
1590
|
+
if (Array.isArray(initialRef) && Array.isArray(currentValue)) {
|
|
1591
|
+
currentRef[key] = [];
|
|
1592
|
+
initialRef.forEach((val, index) => {
|
|
1593
|
+
currentRef[key][index] = {};
|
|
1594
|
+
resetValuesRecursively(currentRef[key][index], initialRef[index]);
|
|
1595
|
+
});
|
|
1596
|
+
} else if (isObject(initialRef)) {
|
|
1597
|
+
resetValuesRecursively(currentValue, initialRef);
|
|
1598
|
+
} else {
|
|
1599
|
+
if (isRef(currentRef[key])) {
|
|
1600
|
+
currentRef[key].value = initialRef;
|
|
1601
|
+
} else {
|
|
1602
|
+
currentRef[key] = initialRef;
|
|
1603
|
+
}
|
|
1604
|
+
}
|
|
1605
|
+
});
|
|
1606
|
+
}
|
|
1607
|
+
const ready = computed(() => {
|
|
1608
|
+
return !(regle.$invalid || regle.$pending);
|
|
1609
|
+
});
|
|
1610
|
+
async function validateState() {
|
|
1611
|
+
regle.$touch();
|
|
1612
|
+
const result = await regle.$validate();
|
|
1613
|
+
if (result) {
|
|
1614
|
+
return processedState.value;
|
|
1615
|
+
}
|
|
1616
|
+
return false;
|
|
1617
|
+
}
|
|
1618
|
+
return {
|
|
1619
|
+
regle,
|
|
1620
|
+
errors,
|
|
1621
|
+
resetAll,
|
|
1622
|
+
validateState,
|
|
1623
|
+
ready,
|
|
1624
|
+
state: processedState
|
|
1625
|
+
};
|
|
1626
|
+
}
|
|
1627
|
+
return useRegle2;
|
|
1628
|
+
}
|
|
1629
|
+
var useRegle = createUseRegleComposable();
|
|
1630
|
+
|
|
1631
|
+
// src/core/defineRegleConfig.ts
|
|
1632
|
+
function defineRegleConfig({
|
|
1633
|
+
rules,
|
|
1634
|
+
modifiers
|
|
1635
|
+
}) {
|
|
1636
|
+
const useRegle2 = createUseRegleComposable(rules, modifiers);
|
|
1637
|
+
return useRegle2;
|
|
1638
|
+
}
|
|
1639
|
+
|
|
1640
|
+
export { InternalRuleType, createRule, defineRegleConfig, unwrapRuleParameters, useRegle };
|
|
1641
|
+
//# sourceMappingURL=index.js.map
|
|
1642
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3JlL2NyZWF0ZVJ1bGUvdW53cmFwUnVsZVBhcmFtZXRlcnMudHMiLCIuLi9zcmMvY29yZS9jcmVhdGVSdWxlL2RlZmluZVJ1bGVQcm9jZXNzb3JzLnRzIiwiLi4vc3JjL2NvcmUvY3JlYXRlUnVsZS9jcmVhdGVSdWxlLnRzIiwiLi4vc3JjL3V0aWxzL29iamVjdC51dGlscy50cyIsIi4uL3NyYy91dGlscy9pc0VtcHR5LnRzIiwiLi4vc3JjL3V0aWxzL2RlYm91bmNlLnRzIiwiLi4vc3JjL2NvcmUvdXNlU3RvcmFnZS91c2VTdG9yYWdlLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvZ3VhcmRzL3J1bGVEZWYuZ3VhcmRzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvZ3VhcmRzL3J1bGUuc3RhdHVzLmd1YXJkcy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL2d1YXJkcy9ydWxlLmVycm9ycy5ndWFyZHMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS91c2VFcnJvcnMudHMiLCIuLi9zcmMvdHlwZXMvcnVsZXMvcnVsZS5pbnRlcm5hbC50eXBlcy50cyIsIi4uL3NyYy90eXBlcy91dGlscy9ncm91cHMudHMiLCIuLi9zcmMvdXRpbHMvcmFuZG9tSWQudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS91c2VTdGF0ZVByb3BlcnRpZXMvY3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMudHMiLCIuLi9zcmMvY29yZS91c2VSZWdsZS91c2VTdGF0ZVByb3BlcnRpZXMvY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL2NyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzLnRzIiwiLi4vc3JjL2NvcmUvdXNlUmVnbGUvdXNlU3RhdGVQcm9wZXJ0aWVzL3VzZVN0YXRlUHJvcGVydGllcy50cyIsIi4uL3NyYy9jb3JlL3VzZVJlZ2xlL3VzZVJlZ2xlLnRzIiwiLi4vc3JjL2NvcmUvZGVmaW5lUmVnbGVDb25maWcudHMiXSwibmFtZXMiOlsidmFsaWRhdG9yIiwiSW50ZXJuYWxSdWxlVHlwZSIsImNvbXB1dGVkIiwiJHZhbGlkIiwiZWZmZWN0U2NvcGUiLCJyZWYiLCJ0b1JlZiIsInVucmVmIiwid2F0Y2giLCJyZWFjdGl2ZSIsInVzZVJlZ2xlIiwib3B0aW9ucyIsImlzUmVmIiwidG9SYXciXSwibWFwcGluZ3MiOiI7OztBQU9PLFNBQVMscUJBQTRDLE1BQThCLEVBQUE7QUFDeEYsRUFBTyxPQUFBLE1BQUEsQ0FBTyxHQUFJLENBQUEsQ0FBQyxLQUFVLEtBQUE7QUFDM0IsSUFBQSxJQUFJLGlCQUFpQixRQUFVLEVBQUE7QUFDN0IsTUFBQSxPQUFPLEtBQU0sRUFBQTtBQUFBO0FBRWYsSUFBQSxPQUFPLE1BQU0sS0FBSyxDQUFBO0FBQUEsR0FDbkIsQ0FBQTtBQUNIO0FBTU8sU0FBUyxxQkFBNEMsTUFBOEIsRUFBQTtBQUN4RixFQUFPLE9BQUEsTUFBQSxDQUFPLEdBQUksQ0FBQSxDQUFDLEtBQVUsS0FBQTtBQUMzQixJQUFBLElBQUksaUJBQWlCLFFBQVUsRUFBQTtBQUM3QixNQUFPLE9BQUEsS0FBQTtBQUFBLEtBQ1QsTUFBQSxJQUFXLEtBQU0sQ0FBQSxLQUFLLENBQUcsRUFBQTtBQUN2QixNQUFPLE9BQUEsS0FBQTtBQUFBO0FBRVQsSUFBTyxPQUFBLEtBQUEsQ0FBTSxNQUFNLEtBQUssQ0FBQTtBQUFBLEdBQ3pCLENBQUE7QUFDSDtBQUtPLFNBQVMsNEJBQTRCLElBQXdCLEVBQUE7QUFDbEUsRUFBTSxNQUFBLE9BQUEsR0FBVSxLQUFLLFFBQVMsRUFBQTtBQUM5QixFQUFNLE1BQUEsZUFBQSxHQUFrQixPQUFRLENBQUEsUUFBQSxDQUFTLElBQUksQ0FBQTtBQUM3QyxFQUFBLE1BQU0sTUFBVSxHQUFBLENBQUEsZUFBQSxHQUFrQixPQUFRLENB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QUUsS0FBTSxDQUFBLFFBQUEsSUFBWSxLQUFNLENBQUEsUUFBQSxDQUFBO0FBQUEsS0FDbEMsQ0FBQTtBQUVELElBQUEsZUFBZSxhQUFvRSxHQUFBO0FBQ2pGLE1BQUEsS0FBQSxDQUFNLE1BQU8sRUFBQTtBQUNiLE1BQU0sTUFBQSxNQUFBLEdBQVMsTUFBTSxLQUFBLENBQU0sU0FBVSxFQUFBO0FBQ3JDLE1BQUEsSUFBSSxNQUFRLEVBQUE7QUFDVixRQUFBLE9BQU8sY0FBZSxDQUFBLEtBQUE7QUFBQTtBQUV4QixNQUFPLE9BQUEsS0FBQTtBQUFBO0FBR1QsSUFBTyxPQUFBO0FBQUEsTUFDTCxLQUFBO0FBQUEsTUFDQSxNQUFBO0FBQUEsTUFDQSxRQUFBO0FBQUEsTUFDQSxhQUFBO0FBQUEsTUFDQSxLQUFBO0FBQUEsTUFDQSxLQUFPLEVBQUE7QUFBQSxLQUNUO0FBQUE7QUFHRixFQUFPUSxPQUFBQSxTQUFBQTtBQUNUO0FBRU8sSUFBTSxXQUFXLHdCQUF5Qjs7O0FDaEkxQyxTQUFTLGlCQUFzRSxDQUFBO0FBQUEsRUFDcEYsS0FBQTtBQUFBLEVBQ0E7QUFDRixDQUdHLEVBQUE7QUFDRCxFQUFNQSxNQUFBQSxTQUFBQSxHQUFXLHdCQUF1QyxDQUFBLEtBQUEsRUFBTyxTQUFTLENBQUE7QUFFeEUsRUFBT0EsT0FBQUEsU0FBQUE7QUFDVCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUmVmLCB0b1JlZiwgdW5yZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUgeyBQYXJhbURlY2wgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbi8qKlxuICogUmV0dXJucyBhIGNsZWFuIGxpc3Qgb2YgcGFyYW1ldGVyc1xuICogUmVtb3ZpbmcgUmVmIGFuZCBleGVjdXRpbmcgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSB1bndyYXBlZCB2YWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW53cmFwUnVsZVBhcmFtZXRlcnM8VFBhcmFtcyBleHRlbmRzIGFueVtdPihwYXJhbXM6IFBhcmFtRGVjbFtdKTogVFBhcmFtcyB7XG4gIHJldHVybiBwYXJhbXMubWFwKChwYXJhbSkgPT4ge1xuICAgIGlmIChwYXJhbSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICByZXR1cm4gcGFyYW0oKTtcbiAgICB9XG4gICAgcmV0dXJuIHVucmVmKHBhcmFtKTtcbiAgfSkgYXMgVFBhcmFtcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2xlYW4gbGlzdCBvZiBwYXJhbWV0ZXJzXG4gKiBSZW1vdmluZyBSZWYgYW5kIGV4ZWN1dGluZyBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHVud3JhcGVkIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZVBhcmFtczxUUGFyYW1zIGV4dGVuZHMgYW55W10+KHBhcmFtczogUGFyYW1EZWNsW10pOiBUUGFyYW1zIHtcbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcbiAgICAgIHJldHVybiBwYXJhbTtcbiAgICB9IGVsc2UgaWYgKGlzUmVmKHBhcmFtKSkge1xuICAgICAgcmV0dXJuIHBhcmFtO1xuICAgIH1cbiAgICByZXR1cm4gdG9SZWYoKCkgPT4gcGFyYW0pO1xuICB9KSBhcyBUUGFyYW1zO1xufVxuXG4vKipcbiAqIER1ZSB0byBgZnVuY3Rpb24ubGVuZ3RoYCBub3QgcmV0dXJuaW5nIGRlZmF1bHQgcGFyYW1ldGVycywgaXQgbmVlZCB0byBwYXJzZSB0aGUgZnVuYy50b1N0cmluZygpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvblBhcmFtZXRlcnNMZW5ndGgoZnVuYzogRnVuY3Rpb24pOiBudW1iZXIge1xuICBjb25zdCBmdW5jU3RyID0gZnVuYy50b1N0cmluZygpO1xuICBjb25zdCBpc0Fycm93RnVuY3Rpb24gPSBmdW5jU3RyLmluY2x1ZGVzKCc9PicpO1xuICBjb25zdCBwYXJhbXMgPSAoaXNBcnJvd0Z1bmN0aW9uID8gZnVuY1N0ci5zcGxpdCgnPT4nKVswXSA6IGZ1bmNTdHIpXG4gICAgLnNsaWNlKGZ1bmNTdHIuaW5kZXhPZignKCcpICsgMSwgZnVuY1N0ci5pbmRleE9mKCcpJykpXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKChwYXJhbSkgPT4gcGFyYW0udHJpbSgpKTtcbiAgY29uc3QgZGVmYXVsdHMgPSBwYXJhbXMuZmlsdGVyKChwYXJhbSkgPT4gcGFyYW0uaW5jbHVkZXMoJz0nKSk7XG4gIHJldHVybiBkZWZhdWx0cy5sZW5ndGggKyBmdW5jLmxlbmd0aDtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgJEludGVybmFsUmVnbGVSdWxlSW5pdCxcbiAgJEludGVybmFsUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZVBhcmFtcywgdW53cmFwUnVsZVBhcmFtZXRlcnMgfSBmcm9tICcuL3Vud3JhcFJ1bGVQYXJhbWV0ZXJzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJ1bGVQcm9jZXNzb3JzKFxuICBkZWZpbml0aW9uOiAkSW50ZXJuYWxSZWdsZVJ1bGVJbml0LFxuICAuLi5wYXJhbXM6IGFueVtdXG4pOiAkSW50ZXJuYWxSZWdsZVJ1bGVEZWZpbml0aW9uIHtcbiAgY29uc3QgeyBtZXNzYWdlLCB2YWxpZGF0b3IsIGFjdGl2ZSwgLi4ucHJvcGVydGllcyB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBpc0FzeW5jID0gdmFsaWRhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcblxuICBjb25zdCBkZWZhdWx0UHJvY2Vzc29ycyA9IHtcbiAgICB2YWxpZGF0b3IodmFsdWU6IGFueSwgLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBkZWZpbml0aW9uLnZhbGlkYXRvcih2YWx1ZSwgLi4udW53cmFwUnVsZVBhcmFtZXRlcnMoYXJncy5sZW5ndGggPyBhcmdzIDogcGFyYW1zKSk7XG4gICAgfSxcbiAgICBtZXNzYWdlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiAkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZmluaXRpb24ubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZGVmaW5pdGlvbi5tZXNzYWdlKHZhbHVlLCB7XG4gICAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgICAgJHBhcmFtczogdW53cmFwUnVsZVBhcmFtZXRlcnMobWV0YWRhdGEuJHBhcmFtcz8ubGVuZ3RoID8gbWV0YWRhdGEuJHBhcmFtcyA6IHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb24ubWVzc2FnZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWN0aXZlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiAkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSB7XG4gICAgICBpZiAodHlwZW9mIGRlZmluaXRpb24uYWN0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uLmFjdGl2ZSh2YWx1ZSwge1xuICAgICAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgICAgICRwYXJhbXM6IHVud3JhcFJ1bGVQYXJhbWV0ZXJzKG1ldGFkYXRhLiRwYXJhbXM/Lmxlbmd0aCA/IG1ldGFkYXRhLiRwYXJhbXMgOiBwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uLmFjdGl2ZSA/PyB0cnVlO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXhlYyh2YWx1ZTogYW55KSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSBkZWZpbml0aW9uLnZhbGlkYXRvcih2YWx1ZSwgLi4udW53cmFwUnVsZVBhcmFtZXRlcnMocGFyYW1zKSk7XG4gICAgICBsZXQgcmF3UmVzdWx0OiBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb247XG4gICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJhd1Jlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAodHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ29iamVjdCcgJiYgJyR2YWxpZCcgaW4gcmF3UmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gcmF3UmVzdWx0LiR2YWxpZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHJhd1Jlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1Jlc3VsdCA9IHZhbGlkYXRvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByYXdSZXN1bHQgPT09ICdvYmplY3QnICYmICckdmFsaWQnIGluIHJhd1Jlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmF3UmVzdWx0LiR2YWxpZDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiByYXdSZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBwcm9jZXNzb3JzID0ge1xuICAgIC4uLmRlZmF1bHRQcm9jZXNzb3JzLFxuICAgIC4uLnByb3BlcnRpZXMsXG4gICAgLi4ue1xuICAgICAgX3ZhbGlkYXRvcjogZGVmaW5pdGlvbi52YWxpZGF0b3IgYXMgYW55LFxuICAgICAgX21lc3NhZ2U6IGRlZmluaXRpb24ubWVzc2FnZSxcbiAgICAgIF9hY3RpdmU6IGRlZmluaXRpb24uYWN0aXZlLFxuICAgICAgX3R5cGU6IGRlZmluaXRpb24udHlwZSxcbiAgICAgIF9wYXRjaGVkOiBmYWxzZSxcbiAgICAgIF9hc3luYzogaXNBc3luYyxcbiAgICAgIF9wYXJhbXM6IGNyZWF0ZVJlYWN0aXZlUGFyYW1zPG5ldmVyPihwYXJhbXMpLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHByb2Nlc3NvcnM7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEluZmVyUmVnbGVSdWxlLFxuICBSZWdsZVJ1bGVJbml0LFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZVR5cGVSZXR1cm4sXG4gIFJlZ2xlVW5pdmVyc2FsUGFyYW1zLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBkZWZpbmVSdWxlUHJvY2Vzc29ycyB9IGZyb20gJy4vZGVmaW5lUnVsZVByb2Nlc3NvcnMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzTGVuZ3RoIH0gZnJvbSAnLi91bndyYXBSdWxlUGFyYW1ldGVycyc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDcmVhdGUgYSB0eXBlZCBjdXN0b20gcnVsZSB0aGF0IGNhbiBiZSB1c2VkIGxpa2UgZGVmYXVsdCBydWxlcy5cbiAqIEl0IGNhbiBhbHNvIGJlIGRlY2xhcmVkIGluIHRoZSBnbG9iYWwgb3B0aW9uc1xuICpcbiAqIEl0IHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgaWYgdGhlIHJ1bGUgaXMgYXN5bmNcbiAqXG4gKiBAdHlwZVBhcmFtIFRWYWx1ZSAtIFRoZSBpbnB1dCB2YWx1ZSB0aGUgcnVsZSBzaG91bGQgcmVjZWl2ZVxuICogQHR5cGVQYXJhbSBUUGFyYW1zIC0gVHVwbGUgZGVjbGFyYXRpb24gb2YgdGhlIHJ1bGUgcGFyYW1ldGVycyAoaWYgYW55KVxuICpcbiAqIEBwYXJhbSBkZWZpbml0aW9uIC0gVGhlIHJ1bGUgcHJvY2Vzc29ycyBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBBIHJ1bGUgZGVmaW5pdGlvbiB0aGF0IGNhbiBiZSBjYWxsYWJsZSBkZXBlbmRpbmcgb24gcGFyYW1zIHByZXNlbmNlXG4gKlxuICogQGV4ZW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gQ3JlYXRlIGEgc2ltcGxlIHJ1bGUgd2l0aCBubyBwYXJhbXNcbiAqIGltcG9ydCB7cnVsZUhlbHBlcnN9IGZyb20gJ0ByZWdsZS9ydWxlcyc7XG4gKlxuICogZXhwb3J0IGNvbnN0IGlzRm9vID0gY3JlYXRlUnVsZSh7XG4gKiAgIHZhbGlkYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gKiAgICAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAnZm9vJztcbiAqICAgICAgIH1cbiAqICAgICAgIHJldHVybiB0cnVlXG4gKiAgIH0sXG4gKiAgIG1lc3NhZ2U6IFwiVGhlIHZhbHVlIHNob3VsZCBiZSAnZm9vJ1wiXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSdWxlPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbiAgVEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyB0cnVlIDogZmFsc2UsXG4+KFxuICBkZWZpbml0aW9uOiBSZWdsZVJ1bGVJbml0PFRWYWx1ZSwgVFBhcmFtcywgVFJldHVybiwgVE1ldGFkYXRhLCBUQXN5bmM+XG4pOiBJbmZlclJlZ2xlUnVsZTxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYywgVE1ldGFkYXRhPiB7XG4gIGlmICh0eXBlb2YgZGVmaW5pdGlvbi52YWxpZGF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBsZXQgZmFrZVBhcmFtczogYW55W10gPSBbXTtcbiAgICBjb25zdCBzdGF0aWNQcm9jZXNzb3JzID0gZGVmaW5lUnVsZVByb2Nlc3NvcnMoZGVmaW5pdGlvbiBhcyBhbnksIC4uLmZha2VQYXJhbXMpO1xuXG4gICAgY29uc3QgaXNBc3luYyA9IGRlZmluaXRpb24udmFsaWRhdG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgICAvLyBGb3IgdmFsaWRhdG9ycyBuZWVkaW5nIGEgcGFyYW1zIGxpa2UgbWF4TGVuZ3RoIG9yIHJlcXVpcmVkSWZcbiAgICBpZiAoZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzTGVuZ3RoKGRlZmluaXRpb24udmFsaWRhdG9yKSA+IDEpIHtcbiAgICAgIC8vIEZvciB2YWxpZGF0b3JzIHdpdGggcGFyYW0sIHJldHVybiBhIGZ1bmN0aW9uIHByb3ZpZGluZyBwYXJhbXMgZm9yIGFsbCB0aGUgcnVsZSBwcm9jZXNzb3JzXG4gICAgICBjb25zdCBydWxlRmFjdG9yeSA9IGZ1bmN0aW9uICguLi5wYXJhbXM6IFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+KSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVSdWxlUHJvY2Vzc29ycyhkZWZpbml0aW9uIGFzIGFueSwgLi4ucGFyYW1zKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFzc2lnbiBhbGwgdGhlIGludGVybmFscyB0byB0aGUgcnVsZSByYXcgZnVuY3Rpb24gc28gdGhleSBhcmUgYWNjZXNzaWJsZSB3aXRob3V0IGNhbGxpbmcgaXRcbiAgICAgIHJ1bGVGYWN0b3J5LnZhbGlkYXRvciA9IHN0YXRpY1Byb2Nlc3NvcnMudmFsaWRhdG9yO1xuICAgICAgcnVsZUZhY3RvcnkubWVzc2FnZSA9IHN0YXRpY1Byb2Nlc3NvcnMubWVzc2FnZTtcbiAgICAgIHJ1bGVGYWN0b3J5LmFjdGl2ZSA9IHN0YXRpY1Byb2Nlc3NvcnMuYWN0aXZlO1xuICAgICAgcnVsZUZhY3RvcnkudHlwZSA9IHN0YXRpY1Byb2Nlc3NvcnMudHlwZTtcbiAgICAgIHJ1bGVGYWN0b3J5LmV4ZWMgPSBzdGF0aWNQcm9jZXNzb3JzLmV4ZWM7XG5cbiAgICAgIHJ1bGVGYWN0b3J5Ll92YWxpZGF0b3IgPSBzdGF0aWNQcm9jZXNzb3JzLnZhbGlkYXRvcjtcbiAgICAgIHJ1bGVGYWN0b3J5Ll9tZXNzYWdlID0gc3RhdGljUHJvY2Vzc29ycy5tZXNzYWdlO1xuICAgICAgcnVsZUZhY3RvcnkuX2FjdGl2ZSA9IHN0YXRpY1Byb2Nlc3NvcnMuYWN0aXZlO1xuICAgICAgcnVsZUZhY3RvcnkuX3R5cGUgPSBkZWZpbml0aW9uLnR5cGU7XG4gICAgICBydWxlRmFjdG9yeS5fcGF0Y2hlZCA9IGZhbHNlO1xuICAgICAgcnVsZUZhY3RvcnkuX2FzeW5jID0gaXNBc3luYyBhcyBUQXN5bmM7XG4gICAgICByZXR1cm4gcnVsZUZhY3RvcnkgYXMgYW55O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3RhdGljUHJvY2Vzc29ycyBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcignVmFsaWRhdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUgeyBNYXliZUdldHRlciB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KG9iajogdW5rbm93bik6IG9iaiBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZWZPYmplY3Qob2JqOiBSZWY8dW5rbm93bj4pOiBvYmogaXMgUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcmV0dXJuIGlzT2JqZWN0KG9iai52YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZURlZXA8VD4ob2JqOiBUKTogVCB7XG4gIGxldCByZXN1bHQgPSBvYmogYXMgYW55O1xuICBsZXQgdHlwZSA9IHt9LnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSk7XG4gIGlmICh0eXBlID09ICdTZXQnKSB7XG4gICAgcmVzdWx0ID0gbmV3IFNldChbLi4uKG9iaiBhcyBhbnkpXS5tYXAoKHZhbHVlKSA9PiBjbG9uZURlZXAodmFsdWUpKSk7XG4gIH1cbiAgaWYgKHR5cGUgPT0gJ01hcCcpIHtcbiAgICByZXN1bHQgPSBuZXcgTWFwKFsuLi4ob2JqIGFzIGFueSldLm1hcCgoa3YpID0+IFtjbG9uZURlZXAoa3ZbMF0pLCBjbG9uZURlZXAoa3ZbMV0pXSkpO1xuICB9XG4gIGlmICh0eXBlID09ICdEYXRlJykge1xuICAgIHJlc3VsdCA9IG5ldyBEYXRlKChvYmogYXMgYW55KS5nZXRUaW1lKCkpO1xuICB9XG4gIGlmICh0eXBlID09ICdSZWdFeHAnKSB7XG4gICAgcmVzdWx0ID0gUmVnRXhwKChvYmogYXMgYW55KS5zb3VyY2UsIGdldFJlZ0V4cEZsYWdzKG9iaikpO1xuICB9XG4gIGlmICh0eXBlID09ICdBcnJheScgfHwgdHlwZSA9PSAnT2JqZWN0Jykge1xuICAgIHJlc3VsdCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgLy8gaW5jbHVkZSBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgcmVzdWx0W2tleV0gPSBjbG9uZURlZXAob2JqW2tleV0pO1xuICAgIH1cbiAgfVxuICAvLyBwcmltaXRpdmVzIGFuZCBub24tc3VwcG9ydGVkIG9iamVjdHMgKGUuZy4gZnVuY3Rpb25zKSBsYW5kIGhlcmVcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnRXhwRmxhZ3MocmVnRXhwOiBhbnkpIHtcbiAgaWYgKHR5cGVvZiByZWdFeHAuc291cmNlLmZsYWdzID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlZ0V4cC5zb3VyY2UuZmxhZ3M7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZsYWdzID0gW107XG4gICAgcmVnRXhwLmdsb2JhbCAmJiBmbGFncy5wdXNoKCdnJyk7XG4gICAgcmVnRXhwLmlnbm9yZUNhc2UgJiYgZmxhZ3MucHVzaCgnaScpO1xuICAgIHJlZ0V4cC5tdWx0aWxpbmUgJiYgZmxhZ3MucHVzaCgnbScpO1xuICAgIHJlZ0V4cC5zdGlja3kgJiYgZmxhZ3MucHVzaCgneScpO1xuICAgIHJlZ0V4cC51bmljb2RlICYmIGZsYWdzLnB1c2goJ3UnKTtcbiAgICByZXR1cm4gZmxhZ3Muam9pbignJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud3JhcEdldHRlcjxUIGV4dGVuZHMgYW55PihcbiAgZ2V0dGVyOiBNYXliZUdldHRlcjxULCBhbnk+LFxuICB2YWx1ZTogUmVmPGFueT4sXG4gIGluZGV4PzogbnVtYmVyXG4pOiBUIHtcbiAgaWYgKGdldHRlciBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIGdldHRlcih2YWx1ZSwgaW5kZXggPz8gMCk7XG4gIH1cbiAgcmV0dXJuIGdldHRlcjtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIC8vIGludmFsaWQgZGF0ZSB3b24ndCBwYXNzXG4gICAgcmV0dXJuIGlzTmFOKHZhbHVlLmdldFRpbWUoKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gIVN0cmluZyh2YWx1ZS50cmltKCkpLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbnRlcmZhY2UgRGVib3VuY2VkRnVuY3Rpb24ge1xuICAoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgY2FuY2VsKCk6IHZvaWQ7XG4gIGRvSW1tZWRpYXRlbHkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlPFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGFueSB8IFByb21pc2U8YW55Pj4oXG4gIHRoaXM6IGFueSxcbiAgZnVuYzogVCxcbiAgd2FpdDogbnVtYmVyLFxuICBpbW1lZGlhdGU/OiBib29sZWFuXG4pOiBUIHtcbiAgbGV0IHRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZWJvdW5jZWRGbjogRGVib3VuY2VkRnVuY3Rpb24gPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWltbWVkaWF0ZSkge1xuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShmdW5jLmFwcGx5KHRoaXMsIFsuLi5hcmdzXSBhcyBhbnkpKS50aGVuKHJlc29sdmUpO1xuICAgICAgICB9XG4gICAgICB9LCB3YWl0KTtcbiAgICAgIGlmIChpbW1lZGlhdGUgJiYgIXRpbWVvdXQpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKGZ1bmMuYXBwbHkodGhpcywgWy4uLmFyZ3NdIGFzIGFueSkpLnRoZW4ocmVzb2x2ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgZGVib3VuY2VkRm4uY2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGRlYm91bmNlZEZuLmRvSW1tZWRpYXRlbHkgPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoZnVuYy5hcHBseSh0aGlzLCBbLi4uYXJnc10gYXMgYW55KSkudGhlbihyZXNvbHZlKTtcbiAgICAgIH0sIDApO1xuICAgIH0pO1xuXG4gIHJldHVybiBkZWJvdW5jZWRGbiBhcyB1bmtub3duIGFzIFQ7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBvblNjb3BlRGlzcG9zZSwgcmVmLCBzaGFsbG93UmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHsgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLCBSZWdsZVJ1bGVEZWNsIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdW53cmFwUnVsZVBhcmFtZXRlcnMgfSBmcm9tICcuLi9jcmVhdGVSdWxlL3Vud3JhcFJ1bGVQYXJhbWV0ZXJzJztcblxuZXhwb3J0IHR5cGUgU3RvcmVkUnVsZVN0YXR1cyA9IHtcbiAgJHZhbGlkOiBSZWY8Ym9vbGVhbj47XG4gICRwZW5kaW5nOiBSZWY8Ym9vbGVhbj47XG4gICRtZXRhZGF0YTogUmVmPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAkdmFsaWRhdGluZzogUmVmPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IHR5cGUgUmVnbGVTdG9yYWdlID0gUmV0dXJuVHlwZTx0eXBlb2YgdXNlU3RvcmFnZT47XG5cbi8qKlxuICogSW5zcGlyZWQgYnkgVnVlbGlkYXRlIHN0b3JhZ2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0b3JhZ2UoKSB7XG4gIGNvbnN0IHJ1bGVEZWNsU3RvcmFnZSA9IHNoYWxsb3dSZWYobmV3IE1hcDxzdHJpbmcsIFJlZ2xlUnVsZURlY2w8YW55LCBhbnk+PigpKTtcbiAgY29uc3QgZmllbGRzU3RvcmFnZSA9IHNoYWxsb3dSZWYoXG4gICAgbmV3IE1hcDxzdHJpbmcsIFJlZjxSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+Pj4oKVxuICApO1xuICBjb25zdCBjb2xsZWN0aW9uc1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBSZWY8QXJyYXk8JEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4+KCkpO1xuICBjb25zdCBkaXJ0eVN0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpKTtcbiAgY29uc3QgcnVsZVN0YXR1c1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCBTdG9yZWRSdWxlU3RhdHVzPigpKTtcblxuICBjb25zdCBhcnJheVN0YXR1c1N0b3JhZ2UgPSBzaGFsbG93UmVmKG5ldyBNYXA8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+KCkpO1xuXG4gIGZ1bmN0aW9uIGdldEZpZWxkc0VudHJ5KCRwYXRoOiBzdHJpbmcpOiBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRmllbGRzID0gZmllbGRzU3RvcmFnZS52YWx1ZS5nZXQoJHBhdGgpO1xuICAgIGlmIChleGlzdGluZ0ZpZWxkcykge1xuICAgICAgcmV0dXJuIGV4aXN0aW5nRmllbGRzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkZmllbGRzID0gcmVmKHt9KSBhcyBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj47XG4gICAgICBmaWVsZHNTdG9yYWdlLnZhbHVlLnNldCgkcGF0aCwgJGZpZWxkcyk7XG4gICAgICByZXR1cm4gJGZpZWxkcztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDb2xsZWN0aW9uc0VudHJ5KCRwYXRoOiBzdHJpbmcpOiBSZWY8QXJyYXk8JEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nRWFjaCA9IGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5nZXQoJHBhdGgpO1xuICAgIGlmIChleGlzdGluZ0VhY2gpIHtcbiAgICAgIHJldHVybiBleGlzdGluZ0VhY2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0ICRlYWNoID0gcmVmPEFycmF5PCRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZT4+KFtdKTtcbiAgICAgIGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5zZXQoJHBhdGgsICRlYWNoKTtcbiAgICAgIHJldHVybiAkZWFjaDtcbiAgICB9XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uc1xuXG4gIGZ1bmN0aW9uIGFkZEFycmF5U3RhdHVzKCRhcnJheUlkOiBzdHJpbmcsIGl0ZW1JZDogc3RyaW5nLCB2YWx1ZTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlKSB7XG4gICAgYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLnNldChgJHskYXJyYXlJZH0tJHtpdGVtSWR9YCwgdmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QXJyYXlTdGF0dXMoJGFycmF5SWQ6IHN0cmluZywgaXRlbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLmdldChgJHskYXJyYXlJZH0tJHtpdGVtSWR9YCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWxldGVBcnJheVN0YXR1cygkYXJyYXlJZDogc3RyaW5nLCBpdGVtSWQ/OiBzdHJpbmcpIHtcbiAgICBpZiAoJGFycmF5SWQgJiYgaXRlbUlkICE9IG51bGwpIHtcbiAgICAgIGFycmF5U3RhdHVzU3RvcmFnZS52YWx1ZS5kZWxldGUoYCR7JGFycmF5SWR9LSR7aXRlbUlkfWApO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldERpcnR5RW50cnkoJHBhdGg6IHN0cmluZywgZGlydHk6IGJvb2xlYW4pIHtcbiAgICBkaXJ0eVN0b3JhZ2UudmFsdWUuc2V0KCRwYXRoLCBkaXJ0eSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREaXJ0eVN0YXRlKHBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBkaXJ0eVN0b3JhZ2UudmFsdWUuZ2V0KHBhdGgpID8/IGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkUnVsZURlY2xFbnRyeSgkcGF0aDogc3RyaW5nLCBvcHRpb25zOiBSZWdsZVJ1bGVEZWNsPGFueSwgYW55Pikge1xuICAgIHJ1bGVEZWNsU3RvcmFnZS52YWx1ZS5zZXQoJHBhdGgsIG9wdGlvbnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tSdWxlRGVjbEVudHJ5KFxuICAgICRwYXRoOiBzdHJpbmcsXG4gICAgbmV3UnVsZXM6IFJlZ2xlUnVsZURlY2xcbiAgKTogeyB2YWxpZDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBzdG9yZWRSdWxlc0RlZnMgPSBydWxlRGVjbFN0b3JhZ2UudmFsdWUuZ2V0KCRwYXRoKTtcblxuICAgIGlmICghc3RvcmVkUnVsZXNEZWZzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc3RvcmVkUnVsZXMgPSBzdG9yZWRSdWxlc0RlZnM7XG5cbiAgICBjb25zdCBpc1ZhbGlkQ2FjaGUgPSBhcmVSdWxlc0NoYW5nZWQobmV3UnVsZXMsIHN0b3JlZFJ1bGVzKTtcblxuICAgIGlmICghaXNWYWxpZENhY2hlKSByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYXJlUnVsZXNDaGFuZ2VkKG5ld1J1bGVzOiBSZWdsZVJ1bGVEZWNsLCBzdG9yZWRSdWxlczogUmVnbGVSdWxlRGVjbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0b3JlZFJ1bGVzS2V5cyA9IE9iamVjdC5rZXlzKHN0b3JlZFJ1bGVzKTtcbiAgICBjb25zdCBuZXdSdWxlc0tleXMgPSBPYmplY3Qua2V5cyhuZXdSdWxlcyk7XG5cbiAgICBpZiAobmV3UnVsZXNLZXlzLmxlbmd0aCAhPT0gc3RvcmVkUnVsZXNLZXlzLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgaGFzQWxsVmFsaWRhdG9ycyA9IG5ld1J1bGVzS2V5cy5ldmVyeSgocnVsZUtleSkgPT4gc3RvcmVkUnVsZXNLZXlzLmluY2x1ZGVzKHJ1bGVLZXkpKTtcbiAgICBpZiAoIWhhc0FsbFZhbGlkYXRvcnMpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBuZXdSdWxlc0tleXMuZXZlcnkoKHJ1bGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IG5ld1J1bGVFbGVtZW50ID0gbmV3UnVsZXNbcnVsZUtleV07XG4gICAgICBjb25zdCBzdG9yZWRSdWxlRWxlbWVudCA9IHN0b3JlZFJ1bGVzW3J1bGVLZXldO1xuICAgICAgaWYgKFxuICAgICAgICAhc3RvcmVkUnVsZUVsZW1lbnQgfHxcbiAgICAgICAgIW5ld1J1bGVFbGVtZW50IHx8XG4gICAgICAgIHR5cGVvZiBuZXdSdWxlRWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICB0eXBlb2Ygc3RvcmVkUnVsZUVsZW1lbnQgPT09ICdmdW5jdGlvbidcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gJGRlYm91bmNlXG4gICAgICBpZiAodHlwZW9mIG5ld1J1bGVFbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8vICRsYXp5LCAkYXV0b0RpcnR5IGV0Yy4uXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXdSdWxlRWxlbWVudCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoIW5ld1J1bGVFbGVtZW50Ll9wYXJhbXMpIHJldHVybiB0cnVlO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXdSdWxlRWxlbWVudC5fcGFyYW1zPy5ldmVyeSgocGFyYW1LZXksIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzdG9yZWRSdWxlRWxlbWVudCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHN0b3JlZFJ1bGVFbGVtZW50ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yZWRQYXJhbXMgPSB1bndyYXBSdWxlUGFyYW1ldGVycyhzdG9yZWRSdWxlRWxlbWVudC5fcGFyYW1zIGFzIGFueVtdKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHVud3JhcFJ1bGVQYXJhbWV0ZXJzKG5ld1J1bGVFbGVtZW50Ll9wYXJhbXMgYXMgYW55W10pO1xuICAgICAgICAgICAgcmV0dXJuIHN0b3JlZFBhcmFtcz8uW2luZGV4XSA9PT0gbmV3UGFyYW1zPy5baW5kZXhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlTZXRSdWxlU3RhdHVzUmVmKHBhdGg6IHN0cmluZyk6IFN0b3JlZFJ1bGVTdGF0dXMge1xuICAgIGNvbnN0IHJ1bGVTdGF0dXMgPSBydWxlU3RhdHVzU3RvcmFnZS52YWx1ZS5nZXQocGF0aCk7XG4gICAgaWYgKHJ1bGVTdGF0dXMpIHtcbiAgICAgIHJldHVybiBydWxlU3RhdHVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCAkcGVuZGluZyA9IHJlZihmYWxzZSk7XG4gICAgICBjb25zdCAkdmFsaWQgPSByZWYodHJ1ZSk7XG4gICAgICBjb25zdCAkbWV0YWRhdGEgPSByZWYoe30pO1xuICAgICAgY29uc3QgJHZhbGlkYXRpbmcgPSByZWYoZmFsc2UpO1xuICAgICAgcnVsZVN0YXR1c1N0b3JhZ2UudmFsdWUuc2V0KHBhdGgsIHsgJHBlbmRpbmcsICR2YWxpZCwgJG1ldGFkYXRhLCAkdmFsaWRhdGluZyB9KTtcbiAgICAgIHJldHVybiB7ICRwZW5kaW5nLCAkdmFsaWQsICRtZXRhZGF0YSwgJHZhbGlkYXRpbmcgfTtcbiAgICB9XG4gIH1cblxuICBvblNjb3BlRGlzcG9zZSgoKSA9PiB7XG4gICAgcnVsZURlY2xTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gICAgZmllbGRzU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGNvbGxlY3Rpb25zU3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIGRpcnR5U3RvcmFnZS52YWx1ZS5jbGVhcigpO1xuICAgIHJ1bGVTdGF0dXNTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gICAgYXJyYXlTdGF0dXNTdG9yYWdlLnZhbHVlLmNsZWFyKCk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYWRkUnVsZURlY2xFbnRyeSxcbiAgICBzZXREaXJ0eUVudHJ5LFxuICAgIGNoZWNrUnVsZURlY2xFbnRyeSxcbiAgICBnZXREaXJ0eVN0YXRlLFxuICAgIHRyeVNldFJ1bGVTdGF0dXNSZWYsXG4gICAgZ2V0RmllbGRzRW50cnksXG4gICAgZ2V0Q29sbGVjdGlvbnNFbnRyeSxcbiAgICBnZXRBcnJheVN0YXR1cyxcbiAgICBhZGRBcnJheVN0YXR1cyxcbiAgICBkZWxldGVBcnJheVN0YXR1cyxcbiAgICBhcnJheVN0YXR1c1N0b3JhZ2UsXG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzLFxuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25SdWxlRGVjbCxcbiAgJEludGVybmFsUmVnbGVQYXJ0aWFsVmFsaWRhdGlvblRyZWUsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZURlY2wsXG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgTWF5YmVHZXR0ZXIsXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzT2JqZWN0LCB1bndyYXBHZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZFJ1bGVzRGVmKFxuICBzdGF0ZTogUmVmPHVua25vd24+LFxuICBydWxlczogUmVmPCRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzPlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPiB7XG4gIHJldHVybiAoXG4gICAgaXNPYmplY3Qoc3RhdGUudmFsdWUpICYmXG4gICAgaXNPYmplY3QocnVsZXMudmFsdWUpICYmXG4gICAgIU9iamVjdC5lbnRyaWVzKHJ1bGVzLnZhbHVlKS5zb21lKChydWxlKSA9PiBpc1J1bGVEZWYocnVsZSkpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25SdWxlc0RlZihcbiAgcnVsZXM6IFJlZjwkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcywgYW55PlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsPiB7XG4gIHJldHVybiAhIXJ1bGVzLnZhbHVlICYmICckZWFjaCcgaW4gcnVsZXMudmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkYXRvclJ1bGVzRGVmKFxuICBydWxlczogUmVmPCRJbnRlcm5hbEZvcm1Qcm9wZXJ0eVR5cGVzPlxuKTogcnVsZXMgaXMgUmVmPCRJbnRlcm5hbFJlZ2xlUnVsZURlY2w+IHtcbiAgcmV0dXJuICEhcnVsZXMudmFsdWUgJiYgaXNPYmplY3QocnVsZXMudmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSdWxlRGVmKHJ1bGU6IHVua25vd24pOiBydWxlIGlzIFJlZ2xlUnVsZURlZmluaXRpb248YW55LCBhbnk+IHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJ1bGUpICYmICdfdmFsaWRhdG9yJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtUnVsZURlZmluaXRpb24oXG4gIHJ1bGU6IFJlZjx1bmtub3duPlxuKTogcnVsZSBpcyBSZWY8UmVnbGVSdWxlRGVmaW5pdGlvbjxhbnksIGFueT4+IHtcbiAgcmV0dXJuICEodHlwZW9mIHJ1bGUudmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGb3JtSW5saW5lKFxuICBydWxlOiBSZWY8dW5rbm93bj5cbik6IHJ1bGUgaXMgUmVmPElubGluZVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueVtdLCBhbnk+PiB7XG4gIHJldHVybiB0eXBlb2YgcnVsZS52YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhdGVBcnJheShzdGF0ZTogUmVmPHVua25vd24+KTogc3RhdGUgaXMgUmVmPCh1bmtub3duICYgeyAkaWQ/OiBzdHJpbmcgfSlbXT4ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9ycyxcbiAgUmVnbGVFeHRlcm5hbEVycm9yVHJlZSxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05lc3RlZFJ1bGVzU3RhdHVzKHJ1bGU6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSk6IHJ1bGUgaXMgJEludGVybmFsUmVnbGVTdGF0dXMge1xuICByZXR1cm4gaXNPYmplY3QocnVsZSkgJiYgJyRmaWVsZHMnIGluIHJ1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cyhcbiAgcnVsZTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlXG4pOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyB7XG4gIHJldHVybiAhIXJ1bGUgJiYgJyRlYWNoJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFN0YXR1cyhydWxlOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUpOiBydWxlIGlzICRJbnRlcm5hbFJlZ2xlRmllbGRTdGF0dXMge1xuICByZXR1cm4gISFydWxlICYmICckcnVsZXMnIGluIHJ1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1J1bGVTdGF0dXMocnVsZTogdW5rbm93bik6IHJ1bGUgaXMgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJ1bGUpICYmICckdHlwZScgaW4gcnVsZSAmJiAnJG1lc3NhZ2UnIGluIHJ1bGU7XG59XG5cbi8vICAtLSBFeHRlcm5hbEVycm9yc1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOZXN0ZWRFeHRlcm5hbEVycm9yU3RhdHVzKFxuICBydWxlOiAkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzXG4pOiBydWxlIGlzIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWU8YW55PiB7XG4gIHJldHVybiAhIXJ1bGUgJiYgJyRlYWNoJyBpbiBydWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb2xsZWN0aW9uRXh0ZXJuYWxFcnJvclN0YXR1cyhcbiAgcnVsZTogJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1xuKTogcnVsZSBpcyBSZWdsZUV4dGVybmFsQ29sbGVjdGlvbkVycm9yczxhbnk+IHtcbiAgcmV0dXJuICEhcnVsZSAmJiAnJGVhY2gnIGluIHJ1bGU7XG59XG4iLCJpbXBvcnQgdHlwZSB7ICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnMsIFJlZ2xlRXh0ZXJuYWxDb2xsZWN0aW9uRXJyb3JzIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbihcbiAgdmFsdWU6ICRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNcbik6IHZhbHVlIGlzIFJlZ2xlRXh0ZXJuYWxDb2xsZWN0aW9uRXJyb3JzIHtcbiAgcmV0dXJuICckZWFjaCcgaW4gdmFsdWUgfHwgJyRlcnJvcnMnIGluIHZhbHVlO1xufVxuIiwiaW1wb3J0IHsgY29tcHV0ZWQgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlRXJyb3JzLFxuICAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXMsXG4gICRJbnRlcm5hbFJlZ2xlU3RhdHVzLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGUsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvblJ1bGVzU3RhdHVzLCBpc0ZpZWxkU3RhdHVzLCBpc05lc3RlZFJ1bGVzU3RhdHVzIH0gZnJvbSAnLi9ndWFyZHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgZmllbGQsXG4gIHNpbGVudCA9IGZhbHNlLFxufToge1xuICBmaWVsZDogUGljazwkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzLCAnJHJ1bGVzJyB8ICckZGlydHknIHwgJyRleHRlcm5hbEVycm9ycyc+O1xuICBzaWxlbnQ/OiBib29sZWFuO1xufSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpZWxkLiRydWxlcyA/PyB7fSlcbiAgICAubWFwKChbcnVsZUtleSwgcnVsZV0pID0+IHtcbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUuJG1lc3NhZ2U7XG4gICAgICB9IGVsc2UgaWYgKCFydWxlLiR2YWxpZCAmJiBmaWVsZC4kZGlydHkpIHtcbiAgICAgICAgcmV0dXJuIHJ1bGUuJG1lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pXG4gICAgLmZpbHRlcigobXNnKTogbXNnIGlzIHN0cmluZyB8IHN0cmluZ1tdID0+ICEhbXNnKVxuICAgIC5yZWR1Y2U8c3RyaW5nW10+KChhY2MsIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gYWNjPy5jb25jYXQoW3ZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYWNjPy5jb25jYXQodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIFtdKVxuICAgIC5jb25jYXQoZmllbGQuJGV4dGVybmFsRXJyb3JzID8/IFtdKTtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0ZpZWxkRXJyb3JzKFxuICBmaWVsZFN0YXR1czogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBzaWxlbnQgPSBmYWxzZVxuKTogJEludGVybmFsUmVnbGVFcnJvcnMge1xuICBpZiAoaXNOZXN0ZWRSdWxlc1N0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICByZXR1cm4gZXh0cmFjdE5lc3RlZEVycm9ycyhmaWVsZFN0YXR1cy4kZmllbGRzKTtcbiAgfSBlbHNlIGlmIChpc0NvbGxlY3Rpb25SdWxlc1N0YXR1cyhmaWVsZFN0YXR1cykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGVycm9yczogZmllbGRTdGF0dXMuJGZpZWxkLiRydWxlc1xuICAgICAgICA/IGV4dHJhY3RSdWxlc0Vycm9ycyh7IGZpZWxkOiBmaWVsZFN0YXR1cy4kZmllbGQsIHNpbGVudCB9KVxuICAgICAgICA6IFtdLFxuICAgICAgJGVhY2g6IGZpZWxkU3RhdHVzLiRlYWNoLm1hcCgoZmllbGQpID0+IHByb2Nlc3NGaWVsZEVycm9ycyhmaWVsZCwgc2lsZW50KSksXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgIGlmIChmaWVsZFN0YXR1cy4kZXJyb3IpIHtcbiAgICAgIHJldHVybiBleHRyYWN0UnVsZXNFcnJvcnMoe1xuICAgICAgICBmaWVsZDogZmllbGRTdGF0dXMsXG4gICAgICAgIHNpbGVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmllbGRTdGF0dXMuJGV4dGVybmFsRXJyb3JzID8/IFtdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKFxuICBlYWNoOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGVbXSxcbiAgc2lsZW50ID0gZmFsc2Vcbik6ICRJbnRlcm5hbFJlZ2xlRXJyb3JzW10ge1xuICByZXR1cm4gZWFjaC5tYXAoKGZpZWxkKSA9PiBwcm9jZXNzRmllbGRFcnJvcnMoZmllbGQsIHNpbGVudCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE5lc3RlZEVycm9ycyhcbiAgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU+IHwgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlW10sXG4gIHNpbGVudCA9IGZhbHNlXG4pOiBSZWNvcmQ8c3RyaW5nLCAkSW50ZXJuYWxSZWdsZUVycm9ycz4ge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykubWFwKChbZmllbGRLZXksIGZpZWxkU3RhdHVzXSkgPT4ge1xuICAgICAgaWYgKGlzTmVzdGVkUnVsZXNTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiBbZmllbGRLZXksIGV4dHJhY3ROZXN0ZWRFcnJvcnMoZmllbGRTdGF0dXMuJGZpZWxkcywgc2lsZW50KV07XG4gICAgICB9IGVsc2UgaWYgKGlzQ29sbGVjdGlvblJ1bGVzU3RhdHVzKGZpZWxkU3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGZpZWxkS2V5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgICRlcnJvcnM6IGV4dHJhY3RSdWxlc0Vycm9ycyh7IGZpZWxkOiBmaWVsZFN0YXR1cy4kZmllbGQsIHNpbGVudCB9KSxcbiAgICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKGZpZWxkU3RhdHVzLiRlYWNoLCBzaWxlbnQpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzRmllbGRTdGF0dXMoZmllbGRTdGF0dXMpKSB7XG4gICAgICAgIGlmIChmaWVsZFN0YXR1cy4kZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgZmllbGRLZXksXG4gICAgICAgICAgICBleHRyYWN0UnVsZXNFcnJvcnMoe1xuICAgICAgICAgICAgICBmaWVsZDogZmllbGRTdGF0dXMsXG4gICAgICAgICAgICAgIHNpbGVudCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtmaWVsZEtleSwgZmllbGRTdGF0dXMuJGV4dGVybmFsRXJyb3JzID8/IFtdXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtmaWVsZEtleSwgW11dO1xuICAgIH0pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VFcnJvcnMoJHJlZ2xlOiAkSW50ZXJuYWxSZWdsZVN0YXR1cykge1xuICBjb25zdCBlcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGV4dHJhY3ROZXN0ZWRFcnJvcnMoJHJlZ2xlLiRmaWVsZHMpO1xuICB9KTtcblxuICByZXR1cm4gZXJyb3JzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBNYXliZSB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHtcbiAgUG9zc2libGVSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyLFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG59IGZyb20gJy4vcnVsZS5kZWZpbml0aW9uLnR5cGUnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVVuaXZlcnNhbFBhcmFtcyB9IGZyb20gJy4vcnVsZS5wYXJhbXMudHlwZXMnO1xuXG4vKipcbiAqIEludGVybmFsIGRlZmluaXRpb24gb2YgdGhlIHJ1bGUsIGNhbiBiZSB1c2VkIHRvIHJlc2V0IG9yIHBhdGNoIHRoZSBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnbGVJbnRlcm5hbFJ1bGVEZWZzPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnkgPSBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSA9IFtdLFxuICBUQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IGJvb2xlYW4sXG4+IHtcbiAgX3ZhbGlkYXRvcjogKFxuICAgIHZhbHVlOiBNYXliZTxUVmFsdWU+LFxuICAgIC4uLmFyZ3M6IFRQYXJhbXNcbiAgKSA9PiBUQXN5bmMgZXh0ZW5kcyBmYWxzZSA/IFRNZXRhZGF0YSA6IFByb21pc2U8VE1ldGFkYXRhPjtcbiAgX21lc3NhZ2U6XG4gICAgfCBzdHJpbmdcbiAgICB8IHN0cmluZ1tdXG4gICAgfCAoKHZhbHVlOiBNYXliZTxUVmFsdWU+LCBtZXRhZGF0YTogUG9zc2libGVSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSk7XG4gIF9hY3RpdmU/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgKCh2YWx1ZTogTWF5YmU8VFZhbHVlPiwgbWV0YWRhdGE6IFBvc3NpYmxlUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcikgPT4gYm9vbGVhbik7XG4gIF90eXBlPzogc3RyaW5nO1xuICBfcGF0Y2hlZDogYm9vbGVhbjtcbiAgX3BhcmFtcz86IFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+O1xuICBfYXN5bmM6IFRBc3luYztcbn1cblxuZXhwb3J0IGVudW0gSW50ZXJuYWxSdWxlVHlwZSB7XG4gIElubGluZSA9ICdfX2lubGluZScsXG4gIEFzeW5jID0gJ19fYXN5bmMnLFxufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIHRvUmVmcyB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnkgfSBmcm9tICcuLi9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyhcbiAgZW50cmllczogUmVmPFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnlbXT4sXG4gIHByb3BlcnR5OiBFeHRyYWN0PFxuICAgIGtleW9mIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnksXG4gICAgJyRpbnZhbGlkJyB8ICckZXJyb3InIHwgJyRwZW5kaW5nJyB8ICckZGlydHknIHwgJyR2YWxpZCdcbiAgPlxuKSB7XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIGVudHJpZXMudmFsdWUuc29tZSgoZW50cnkpID0+IHtcbiAgICAgIHJldHVybiBlbnRyeVtwcm9wZXJ0eV07XG4gICAgfSk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMoXG4gIGVudHJpZXM6IFJlZjxSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+LFxuICBwcm9wZXJ0eTogRXh0cmFjdDxrZXlvZiBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5LCAnJGVycm9ycycgfCAnJHNpbGVudEVycm9ycyc+XG4pIHtcbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gZW50cmllcy52YWx1ZS5yZWR1Y2UoKGFsbCwgZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGZldGNoZWRQcm9wZXJ0eSA9IGVudHJ5W3Byb3BlcnR5XSB8fCBbXTtcbiAgICAgIHJldHVybiBhbGwuY29uY2F0KGZldGNoZWRQcm9wZXJ0eSk7XG4gICAgfSwgW10gYXMgc3RyaW5nW10pO1xuICB9KTtcbn1cbiIsImZ1bmN0aW9uIHVuaXF1ZUlETnV4dCgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIERhdGUubm93KCkpLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21JZCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gdW5pcXVlSUROdXh0KCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdWludDMyID0gd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTtcbiAgICByZXR1cm4gdWludDMyLnRvU3RyaW5nKDEwKTtcbiAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBlZmZlY3RTY29wZSwgcmVhY3RpdmUsIHRvUmF3LCB3YXRjaCB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cyxcbiAgQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWUsXG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFJ1bGVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVib3VuY2UsIGlzRW1wdHkgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyB1bndyYXBSdWxlUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL2NyZWF0ZVJ1bGUvdW53cmFwUnVsZVBhcmFtZXRlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi91c2VTdG9yYWdlJztcbmltcG9ydCB7IGlzRm9ybVJ1bGVEZWZpbml0aW9uIH0gZnJvbSAnLi4vZ3VhcmRzJztcblxuaW50ZXJmYWNlIENyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1c09wdGlvbnMge1xuICBzdGF0ZTogUmVmPHVua25vd24+O1xuICBydWxlS2V5OiBzdHJpbmc7XG4gIHJ1bGU6IFJlZjxJbmxpbmVSdWxlRGVjbGFyYXRpb248YW55LCBhbnlbXSwgYW55PiB8IFJlZ2xlUnVsZURlZmluaXRpb248YW55LCBhbnksIGFueT4+O1xuICAkZGlydHk6IFJlZjxib29sZWFuPjtcbiAgY3VzdG9tTWVzc2FnZXM/OiBQYXJ0aWFsPEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlPjtcbiAgcGF0aDogc3RyaW5nO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gICRkZWJvdW5jZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cyh7XG4gICRkaXJ0eSxcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHJ1bGUsXG4gIHJ1bGVLZXksXG4gIHN0YXRlLFxuICBwYXRoLFxuICBzdG9yYWdlLFxuICAkZGVib3VuY2UsXG59OiBDcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXNPcHRpb25zKTogJEludGVybmFsUmVnbGVSdWxlU3RhdHVzIHtcbiAgdHlwZSBTY29wZVN0YXRlID0ge1xuICAgICRhY3RpdmU6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRtZXNzYWdlOiBDb21wdXRlZFJlZjxzdHJpbmcgfCBzdHJpbmdbXT47XG4gICAgJHR5cGU6IENvbXB1dGVkUmVmPHN0cmluZz47XG4gICAgJHZhbGlkYXRvcjogQ29tcHV0ZWRSZWY8XG4gICAgICBSZWdsZVJ1bGVEZWZpbml0aW9uUHJvY2Vzc29yPFxuICAgICAgICBhbnksXG4gICAgICAgIGFueSxcbiAgICAgICAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uIHwgUHJvbWlzZTxSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24+XG4gICAgICA+XG4gICAgPjtcbiAgICAkcGFyYW1zOiBDb21wdXRlZFJlZjxhbnlbXT47XG4gICAgJHBhdGg6IENvbXB1dGVkUmVmPHN0cmluZz47XG4gIH07XG4gIGxldCBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIGxldCBzY29wZVN0YXRlITogU2NvcGVTdGF0ZTtcblxuICBsZXQgJHVud2F0Y2hTdGF0ZTogKCkgPT4gdm9pZDtcblxuICBjb25zdCB7ICRwZW5kaW5nLCAkdmFsaWQsICRtZXRhZGF0YSwgJHZhbGlkYXRpbmcgfSA9IHN0b3JhZ2UudHJ5U2V0UnVsZVN0YXR1c1JlZihcbiAgICBgJHtwYXRofS4ke3J1bGVLZXl9YFxuICApO1xuXG4gIGZ1bmN0aW9uICR3YXRjaCgpIHtcbiAgICBzY29wZVN0YXRlID0gc2NvcGUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0ICRkZWZhdWx0TWV0YWRhdGEgPSBjb21wdXRlZDwkSW50ZXJuYWxSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPigoKSA9PiAoe1xuICAgICAgICAkaW52YWxpZDogISR2YWxpZC52YWx1ZSxcbiAgICAgICAgJHBhcmFtczogJHBhcmFtcy52YWx1ZSxcbiAgICAgICAgLi4uJG1ldGFkYXRhLnZhbHVlLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCAkYWN0aXZlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICBpZiAoaXNGb3JtUnVsZURlZmluaXRpb24ocnVsZSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudmFsdWUuYWN0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS52YWx1ZS5hY3RpdmUoc3RhdGUudmFsdWUsICRkZWZhdWx0TWV0YWRhdGEudmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcnVsZS52YWx1ZS5hY3RpdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJG1lc3NhZ2UgPSBjb21wdXRlZDxzdHJpbmcgfCBzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTogc3RyaW5nIHwgc3RyaW5nW10gPSAnJztcbiAgICAgICAgY29uc3QgY3VzdG9tTWVzc2FnZVJ1bGUgPSBjdXN0b21NZXNzYWdlcyA/IGN1c3RvbU1lc3NhZ2VzW3J1bGVLZXldPy5tZXNzYWdlIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChjdXN0b21NZXNzYWdlUnVsZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tTWVzc2FnZVJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBjdXN0b21NZXNzYWdlUnVsZShzdGF0ZS52YWx1ZSwgJGRlZmF1bHRNZXRhZGF0YS52YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBjdXN0b21NZXNzYWdlUnVsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRm9ybVJ1bGVEZWZpbml0aW9uKHJ1bGUpKSB7XG4gICAgICAgICAgaWYgKCEoY3VzdG9tTWVzc2FnZVJ1bGUgJiYgIXJ1bGUudmFsdWUuX3BhdGNoZWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUudmFsdWUubWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gcnVsZS52YWx1ZS5tZXNzYWdlKHN0YXRlLnZhbHVlLCAkZGVmYXVsdE1ldGFkYXRhLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBydWxlLnZhbHVlLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRW1wdHkobWVzc2FnZSkpIHtcbiAgICAgICAgICBtZXNzYWdlID0gJ0Vycm9yJztcbiAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIGVycm9yIG1lc3NhZ2UgZGVmaW5lZCBmb3IgJHtwYXRofS4ke3J1bGVLZXl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdHlwZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKGlzRm9ybVJ1bGVEZWZpbml0aW9uKHJ1bGUpICYmIHJ1bGUudmFsdWUudHlwZSkge1xuICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlLnR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJ1bGVLZXk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWRhdG9yID0gY29tcHV0ZWQ8XG4gICAgICAgIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I8YW55LCBhbnksIGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+PlxuICAgICAgPigoKSA9PiB7XG4gICAgICAgIGlmIChpc0Zvcm1SdWxlRGVmaW5pdGlvbihydWxlKSkge1xuICAgICAgICAgIHJldHVybiBydWxlLnZhbHVlLnZhbGlkYXRvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcnVsZS52YWx1ZSBhcyBJbmxpbmVSdWxlRGVjbGFyYXRpb248YW55LCBhbnlbXSwgYW55PjtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRwYXJhbXMgPSBjb21wdXRlZDxhbnlbXT4oKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVud3JhcFJ1bGVQYXJhbWV0ZXJzKHJ1bGUudmFsdWUuX3BhcmFtcyA/PyBbXSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJHBhdGggPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IGAke3BhdGh9LiR7JHR5cGUudmFsdWV9YCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgICRhY3RpdmUsXG4gICAgICAgICRtZXNzYWdlLFxuICAgICAgICAkdHlwZSxcbiAgICAgICAgJHZhbGlkYXRvcixcbiAgICAgICAgJHBhcmFtcyxcbiAgICAgICAgJHBhdGgsXG4gICAgICB9IHNhdGlzZmllcyBTY29wZVN0YXRlO1xuICAgIH0pITtcblxuICAgICR1bndhdGNoU3RhdGUgPSB3YXRjaChzY29wZVN0YXRlLiRwYXJhbXMsICR2YWxpZGF0ZSwge1xuICAgICAgZGVlcDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gICR3YXRjaCgpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbXB1dGVBc3luY1Jlc3VsdChwcm9taXNlOiBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4pIHtcbiAgICBsZXQgcnVsZVJlc3VsdCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAkdmFsaWQudmFsdWUgPSB0cnVlO1xuICAgICAgaWYgKCRkaXJ0eS52YWx1ZSkge1xuICAgICAgICAkcGVuZGluZy52YWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9taXNlUmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgIGlmICh0eXBlb2YgcHJvbWlzZVJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJ1bGVSZXN1bHQgPSBwcm9taXNlUmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyAkdmFsaWQsIC4uLnJlc3QgfSA9IHByb21pc2VSZXN1bHQ7XG4gICAgICAgIHJ1bGVSZXN1bHQgPSAkdmFsaWQ7XG4gICAgICAgICRtZXRhZGF0YS52YWx1ZSA9IHJlc3Q7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcnVsZVJlc3VsdCA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAkcGVuZGluZy52YWx1ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBydWxlUmVzdWx0O1xuICB9XG5cbiAgY29uc3QgJGNvbXB1dGVBc3luY0RlYm91bmNlID0gZGVib3VuY2UoY29tcHV0ZUFzeW5jUmVzdWx0LCAkZGVib3VuY2UgPz8gMTAwKTtcblxuICBhc3luYyBmdW5jdGlvbiAkdmFsaWRhdGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgJHZhbGlkYXRpbmcudmFsdWUgPSB0cnVlO1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHNjb3BlU3RhdGUuJHZhbGlkYXRvci52YWx1ZTtcbiAgICBsZXQgcnVsZVJlc3VsdCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdE9yUHJvbWlzZSA9IHZhbGlkYXRvcihzdGF0ZS52YWx1ZSwgLi4uc2NvcGVTdGF0ZS4kcGFyYW1zLnZhbHVlKTtcblxuICAgIGlmIChyZXN1bHRPclByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICBjb25zdCBwcm9taXNlRGVib3VuY2UgPSAkY29tcHV0ZUFzeW5jRGVib3VuY2UocmVzdWx0T3JQcm9taXNlKTtcbiAgICAgIHJ1bGVSZXN1bHQgPSBhd2FpdCBwcm9taXNlRGVib3VuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXN1bHRPclByb21pc2UgIT0gbnVsbCkge1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdE9yUHJvbWlzZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgcnVsZVJlc3VsdCA9IHJlc3VsdE9yUHJvbWlzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7ICR2YWxpZCwgLi4ucmVzdCB9ID0gcmVzdWx0T3JQcm9taXNlO1xuICAgICAgICAgIHJ1bGVSZXN1bHQgPSAkdmFsaWQ7XG4gICAgICAgICAgJG1ldGFkYXRhLnZhbHVlID0gcmVzdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAkdmFsaWQudmFsdWUgPSBydWxlUmVzdWx0O1xuXG4gICAgJHZhbGlkYXRpbmcudmFsdWUgPSBmYWxzZTtcblxuICAgIHJldHVybiBydWxlUmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gJHJlc2V0KCkge1xuICAgICR2YWxpZC52YWx1ZSA9IHRydWU7XG4gICAgJG1ldGFkYXRhLnZhbHVlID0ge307XG4gICAgJHBlbmRpbmcudmFsdWUgPSBmYWxzZTtcbiAgICAkdmFsaWRhdGluZy52YWx1ZSA9IGZhbHNlO1xuXG4gICAgJHdhdGNoKCk7XG4gIH1cblxuICBmdW5jdGlvbiAkdW53YXRjaCgpIHtcbiAgICAkdW53YXRjaFN0YXRlKCk7XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgfVxuXG4gIHJldHVybiByZWFjdGl2ZSh7XG4gICAgLi4uc2NvcGVTdGF0ZSxcbiAgICAkcGVuZGluZyxcbiAgICAkdmFsaWQsXG4gICAgJG1ldGFkYXRhLFxuICAgICR2YWxpZGF0ZSxcbiAgICAkdW53YXRjaCxcbiAgICAkd2F0Y2gsXG4gICAgJHJlc2V0LFxuICB9KSBzYXRpc2ZpZXMgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBDb21wdXRlZFJlZiwgUmVmLCBXYXRjaFN0b3BIYW5kbGUgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgcmVmLCB0b1JlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVSdWxlRGVjbCxcbiAgJEludGVybmFsUmVnbGVSdWxlU3RhdHVzLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgRmllbGRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gIFJlZ2xlUnVsZURlY2wsXG4gIFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBkZWJvdW5jZSwgaXNFbXB0eSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgUmVnbGVTdG9yYWdlIH0gZnJvbSAnLi4vLi4vdXNlU3RvcmFnZSc7XG5pbXBvcnQgeyBleHRyYWN0UnVsZXNFcnJvcnMgfSBmcm9tICcuLi91c2VFcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVSdWxlU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZVJ1bGVTdGF0dXMnO1xuXG5pbnRlcmZhY2UgQ3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1c0FyZ3Mge1xuICBzdGF0ZTogUmVmPHVua25vd24+O1xuICBydWxlc0RlZjogUmVmPCRJbnRlcm5hbFJlZ2xlUnVsZURlY2w+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBwYXRoOiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xuICBleHRlcm5hbEVycm9yczogUmVhZG9ubHk8UmVmPHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIG9uVW53YXRjaD86ICgpID0+IHZvaWQ7XG59XG5cbnR5cGUgU2NvcGVSZXR1cm5TdGF0ZSA9IHtcbiAgJGVycm9yOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGVycm9yczogQ29tcHV0ZWRSZWY8c3RyaW5nW10+O1xuICAkc2lsZW50RXJyb3JzOiBDb21wdXRlZFJlZjxzdHJpbmdbXT47XG4gICRwZW5kaW5nOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGludmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkZGVib3VuY2U6IENvbXB1dGVkUmVmPG51bWJlciB8IHVuZGVmaW5lZD47XG4gICRsYXp5OiBDb21wdXRlZFJlZjxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgJHJld2FyZEVhcmx5OiBDb21wdXRlZFJlZjxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgJGF1dG9EaXJ0eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gICRhbnlEaXJ0eTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyh7XG4gIHN0YXRlLFxuICBydWxlc0RlZixcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGgsXG4gIHN0b3JhZ2UsXG4gIG9wdGlvbnMsXG4gIGV4dGVybmFsRXJyb3JzLFxuICBpbmRleCxcbiAgb25VbndhdGNoLFxufTogQ3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1c0FyZ3MpOiAkSW50ZXJuYWxSZWdsZUZpZWxkU3RhdHVzIHtcbiAgbGV0IHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVJldHVyblN0YXRlO1xuXG4gIGNvbnN0ICRkaXJ0eSA9IHJlZihmYWxzZSk7XG5cbiAgY29uc3QgdHJpZ2dlclB1bmlzaG1lbnQgPSByZWYoZmFsc2UpO1xuXG4gIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHJlZjxzdHJpbmdbXSB8IHVuZGVmaW5lZD4oW10pO1xuXG4gIGxldCAkdW53YXRjaFN0YXRlOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaFZhbGlkOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaEV4dGVybmFsRXJyb3JzOiBXYXRjaFN0b3BIYW5kbGU7XG4gIGxldCAkdW53YXRjaERpcnR5OiBXYXRjaFN0b3BIYW5kbGU7XG5cbiAgbGV0ICRjb21taXQgPSAoKSA9PiB7fTtcblxuICBmdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxFcnJvcnMoKSB7XG4gICAgJGV4dGVybmFsRXJyb3JzLnZhbHVlID0gZXh0ZXJuYWxFcnJvcnMudmFsdWUgPz8gW107XG4gIH1cbiAgY29sbGVjdEV4dGVybmFsRXJyb3JzKCk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVSdWxlc1Jlc3VsdCgpIHtcbiAgICBjb25zdCBkZWNsYXJlZFJ1bGVzID0gcnVsZXNEZWYudmFsdWUgYXMgUmVnbGVSdWxlRGVjbDxhbnksIGFueT47XG4gICAgY29uc3Qgc3RvcmVSZXN1bHQgPSBzdG9yYWdlLmNoZWNrUnVsZURlY2xFbnRyeShwYXRoLCBkZWNsYXJlZFJ1bGVzKTtcblxuICAgICRsb2NhbE9wdGlvbnMudmFsdWUgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhkZWNsYXJlZFJ1bGVzKS5maWx0ZXIoKFtydWxlS2V5XSkgPT4gcnVsZUtleS5zdGFydHNXaXRoKCckJykpXG4gICAgKTtcblxuICAgICRydWxlcy52YWx1ZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJ1bGVzRGVmLnZhbHVlKVxuICAgICAgICAuZmlsdGVyKChbcnVsZUtleV0pID0+ICFydWxlS2V5LnN0YXJ0c1dpdGgoJyQnKSlcbiAgICAgICAgLm1hcCgoW3J1bGVLZXksIHJ1bGVdKSA9PiB7XG4gICAgICAgICAgaWYgKHJ1bGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVSZWYgPSB0b1JlZigoKSA9PiBydWxlKTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIHJ1bGVLZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlUnVsZVN0YXR1cyh7XG4gICAgICAgICAgICAgICAgJGRpcnR5LFxuICAgICAgICAgICAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgIHJ1bGU6IHJ1bGVSZWYgYXMgYW55LFxuICAgICAgICAgICAgICAgIHJ1bGVLZXksXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICAgICRkZWJvdW5jZTogJGxvY2FsT3B0aW9ucy52YWx1ZS4kZGVib3VuY2UsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChydWxlRGVmKTogcnVsZURlZiBpcyBbc3RyaW5nLCAkSW50ZXJuYWxSZWdsZVJ1bGVTdGF0dXNdID0+ICEhcnVsZURlZi5sZW5ndGgpXG4gICAgKTtcblxuICAgICR3YXRjaCgpO1xuXG4gICAgJGNvbW1pdCA9IHNjb3BlU3RhdGUuJGRlYm91bmNlLnZhbHVlXG4gICAgICA/IGRlYm91bmNlKCRjb21taXRIYW5kbGVyLCBzY29wZVN0YXRlLiRkZWJvdW5jZS52YWx1ZSA/PyAwKVxuICAgICAgOiAkY29tbWl0SGFuZGxlcjtcblxuICAgIGlmIChzdG9yZVJlc3VsdD8udmFsaWQgIT0gbnVsbCkge1xuICAgICAgJGRpcnR5LnZhbHVlID0gc3RvcmFnZS5nZXREaXJ0eVN0YXRlKHBhdGgpO1xuICAgICAgaWYgKCRkaXJ0eS52YWx1ZSkge1xuICAgICAgICAkY29tbWl0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RvcmFnZS5hZGRSdWxlRGVjbEVudHJ5KHBhdGgsIGRlY2xhcmVkUnVsZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCRydWxlcy52YWx1ZSkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5mb3JFYWNoKChbXywgcnVsZV0pID0+IHtcbiAgICAgICAgcnVsZS4kdW53YXRjaCgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgICR1bndhdGNoRGlydHkoKTtcbiAgICBpZiAoJGRpcnR5LnZhbHVlKSB7XG4gICAgICBzdG9yYWdlLnNldERpcnR5RW50cnkocGF0aCwgJGRpcnR5LnZhbHVlKTtcbiAgICB9XG4gICAgJHVud2F0Y2hTdGF0ZSgpO1xuICAgICR1bndhdGNoVmFsaWQoKTtcbiAgICAkdW53YXRjaEV4dGVybmFsRXJyb3JzKCk7XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgICBvblVud2F0Y2g/LigpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHdhdGNoKCkge1xuICAgIGlmICgkcnVsZXMudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZm9yRWFjaCgoW18sIHJ1bGVdKSA9PiB7XG4gICAgICAgIHJ1bGUuJHdhdGNoKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2NvcGVTdGF0ZSA9IHNjb3BlLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCAkYW55RGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAkZGlydHkudmFsdWUpO1xuICAgICAgY29uc3QgJGRlYm91bmNlID0gY29tcHV0ZWQ8bnVtYmVyIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRkZWJvdW5jZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkbGF6eSA9IGNvbXB1dGVkPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgaWYgKCRsb2NhbE9wdGlvbnMudmFsdWUuJGxhenkgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRsYXp5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bnJlZihvcHRpb25zLmxhenkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRyZXdhcmRFYXJseSA9IGNvbXB1dGVkPGJvb2xlYW4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgaWYgKCRsb2NhbE9wdGlvbnMudmFsdWUuJHJld2FyZEVhcmx5ICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gJGxvY2FsT3B0aW9ucy52YWx1ZS4kcmV3YXJkRWFybHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucmVmKG9wdGlvbnMucmV3YXJkRWFybHkpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRhdXRvRGlydHkgPSBjb21wdXRlZDxib29sZWFuIHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIGlmICgkbG9jYWxPcHRpb25zLnZhbHVlLiRhdXRvRGlydHkgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiAkbG9jYWxPcHRpb25zLnZhbHVlLiRhdXRvRGlydHk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVucmVmKG9wdGlvbnMuYXV0b0RpcnR5KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkZXJyb3IgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAkaW52YWxpZC52YWx1ZSAmJiAhJHBlbmRpbmcudmFsdWUgJiYgJGRpcnR5LnZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgICBmaWVsZDoge1xuICAgICAgICAgICAgJGRpcnR5OiAkZGlydHkudmFsdWUsXG4gICAgICAgICAgICAkZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycy52YWx1ZSxcbiAgICAgICAgICAgICRydWxlczogJHJ1bGVzLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRzaWxlbnRFcnJvcnMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdFJ1bGVzRXJyb3JzKHtcbiAgICAgICAgICBmaWVsZDoge1xuICAgICAgICAgICAgJGRpcnR5OiAkZGlydHkudmFsdWUsXG4gICAgICAgICAgICAkZXh0ZXJuYWxFcnJvcnM6ICRleHRlcm5hbEVycm9ycy52YWx1ZSxcbiAgICAgICAgICAgICRydWxlczogJHJ1bGVzLnZhbHVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKHRyaWdnZXJQdW5pc2htZW50LnZhbHVlIHx8ICEkcmV3YXJkRWFybHkudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoJHJ1bGVzLnZhbHVlKS5zb21lKChba2V5LCBydWxlUmVzdWx0XSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJ1bGVSZXN1bHQuJHBlbmRpbmc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRpbnZhbGlkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICBpZiAoJGV4dGVybmFsRXJyb3JzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghJHJld2FyZEVhcmx5LnZhbHVlIHx8ICgkcmV3YXJkRWFybHkudmFsdWUgJiYgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuc29tZSgoW2tleSwgcnVsZVJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhcnVsZVJlc3VsdC4kdmFsaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICR2YWxpZCA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgaWYgKCRkaXJ0eS52YWx1ZSAmJiAhaXNFbXB0eShzdGF0ZS52YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoJGV4dGVybmFsRXJyb3JzLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCRyZXdhcmRFYXJseS52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZXZlcnkoKFtrZXksIHJ1bGVSZXN1bHRdKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBydWxlUmVzdWx0LiR2YWxpZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gISRpbnZhbGlkLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgd2F0Y2goJHZhbGlkLCAodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdHJpZ2dlclB1bmlzaG1lbnQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgICRlcnJvcixcbiAgICAgICAgJHBlbmRpbmcsXG4gICAgICAgICRpbnZhbGlkLFxuICAgICAgICAkdmFsaWQsXG4gICAgICAgICRkZWJvdW5jZSxcbiAgICAgICAgJGxhenksXG4gICAgICAgICRlcnJvcnMsXG4gICAgICAgICRzaWxlbnRFcnJvcnMsXG4gICAgICAgICRyZXdhcmRFYXJseSxcbiAgICAgICAgJGF1dG9EaXJ0eSxcbiAgICAgICAgJGFueURpcnR5LFxuICAgICAgfSBzYXRpc2ZpZXMgU2NvcGVSZXR1cm5TdGF0ZTtcbiAgICB9KSBhcyBTY29wZVJldHVyblN0YXRlO1xuXG4gICAgJHVud2F0Y2hFeHRlcm5hbEVycm9ycyA9IHdhdGNoKGV4dGVybmFsRXJyb3JzLCBjb2xsZWN0RXh0ZXJuYWxFcnJvcnMpO1xuICAgICR1bndhdGNoU3RhdGUgPSB3YXRjaChcbiAgICAgIHN0YXRlLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoc2NvcGVTdGF0ZS4kYXV0b0RpcnR5LnZhbHVlKSB7XG4gICAgICAgICAgaWYgKCEkZGlydHkudmFsdWUpIHtcbiAgICAgICAgICAgICRkaXJ0eS52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlc0RlZi52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgICAgICAgY3JlYXRlUmVhY3RpdmVSdWxlc1Jlc3VsdCgpO1xuICAgICAgICB9XG4gICAgICAgICRjb21taXQoKTtcbiAgICAgICAgaWYgKCFzY29wZVN0YXRlLiRyZXdhcmRFYXJseS52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyAkY2xlYXJFeHRlcm5hbEVycm9ycygpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBkZWVwOiB0cnVlIH1cbiAgICApO1xuXG4gICAgJHVud2F0Y2hEaXJ0eSA9IHdhdGNoKCRkaXJ0eSwgKCkgPT4ge1xuICAgICAgc3RvcmFnZS5zZXREaXJ0eUVudHJ5KHBhdGgsICRkaXJ0eS52YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAkdW53YXRjaFZhbGlkID0gd2F0Y2goc2NvcGVTdGF0ZS4kdmFsaWQsICh2YWxpZCkgPT4ge1xuICAgICAgaWYgKHNjb3BlU3RhdGUuJHJld2FyZEVhcmx5LnZhbHVlICYmIHZhbGlkKSB7XG4gICAgICAgIHRyaWdnZXJQdW5pc2htZW50LnZhbHVlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiAkY29tbWl0SGFuZGxlcigpIHtcbiAgICBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLmZvckVhY2goKFtrZXksIHJ1bGVdKSA9PiB7XG4gICAgICBydWxlLiR2YWxpZGF0ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgJHJ1bGVzID0gcmVmKCkgYXMgUmVmPFJlY29yZDxzdHJpbmcsICRJbnRlcm5hbFJlZ2xlUnVsZVN0YXR1cz4+O1xuICBjb25zdCAkbG9jYWxPcHRpb25zID0gcmVmKCkgYXMgUmVmPEZpZWxkUmVnbGVCZWhhdmlvdXJPcHRpb25zPjtcblxuICBjcmVhdGVSZWFjdGl2ZVJ1bGVzUmVzdWx0KCk7XG5cbiAgZnVuY3Rpb24gJHJlc2V0KCk6IHZvaWQge1xuICAgICRkaXJ0eS52YWx1ZSA9IGZhbHNlO1xuICAgICRleHRlcm5hbEVycm9ycy52YWx1ZSA9IFtdO1xuICAgIE9iamVjdC5lbnRyaWVzKCRydWxlcy52YWx1ZSkuZm9yRWFjaCgoW2tleSwgcnVsZV0pID0+IHtcbiAgICAgIHJ1bGUuJHJlc2V0KCk7XG4gICAgfSk7XG4gICAgaWYgKCFzY29wZVN0YXRlLiRsYXp5LnZhbHVlKSB7XG4gICAgICBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLm1hcCgoW2tleSwgcnVsZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJ1bGUuJHZhbGlkYXRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiAkdG91Y2goKTogdm9pZCB7XG4gICAgaWYgKCEkZGlydHkudmFsdWUpIHtcbiAgICAgICRkaXJ0eS52YWx1ZSA9IHRydWU7XG4gICAgICBpZiAoIXNjb3BlU3RhdGUuJHJld2FyZEVhcmx5LnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgICAvLyAkY2xlYXJFeHRlcm5hbEVycm9ycygpO1xuICAgICAgfVxuICAgICAgJGNvbW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0ICR2YWxpZGF0ZSA9IHNjb3BlU3RhdGUuJGRlYm91bmNlLnZhbHVlXG4gICAgPyBkZWJvdW5jZSgkdmFsaWRhdGVIYW5kbGVyLCBzY29wZVN0YXRlLiRkZWJvdW5jZS52YWx1ZSA/PyAwKVxuICAgIDogJHZhbGlkYXRlSGFuZGxlcjtcblxuICBhc3luYyBmdW5jdGlvbiAkdmFsaWRhdGVIYW5kbGVyKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICB0cmlnZ2VyUHVuaXNobWVudC52YWx1ZSA9IHRydWU7XG4gICAgICBpZiAoc2NvcGVTdGF0ZS4kYXV0b0RpcnR5LnZhbHVlICYmICRkaXJ0eS52YWx1ZSAmJiAhc2NvcGVTdGF0ZS4kcGVuZGluZy52YWx1ZSkge1xuICAgICAgICByZXR1cm4gIXNjb3BlU3RhdGUuJGVycm9yLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3QuZW50cmllcygkcnVsZXMudmFsdWUpLm1hcCgoW2tleSwgcnVsZV0pID0+IHtcbiAgICAgICAgICByZXR1cm4gcnVsZS4kdmFsaWRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmV2ZXJ5KCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiAkY2xlYXJFeHRlcm5hbEVycm9ycygpIHtcbiAgICAkZXh0ZXJuYWxFcnJvcnMudmFsdWUgPSBbXTtcbiAgfVxuXG4gIGlmICghc2NvcGVTdGF0ZS4kbGF6eS52YWx1ZSkge1xuICAgICR2YWxpZGF0ZUhhbmRsZXIoKTtcbiAgfVxuXG4gIHJldHVybiByZWFjdGl2ZSh7XG4gICAgJGRpcnR5LFxuICAgIC4uLnNjb3BlU3RhdGUsXG4gICAgJGV4dGVybmFsRXJyb3JzLFxuICAgICR2YWx1ZTogc3RhdGUsXG4gICAgJHJ1bGVzOiAkcnVsZXMsXG4gICAgJHJlc2V0LFxuICAgICR0b3VjaCxcbiAgICAkdmFsaWRhdGUsXG4gICAgJHVud2F0Y2gsXG4gICAgJHdhdGNoLFxuICAgICRjbGVhckV4dGVybmFsRXJyb3JzLFxuICB9KSBzYXRpc2ZpZXMgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cztcbn1cbiIsImltcG9ydCB0eXBlIHsgUmVxdWlyZWREZWVwIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tcHV0ZWRSZWYsIFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgeyBjb21wdXRlZCwgZWZmZWN0U2NvcGUsIHJlYWN0aXZlLCByZWYsIHRvUmVmLCB0b1JlZnMsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9ycyxcbiAgJEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycyxcbiAgJEludGVybmFsUmVnbGVDb2xsZWN0aW9uUnVsZURlY2wsXG4gICRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVGaWVsZFN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgRGVlcE1heWJlUmVmLFxuICBSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG4gIFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsS2V5UHJvcGVydHksXG4gIFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIHVud3JhcEdldHRlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IHJhbmRvbUlkIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmFuZG9tSWQnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi91c2VTdG9yYWdlJztcbmltcG9ydCB7IGlzRXh0ZXJuYWxFcnJvckNvbGxlY3Rpb24sIGlzUnVsZURlZiB9IGZyb20gJy4uL2d1YXJkcyc7XG5pbXBvcnQgeyBleHRyYWN0Q29sbGVjdGlvbkVycm9yLCBleHRyYWN0UnVsZXNFcnJvcnMgfSBmcm9tICcuLi91c2VFcnJvcnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzIH0gZnJvbSAnLi9jcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyc7XG5cbnR5cGUgU3RhdGVXaXRoSWQgPSB1bmtub3duICYgeyAkaWQ/OiBzdHJpbmcgfTtcblxuZnVuY3Rpb24gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAkaWQsXG4gIHBhdGgsXG4gIGluZGV4LFxuICBvcHRpb25zLFxuICBzdG9yYWdlLFxuICBzdGF0ZVZhbHVlLFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcnVsZXMsXG4gIGV4dGVybmFsRXJyb3JzLFxufToge1xuICAkaWQ6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICBpbmRleDogbnVtYmVyO1xuICBzdGF0ZVZhbHVlOiBSZWY8U3RhdGVXaXRoSWQ+O1xuICBjdXN0b21NZXNzYWdlcz86IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IERlZXBNYXliZVJlZjxSZXF1aXJlZERlZXA8UmVnbGVCZWhhdmlvdXJPcHRpb25zPj47XG4gIHJ1bGVzOiAkSW50ZXJuYWxGb3JtUHJvcGVydHlUeXBlcyAmIFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsS2V5UHJvcGVydHk7XG4gIGV4dGVybmFsRXJyb3JzOiBDb21wdXRlZFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzW10gfCB1bmRlZmluZWQ+O1xufSk6ICRJbnRlcm5hbFJlZ2xlU3RhdHVzVHlwZSB8IG51bGwge1xuICBjb25zdCAkZmllbGRJZCA9IHJ1bGVzLiRrZXkgPyBydWxlcy4ka2V5IDogcmFuZG9tSWQoKTtcbiAgbGV0ICRwYXRoID0gYCR7cGF0aH0uJHtTdHJpbmcoJGZpZWxkSWQpfWA7XG5cbiAgaWYgKHR5cGVvZiBzdGF0ZVZhbHVlLnZhbHVlID09PSAnb2JqZWN0JyAmJiBzdGF0ZVZhbHVlLnZhbHVlICE9IG51bGwpIHtcbiAgICBpZiAoIXN0YXRlVmFsdWUudmFsdWUuJGlkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdGF0ZVZhbHVlLnZhbHVlLCB7XG4gICAgICAgICRpZDoge1xuICAgICAgICAgIHZhbHVlOiAkZmllbGRJZCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAkcGF0aCA9IGAke3BhdGh9LiR7c3RhdGVWYWx1ZS52YWx1ZS4kaWR9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCAkZXh0ZXJuYWxFcnJvcnMgPSB0b1JlZigoKSA9PiBleHRlcm5hbEVycm9ycy52YWx1ZT8uW2luZGV4XSk7XG5cbiAgY29uc3QgJHN0YXR1cyA9IGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgIHN0YXRlOiBzdGF0ZVZhbHVlLFxuICAgIHJ1bGVzRGVmOiB0b1JlZigoKSA9PiBydWxlcyksXG4gICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgcGF0aDogJHBhdGgsXG4gICAgc3RvcmFnZSxcbiAgICBvcHRpb25zLFxuICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gIH0pO1xuXG4gIGlmICgkc3RhdHVzKSB7XG4gICAgY29uc3QgdmFsdWVJZCA9IHN0YXRlVmFsdWUudmFsdWU/LiRpZDtcbiAgICAkc3RhdHVzLiRpZCA9IHZhbHVlSWQgPz8gU3RyaW5nKCRmaWVsZElkKTtcbiAgICBzdG9yYWdlLmFkZEFycmF5U3RhdHVzKCRpZCwgJHN0YXR1cy4kaWQsICRzdGF0dXMpO1xuICB9XG5cbiAgcmV0dXJuICRzdGF0dXM7XG59XG5cbmludGVyZmFjZSBDcmVhdGVSZWFjdGl2ZUNvbGxlY3Rpb25TdGF0dXNBcmdzIHtcbiAgc3RhdGU6IFJlZjxTdGF0ZVdpdGhJZFtdICYgU3RhdGVXaXRoSWQ+O1xuICBydWxlc0RlZjogUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvblJ1bGVEZWNsPjtcbiAgY3VzdG9tTWVzc2FnZXM/OiBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZTtcbiAgcGF0aDogc3RyaW5nO1xuICBpbmRleD86IG51bWJlcjtcbiAgc3RvcmFnZTogUmVnbGVTdG9yYWdlO1xuICBvcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucztcbiAgZXh0ZXJuYWxFcnJvcnM6IFJlYWRvbmx5PFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzIHwgdW5kZWZpbmVkPj47XG59XG5cbmludGVyZmFjZSBTY29wZVJldHVyblN0YXRlIHtcbiAgJGRpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGFueURpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgJGludmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkZXJyb3I6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAkcGVuZGluZzogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRlcnJvcnM6IENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycz47XG4gICRzaWxlbnRFcnJvcnM6IENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlQ29sbGVjdGlvbkVycm9ycz47XG59XG5cbmludGVyZmFjZSBJbW1lZGlhdGVTY29wZVJldHVyblN0YXRlIHtcbiAgaXNQcmltaXRpdmVBcnJheTogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICRleHRlcm5hbEVycm9yc0ZpZWxkOiBDb21wdXRlZFJlZjxzdHJpbmdbXT47XG4gICRleHRlcm5hbEVycm9yc0VhY2g6IENvbXB1dGVkUmVmPCRJbnRlcm5hbEV4dGVybmFsUmVnbGVFcnJvcnNbXT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNvbGxlY3Rpb25TdGF0dXMoe1xuICBzdGF0ZSxcbiAgcnVsZXNEZWYsXG4gIGN1c3RvbU1lc3NhZ2VzLFxuICBwYXRoLFxuICBzdG9yYWdlLFxuICBvcHRpb25zLFxuICBleHRlcm5hbEVycm9ycyxcbn06IENyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1c0FyZ3MpOiAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXMgfCBudWxsIHtcbiAgbGV0IHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVJldHVyblN0YXRlO1xuXG4gIGxldCBpbW1lZGlhdGVTY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gIGxldCBpbW1lZGlhdGVTY29wZVN0YXRlITogSW1tZWRpYXRlU2NvcGVSZXR1cm5TdGF0ZTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSkgJiYgIXJ1bGVzRGVmLnZhbHVlLiRlYWNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgJGlkID0gcmVmPHN0cmluZz4oKSBhcyBSZWY8c3RyaW5nPjtcbiAgY29uc3QgJHZhbHVlID0gcmVmKHN0YXRlLnZhbHVlKTtcblxuICBsZXQgJHVud2F0Y2hTdGF0ZTogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3QgJGZpZWxkU3RhdHVzID0gcmVmKHt9KSBhcyBSZWY8JEludGVybmFsUmVnbGVGaWVsZFN0YXR1cz47XG4gIGNvbnN0ICRlYWNoU3RhdHVzID0gc3RvcmFnZS5nZXRDb2xsZWN0aW9uc0VudHJ5KHBhdGgpO1xuXG4gIGltbWVkaWF0ZVNjb3BlU3RhdGUgPSBpbW1lZGlhdGVTY29wZS5ydW4oKCkgPT4ge1xuICAgIGNvbnN0IGlzUHJpbWl0aXZlQXJyYXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzdGF0ZS52YWx1ZSkgJiYgc3RhdGUudmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS52YWx1ZS5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ29iamVjdCcpO1xuICAgICAgfSBlbHNlIGlmIChydWxlc0RlZi52YWx1ZS4kZWFjaCAmJiAhKHJ1bGVzRGVmLnZhbHVlLiRlYWNoIGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QudmFsdWVzKHJ1bGVzRGVmLnZhbHVlLiRlYWNoKS5ldmVyeSgocnVsZSkgPT4gaXNSdWxlRGVmKHJ1bGUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIGNvbnN0ICRleHRlcm5hbEVycm9yc0ZpZWxkID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHtcbiAgICAgIGlmIChleHRlcm5hbEVycm9ycy52YWx1ZSkge1xuICAgICAgICBpZiAoaXNFeHRlcm5hbEVycm9yQ29sbGVjdGlvbihleHRlcm5hbEVycm9ycy52YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZXh0ZXJuYWxFcnJvcnMudmFsdWUuJGVycm9ycyA/PyBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSk7XG5cbiAgICBjb25zdCAkZXh0ZXJuYWxFcnJvcnNFYWNoID0gY29tcHV0ZWQ8JEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9yc1tdPigoKSA9PiB7XG4gICAgICBpZiAoZXh0ZXJuYWxFcnJvcnMudmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRXh0ZXJuYWxFcnJvckNvbGxlY3Rpb24oZXh0ZXJuYWxFcnJvcnMudmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dGVybmFsRXJyb3JzLnZhbHVlLiRlYWNoID8/IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaXNQcmltaXRpdmVBcnJheSxcbiAgICAgICRleHRlcm5hbEVycm9yc0ZpZWxkLFxuICAgICAgJGV4dGVybmFsRXJyb3JzRWFjaCxcbiAgICB9IHNhdGlzZmllcyBJbW1lZGlhdGVTY29wZVJldHVyblN0YXRlO1xuICB9KSE7XG5cbiAgY3JlYXRlU3RhdHVzKCk7XG4gICR3YXRjaCgpO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXR1cygpIHtcbiAgICBpZiAodHlwZW9mIHN0YXRlLnZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9IG51bGwgJiYgIXN0YXRlLnZhbHVlPy4kaWQgJiYgc3RhdGUudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgJGlkLnZhbHVlID0gcmFuZG9tSWQoKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoc3RhdGUudmFsdWUsIHtcbiAgICAgICAgICAkaWQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAkaWQudmFsdWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLnZhbHVlPy4kaWQpIHtcbiAgICAgICAgJGlkLnZhbHVlID0gc3RhdGUudmFsdWUuJGlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpbW1lZGlhdGVTY29wZVN0YXRlLmlzUHJpbWl0aXZlQXJyYXkudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkdmFsdWUudmFsdWUgPSAkZmllbGRTdGF0dXMudmFsdWUuJHZhbHVlO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGUudmFsdWUpICYmIHJ1bGVzRGVmLnZhbHVlLiRlYWNoKSB7XG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IHN0YXRlLnZhbHVlXG4gICAgICAgIC5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVud3JhcHBlZCRFYWNoID0gdW53cmFwR2V0dGVyKFxuICAgICAgICAgICAgcnVsZXNEZWYudmFsdWUuJGVhY2gsXG4gICAgICAgICAgICB0b1JlZigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHVud3JhcHBlZCRFYWNoKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAgICAgICAgICAgICAkaWQ6ICRpZC52YWx1ZSxcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgcnVsZXM6IHVud3JhcHBlZCRFYWNoLFxuICAgICAgICAgICAgICBzdGF0ZVZhbHVlOiB0b1JlZigoKSA9PiB2YWx1ZSksXG4gICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICBzdG9yYWdlLFxuICAgICAgICAgICAgICBleHRlcm5hbEVycm9yczogaW1tZWRpYXRlU2NvcGVTdGF0ZS4kZXh0ZXJuYWxFcnJvcnNFYWNoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZWFjaCkgPT4gISFlYWNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUgPSBbXTtcbiAgICB9XG5cbiAgICAkZmllbGRTdGF0dXMudmFsdWUgPSBjcmVhdGVSZWFjdGl2ZUZpZWxkU3RhdHVzKHtcbiAgICAgIHN0YXRlLFxuICAgICAgcnVsZXNEZWYsXG4gICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgIHBhdGgsXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dGVybmFsRXJyb3JzOiBpbW1lZGlhdGVTY29wZVN0YXRlLiRleHRlcm5hbEVycm9yc0ZpZWxkLFxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0YXRlLnZhbHVlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0dXMgPSBjbG9uZURlZXAoJGVhY2hTdGF0dXMudmFsdWUpO1xuXG4gICAgICAkZWFjaFN0YXR1cy52YWx1ZSA9IHN0YXRlLnZhbHVlXG4gICAgICAgIC5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRvUmVmKCgpID0+IHZhbHVlKTtcbiAgICAgICAgICBpZiAodmFsdWUuJGlkICYmICRlYWNoU3RhdHVzLnZhbHVlLmZpbmQoKGVhY2gpID0+IGVhY2guJGlkID09PSB2YWx1ZS4kaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZ1N0YXR1cyA9IHN0b3JhZ2UuZ2V0QXJyYXlTdGF0dXMoJGlkLnZhbHVlLCB2YWx1ZS4kaWQpO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nU3RhdHVzKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nU3RhdHVzLiR2YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVud3JhcHBlZCRFYWNoID0gdW53cmFwR2V0dGVyKHJ1bGVzRGVmLnZhbHVlLiRlYWNoLCBjdXJyZW50VmFsdWUsIGluZGV4KTtcbiAgICAgICAgICAgIGlmICh1bndyYXBwZWQkRWFjaCkge1xuICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY3JlYXRlQ29sbGVjdGlvbkVsZW1lbnQoe1xuICAgICAgICAgICAgICAgICRpZDogJGlkLnZhbHVlLFxuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZXM6IHVud3JhcHBlZCRFYWNoLFxuICAgICAgICAgICAgICAgIHN0YXRlVmFsdWU6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgZXh0ZXJuYWxFcnJvcnM6IGltbWVkaWF0ZVNjb3BlU3RhdGUuJGV4dGVybmFsRXJyb3JzRWFjaCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlYWNoKSA9PiAhIWVhY2gpO1xuXG4gICAgICBwcmV2aW91c1N0YXR1c1xuICAgICAgICAuZmlsdGVyKCgkZWFjaCkgPT4gIXN0YXRlLnZhbHVlLmZpbmQoKGYpID0+ICRlYWNoLiRpZCA9PT0gZi4kaWQpKVxuICAgICAgICAuZm9yRWFjaCgoJGVhY2gsIGluZGV4KSA9PiB7XG4gICAgICAgICAgc3RvcmFnZS5kZWxldGVBcnJheVN0YXR1cygkaWQudmFsdWUsIGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUgPSBbXTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiAkd2F0Y2goKSB7XG4gICAgJHVud2F0Y2hTdGF0ZSA9IHdhdGNoKFxuICAgICAgc3RhdGUsXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPSBudWxsICYmICFPYmplY3QuaGFzT3duKHN0YXRlLnZhbHVlIGFzIGFueSwgJyRpZCcpKSB7XG4gICAgICAgICAgY3JlYXRlU3RhdHVzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlU3RhdHVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGRlZXA6IHRydWUsIGZsdXNoOiAncHJlJyB9XG4gICAgKTtcbiAgICBzY29wZVN0YXRlID0gc2NvcGUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0ICRkaXJ0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJGRpcnR5ICYmXG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZXZlcnkoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRkaXJ0eTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRhbnlEaXJ0eSA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJGFueURpcnR5IHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGRpcnR5O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGludmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiRpbnZhbGlkIHx8XG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuc29tZSgoc3RhdHVzT3JGaWVsZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGludmFsaWQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWQgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHZhbGlkICYmXG4gICAgICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZXZlcnkoKHN0YXR1c09yRmllbGQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiR2YWxpZDtcbiAgICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgJGVycm9yID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICRmaWVsZFN0YXR1cy52YWx1ZS4kZXJyb3IgfHxcbiAgICAgICAgICAkZWFjaFN0YXR1cy52YWx1ZS5zb21lKChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZXJyb3I7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHBlbmRpbmcgfHxcbiAgICAgICAgICAkZWFjaFN0YXR1cy52YWx1ZS5zb21lKChzdGF0dXNPckZpZWxkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kcGVuZGluZztcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZDwkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25FcnJvcnM+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAkZXJyb3JzOiBleHRyYWN0UnVsZXNFcnJvcnMoeyBmaWVsZDogJGZpZWxkU3RhdHVzLnZhbHVlLCBzaWxlbnQ6IGZhbHNlIH0pLFxuICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKCRlYWNoU3RhdHVzLnZhbHVlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkc2lsZW50RXJyb3JzID0gY29tcHV0ZWQ8JEludGVybmFsUmVnbGVDb2xsZWN0aW9uRXJyb3JzPigoKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJGVycm9yczogZXh0cmFjdFJ1bGVzRXJyb3JzKHsgZmllbGQ6ICRmaWVsZFN0YXR1cy52YWx1ZSwgc2lsZW50OiB0cnVlIH0pLFxuICAgICAgICAgICRlYWNoOiBleHRyYWN0Q29sbGVjdGlvbkVycm9yKCRlYWNoU3RhdHVzLnZhbHVlLCB0cnVlKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkZGlydHksXG4gICAgICAgICRhbnlEaXJ0eSxcbiAgICAgICAgJGludmFsaWQsXG4gICAgICAgICR2YWxpZCxcbiAgICAgICAgJGVycm9yLFxuICAgICAgICAkcGVuZGluZyxcbiAgICAgICAgJGVycm9ycyxcbiAgICAgICAgJHNpbGVudEVycm9ycyxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlUmV0dXJuU3RhdGU7XG4gICAgfSkhO1xuXG4gICAgaWYgKGltbWVkaWF0ZVNjb3BlU3RhdGUuaXNQcmltaXRpdmVBcnJheS52YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtwYXRofSBpcyBhIEFycmF5IG9mIHByaW1pdGl2ZXMuIFRyYWNraW5nIGNhbiBiZSBsb3N0IHdoZW4gcmVhc3NpZ25pbmcgdGhlIEFycmF5LiBXZSBhZHZpc2UgdG8gdXNlIGFuIEFycmF5IG9mIG9iamVjdHMgaW5zdGVhZGBcbiAgICAgICk7XG4gICAgICAkdW53YXRjaFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCR1bndhdGNoU3RhdGUpIHtcbiAgICAgICR1bndhdGNoU3RhdGUoKTtcbiAgICB9XG4gICAgaWYgKCRmaWVsZFN0YXR1cy52YWx1ZSkge1xuICAgICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR1bndhdGNoKCk7XG4gICAgfVxuICAgIGlmICgkZWFjaFN0YXR1cy52YWx1ZSkge1xuICAgICAgJGVhY2hTdGF0dXMudmFsdWUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoJyRkaXJ0eScgaW4gZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuJHVud2F0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBzY29wZSA9IGVmZmVjdFNjb3BlKCk7XG4gICAgaW1tZWRpYXRlU2NvcGUuc3RvcCgpO1xuICAgIGltbWVkaWF0ZVNjb3BlID0gZWZmZWN0U2NvcGUodHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiAkdG91Y2goKTogdm9pZCB7XG4gICAgJGZpZWxkU3RhdHVzLnZhbHVlLiR0b3VjaCgpO1xuICAgICRlYWNoU3RhdHVzLnZhbHVlLmZvckVhY2goKCRlYWNoKSA9PiB7XG4gICAgICAkZWFjaC4kdG91Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRyZXNldCgpOiB2b2lkIHtcbiAgICAkZmllbGRTdGF0dXMudmFsdWUuJHJlc2V0KCk7XG4gICAgJGVhY2hTdGF0dXMudmFsdWUuZm9yRWFjaCgoJGVhY2gpID0+IHtcbiAgICAgICRlYWNoLiRyZXNldCgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gJHZhbGlkYXRlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAkZmllbGRTdGF0dXMudmFsdWUuJHZhbGlkYXRlKCksXG4gICAgICAgIC4uLiRlYWNoU3RhdHVzLnZhbHVlLm1hcCgocnVsZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBydWxlLiR2YWxpZGF0ZSgpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHZhbHVlKSA9PiAhIXZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJGNsZWFyRXh0ZXJuYWxFcnJvcnMoKSB7XG4gICAgLy8gVE9ETyBjbGVhciBleHRlcm5hbCBlcnJvcnNcbiAgfVxuXG4gIHJldHVybiByZWFjdGl2ZSh7XG4gICAgJGZpZWxkOiAkZmllbGRTdGF0dXMsXG4gICAgLi4uc2NvcGVTdGF0ZSxcbiAgICAkZWFjaDogJGVhY2hTdGF0dXMsXG4gICAgJHZhbHVlOiBzdGF0ZSxcbiAgICAkdmFsaWRhdGUsXG4gICAgJHVud2F0Y2gsXG4gICAgJHdhdGNoLFxuICAgICR0b3VjaCxcbiAgICAkcmVzZXQsXG4gICAgJGNsZWFyRXh0ZXJuYWxFcnJvcnMsXG4gIH0pIHNhdGlzZmllcyAkSW50ZXJuYWxSZWdsZUNvbGxlY3Rpb25TdGF0dXM7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBFZmZlY3RTY29wZSwgUmVmLCBXYXRjaFN0b3BIYW5kbGUgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIGVmZmVjdFNjb3BlLCByZWFjdGl2ZSwgcmVmLCB0b1JlZiwgdHJpZ2dlclJlZiwgdW5yZWYsIHdhdGNoIH0gZnJvbSAndnVlJztcbmltcG9ydCB0eXBlIHtcbiAgRGVlcE1heWJlUmVmLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgJEludGVybmFsRXh0ZXJuYWxSZWdsZUVycm9ycyxcbiAgJEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsXG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICAkSW50ZXJuYWxSZWdsZVN0YXR1cyxcbiAgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlLFxuICBNYXliZUdldHRlcixcbiAgUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxuICBSZWdsZUV4dGVybmFsRXJyb3JUcmVlLFxuICBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5LFxuICBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgJEludGVybmFsUmVnbGVFcnJvcnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMsIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGlzUmVmT2JqZWN0LCB1bndyYXBHZXR0ZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlU3RvcmFnZSB9IGZyb20gJy4uLy4uL3VzZVN0b3JhZ2UnO1xuaW1wb3J0IHtcbiAgaXNDb2xsZWN0aW9uUnVsZXNEZWYsXG4gIGlzTmVzdGVkUnVsZXNEZWYsXG4gIGlzU3RhdGVBcnJheSxcbiAgaXNWYWxpZGF0b3JSdWxlc0RlZixcbn0gZnJvbSAnLi4vZ3VhcmRzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlQ29sbGVjdGlvblN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzJztcbmltcG9ydCB7IGNyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMgfSBmcm9tICcuL2NyZWF0ZVJlYWN0aXZlRmllbGRTdGF0dXMnO1xuaW1wb3J0IHsgZXh0cmFjdE5lc3RlZEVycm9ycyB9IGZyb20gJy4uL3VzZUVycm9ycyc7XG5cbmludGVyZmFjZSBDcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyB7XG4gIHJvb3RSdWxlcz86IFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT47XG4gIHNjb3BlUnVsZXM6IFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT47XG4gIHN0YXRlOiBSZWY8UmVjb3JkPHN0cmluZywgYW55Pj47XG4gIGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzdG9yYWdlOiBSZWdsZVN0b3JhZ2U7XG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zO1xuICBleHRlcm5hbEVycm9yczogUmVhZG9ubHk8UmVmPFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWUgfCB1bmRlZmluZWQ+PjtcbiAgdmFsaWRhdGlvbkdyb3Vwcz86XG4gICAgfCAoKHJ1bGVzOiB7XG4gICAgICAgIFt4OiBzdHJpbmddOiAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGU7XG4gICAgICB9KSA9PiBSZWNvcmQ8c3RyaW5nLCBSZWdsZVZhbGlkYXRpb25Hcm91cEVudHJ5W10+KVxuICAgIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMoe1xuICBzY29wZVJ1bGVzLFxuICBzdGF0ZSxcbiAgY3VzdG9tTWVzc2FnZXMsXG4gIHBhdGggPSAnJyxcbiAgcm9vdFJ1bGVzLFxuICBzdG9yYWdlLFxuICBvcHRpb25zLFxuICBleHRlcm5hbEVycm9ycyxcbiAgdmFsaWRhdGlvbkdyb3Vwcyxcbn06IENyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKTogJEludGVybmFsUmVnbGVTdGF0dXMge1xuICB0eXBlIFNjb3BlU3RhdGUgPSB7XG4gICAgJGRpcnR5OiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkYW55RGlydHk6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRpbnZhbGlkOiBDb21wdXRlZFJlZjxib29sZWFuPjtcbiAgICAkdmFsaWQ6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRlcnJvcjogQ29tcHV0ZWRSZWY8Ym9vbGVhbj47XG4gICAgJHBlbmRpbmc6IENvbXB1dGVkUmVmPGJvb2xlYW4+O1xuICAgICRlcnJvcnM6IENvbXB1dGVkUmVmPFJlY29yZDxzdHJpbmcsICRJbnRlcm5hbFJlZ2xlRXJyb3JzPj47XG4gICAgJHNpbGVudEVycm9yczogQ29tcHV0ZWRSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVFcnJvcnM+PjtcbiAgfTtcbiAgbGV0IHNjb3BlOiBFZmZlY3RTY29wZTtcbiAgbGV0IHNjb3BlU3RhdGUhOiBTY29wZVN0YXRlO1xuICBsZXQgJHVud2F0Y2hGaWVsZHM6IFdhdGNoU3RvcEhhbmRsZTtcbiAgbGV0ICR1bndhdGNoU3RhdGU6IFdhdGNoU3RvcEhhbmRsZTtcbiAgbGV0ICR1bndhdGNoR3JvdXBzOiBXYXRjaFN0b3BIYW5kbGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlUmVhY3RpdmVGaWVsZHNTdGF0dXMod2F0Y2ggPSB0cnVlLCBmb3JjZUZyb21HZXR0ZXIgPSBmYWxzZSkge1xuICAgICRmaWVsZHMudmFsdWUgPSBudWxsITtcbiAgICB0cmlnZ2VyUmVmKCRmaWVsZHMpO1xuXG4gICAgY29uc3Qgc2NvcGVkUnVsZXNTdGF0dXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzY29wZVJ1bGVzLnZhbHVlKVxuICAgICAgICAubWFwKChbc3RhdGVQcm9wS2V5LCBzdGF0ZVByb3BSdWxlc10pID0+IHtcbiAgICAgICAgICBpZiAoc3RhdGVQcm9wUnVsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlUmVmID0gdG9SZWYoc3RhdGUudmFsdWUsIHN0YXRlUHJvcEtleSk7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZVByb3BSdWxlc1JlZiA9IHRvUmVmKCgpID0+IHN0YXRlUHJvcFJ1bGVzKTtcbiAgICAgICAgICAgIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHRvUmVmKCgpID0+IGV4dGVybmFsRXJyb3JzLnZhbHVlPy5bc3RhdGVQcm9wS2V5XSk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBzdGF0ZVByb3BLZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVJlZixcbiAgICAgICAgICAgICAgICBydWxlc0RlZjogc3RhdGVQcm9wUnVsZXNSZWYsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCA/IGAke3BhdGh9LiR7c3RhdGVQcm9wS2V5fWAgOiBzdGF0ZVByb3BLZXksXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChydWxlKTogcnVsZSBpcyBbc3RyaW5nLCAkSW50ZXJuYWxSZWdsZVN0YXR1c1R5cGVdID0+ICEhcnVsZS5sZW5ndGggJiYgcnVsZVsxXSAhPSBudWxsXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxSdWxlc1N0YXR1cyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHVucmVmKGV4dGVybmFsRXJyb3JzKSA/PyB7fSlcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICEoa2V5IGluIHNjb3BlUnVsZXMudmFsdWUpKVxuICAgICAgICAubWFwKChba2V5LCBlcnJvcnNdKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgY29uc3Qgc3RhdGVQcm9wUnVsZXNSZWYgPSB0b1JlZigoKSA9PiAoe30pKTtcbiAgICAgICAgICAgIGNvbnN0ICRleHRlcm5hbEVycm9ycyA9IHRvUmVmKCgpID0+IGVycm9ycyk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIGNyZWF0ZVJlYWN0aXZlQ2hpbGRyZW5TdGF0dXMoe1xuICAgICAgICAgICAgICAgIHN0YXRlOiByZWYodW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICBydWxlc0RlZjogc3RhdGVQcm9wUnVsZXNSZWYsXG4gICAgICAgICAgICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXksXG4gICAgICAgICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgIGV4dGVybmFsRXJyb3JzOiAkZXh0ZXJuYWxFcnJvcnMsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBncm91cHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uR3JvdXBzPy4oc2NvcGVkUnVsZXNTdGF0dXMpID8/IHt9KS5tYXAoKFtrZXksIGVudHJpZXNdKSA9PiB7XG4gICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAoWyckaW52YWxpZCcsICckZXJyb3InLCAnJHBlbmRpbmcnLCAnJGRpcnR5JywgJyR2YWxpZCddIGFzIGNvbnN0KS5tYXAoXG4gICAgICAgICAgICAgICAgICAocHJvcGVydHkpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlQm9vbGVhbkdyb3VwUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICB0b1JlZigoKSA9PiBlbnRyaWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIChbJyRlcnJvcnMnLCAnJHNpbGVudEVycm9ycyddIGFzIGNvbnN0KS5tYXAoKHByb3BlcnR5KSA9PiBbXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgIG1lcmdlQXJyYXlHcm91cFByb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICAgIHRvUmVmKCgpID0+IGVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgICRmaWVsZHMudmFsdWUgPSB7IC4uLnNjb3BlZFJ1bGVzU3RhdHVzLCAuLi5leHRlcm5hbFJ1bGVzU3RhdHVzLCAuLi5ncm91cHMgfTtcbiAgICBpZiAod2F0Y2gpIHtcbiAgICAgICR3YXRjaCgpO1xuICAgIH1cbiAgfVxuXG4gIGxldCAkZmllbGRzOiBSZWY8UmVjb3JkPHN0cmluZywgJEludGVybmFsUmVnbGVTdGF0dXNUeXBlPj4gPSBzdG9yYWdlLmdldEZpZWxkc0VudHJ5KHBhdGgpO1xuICBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cygpO1xuXG4gIGZ1bmN0aW9uICRyZXNldCgpOiB2b2lkIHtcbiAgICBjcmVhdGVSZWFjdGl2ZUZpZWxkc1N0YXR1cyhmYWxzZSk7XG4gICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZm9yRWFjaCgoW18sIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICBzdGF0dXNPckZpZWxkLiRyZXNldCgpO1xuICAgIH0pO1xuICAgICR3YXRjaCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gJHRvdWNoKCk6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgc3RhdHVzT3JGaWVsZC4kdG91Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uICR2YWxpZGF0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkubWFwKChbXywgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kdmFsaWRhdGUoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gJHdhdGNoKCkge1xuICAgIGlmIChyb290UnVsZXMpIHtcbiAgICAgICR1bndhdGNoRmllbGRzID0gd2F0Y2goXG4gICAgICAgIHJvb3RSdWxlcyxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICR1bndhdGNoKCk7XG4gICAgICAgICAgY3JlYXRlUmVhY3RpdmVGaWVsZHNTdGF0dXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBkZWVwOiB0cnVlLCBmbHVzaDogJ3Bvc3QnIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2NvcGUgPSBlZmZlY3RTY29wZSgpO1xuICAgIHNjb3BlU3RhdGUgPSBzY29wZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgJGRpcnR5ID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkubGVuZ3RoICYmXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoJGZpZWxkcy52YWx1ZSkuZXZlcnkoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kZGlydHk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkYW55RGlydHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRkaXJ0eTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgJGludmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5zb21lKChba2V5LCBzdGF0dXNPckZpZWxkXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzdGF0dXNPckZpZWxkLiRpbnZhbGlkO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkdmFsaWQgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcygkZmllbGRzLnZhbHVlKS5ldmVyeSgoW2tleSwgc3RhdHVzT3JGaWVsZF0pID0+IHtcbiAgICAgICAgICByZXR1cm4gc3RhdHVzT3JGaWVsZC4kdmFsaWQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvciA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLnNvbWUoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCAkcGVuZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLnNvbWUoKFtrZXksIHN0YXR1c09yRmllbGRdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0YXR1c09yRmllbGQuJHBlbmRpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0ICRlcnJvcnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiBleHRyYWN0TmVzdGVkRXJyb3JzKCRmaWVsZHMudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBjb25zdCAkc2lsZW50RXJyb3JzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gZXh0cmFjdE5lc3RlZEVycm9ycygkZmllbGRzLnZhbHVlLCB0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAkZGlydHksXG4gICAgICAgICRhbnlEaXJ0eSxcbiAgICAgICAgJGludmFsaWQsXG4gICAgICAgICR2YWxpZCxcbiAgICAgICAgJGVycm9yLFxuICAgICAgICAkcGVuZGluZyxcbiAgICAgICAgJGVycm9ycyxcbiAgICAgICAgJHNpbGVudEVycm9ycyxcbiAgICAgIH0gc2F0aXNmaWVzIFNjb3BlU3RhdGU7XG4gICAgfSkhO1xuICB9XG5cbiAgZnVuY3Rpb24gJHVud2F0Y2goKSB7XG4gICAgaWYgKCRmaWVsZHMudmFsdWUpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBmaWVsZF0pID0+IHtcbiAgICAgICAgZmllbGQuJHVud2F0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgICR1bndhdGNoRmllbGRzPy4oKTtcbiAgICAkdW53YXRjaFN0YXRlPy4oKTtcbiAgICAkdW53YXRjaEdyb3Vwcz8uKCk7XG4gICAgc2NvcGUuc3RvcCgpO1xuICAgIHNjb3BlID0gZWZmZWN0U2NvcGUoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uICRjbGVhckV4dGVybmFsRXJyb3JzKCkge1xuICAgIE9iamVjdC5lbnRyaWVzKCRmaWVsZHMudmFsdWUpLmZvckVhY2goKFtfLCBmaWVsZF0pID0+IHtcbiAgICAgIGZpZWxkLiRjbGVhckV4dGVybmFsRXJyb3JzKCk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVhY3RpdmUoe1xuICAgIC4uLnNjb3BlU3RhdGUsXG4gICAgJGZpZWxkcyxcbiAgICAkdmFsdWU6IHN0YXRlLFxuICAgICRyZXNldCxcbiAgICAkdG91Y2gsXG4gICAgJHZhbGlkYXRlLFxuICAgICR1bndhdGNoLFxuICAgICR3YXRjaCxcbiAgICAkY2xlYXJFeHRlcm5hbEVycm9ycyxcbiAgfSkgc2F0aXNmaWVzICRJbnRlcm5hbFJlZ2xlU3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgQ3JlYXRlUmVhY3RpdmVDaGlsZHJlblN0YXR1cyB7XG4gIHN0YXRlOiBSZWY8dW5rbm93bj47XG4gIHJ1bGVzRGVmOiBSZWY8JEludGVybmFsRm9ybVByb3BlcnR5VHlwZXMsIGFueT47XG4gIGN1c3RvbU1lc3NhZ2VzPzogQ3VzdG9tUnVsZXNEZWNsYXJhdGlvblRyZWU7XG4gIHBhdGg6IHN0cmluZztcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHN0b3JhZ2U6IFJlZ2xlU3RvcmFnZTtcbiAgb3B0aW9uczogRGVlcE1heWJlUmVmPFJlcXVpcmVkRGVlcDxSZWdsZUJlaGF2aW91ck9wdGlvbnM+PjtcbiAgZXh0ZXJuYWxFcnJvcnM6IFJlYWRvbmx5PFJlZjwkSW50ZXJuYWxFeHRlcm5hbFJlZ2xlRXJyb3JzIHwgdW5kZWZpbmVkPj47XG4gIG9uVW53YXRjaD86ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzKHtcbiAgc3RhdGUsXG4gIHJ1bGVzRGVmLFxuICBjdXN0b21NZXNzYWdlcyxcbiAgcGF0aCxcbiAgc3RvcmFnZSxcbiAgb3B0aW9ucyxcbiAgZXh0ZXJuYWxFcnJvcnMsXG4gIGluZGV4LFxuICBvblVud2F0Y2gsXG59OiBDcmVhdGVSZWFjdGl2ZUNoaWxkcmVuU3RhdHVzKTogJEludGVybmFsUmVnbGVTdGF0dXNUeXBlIHwgbnVsbCB7XG4gIGlmIChpc0NvbGxlY3Rpb25SdWxlc0RlZihydWxlc0RlZikpIHtcbiAgICByZXR1cm4gY3JlYXRlUmVhY3RpdmVDb2xsZWN0aW9uU3RhdHVzKHtcbiAgICAgIHN0YXRlOiBzdGF0ZSBhcyBSZWY8dW5rbm93biAmIHsgJGlkPzogc3RyaW5nIH1bXT4sXG4gICAgICBydWxlc0RlZixcbiAgICAgIGN1c3RvbU1lc3NhZ2VzLFxuICAgICAgcGF0aCxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBvcHRpb25zLFxuICAgICAgaW5kZXgsXG4gICAgICBleHRlcm5hbEVycm9ycyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc05lc3RlZFJ1bGVzRGVmKHN0YXRlLCBydWxlc0RlZikgJiYgaXNSZWZPYmplY3Qoc3RhdGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKHtcbiAgICAgIHNjb3BlUnVsZXM6IHJ1bGVzRGVmLFxuICAgICAgc3RhdGUsXG4gICAgICBjdXN0b21NZXNzYWdlcyxcbiAgICAgIHBhdGgsXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGluZGV4LFxuICAgICAgZXh0ZXJuYWxFcnJvcnM6IGV4dGVybmFsRXJyb3JzIGFzIFJlYWRvbmx5PFJlZjxSZWdsZUV4dGVybmFsRXJyb3JUcmVlIHwgdW5kZWZpbmVkPj4sXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNWYWxpZGF0b3JSdWxlc0RlZihydWxlc0RlZikpIHtcbiAgICByZXR1cm4gY3JlYXRlUmVhY3RpdmVGaWVsZFN0YXR1cyh7XG4gICAgICBzdGF0ZSxcbiAgICAgIHJ1bGVzRGVmLFxuICAgICAgY3VzdG9tTWVzc2FnZXMsXG4gICAgICBwYXRoLFxuICAgICAgc3RvcmFnZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpbmRleCxcbiAgICAgIGV4dGVybmFsRXJyb3JzOiBleHRlcm5hbEVycm9ycyBhcyBSZWY8c3RyaW5nW10gfCB1bmRlZmluZWQ+LFxuICAgICAgb25VbndhdGNoLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgY29tcHV0ZWQsIHJlYWN0aXZlLCB1bnJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBDdXN0b21SdWxlc0RlY2xhcmF0aW9uVHJlZSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IHVzZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi91c2VTdG9yYWdlJztcbmltcG9ydCB7IHVzZUVycm9ycyB9IGZyb20gJy4uL3VzZUVycm9ycyc7XG5pbXBvcnQgeyBjcmVhdGVSZWFjdGl2ZU5lc3RlZFN0YXR1cyB9IGZyb20gJy4vY3JlYXRlUmVhY3RpdmVOZXN0ZWRTdGF0dXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlU3RhdGVQcm9wZXJ0aWVzKFxuICBzY29wZVJ1bGVzOiBDb21wdXRlZFJlZjwkSW50ZXJuYWxSZWdsZVBhcnRpYWxWYWxpZGF0aW9uVHJlZT4sXG4gIHN0YXRlOiBSZWY8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gIG9wdGlvbnM6IFJlc29sdmVkUmVnbGVCZWhhdmlvdXJPcHRpb25zLFxuICBjdXN0b21SdWxlcz86ICgpID0+IEN1c3RvbVJ1bGVzRGVjbGFyYXRpb25UcmVlXG4pIHtcbiAgY29uc3Qgc3RvcmFnZSA9IHVzZVN0b3JhZ2UoKTtcblxuICBjb25zdCBleHRlcm5hbEVycm9ycyA9IGNvbXB1dGVkKCgpID0+IHVucmVmKG9wdGlvbnMuZXh0ZXJuYWxFcnJvcnMpKTtcblxuICBjb25zdCByZWdsZSA9IHJlYWN0aXZlKFxuICAgIGNyZWF0ZVJlYWN0aXZlTmVzdGVkU3RhdHVzKHtcbiAgICAgIHJvb3RSdWxlczogc2NvcGVSdWxlcyxcbiAgICAgIHNjb3BlUnVsZXMsXG4gICAgICBzdGF0ZSxcbiAgICAgIGN1c3RvbU1lc3NhZ2VzOiBjdXN0b21SdWxlcz8uKCksXG4gICAgICBzdG9yYWdlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dGVybmFsRXJyb3JzLFxuICAgICAgdmFsaWRhdGlvbkdyb3Vwczogb3B0aW9ucy52YWxpZGF0aW9uR3JvdXBzLFxuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgZXJyb3JzID0gdXNlRXJyb3JzKHJlZ2xlKTtcblxuICByZXR1cm4geyByZWdsZSwgZXJyb3JzIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVpcmVkRGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5pbXBvcnQgdHlwZSB7IENvbXB1dGVkUmVmLCBNYXliZVJlZiwgUmVmIH0gZnJvbSAndnVlJztcbmltcG9ydCB7IGNvbXB1dGVkLCBpc1JlZiwgcmVmLCB0b1JhdyB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gICRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBBbGxSdWxlc0RlY2xhcmF0aW9ucyxcbiAgRGVlcFJlYWN0aXZlU3RhdGUsXG4gIERlZXBTYWZlRm9ybVN0YXRlLFxuICBMb2NhbFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGUsXG4gIFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyxcbiAgUmVnbGVFcnJvclRyZWUsXG4gIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWUsXG4gIFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlLFxuICBSZWdsZVN0YXR1cyxcbiAgUmVnbGVWYWxpZGF0aW9uR3JvdXBFbnRyeSxcbiAgUmVzb2x2ZWRSZWdsZUJlaGF2aW91ck9wdGlvbnMsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgRGVlcE1heWJlUmVmIH0gZnJvbSAnLi4vLi4vdHlwZXMvdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IHVzZVN0YXRlUHJvcGVydGllcyB9IGZyb20gJy4vdXNlU3RhdGVQcm9wZXJ0aWVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZVJlZ2xlQ29tcG9zYWJsZTxUQ3VzdG9tUnVsZXMgZXh0ZW5kcyBQYXJ0aWFsPEFsbFJ1bGVzRGVjbGFyYXRpb25zPj4oXG4gIGN1c3RvbVJ1bGVzPzogKCkgPT4gVEN1c3RvbVJ1bGVzLFxuICBvcHRpb25zPzogUmVnbGVCZWhhdmlvdXJPcHRpb25zXG4pIHtcbiAgY29uc3QgZ2xvYmFsT3B0aW9uczogUmVxdWlyZWREZWVwPFJlZ2xlQmVoYXZpb3VyT3B0aW9ucz4gPSB7XG4gICAgYXV0b0RpcnR5OiBvcHRpb25zPy5hdXRvRGlydHkgPz8gdHJ1ZSxcbiAgICBsYXp5OiBvcHRpb25zPy5sYXp5ID8/IGZhbHNlLFxuICAgIHJld2FyZEVhcmx5OiBvcHRpb25zPy5yZXdhcmRFYXJseSA/PyBmYWxzZSxcbiAgfTtcblxuICBmdW5jdGlvbiB1c2VSZWdsZTxcbiAgICBUU3RhdGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRSdWxlcyBleHRlbmRzIFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPFRTdGF0ZSwgUGFydGlhbDxBbGxSdWxlc0RlY2xhcmF0aW9ucz4gJiBUQ3VzdG9tUnVsZXM+LFxuICAgIFRFeHRlcm5hbCBleHRlbmRzIFJlZ2xlRXh0ZXJuYWxFcnJvclRyZWU8VFN0YXRlPixcbiAgICBUVmFsaWRhdGlvbkdyb3VwcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFJlZ2xlVmFsaWRhdGlvbkdyb3VwRW50cnlbXT4sXG4gICAgVFZhbGlkID0ga2V5b2YgVFJ1bGVzIGV4dGVuZHMga2V5b2YgUmVnbGVQYXJ0aWFsVmFsaWRhdGlvblRyZWU8XG4gICAgICBUU3RhdGUsXG4gICAgICBQYXJ0aWFsPEFsbFJ1bGVzRGVjbGFyYXRpb25zPiAmIFRDdXN0b21SdWxlc1xuICAgID5cbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZSxcbiAgPihcbiAgICBzdGF0ZTogTWF5YmVSZWY8VFN0YXRlPiB8IERlZXBSZWFjdGl2ZVN0YXRlPFRTdGF0ZT4sXG4gICAgcnVsZXNGYWN0b3J5OiBUVmFsaWQgZXh0ZW5kcyB0cnVlID8gVFJ1bGVzIHwgKCgpID0+IFRSdWxlcykgfCBDb21wdXRlZFJlZjxUUnVsZXM+IDogbmV2ZXIsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8RGVlcE1heWJlUmVmPFJlZ2xlQmVoYXZpb3VyT3B0aW9ucz4+ICZcbiAgICAgIExvY2FsUmVnbGVCZWhhdmlvdXJPcHRpb25zPFRTdGF0ZSwgVFJ1bGVzLCBURXh0ZXJuYWwsIFRWYWxpZGF0aW9uR3JvdXBzPlxuICApOiBSZWdsZTxUU3RhdGUsIFRSdWxlcywgVEV4dGVybmFsLCBUVmFsaWRhdGlvbkdyb3Vwcz4ge1xuICAgIGNvbnN0IHNjb3BlUnVsZXMgPSBpc1JlZihydWxlc0ZhY3RvcnkpXG4gICAgICA/IHJ1bGVzRmFjdG9yeVxuICAgICAgOiBjb21wdXRlZChcbiAgICAgICAgICAodHlwZW9mIChydWxlc0ZhY3RvcnkgYXMgVFJ1bGVzIHwgKCgpID0+IFRSdWxlcykpID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IHJ1bGVzRmFjdG9yeVxuICAgICAgICAgICAgOiAoKSA9PiBydWxlc0ZhY3RvcnkpIGFzIGFueVxuICAgICAgICApO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRPcHRpb25zOiBSZXNvbHZlZFJlZ2xlQmVoYXZpb3VyT3B0aW9ucyA9IHtcbiAgICAgIC4uLmdsb2JhbE9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgcHJvY2Vzc2VkU3RhdGUgPSBpc1JlZihzdGF0ZSkgPyBzdGF0ZSA6IChyZWYoc3RhdGUpIGFzIFJlZjxUU3RhdGU+KTtcblxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGNsb25lRGVlcCh0b1Jhdyhwcm9jZXNzZWRTdGF0ZS52YWx1ZSkpO1xuXG4gICAgY29uc3QgeyByZWdsZSwgZXJyb3JzIH0gPSB1c2VTdGF0ZVByb3BlcnRpZXMoXG4gICAgICBzY29wZVJ1bGVzIGFzIENvbXB1dGVkUmVmPCRJbnRlcm5hbFJlZ2xlUGFydGlhbFZhbGlkYXRpb25UcmVlPixcbiAgICAgIHByb2Nlc3NlZFN0YXRlLFxuICAgICAgcmVzb2x2ZWRPcHRpb25zLFxuICAgICAgY3VzdG9tUnVsZXNcbiAgICApO1xuXG4gICAgZnVuY3Rpb24gcmVzZXRBbGwoKSB7XG4gICAgICByZWdsZS4kdW53YXRjaCgpO1xuICAgICAgcmVzZXRWYWx1ZXNSZWN1cnNpdmVseShzdGF0ZSwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIHJlZ2xlLiRyZXNldCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoXG4gICAgICBjdXJyZW50OiBSZWY8UmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4+IHwgUmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4sXG4gICAgICBpbml0aWFsOiBSZWNvcmQ8c3RyaW5nLCBNYXliZVJlZjxhbnk+PlxuICAgICkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoaW5pdGlhbCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50UmVmID0gaXNSZWY8UmVjb3JkPHN0cmluZywgTWF5YmVSZWY8YW55Pj4+KGN1cnJlbnQpID8gY3VycmVudC52YWx1ZSA6IGN1cnJlbnQ7XG4gICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBpc1JlZihjdXJyZW50UmVmW2tleV0pID8gY3VycmVudFJlZltrZXldLnZhbHVlIDogY3VycmVudFJlZltrZXldO1xuICAgICAgICBsZXQgaW5pdGlhbFJlZiA9IGlzUmVmKGluaXRpYWxba2V5XSkgPyAoaW5pdGlhbFtrZXldIGFzIGFueSkuX3ZhbHVlIDogaW5pdGlhbFtrZXldO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsUmVmKSAmJiBBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICBjdXJyZW50UmVmW2tleV0gPSBbXTtcbiAgICAgICAgICBpbml0aWFsUmVmLmZvckVhY2goKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWZba2V5XVtpbmRleF0gPSB7fTtcbiAgICAgICAgICAgIHJlc2V0VmFsdWVzUmVjdXJzaXZlbHkoY3VycmVudFJlZltrZXldW2luZGV4XSwgaW5pdGlhbFJlZltpbmRleF0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGluaXRpYWxSZWYpKSB7XG4gICAgICAgICAgcmVzZXRWYWx1ZXNSZWN1cnNpdmVseShjdXJyZW50VmFsdWUsIGluaXRpYWxSZWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChpc1JlZihjdXJyZW50UmVmW2tleV0pKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVmW2tleV0udmFsdWUgPSBpbml0aWFsUmVmO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50UmVmW2tleV0gPSBpbml0aWFsUmVmO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhZHkgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiB7XG4gICAgICByZXR1cm4gIShyZWdsZS4kaW52YWxpZCB8fCByZWdsZS4kcGVuZGluZyk7XG4gICAgfSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZVN0YXRlKCk6IFByb21pc2U8ZmFsc2UgfCBEZWVwU2FmZUZvcm1TdGF0ZTxUU3RhdGUsIFRSdWxlcz4+IHtcbiAgICAgIHJlZ2xlLiR0b3VjaCgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVnbGUuJHZhbGlkYXRlKCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRTdGF0ZS52YWx1ZSBhcyBhbnk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZ2xlOiByZWdsZSBhcyB1bmtub3duIGFzIFJlZ2xlU3RhdHVzPFRTdGF0ZSwgVFJ1bGVzLCBUVmFsaWRhdGlvbkdyb3Vwcz4sXG4gICAgICBlcnJvcnM6IGVycm9ycyBhcyBSZWdsZUVycm9yVHJlZTxUUnVsZXM+LFxuICAgICAgcmVzZXRBbGwsXG4gICAgICB2YWxpZGF0ZVN0YXRlLFxuICAgICAgcmVhZHksXG4gICAgICBzdGF0ZTogcHJvY2Vzc2VkU3RhdGUsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1c2VSZWdsZTtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVJlZ2xlID0gY3JlYXRlVXNlUmVnbGVDb21wb3NhYmxlKCk7XG4iLCJpbXBvcnQgdHlwZSB7IEFsbFJ1bGVzRGVjbGFyYXRpb25zLCBSZWdsZUJlaGF2aW91ck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVVc2VSZWdsZUNvbXBvc2FibGUgfSBmcm9tICcuL3VzZVJlZ2xlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZ2xlQ29uZmlnPFRDdXN0b21SdWxlcyBleHRlbmRzIFBhcnRpYWw8QWxsUnVsZXNEZWNsYXJhdGlvbnM+Pih7XG4gIHJ1bGVzLFxuICBtb2RpZmllcnMsXG59OiB7XG4gIHJ1bGVzPzogKCkgPT4gVEN1c3RvbVJ1bGVzO1xuICBtb2RpZmllcnM/OiBSZWdsZUJlaGF2aW91ck9wdGlvbnM7XG59KSB7XG4gIGNvbnN0IHVzZVJlZ2xlID0gY3JlYXRlVXNlUmVnbGVDb21wb3NhYmxlPFRDdXN0b21SdWxlcz4ocnVsZXMsIG1vZGlmaWVycyk7XG5cbiAgcmV0dXJuIHVzZVJlZ2xlO1xufVxuIl19
|