@regle/rules 0.1.4 → 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 CHANGED
@@ -5,9 +5,9 @@ declare function withMessage<TValue extends any, TParams extends any[], TReturn
5
5
  declare function withMessage<TValue extends any, TParams extends any[], TMetadata extends RegleRuleMetadataDefinition, TReturn extends TMetadata | Promise<TMetadata>, TAsync extends boolean = TReturn extends Promise<any> ? true : false>(rule: RegleRuleWithParamsDefinition<TValue, TParams, TAsync, TMetadata>, newMessage: RegleRuleDefinitionWithMetadataProcessor<TValue, RegleRuleMetadataConsumer<TParams, TMetadata>, string | string[]>): RegleRuleWithParamsDefinition<TValue, TParams, TAsync>;
6
6
  declare function withMessage<TValue extends any, TParams extends any[], TMetadata extends RegleRuleMetadataDefinition, TReturn extends TMetadata | Promise<TMetadata>, TAsync extends boolean>(rule: RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>, newMessage: RegleRuleDefinitionWithMetadataProcessor<TValue, RegleRuleMetadataConsumer<TParams, TMetadata>, string | string[]>): RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>;
7
7
 
8
- declare function withAsync<TValue, TParams extends (Ref<unknown> | (() => unknown))[] = [], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn>(rule: InlineRuleDeclaration<TValue, NoInfer<TParams>, TReturn>, depsArray?: [...TParams]): RegleRuleDefinition<TValue, UnwrapRegleUniversalParams<TParams>, true, TMetadata>;
8
+ declare function withAsync<TValue, TParams extends (Ref<unknown> | (() => unknown))[] = [], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition>, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn>(rule: InlineRuleDeclaration<TValue, TParams, TReturn>, depsArray?: [...TParams]): RegleRuleDefinition<TValue, UnwrapRegleUniversalParams<TParams>, true, TMetadata>;
9
9
 
10
- declare function withParams<TValue, TParams extends (Ref<unknown> | (() => unknown))[] = [], TReturn extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn>(rule: InlineRuleDeclaration<TValue, NoInfer<TParams>, TReturn>, depsArray: [...TParams]): RegleRuleDefinition<TValue, UnwrapRegleUniversalParams<TParams>, true, TMetadata>;
10
+ declare function withParams<TValue, TParams extends (Ref<unknown> | (() => unknown))[] = [], TReturn extends RegleRuleMetadataDefinition = RegleRuleMetadataDefinition, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn>(rule: InlineRuleDeclaration<TValue, TParams, TReturn>, depsArray: [...TParams]): RegleRuleDefinition<TValue, UnwrapRegleUniversalParams<TParams>, true, TMetadata>;
11
11
 
12
12
  declare function applyIf<TValue extends any, TParams extends any[], TReturn extends RegleRuleMetadataDefinition | Promise<RegleRuleMetadataDefinition> = RegleRuleMetadataDefinition, TMetadata extends RegleRuleMetadataDefinition = TReturn extends Promise<infer M> ? M : TReturn, TAsync extends boolean = TReturn extends Promise<any> ? true : false>(_condition: ParamDecl<boolean>, rule: InlineRuleDeclaration<TValue, TParams, TReturn> | RegleRuleDefinition<TValue, TParams, TAsync, TMetadata>): RegleRuleDefinition<TValue, [], TAsync, TMetadata>;
13
13
 
@@ -149,7 +149,13 @@ declare const url: RegleRuleDefinition<string, [], false, boolean, string>;
149
149
 
150
150
  declare const dateAfter: RegleRuleWithParamsDefinition<string | Date, [
151
151
  after: Maybe<string | Date>
152
- ], false, boolean>;
152
+ ], false, true | {
153
+ $valid: false;
154
+ error: 'date-not-after';
155
+ } | {
156
+ $valid: false;
157
+ error: 'value-or-paramater-not-a-date';
158
+ }>;
153
159
 
154
160
  declare const dateBefore: RegleRuleWithParamsDefinition<string | Date, [
155
161
  before: Maybe<string | Date>
@@ -174,4 +180,16 @@ declare const macAddress: RegleRuleWithParamsDefinition<string, [
174
180
 
175
181
  declare const checked: RegleRuleDefinition<boolean, [], false, boolean, boolean>;
176
182
 
177
- export { alpha, alphaNum, and, applyIf, between, checked, dateAfter, dateBefore, dateBetween, decimal, email, exactLength, integer, ipAddress, macAddress, maxLength, maxValue, minLength, minValue, not, numeric, or, required, requiredIf, requiredUnless, ruleHelpers, sameAs, url, withAsync, withMessage, withParams };
183
+ declare const contains: RegleRuleWithParamsDefinition<string, [
184
+ part: Maybe<string>
185
+ ], false, boolean>;
186
+
187
+ declare const startsWith: RegleRuleWithParamsDefinition<string, [
188
+ part: Maybe<string>
189
+ ], false, boolean>;
190
+
191
+ declare const endsWith: RegleRuleWithParamsDefinition<string, [
192
+ part: Maybe<string>
193
+ ], false, boolean>;
194
+
195
+ export { alpha, alphaNum, and, applyIf, between, checked, contains, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, integer, ipAddress, macAddress, maxLength, maxValue, minLength, minValue, not, numeric, or, required, requiredIf, requiredUnless, ruleHelpers, sameAs, startsWith, url, withAsync, withMessage, withParams };
package/dist/index.js CHANGED
@@ -1 +1,771 @@
1
- import {createRule,InternalRuleType,unwrapRuleParameters}from'@regle/core';import {unref}from'vue';function $(e,t){let a,o,l,u;typeof e=="function"&&!("_validator"in e)?(a=InternalRuleType.Inline,o=e):{_type:a,validator:o,_active:l,_params:u}=e;let f=createRule({type:a,validator:o,active:l,message:t});return f._params=u,f._patched=!0,f}function v(e,t){let a=async(l,...u)=>e(l,...u),o=createRule({type:InternalRuleType.Async,validator:a,message:""});return o._params=t,o}function _(e,t){let a=(l,...u)=>e(l,...u),o=createRule({type:InternalRuleType.Inline,validator:a,message:""});return o._params=t,o}function E(e,t){let a,o,l,u="";typeof t=="function"?(a=InternalRuleType.Inline,o=t):({_type:a,validator:o,_params:l,_message:u}=t,l?.push(e));function f(i,...m){let[p]=unwrapRuleParameters([e]);return p?o(i,...m):!0}function n(i,m){let[p]=unwrapRuleParameters([e]);return p}let s=createRule({type:a,validator:f,active:n,message:u});return s._params=l,s}function y(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:!String(e).length}function c(e){return !y(typeof e=="string"?e.trim():e)}function b(e){return e==null||typeof e!="number"?!1:!isNaN(e)}function x(e,...t){if(y(e))return !0;let a=typeof e=="number"?e.toString():e;return t.every(o=>(o.lastIndex=0,o.test(a)))}function D(e){let t=unref(e);return Array.isArray(t)?t.length:typeof t=="object"?Object.keys(t).length:typeof t=="number"?isNaN(t)?0:t:String(t).length}function T(e){if(y(e))return !1;try{let t=null;if(e instanceof Date)t=e;else if(typeof e=="number"&&!isNaN(e))t=new Date(e);else if(typeof e=="string"){let a=new Date(e);if(a.toString()==="Invalid Date")return !1;t=a;}return !!t}catch{return !1}}function M(e){let t=Object.prototype.toString.call(e);return e instanceof Date||typeof e=="object"&&t==="[object Date]"?new Date(e.getTime()):typeof e=="number"||t==="[object Number]"?new Date(e):typeof e=="string"||t==="[object String]"?new Date(e):new Date(NaN)}function h(e){return typeof e=="number"?e:e.trim()!==e?null:+e}var r={isEmpty:y,isFilled:c,size:D,regex:x,isNumber:b,isDate:T,toDate:M,toNumber:h};function z(...e){let t=e.some(n=>typeof n=="function"?n.constructor.name==="AsyncFunction":n._async),a=e.map(n=>{if(typeof n=="function")return null;{let s=n._params;return s?.length?s:[null]}}).flat().filter(n=>!!n);function o(n,s,...i){let m=[],p=0;for(let R of n)if(typeof R=="function")m.push(R(s)),p++;else {let d=R._params?.length??0;m.push(R.validator(s,...i.slice(p,d))),d&&(p+=d);}return m}function l(n){return n.some(i=>typeof i!="boolean")?{$valid:n.every(i=>typeof i=="boolean"?!!i:i.$valid),...n.reduce((i,m)=>{if(typeof m=="boolean")return i;let{$valid:p,...R}=m;return {...i,...R}},{})}:n.every(i=>!!i)}let u;e.length?u=t?async(n,...s)=>{let i=await Promise.all(o(e,n,...s));return l(i)}:(n,...s)=>{let i=o(e,n,...s);return l(i)}:u=n=>!1;let f=createRule({type:"and",validator:u,message:"The value does not match all of the provided validators"});return f._params=a,f}function C(...e){let t=e.some(n=>typeof n=="function"?n.constructor.name==="AsyncFunction":n._async),a=e.map(n=>typeof n=="function"?null:n._params).flat().filter(n=>!!n);function o(n,s,...i){let m=[],p=0;for(let R of n)if(typeof R=="function")m.push(R(s)),p++;else {let d=R._params?.length??0;m.push(R.validator(s,...i.slice(p,d))),d&&(p+=d);}return m}function l(n){return n.some(i=>typeof i!="boolean")?{$valid:n.some(i=>typeof i=="boolean"?!!i:i.$valid),...n.reduce((i,m)=>{if(typeof m=="boolean")return i;let{$valid:p,...R}=m;return {...i,...R}},{})}:n.some(i=>!!i)}let f=createRule({type:"or",validator:t?async(n,...s)=>{let i=await Promise.all(o(e,n,...s));return l(i)}:(n,...s)=>{let i=o(e,n,...s);return l(i)},message:"The value does not match any of the provided validators"});return f._params=a,f}function q(e,t){let a,o,l,u,f;typeof e=="function"?(o=e,f=e.constructor.name==="AsyncFunction"):({_type:a,validator:o,_params:u}=e,f=e._async),f?l=async(s,...i)=>r.isFilled(s)?!await o(s,...i):!0:l=(s,...i)=>r.isFilled(s)?!o(s,...i):!0;let n=createRule({type:"not",validator:l,message:t??"Error"});return n._params=u,n}var yt=createRule({type:"required",validator:e=>r.isFilled(e),message:"This field is required"});var bt=createRule({type:"maxLength",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isNumber(t)?r.size(e)<=t:(console.warn(`[maxLength] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0,message:(e,{$params:[t]})=>Array.isArray(e)?`This list should have maximum ${t} items`:`The maximum length allowed is ${t}`});var ht=createRule({type:"required",validator(e,t){return t?r.isFilled(e):!0},message:"This field is required",active(e,{$params:[t]}){return t}});var B=/^[a-zA-Z]*$/,At=createRule({type:"alpha",validator(e){return r.isEmpty(e)?!0:r.regex(e,B)},message:"The value is not alphabetical"});var Z=/^[a-zA-Z0-9]*$/,Wt=createRule({type:"alpha",validator(e){return r.isEmpty(e)?!0:r.regex(e,Z)},message:"The value must be alpha-numeric"});var Et=createRule({type:"between",validator:(e,t,a)=>{if(r.isFilled(e)&&r.isFilled(t)&&r.isFilled(a)){let o=r.toNumber(e),l=r.toNumber(t),u=r.toNumber(a);return r.isNumber(o)&&r.isNumber(l)&&r.isNumber(u)?o>=l&&o<=u:(console.warn(`[between] Value or parameters aren't numbers, got value: ${e}, min: ${t}, max: ${a}`),!1)}return !0},message:(e,{$params:[t,a]})=>`The value must be between ${t} and ${a}`});var X=/^[-]?\d*(\.\d+)?$/,Ut=createRule({type:"decimal",validator(e){return r.isEmpty(e)?!0:r.regex(e,X)},message:"Value must be decimal"});var ee=/^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i,St=createRule({type:"email",validator(e){return r.isEmpty(e)?!0:r.regex(e,ee)},message:"Value must be an valid email address"});var re=/(^[0-9]*$)|(^-[0-9]+$)/,Bt=createRule({type:"integer",validator(e){return r.isEmpty(e)?!0:r.regex(e,re)},message:"Value must be an integer"});var Qt=createRule({type:"maxValue",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isNumber(t)&&r.isNumber(e)?e<=t:(console.warn(`[maxValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0,message:(e,{$params:[t]})=>`The maximum value allowed is ${t}`});var tr=createRule({type:"minLength",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isNumber(t)?r.size(e)>=t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0,message:(e,{$params:[t]})=>Array.isArray(e)?`This list should have at least ${t} items`:`This field should be at least ${t} characters long`});var ir=createRule({type:"minValue",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isNumber(t)&&r.isNumber(e)?e>=t:(console.warn(`[minValue] Value or parameter isn't a number, got value: ${e}, parameter: ${t}`),!1):!0,message:(e,{$params:[t]})=>`The minimum value allowed is ${t}`});var ur=createRule({type:"exactLength",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isNumber(t)?r.size(e)===t:(console.warn(`[minLength] Parameter isn't a number, got parameter: ${t}`),!1):!0,message:(e,{$params:[t]})=>`This field should be exactly ${t} characters long`});var le=/^\d*(\.\d+)?$/,Rr=createRule({type:"numeric",validator(e){return r.isEmpty(e)?!0:r.regex(e,le)},message:"This field must be numeric"});var cr=createRule({type:"required",validator(e,t){return t?!0:r.isFilled(e)},message:"This field is required",active(e,{$params:[t]}){return !t}});var Tr=createRule({type:"sameAs",validator(e,t){return r.isEmpty(e)?!0:e===t},message(e,{$params:[t]}){return `Value must be equal to "${t}"`}});var pe=/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i,wr=createRule({type:"url",validator(e){return r.isEmpty(e)?!0:r.regex(e,pe)},message:"The value is not a valid URL address"});var vr=createRule({type:"dateAfter",validator:(e,t)=>r.isDate(e)&&r.isDate(t)?r.toDate(e).getTime()>r.toDate(t).getTime():!0,message:(e,{$params:[t]})=>`The date must be after ${t}`});var Nr=createRule({type:"dateBefore",validator:(e,t)=>r.isFilled(e)&&r.isFilled(t)?r.isDate(e)&&r.isDate(t)?r.toDate(e).getTime()<r.toDate(t).getTime()?!0:{$valid:!1,error:"date-not-before"}:{$valid:!1,error:"value-or-paramater-not-a-date"}:!0,message:(e,{$params:[t],error:a})=>a==="value-or-paramater-not-a-date"?"The inputs must be Dates":`The date must be before ${t}`});var kr=createRule({type:"dateBetween",validator:(e,t,a)=>r.isDate(e)&&r.isDate(t)&&r.isDate(a)?r.toDate(e).getTime()>r.toDate(t).getTime()&&r.toDate(e).getTime()<r.toDate(a).getTime():!0,message:(e,{$params:[t,a]})=>`The date must be between ${t} and ${a}`});function ce(e){if(e.length>3||e.length===0||e[0]==="0"&&e!=="0"||!e.match(/^\d+$/))return !1;let t=+e|0;return t>=0&&t<=255}var Lr=createRule({type:"ipAddress",validator(e){if(r.isEmpty(e))return !0;if(typeof e!="string")return !1;let t=e.split(".");return t.length===4&&t.every(ce)},message:"The value is not a valid IP address"});var Gr=createRule({type:"macAddress",validator(e,t=":"){if(r.isEmpty(e))return !0;if(typeof e!="string")return !1;let a=typeof t=="string"&&t!==""?e.split(t):e.length===12||e.length===16?e.match(/.{2}/g):null;return a!==null&&(a.length===6||a.length===8)&&a.every(xe)},message:"The value is not a valid MAC Address"}),xe=e=>e.toLowerCase().match(/^[0-9a-f]{2}$/);var Or=createRule({type:"checked",validator:e=>e===!0,message:"This field must be checked"});export{At as alpha,Wt as alphaNum,z as and,E as applyIf,Et as between,Or as checked,vr as dateAfter,Nr as dateBefore,kr as dateBetween,Ut as decimal,St as email,ur as exactLength,Bt as integer,Lr as ipAddress,Gr as macAddress,bt as maxLength,Qt as maxValue,tr as minLength,ir as minValue,q as not,Rr as numeric,C as or,yt as required,ht as requiredIf,cr as requiredUnless,r as ruleHelpers,Tr as sameAs,wr as url,v as withAsync,$ as withMessage,_ as withParams};
1
+ import { createRule, InternalRuleType, unwrapRuleParameters } from '@regle/core';
2
+ import { unref } from 'vue';
3
+
4
+ // src/helpers/withMessage.ts
5
+ function withMessage(rule, newMessage) {
6
+ let _type;
7
+ let validator;
8
+ let _active;
9
+ let _params;
10
+ if (typeof rule === "function" && !("_validator" in rule)) {
11
+ _type = InternalRuleType.Inline;
12
+ validator = rule;
13
+ } else {
14
+ ({ _type, validator, _active, _params } = rule);
15
+ }
16
+ const newRule = createRule({
17
+ type: _type,
18
+ validator,
19
+ active: _active,
20
+ message: newMessage
21
+ });
22
+ newRule._params = _params;
23
+ newRule._patched = true;
24
+ return newRule;
25
+ }
26
+ function withAsync(rule, depsArray) {
27
+ const validator = async (value, ...params) => {
28
+ return rule(value, ...params);
29
+ };
30
+ const newRule = createRule({
31
+ type: InternalRuleType.Async,
32
+ validator,
33
+ message: ""
34
+ });
35
+ newRule._params = depsArray;
36
+ return newRule;
37
+ }
38
+ function withParams(rule, depsArray) {
39
+ const validator = (value, ...params) => {
40
+ return rule(value, ...params);
41
+ };
42
+ const newRule = createRule({
43
+ type: InternalRuleType.Inline,
44
+ validator,
45
+ message: ""
46
+ });
47
+ newRule._params = depsArray;
48
+ return newRule;
49
+ }
50
+ function applyIf(_condition, rule) {
51
+ let _type;
52
+ let validator;
53
+ let _params;
54
+ let _message = "";
55
+ if (typeof rule === "function") {
56
+ _type = InternalRuleType.Inline;
57
+ validator = rule;
58
+ } else {
59
+ ({ _type, validator, _params, _message } = rule);
60
+ _params?.push(_condition);
61
+ }
62
+ function newValidator(value, ...args) {
63
+ const [condition] = unwrapRuleParameters([_condition]);
64
+ if (condition) {
65
+ return validator(value, ...args);
66
+ }
67
+ return true;
68
+ }
69
+ function newActive(value, metadata) {
70
+ const [condition] = unwrapRuleParameters([_condition]);
71
+ return condition;
72
+ }
73
+ const newRule = createRule({
74
+ type: _type,
75
+ validator: newValidator,
76
+ active: newActive,
77
+ message: _message
78
+ });
79
+ newRule._params = _params;
80
+ return newRule;
81
+ }
82
+
83
+ // src/helpers/ruleHelpers/isEmpty.ts
84
+ function isEmpty(value) {
85
+ if (value === void 0 || value === null) {
86
+ return true;
87
+ }
88
+ if (value === false) {
89
+ return false;
90
+ }
91
+ if (value instanceof Date) {
92
+ return isNaN(value.getTime());
93
+ }
94
+ if (Array.isArray(value)) {
95
+ return value.length === 0;
96
+ }
97
+ if (typeof value === "object" && value != null) {
98
+ return Object.keys(value).length === 0;
99
+ }
100
+ return !String(value).length;
101
+ }
102
+
103
+ // src/helpers/ruleHelpers/isFilled.ts
104
+ function isFilled(value) {
105
+ return !isEmpty(typeof value === "string" ? value.trim() : value);
106
+ }
107
+
108
+ // src/helpers/ruleHelpers/isNumber.ts
109
+ function isNumber(value) {
110
+ if (value == null) return false;
111
+ else if (typeof value !== "number") {
112
+ return false;
113
+ } else if (isNaN(value)) {
114
+ return false;
115
+ } else {
116
+ return true;
117
+ }
118
+ }
119
+
120
+ // src/helpers/ruleHelpers/regex.ts
121
+ function regex(_value, ...expr) {
122
+ if (isEmpty(_value)) {
123
+ return true;
124
+ }
125
+ const value = typeof _value === "number" ? _value.toString() : _value;
126
+ return expr.every((reg) => {
127
+ reg.lastIndex = 0;
128
+ return reg.test(value);
129
+ });
130
+ }
131
+ function size(value) {
132
+ const _value = unref(value);
133
+ if (Array.isArray(_value)) return _value.length;
134
+ if (typeof _value === "object") {
135
+ return Object.keys(_value).length;
136
+ }
137
+ if (typeof _value === "number") {
138
+ if (isNaN(_value)) {
139
+ return 0;
140
+ }
141
+ return _value;
142
+ }
143
+ return String(_value).length;
144
+ }
145
+
146
+ // src/helpers/ruleHelpers/isDate.ts
147
+ function isDate(value) {
148
+ if (isEmpty(value)) {
149
+ return false;
150
+ }
151
+ try {
152
+ let possibleDate = null;
153
+ if (value instanceof Date) {
154
+ possibleDate = value;
155
+ } else if (typeof value === "number" && !isNaN(value)) {
156
+ possibleDate = new Date(value);
157
+ } else if (typeof value === "string") {
158
+ const date = new Date(value);
159
+ if (date.toString() === "Invalid Date") {
160
+ return false;
161
+ }
162
+ possibleDate = date;
163
+ }
164
+ return !!possibleDate;
165
+ } catch (e) {
166
+ return false;
167
+ }
168
+ }
169
+
170
+ // src/helpers/ruleHelpers/toDate.ts
171
+ function toDate(argument) {
172
+ const argStr = Object.prototype.toString.call(argument);
173
+ if (argument instanceof Date || typeof argument === "object" && argStr === "[object Date]") {
174
+ return new Date(argument.getTime());
175
+ } else if (typeof argument === "number" || argStr === "[object Number]") {
176
+ return new Date(argument);
177
+ } else if (typeof argument === "string" || argStr === "[object String]") {
178
+ return new Date(argument);
179
+ } else {
180
+ return /* @__PURE__ */ new Date(NaN);
181
+ }
182
+ }
183
+
184
+ // src/helpers/ruleHelpers/toNumber.ts
185
+ function toNumber(argument) {
186
+ if (typeof argument === "number") {
187
+ return argument;
188
+ } else {
189
+ const isPadded = argument.trim() !== argument;
190
+ if (isPadded) {
191
+ return null;
192
+ }
193
+ return +argument;
194
+ }
195
+ }
196
+
197
+ // src/helpers/ruleHelpers/index.ts
198
+ var ruleHelpers = {
199
+ isEmpty,
200
+ isFilled,
201
+ size,
202
+ regex,
203
+ isNumber,
204
+ isDate,
205
+ toDate,
206
+ toNumber
207
+ };
208
+ function and(...rules) {
209
+ const isAnyRuleAsync = rules.some((rule) => {
210
+ if (typeof rule === "function") {
211
+ return rule.constructor.name === "AsyncFunction";
212
+ } else {
213
+ return rule._async;
214
+ }
215
+ });
216
+ const _params = rules.map((rule) => {
217
+ if (typeof rule === "function") {
218
+ return null;
219
+ } else {
220
+ const $params = rule._params;
221
+ if (!$params?.length) {
222
+ return [null];
223
+ } else {
224
+ return $params;
225
+ }
226
+ }
227
+ }).flat().filter((param) => !!param);
228
+ function computeRules(rules2, value, ...params) {
229
+ const $rules = [];
230
+ let paramIndex = 0;
231
+ for (let rule of rules2) {
232
+ if (typeof rule === "function") {
233
+ $rules.push(rule(value));
234
+ paramIndex++;
235
+ } else {
236
+ const paramsLength = rule._params?.length ?? 0;
237
+ $rules.push(rule.validator(value, ...params.slice(paramIndex, paramsLength)));
238
+ if (paramsLength) {
239
+ paramIndex += paramsLength;
240
+ }
241
+ }
242
+ }
243
+ return $rules;
244
+ }
245
+ function computeMetadata(results) {
246
+ const isAnyResultMetaData = results.some((s) => typeof s !== "boolean");
247
+ if (isAnyResultMetaData) {
248
+ return {
249
+ $valid: results.every((result) => {
250
+ if (typeof result === "boolean") {
251
+ return !!result;
252
+ }
253
+ return result.$valid;
254
+ }),
255
+ ...results.reduce((acc, result) => {
256
+ if (typeof result === "boolean") {
257
+ return acc;
258
+ }
259
+ const { $valid, ...rest } = result;
260
+ return { ...acc, ...rest };
261
+ }, {})
262
+ };
263
+ } else {
264
+ return results.every((result) => !!result);
265
+ }
266
+ }
267
+ let validator;
268
+ if (!!rules.length) {
269
+ validator = isAnyRuleAsync ? async (value, ...params) => {
270
+ const results = await Promise.all(computeRules(rules, value, ...params));
271
+ return computeMetadata(results);
272
+ } : (value, ...params) => {
273
+ const $rules = computeRules(rules, value, ...params);
274
+ return computeMetadata($rules);
275
+ };
276
+ } else {
277
+ validator = (value) => {
278
+ return false;
279
+ };
280
+ }
281
+ const newRule = createRule({
282
+ type: "and",
283
+ validator,
284
+ message: "The value does not match all of the provided validators"
285
+ });
286
+ newRule._params = _params;
287
+ return newRule;
288
+ }
289
+ function or(...rules) {
290
+ const isAnyRuleAsync = rules.some((rule) => {
291
+ if (typeof rule === "function") {
292
+ return rule.constructor.name === "AsyncFunction";
293
+ } else {
294
+ return rule._async;
295
+ }
296
+ });
297
+ const params = rules.map((rule) => {
298
+ if (typeof rule === "function") {
299
+ return null;
300
+ } else {
301
+ return rule._params;
302
+ }
303
+ }).flat().filter((param) => !!param);
304
+ function computeRules(rules2, value, ...params2) {
305
+ const $rules = [];
306
+ let paramIndex = 0;
307
+ for (let rule of rules2) {
308
+ if (typeof rule === "function") {
309
+ $rules.push(rule(value));
310
+ paramIndex++;
311
+ } else {
312
+ const paramsLength = rule._params?.length ?? 0;
313
+ $rules.push(rule.validator(value, ...params2.slice(paramIndex, paramsLength)));
314
+ if (paramsLength) {
315
+ paramIndex += paramsLength;
316
+ }
317
+ }
318
+ }
319
+ return $rules;
320
+ }
321
+ function computeMetadata(results) {
322
+ const isAnyResultMetaData = results.some((s) => typeof s !== "boolean");
323
+ if (isAnyResultMetaData) {
324
+ return {
325
+ $valid: results.some((result) => {
326
+ if (typeof result === "boolean") {
327
+ return !!result;
328
+ }
329
+ return result.$valid;
330
+ }),
331
+ ...results.reduce((acc, result) => {
332
+ if (typeof result === "boolean") {
333
+ return acc;
334
+ }
335
+ const { $valid, ...rest } = result;
336
+ return { ...acc, ...rest };
337
+ }, {})
338
+ };
339
+ } else {
340
+ return results.some((result) => !!result);
341
+ }
342
+ }
343
+ const validator = isAnyRuleAsync ? async (value, ...params2) => {
344
+ const results = await Promise.all(computeRules(rules, value, ...params2));
345
+ return computeMetadata(results);
346
+ } : (value, ...params2) => {
347
+ const $rules = computeRules(rules, value, ...params2);
348
+ return computeMetadata($rules);
349
+ };
350
+ const newRule = createRule({
351
+ type: "or",
352
+ validator,
353
+ message: "The value does not match any of the provided validators"
354
+ });
355
+ newRule._params = params;
356
+ return newRule;
357
+ }
358
+ function not(rule, message) {
359
+ let _type;
360
+ let validator;
361
+ let newValidator;
362
+ let _params;
363
+ let _async;
364
+ if (typeof rule === "function") {
365
+ validator = rule;
366
+ _async = rule.constructor.name === "AsyncFunction";
367
+ } else {
368
+ ({ _type, validator, _params } = rule);
369
+ _async = rule._async;
370
+ }
371
+ if (_async) {
372
+ newValidator = async (value, ...params) => {
373
+ if (ruleHelpers.isFilled(value)) {
374
+ const result = await validator(value, ...params);
375
+ return !result;
376
+ }
377
+ return true;
378
+ };
379
+ } else {
380
+ newValidator = (value, ...params) => {
381
+ if (ruleHelpers.isFilled(value)) {
382
+ return !validator(value, ...params);
383
+ }
384
+ return true;
385
+ };
386
+ }
387
+ const newRule = createRule({
388
+ type: "not",
389
+ validator: newValidator,
390
+ message: message ?? "Error"
391
+ });
392
+ newRule._params = _params;
393
+ return newRule;
394
+ }
395
+ var required = createRule({
396
+ type: "required",
397
+ validator: (value) => {
398
+ return ruleHelpers.isFilled(value);
399
+ },
400
+ message: "This field is required"
401
+ });
402
+ var maxLength = createRule({
403
+ type: "maxLength",
404
+ validator: (value, count) => {
405
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
406
+ if (ruleHelpers.isNumber(count)) {
407
+ return ruleHelpers.size(value) <= count;
408
+ }
409
+ console.warn(
410
+ `[maxLength] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
411
+ );
412
+ return false;
413
+ }
414
+ return true;
415
+ },
416
+ message: (value, { $params: [count] }) => {
417
+ if (Array.isArray(value)) {
418
+ return `This list should have maximum ${count} items`;
419
+ }
420
+ return `The maximum length allowed is ${count}`;
421
+ }
422
+ });
423
+ var requiredIf = createRule({
424
+ type: "required",
425
+ validator(value, condition) {
426
+ if (condition) {
427
+ return ruleHelpers.isFilled(value);
428
+ }
429
+ return true;
430
+ },
431
+ message: "This field is required",
432
+ active(_, { $params: [condition] }) {
433
+ return condition;
434
+ }
435
+ });
436
+ var alphaRegex = /^[a-zA-Z]*$/;
437
+ var alpha = createRule({
438
+ type: "alpha",
439
+ validator(value) {
440
+ if (ruleHelpers.isEmpty(value)) {
441
+ return true;
442
+ }
443
+ return ruleHelpers.regex(value, alphaRegex);
444
+ },
445
+ message: "The value is not alphabetical"
446
+ });
447
+ var alphaNumRegex = /^[a-zA-Z0-9]*$/;
448
+ var alphaNum = createRule({
449
+ type: "alpha",
450
+ validator(value) {
451
+ if (ruleHelpers.isEmpty(value)) {
452
+ return true;
453
+ }
454
+ return ruleHelpers.regex(value, alphaNumRegex);
455
+ },
456
+ message: "The value must be alpha-numeric"
457
+ });
458
+ var between = createRule({
459
+ type: "between",
460
+ validator: (value, min, max) => {
461
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(min) && ruleHelpers.isFilled(max)) {
462
+ const tValue = ruleHelpers.toNumber(value);
463
+ const tMin = ruleHelpers.toNumber(min);
464
+ const tMax = ruleHelpers.toNumber(max);
465
+ if (ruleHelpers.isNumber(tValue) && ruleHelpers.isNumber(tMin) && ruleHelpers.isNumber(tMax)) {
466
+ return tValue >= tMin && tValue <= tMax;
467
+ }
468
+ console.warn(
469
+ `[between] Value or parameters aren't numbers, got value: ${value}, min: ${min}, max: ${max}`
470
+ );
471
+ return false;
472
+ }
473
+ return true;
474
+ },
475
+ message: (_, { $params: [min, max] }) => {
476
+ return `The value must be between ${min} and ${max}`;
477
+ }
478
+ });
479
+ var decimalRegex = /^[-]?\d*(\.\d+)?$/;
480
+ var decimal = createRule({
481
+ type: "decimal",
482
+ validator(value) {
483
+ if (ruleHelpers.isEmpty(value)) {
484
+ return true;
485
+ }
486
+ return ruleHelpers.regex(value, decimalRegex);
487
+ },
488
+ message: "Value must be decimal"
489
+ });
490
+ var emailRegex = /^(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9]{2,}(?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i;
491
+ var email = createRule({
492
+ type: "email",
493
+ validator(value) {
494
+ if (ruleHelpers.isEmpty(value)) {
495
+ return true;
496
+ }
497
+ return ruleHelpers.regex(value, emailRegex);
498
+ },
499
+ message: "Value must be an valid email address"
500
+ });
501
+ var integerRegex = /(^[0-9]*$)|(^-[0-9]+$)/;
502
+ var integer = createRule({
503
+ type: "integer",
504
+ validator(value) {
505
+ if (ruleHelpers.isEmpty(value)) {
506
+ return true;
507
+ }
508
+ return ruleHelpers.regex(value, integerRegex);
509
+ },
510
+ message: "Value must be an integer"
511
+ });
512
+ var maxValue = createRule({
513
+ type: "maxValue",
514
+ validator: (value, count) => {
515
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
516
+ if (ruleHelpers.isNumber(count) && ruleHelpers.isNumber(value)) {
517
+ return value <= count;
518
+ }
519
+ console.warn(
520
+ `[maxValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
521
+ );
522
+ return false;
523
+ }
524
+ return true;
525
+ },
526
+ message: (_, { $params: [count] }) => {
527
+ return `The maximum value allowed is ${count}`;
528
+ }
529
+ });
530
+ var minLength = createRule({
531
+ type: "minLength",
532
+ validator: (value, count) => {
533
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
534
+ if (ruleHelpers.isNumber(count)) {
535
+ return ruleHelpers.size(value) >= count;
536
+ }
537
+ console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
538
+ return false;
539
+ }
540
+ return true;
541
+ },
542
+ message: (value, { $params: [count] }) => {
543
+ if (Array.isArray(value)) {
544
+ return `This list should have at least ${count} items`;
545
+ }
546
+ return `This field should be at least ${count} characters long`;
547
+ }
548
+ });
549
+ var minValue = createRule({
550
+ type: "minValue",
551
+ validator: (value, count) => {
552
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
553
+ if (ruleHelpers.isNumber(count) && ruleHelpers.isNumber(value)) {
554
+ return value >= count;
555
+ }
556
+ console.warn(
557
+ `[minValue] Value or parameter isn't a number, got value: ${value}, parameter: ${count}`
558
+ );
559
+ return false;
560
+ }
561
+ return true;
562
+ },
563
+ message: (_, { $params: [count] }) => {
564
+ return `The minimum value allowed is ${count}`;
565
+ }
566
+ });
567
+ var exactLength = createRule({
568
+ type: "exactLength",
569
+ validator: (value, count) => {
570
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(count)) {
571
+ if (ruleHelpers.isNumber(count)) {
572
+ return ruleHelpers.size(value) === count;
573
+ }
574
+ console.warn(`[minLength] Parameter isn't a number, got parameter: ${count}`);
575
+ return false;
576
+ }
577
+ return true;
578
+ },
579
+ message: (_, { $params: [count] }) => {
580
+ return `This field should be exactly ${count} characters long`;
581
+ }
582
+ });
583
+ var numericRegex = /^\d*(\.\d+)?$/;
584
+ var numeric = createRule({
585
+ type: "numeric",
586
+ validator(value) {
587
+ if (ruleHelpers.isEmpty(value)) {
588
+ return true;
589
+ }
590
+ return ruleHelpers.regex(value, numericRegex);
591
+ },
592
+ message: "This field must be numeric"
593
+ });
594
+ var requiredUnless = createRule({
595
+ type: "required",
596
+ validator(value, condition) {
597
+ if (!condition) {
598
+ return ruleHelpers.isFilled(value);
599
+ }
600
+ return true;
601
+ },
602
+ message: "This field is required",
603
+ active(_, { $params: [condition] }) {
604
+ return !condition;
605
+ }
606
+ });
607
+ var sameAs = createRule({
608
+ type: "sameAs",
609
+ validator(value, target) {
610
+ if (ruleHelpers.isEmpty(value)) {
611
+ return true;
612
+ }
613
+ return value === target;
614
+ },
615
+ message(_, { $params: [target] }) {
616
+ return `Value must be equal to "${target}"`;
617
+ }
618
+ });
619
+ var urlRegex = /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i;
620
+ var url = createRule({
621
+ type: "url",
622
+ validator(value) {
623
+ if (ruleHelpers.isEmpty(value)) {
624
+ return true;
625
+ }
626
+ return ruleHelpers.regex(value, urlRegex);
627
+ },
628
+ message: "The value is not a valid URL address"
629
+ });
630
+ var dateAfter = createRule({
631
+ type: "dateAfter",
632
+ validator: (value, after) => {
633
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(after)) {
634
+ if (ruleHelpers.isDate(value) && ruleHelpers.isDate(after)) {
635
+ const result = ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(after).getTime();
636
+ if (result) {
637
+ return true;
638
+ }
639
+ return { $valid: false, error: "date-not-after" };
640
+ }
641
+ return { $valid: false, error: "value-or-paramater-not-a-date" };
642
+ }
643
+ return true;
644
+ },
645
+ message: (_, { $params: [after] }) => {
646
+ return `The date must be after ${after}`;
647
+ }
648
+ });
649
+ var dateBefore = createRule({
650
+ type: "dateBefore",
651
+ validator: (value, before) => {
652
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(before)) {
653
+ if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before)) {
654
+ const result = ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(before).getTime();
655
+ if (result) {
656
+ return true;
657
+ }
658
+ return { $valid: false, error: "date-not-before" };
659
+ }
660
+ return { $valid: false, error: "value-or-paramater-not-a-date" };
661
+ }
662
+ return true;
663
+ },
664
+ message: (_, { $params: [before], error }) => {
665
+ if (error === "value-or-paramater-not-a-date") {
666
+ return "The fields must be Dates";
667
+ }
668
+ return `The date must be before ${before}`;
669
+ }
670
+ });
671
+ var dateBetween = createRule({
672
+ type: "dateBetween",
673
+ validator: (value, before, after) => {
674
+ if (ruleHelpers.isDate(value) && ruleHelpers.isDate(before) && ruleHelpers.isDate(after)) {
675
+ return ruleHelpers.toDate(value).getTime() > ruleHelpers.toDate(before).getTime() && ruleHelpers.toDate(value).getTime() < ruleHelpers.toDate(after).getTime();
676
+ }
677
+ return true;
678
+ },
679
+ message: (_, { $params: [before, after] }) => {
680
+ return `The date must be between ${before} and ${after}`;
681
+ }
682
+ });
683
+ function nibbleValid(nibble) {
684
+ if (nibble.length > 3 || nibble.length === 0) {
685
+ return false;
686
+ }
687
+ if (nibble[0] === "0" && nibble !== "0") {
688
+ return false;
689
+ }
690
+ if (!nibble.match(/^\d+$/)) {
691
+ return false;
692
+ }
693
+ const numeric2 = +nibble | 0;
694
+ return numeric2 >= 0 && numeric2 <= 255;
695
+ }
696
+ var ipAddress = createRule({
697
+ type: "ipAddress",
698
+ validator(value) {
699
+ if (ruleHelpers.isEmpty(value)) {
700
+ return true;
701
+ }
702
+ if (typeof value !== "string") {
703
+ return false;
704
+ }
705
+ const nibbles = value.split(".");
706
+ return nibbles.length === 4 && nibbles.every(nibbleValid);
707
+ },
708
+ message: "The value is not a valid IP address"
709
+ });
710
+ var macAddress = createRule({
711
+ type: "macAddress",
712
+ validator(value, separator = ":") {
713
+ if (ruleHelpers.isEmpty(value)) {
714
+ return true;
715
+ }
716
+ if (typeof value !== "string") {
717
+ return false;
718
+ }
719
+ const parts = typeof separator === "string" && separator !== "" ? value.split(separator) : value.length === 12 || value.length === 16 ? value.match(/.{2}/g) : null;
720
+ return parts !== null && (parts.length === 6 || parts.length === 8) && parts.every(hexValid);
721
+ },
722
+ message: "The value is not a valid MAC Address"
723
+ });
724
+ var hexValid = (hex) => hex.toLowerCase().match(/^[0-9a-f]{2}$/);
725
+ var checked = createRule({
726
+ type: "checked",
727
+ validator: (value) => {
728
+ return value === true;
729
+ },
730
+ message: "This field must be checked"
731
+ });
732
+ var contains = createRule({
733
+ type: "contains",
734
+ validator(value, part) {
735
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
736
+ return value.includes(part);
737
+ }
738
+ return true;
739
+ },
740
+ message(_, { $params: [part] }) {
741
+ return `Field must contain ${part}`;
742
+ }
743
+ });
744
+ var startsWith = createRule({
745
+ type: "startsWith",
746
+ validator(value, part) {
747
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
748
+ return value.startsWith(part);
749
+ }
750
+ return true;
751
+ },
752
+ message(_, { $params: [part] }) {
753
+ return `Field must end with ${part}`;
754
+ }
755
+ });
756
+ var endsWith = createRule({
757
+ type: "endsWith",
758
+ validator(value, part) {
759
+ if (ruleHelpers.isFilled(value) && ruleHelpers.isFilled(part)) {
760
+ return value.endsWith(part);
761
+ }
762
+ return true;
763
+ },
764
+ message(_, { $params: [part] }) {
765
+ return `Field must end with ${part}`;
766
+ }
767
+ });
768
+
769
+ export { alpha, alphaNum, and, applyIf, between, checked, contains, dateAfter, dateBefore, dateBetween, decimal, email, endsWith, exactLength, integer, ipAddress, macAddress, maxLength, maxValue, minLength, minValue, not, numeric, or, required, requiredIf, requiredUnless, ruleHelpers, sameAs, startsWith, url, withAsync, withMessage, withParams };
770
+ //# sourceMappingURL=index.js.map
771
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWxwZXJzL3dpdGhNZXNzYWdlLnRzIiwiLi4vc3JjL2hlbHBlcnMvd2l0aEFzeW5jLnRzIiwiLi4vc3JjL2hlbHBlcnMvd2l0aFBhcmFtcy50cyIsIi4uL3NyYy9oZWxwZXJzL2FwcGx5SWYudHMiLCIuLi9zcmMvaGVscGVycy9ydWxlSGVscGVycy9pc0VtcHR5LnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvaXNGaWxsZWQudHMiLCIuLi9zcmMvaGVscGVycy9ydWxlSGVscGVycy9pc051bWJlci50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3JlZ2V4LnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvc2l6ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL2lzRGF0ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3RvRGF0ZS50cyIsIi4uL3NyYy9oZWxwZXJzL3J1bGVIZWxwZXJzL3RvTnVtYmVyLnRzIiwiLi4vc3JjL2hlbHBlcnMvcnVsZUhlbHBlcnMvaW5kZXgudHMiLCIuLi9zcmMvaGVscGVycy9hbmQudHMiLCIuLi9zcmMvaGVscGVycy9vci50cyIsIi4uL3NyYy9oZWxwZXJzL25vdC50cyIsIi4uL3NyYy9ydWxlcy9yZXF1aXJlZC50cyIsIi4uL3NyYy9ydWxlcy9tYXhMZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvcmVxdWlyZWRJZi50cyIsIi4uL3NyYy9ydWxlcy9hbHBoYS50cyIsIi4uL3NyYy9ydWxlcy9hbHBoYU51bS50cyIsIi4uL3NyYy9ydWxlcy9iZXR3ZWVuLnRzIiwiLi4vc3JjL3J1bGVzL2RlY2ltYWwudHMiLCIuLi9zcmMvcnVsZXMvZW1haWwudHMiLCIuLi9zcmMvcnVsZXMvaW50ZWdlci50cyIsIi4uL3NyYy9ydWxlcy9tYXhWYWx1ZS50cyIsIi4uL3NyYy9ydWxlcy9taW5MZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvbWluVmFsdWUudHMiLCIuLi9zcmMvcnVsZXMvZXhhY3RMZW5ndGgudHMiLCIuLi9zcmMvcnVsZXMvbnVtZXJpYy50cyIsIi4uL3NyYy9ydWxlcy9yZXF1aXJlZFVubGVzcy50cyIsIi4uL3NyYy9ydWxlcy9zYW1lQXMudHMiLCIuLi9zcmMvcnVsZXMvdXJsLnRzIiwiLi4vc3JjL3J1bGVzL2RhdGVBZnRlci50cyIsIi4uL3NyYy9ydWxlcy9kYXRlQmVmb3JlLnRzIiwiLi4vc3JjL3J1bGVzL2RhdGVCZXR3ZWVuLnRzIiwiLi4vc3JjL3J1bGVzL2lwQWRkcmVzcy50cyIsIi4uL3NyYy9ydWxlcy9tYWNBZGRyZXNzLnRzIiwiLi4vc3JjL3J1bGVzL2NoZWNrZWQudHMiLCIuLi9zcmMvcnVsZXMvY29udGFpbnMudHMiLCIuLi9zcmMvcnVsZXMvc3RhcnRzV2l0aC50cyIsIi4uL3NyYy9ydWxlcy9lbmRzV2l0aC50cyJdLCJuYW1lcyI6WyJjcmVhdGVSdWxlIiwiSW50ZXJuYWxSdWxlVHlwZSIsInJ1bGVzIiwicGFyYW1zIiwibnVtZXJpYyJdLCJtYXBwaW5ncyI6Ijs7OztBQXFETyxTQUFTLFdBQUEsQ0FDZCxNQUNBLFVBSzZGLEVBQUE7QUFDN0YsRUFBSSxJQUFBLEtBQUE7QUFDSixFQUFJLElBQUEsU0FBQTtBQUNKLEVBQUksSUFBQSxPQUFBO0FBSUosRUFBSSxJQUFBLE9BQUE7QUFFSixFQUFBLElBQUksT0FBTyxJQUFBLEtBQVMsVUFBYyxJQUFBLEVBQUUsZ0JBQWdCLElBQU8sQ0FBQSxFQUFBO0FBQ3pELElBQUEsS0FBQSxHQUFRLGdCQUFpQixDQUFBLE1BQUE7QUFDekIsSUFBWSxTQUFBLEdBQUEsSUFBQTtBQUFBLEdBQ1AsTUFBQTtBQUNMLElBQUEsQ0FBQyxFQUFFLEtBQUEsRUFBTyxTQUFXLEVBQUEsT0FBQSxFQUFTLFNBQVksR0FBQSxJQUFBO0FBQUE7QUFHNUMsRUFBQSxNQUFNLFVBQVUsVUFBVyxDQUFBO0FBQUEsSUFDekIsSUFBTSxFQUFBLEtBQUE7QUFBQSxJQUNOLFNBQUE7QUFBQSxJQUNBLE1BQVEsRUFBQSxPQUFBO0FBQUEs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QzdELE1BQU8sT0FBQSxLQUFBLENBQU0sV0FBVyxJQUFJLENBQUE7QUFBQTtBQUU5QixJQUFPLE9BQUEsSUFBQTtBQUFBLEdBQ1Q7QUFBQSxFQUNBLFFBQVEsQ0FBRyxFQUFBLEVBQUUsU0FBUyxDQUFDLElBQUksR0FBSyxFQUFBO0FBQzlCLElBQUEsT0FBTyx1QkFBdUIsSUFBSSxDQUFBLENBQUE7QUFBQTtBQUV0QyxDQUFDO0FDaEJNLElBQU0sV0FLVEEsVUFBVyxDQUFBO0FBQUEsRUFDYixJQUFNLEVBQUEsVUFBQTtBQUFBLEVBQ04sU0FBQSxDQUFVLE9BQXNCLElBQXFCLEVBQUE7QUFDbkQsSUFBQSxJQUFJLFlBQVksUUFBUyxDQUFBLEtBQUssS0FBSyxXQUFZLENBQUEsUUFBQSxDQUFTLElBQUksQ0FBRyxFQUFBO0FBQzdELE1BQU8sT0FBQSxLQUFBLENBQU0sU0FBUyxJQUFJLENBQUE7QUFBQTtBQUU1QixJQUFPLE9BQUEsSUFBQTtBQUFBLEdBQ1Q7QUFBQSxFQUNBLFFBQVEsQ0FBRyxFQUFBLEVBQUUsU0FBUyxDQUFDLElBQUksR0FBSyxFQUFBO0FBQzlCLElBQUEsT0FBTyx1QkFBdUIsSUFBSSxDQUFBLENBQUE7QUFBQTtBQUV0QyxDQUFDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlUmF3LFxuICBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbixcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSwgSW50ZXJuYWxSdWxlVHlwZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhNZXNzYWdlPFxuICBUVmFsdWUgZXh0ZW5kcyBhbnksXG4gIFRQYXJhbXMgZXh0ZW5kcyBhbnlbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGFueT4gPyB0cnVlIDogZmFsc2UsXG4+KFxuICBydWxlOiBJbmxpbmVSdWxlRGVjbGFyYXRpb248VFZhbHVlLCBUUGFyYW1zLCBUUmV0dXJuPixcbiAgbmV3TWVzc2FnZTogUmVnbGVSdWxlRGVmaW5pdGlvbldpdGhNZXRhZGF0YVByb2Nlc3NvcjxcbiAgICBUVmFsdWUsXG4gICAgUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcjxUUGFyYW1zLCBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBNPiA/IE0gOiBUUmV0dXJuPixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+XG4pOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFRWYWx1ZSwgW10sIFRBc3luYywgVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybj47XG5leHBvcnQgZnVuY3Rpb24gd2l0aE1lc3NhZ2U8XG4gIFRWYWx1ZSBleHRlbmRzIGFueSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdLFxuICBUTWV0YWRhdGEgZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRSZXR1cm4gZXh0ZW5kcyBUTWV0YWRhdGEgfCBQcm9taXNlPFRNZXRhZGF0YT4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgcnVsZTogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT4sXG4gIG5ld01lc3NhZ2U6IFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3I8XG4gICAgVFZhbHVlLFxuICAgIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXI8VFBhcmFtcywgVE1ldGFkYXRhPixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+XG4pOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYz47XG5leHBvcnQgZnVuY3Rpb24gd2l0aE1lc3NhZ2U8XG4gIFRWYWx1ZSBleHRlbmRzIGFueSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdLFxuICBUTWV0YWRhdGEgZXh0ZW5kcyBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRSZXR1cm4gZXh0ZW5kcyBUTWV0YWRhdGEgfCBQcm9taXNlPFRNZXRhZGF0YT4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4sXG4+KFxuICBydWxlOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFRWYWx1ZSwgVFBhcmFtcywgVEFzeW5jLCBUTWV0YWRhdGE+LFxuICBuZXdNZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIFRWYWx1ZSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPFRQYXJhbXMsIFRNZXRhZGF0YT4sXG4gICAgc3RyaW5nIHwgc3RyaW5nW11cbiAgPlxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRBc3luYywgVE1ldGFkYXRhPjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoTWVzc2FnZShcbiAgcnVsZTogUmVnbGVSdWxlUmF3PGFueSwgYW55LCBhbnksIGFueT4gfCBJbmxpbmVSdWxlRGVjbGFyYXRpb248YW55LCBhbnk+LFxuICBuZXdNZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIGFueSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueVtdLCBhbnk+LFxuICAgIHN0cmluZyB8IHN0cmluZ1tdXG4gID5cbik6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPGFueSwgYW55LCBhbnksIGFueT4gfCBSZWdsZVJ1bGVEZWZpbml0aW9uPGFueSwgYW55LCBhbnksIGFueT4ge1xuICBsZXQgX3R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnkgfCBQcm9taXNlPGFueT4+O1xuICBsZXQgX2FjdGl2ZTpcbiAgICB8IGJvb2xlYW5cbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3I8YW55LCBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueSwgYW55PiwgYm9vbGVhbj5cbiAgICB8IHVuZGVmaW5lZDtcbiAgbGV0IF9wYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhKCdfdmFsaWRhdG9yJyBpbiBydWxlKSkge1xuICAgIF90eXBlID0gSW50ZXJuYWxSdWxlVHlwZS5JbmxpbmU7XG4gICAgdmFsaWRhdG9yID0gcnVsZTtcbiAgfSBlbHNlIHtcbiAgICAoeyBfdHlwZSwgdmFsaWRhdG9yLCBfYWN0aXZlLCBfcGFyYW1zIH0gPSBydWxlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBfdHlwZSBhcyBhbnksXG4gICAgdmFsaWRhdG9yOiB2YWxpZGF0b3IgYXMgYW55LFxuICAgIGFjdGl2ZTogX2FjdGl2ZSBhcyBhbnksXG4gICAgbWVzc2FnZTogbmV3TWVzc2FnZSxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gX3BhcmFtcyBhcyBhbnk7XG4gIG5ld1J1bGUuX3BhdGNoZWQgPSB0cnVlO1xuXG4gIHJldHVybiBuZXdSdWxlO1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgVW53cmFwUmVnbGVVbml2ZXJzYWxQYXJhbXMsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIEludGVybmFsUnVsZVR5cGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQXN5bmM8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIChSZWY8dW5rbm93bj4gfCAoKCkgPT4gdW5rbm93bikpW10gPSBbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPiA9XG4gICAgfCBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb25cbiAgICB8IFByb21pc2U8UmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uPixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbj4oXG4gIHJ1bGU6IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBkZXBzQXJyYXk/OiBbLi4uVFBhcmFtc11cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBVbndyYXBSZWdsZVVuaXZlcnNhbFBhcmFtczxUUGFyYW1zPiwgdHJ1ZSwgVE1ldGFkYXRhPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IGFzeW5jICh2YWx1ZTogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgIHJldHVybiBydWxlKHZhbHVlLCAuLi4ocGFyYW1zIGFzIGFueSkpO1xuICB9O1xuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBJbnRlcm5hbFJ1bGVUeXBlLkFzeW5jLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gZGVwc0FycmF5IGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gJ3Z1ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uLFxuICBVbndyYXBSZWdsZVVuaXZlcnNhbFBhcmFtcyxcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSwgSW50ZXJuYWxSdWxlVHlwZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhQYXJhbXM8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIChSZWY8dW5rbm93bj4gfCAoKCkgPT4gdW5rbm93bikpW10gPSBbXSxcbiAgVFJldHVybiBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbiAgVE1ldGFkYXRhIGV4dGVuZHMgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uID0gVFJldHVybiBleHRlbmRzIFByb21pc2U8aW5mZXIgTT4gPyBNIDogVFJldHVybixcbj4oXG4gIHJ1bGU6IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBkZXBzQXJyYXk6IFsuLi5UUGFyYW1zXVxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxUVmFsdWUsIFVud3JhcFJlZ2xlVW5pdmVyc2FsUGFyYW1zPFRQYXJhbXM+LCB0cnVlLCBUTWV0YWRhdGE+IHtcbiAgY29uc3QgdmFsaWRhdG9yID0gKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgcmV0dXJuIHJ1bGUodmFsdWUsIC4uLihwYXJhbXMgYXMgYW55KSk7XG4gIH07XG5cbiAgY29uc3QgbmV3UnVsZSA9IGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6IEludGVybmFsUnVsZVR5cGUuSW5saW5lLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gZGVwc0FycmF5IGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIElubGluZVJ1bGVEZWNsYXJhdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvbixcbiAgUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcixcbiAgUGFyYW1EZWNsLFxuICBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUsIEludGVybmFsUnVsZVR5cGUsIHVud3JhcFJ1bGVQYXJhbWV0ZXJzIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlJZjxcbiAgVFZhbHVlIGV4dGVuZHMgYW55LFxuICBUUGFyYW1zIGV4dGVuZHMgYW55W10sXG4gIFRSZXR1cm4gZXh0ZW5kc1xuICAgIHwgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uXG4gICAgfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4gPSBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIE0+ID8gTSA6IFRSZXR1cm4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgX2NvbmRpdGlvbjogUGFyYW1EZWNsPGJvb2xlYW4+LFxuICBydWxlOlxuICAgIHwgSW5saW5lUnVsZURlY2xhcmF0aW9uPFRWYWx1ZSwgVFBhcmFtcywgVFJldHVybj5cbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT5cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBbXSwgVEFzeW5jLCBUTWV0YWRhdGE+IHtcbiAgbGV0IF90eXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCB2YWxpZGF0b3I6IFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I8YW55LCBhbnksIGFueT47XG4gIGxldCBfcGFyYW1zOiBhbnlbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IF9tZXNzYWdlOiBSZWdsZVJ1bGVEZWZpbml0aW9uV2l0aE1ldGFkYXRhUHJvY2Vzc29yPFxuICAgIGFueSxcbiAgICBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueSwgYW55PixcbiAgICBzdHJpbmcgfCBzdHJpbmdbXVxuICA+ID0gJyc7XG5cbiAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgX3R5cGUgPSBJbnRlcm5hbFJ1bGVUeXBlLklubGluZTtcbiAgICB2YWxpZGF0b3IgPSBydWxlO1xuICB9IGVsc2Uge1xuICAgICh7IF90eXBlLCB2YWxpZGF0b3IsIF9wYXJhbXMsIF9tZXNzYWdlIH0gPSBydWxlKTtcbiAgICBfcGFyYW1zPy5wdXNoKF9jb25kaXRpb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3VmFsaWRhdG9yKHZhbHVlOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgW2NvbmRpdGlvbl0gPSB1bndyYXBSdWxlUGFyYW1ldGVyczxbYm9vbGVhbl0+KFtfY29uZGl0aW9uXSk7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHZhbGlkYXRvcih2YWx1ZSwgLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gbmV3QWN0aXZlKHZhbHVlOiBhbnksIG1ldGFkYXRhOiBSZWdsZVJ1bGVNZXRhZGF0YUNvbnN1bWVyPGFueVtdLCBhbnk+KSB7XG4gICAgY29uc3QgW2NvbmRpdGlvbl0gPSB1bndyYXBSdWxlUGFyYW1ldGVyczxbYm9vbGVhbl0+KFtfY29uZGl0aW9uXSk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcbiAgfVxuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiBfdHlwZSBhcyBhbnksXG4gICAgdmFsaWRhdG9yOiBuZXdWYWxpZGF0b3IgYXMgYW55LFxuICAgIGFjdGl2ZTogbmV3QWN0aXZlLFxuICAgIG1lc3NhZ2U6IF9tZXNzYWdlLFxuICB9KTtcblxuICBuZXdSdWxlLl9wYXJhbXMgPSBfcGFyYW1zIGFzIGFueTtcblxuICByZXR1cm4gbmV3UnVsZSBhcyBhbnk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAvLyBpbnZhbGlkIGRhdGUgd29uJ3QgcGFzc1xuICAgIHJldHVybiBpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPT09IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICB9XG4gIHJldHVybiAhU3RyaW5nKHZhbHVlKS5sZW5ndGg7XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSAnLi9pc0VtcHR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmlsbGVkPFQgZXh0ZW5kcyB1bmtub3duPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgcmV0dXJuICFpc0VtcHR5KHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkgOiB2YWx1ZSk7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gJy4vaXNFbXB0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdleChfdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmV4cHI6IFJlZ0V4cFtdKTogYm9vbGVhbiB7XG4gIGlmIChpc0VtcHR5KF92YWx1ZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBfdmFsdWUgPT09ICdudW1iZXInID8gX3ZhbHVlLnRvU3RyaW5nKCkgOiBfdmFsdWU7XG4gIHJldHVybiBleHByLmV2ZXJ5KChyZWcpID0+IHtcbiAgICByZWcubGFzdEluZGV4ID0gMDtcbiAgICByZXR1cm4gcmVnLnRlc3QodmFsdWUpO1xuICB9KTtcbn1cbiIsImltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICd2dWUnO1xuaW1wb3J0IHsgdW5yZWYgfSBmcm9tICd2dWUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2l6ZSh2YWx1ZTogTWF5YmVSZWY8c3RyaW5nIHwgYW55W10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVtYmVyPik6IG51bWJlciB7XG4gIGNvbnN0IF92YWx1ZSA9IHVucmVmKHZhbHVlKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoX3ZhbHVlKSkgcmV0dXJuIF92YWx1ZS5sZW5ndGg7XG4gIGlmICh0eXBlb2YgX3ZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhfdmFsdWUpLmxlbmd0aDtcbiAgfVxuICBpZiAodHlwZW9mIF92YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoaXNOYU4oX3ZhbHVlKSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiBfdmFsdWU7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhfdmFsdWUpLmxlbmd0aDtcbn1cbiIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRGF0ZSB7XG4gIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwb3NzaWJsZURhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBwb3NzaWJsZURhdGUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgcG9zc2libGVEYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgIGlmIChkYXRlLnRvU3RyaW5nKCkgPT09ICdJbnZhbGlkIERhdGUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHBvc3NpYmxlRGF0ZSA9IGRhdGU7XG4gICAgfVxuICAgIHJldHVybiAhIXBvc3NpYmxlRGF0ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudDogRGF0ZSkge1xuICBjb25zdCBhcmdTdHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJndW1lbnQpO1xuICBpZiAoYXJndW1lbnQgaW5zdGFuY2VvZiBEYXRlIHx8ICh0eXBlb2YgYXJndW1lbnQgPT09ICdvYmplY3QnICYmIGFyZ1N0ciA9PT0gJ1tvYmplY3QgRGF0ZV0nKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudC5nZXRUaW1lKCkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ251bWJlcicgfHwgYXJnU3RyID09PSAnW29iamVjdCBOdW1iZXJdJykge1xuICAgIHJldHVybiBuZXcgRGF0ZShhcmd1bWVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IFN0cmluZ10nKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFyZ3VtZW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoTmFOKTtcbiAgfVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKGFyZ3VtZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYXJndW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNQYWRkZWQgPSBhcmd1bWVudC50cmltKCkgIT09IGFyZ3VtZW50O1xuICAgIGlmIChpc1BhZGRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiArYXJndW1lbnQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICcuL2lzRW1wdHknO1xuaW1wb3J0IHsgaXNGaWxsZWQgfSBmcm9tICcuL2lzRmlsbGVkJztcbmltcG9ydCB7IGlzTnVtYmVyIH0gZnJvbSAnLi9pc051bWJlcic7XG5pbXBvcnQgeyByZWdleCB9IGZyb20gJy4vcmVnZXgnO1xuaW1wb3J0IHsgc2l6ZSB9IGZyb20gJy4vc2l6ZSc7XG5pbXBvcnQgeyBpc0RhdGUgfSBmcm9tICcuL2lzRGF0ZSc7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tICcuL3RvRGF0ZSc7XG5pbXBvcnQgeyB0b051bWJlciB9IGZyb20gJy4vdG9OdW1iZXInO1xuXG5leHBvcnQgY29uc3QgcnVsZUhlbHBlcnMgPSB7XG4gIGlzRW1wdHksXG4gIGlzRmlsbGVkLFxuICBzaXplLFxuICByZWdleCxcbiAgaXNOdW1iZXIsXG4gIGlzRGF0ZSxcbiAgdG9EYXRlLFxuICB0b051bWJlcixcbn07XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEZvcm1SdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG59IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RWYWx1ZUZyb21SdWxlcyxcbiAgRXh0cmFjdFBhcmFtc0Zyb21SdWxlcyxcbiAgVW53cmFwVHVwbGVzLFxuICBHdWVzc0FzeW5jRnJvbVJ1bGVzLFxuICBHdWVzc01ldGFkYXRhRnJvbVJ1bGVzLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhbmQ8VFJ1bGVzIGV4dGVuZHMgRm9ybVJ1bGVEZWNsYXJhdGlvbjxhbnksIGFueT5bXT4oXG4gIC4uLnJ1bGVzOiBbLi4uVFJ1bGVzXVxuKTogUmVnbGVSdWxlRGVmaW5pdGlvbjxcbiAgRXh0cmFjdFZhbHVlRnJvbVJ1bGVzPFRSdWxlcz5bbnVtYmVyXSxcbiAgVW53cmFwVHVwbGVzPEV4dHJhY3RQYXJhbXNGcm9tUnVsZXM8VFJ1bGVzPj4sXG4gIEd1ZXNzQXN5bmNGcm9tUnVsZXM8VFJ1bGVzPixcbiAgR3Vlc3NNZXRhZGF0YUZyb21SdWxlczxUUnVsZXM+XG4+IHtcbiAgY29uc3QgaXNBbnlSdWxlQXN5bmMgPSBydWxlcy5zb21lKChydWxlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcnVsZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnQXN5bmNGdW5jdGlvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBydWxlLl9hc3luYztcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IF9wYXJhbXMgPSBydWxlc1xuICAgIC5tYXAoKHJ1bGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0ICRwYXJhbXMgPSBydWxlLl9wYXJhbXM7XG4gICAgICAgIGlmICghJHBhcmFtcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJHBhcmFtcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLmZsYXQoKVxuICAgIC5maWx0ZXIoKHBhcmFtKTogcGFyYW0gaXMgYW55ID0+ICEhcGFyYW0pO1xuXG4gIGZ1bmN0aW9uIGNvbXB1dGVSdWxlcyhydWxlczogWy4uLlRSdWxlc10sIHZhbHVlOiBhbnksIC4uLnBhcmFtczogYW55W10pIHtcbiAgICBjb25zdCAkcnVsZXM6IGFueVtdID0gW107XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICRydWxlcy5wdXNoKHJ1bGUodmFsdWUpKTtcbiAgICAgICAgcGFyYW1JbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyYW1zTGVuZ3RoID0gcnVsZS5fcGFyYW1zPy5sZW5ndGggPz8gMDtcbiAgICAgICAgJHJ1bGVzLnB1c2gocnVsZS52YWxpZGF0b3IodmFsdWUsIC4uLnBhcmFtcy5zbGljZShwYXJhbUluZGV4LCBwYXJhbXNMZW5ndGgpKSk7XG4gICAgICAgIGlmIChwYXJhbXNMZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbUluZGV4ICs9IHBhcmFtc0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAkcnVsZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTWV0YWRhdGEoXG4gICAgcmVzdWx0czogKGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9KVtdXG4gICk6IGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBpc0FueVJlc3VsdE1ldGFEYXRhID0gcmVzdWx0cy5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ2Jvb2xlYW4nKTtcbiAgICBpZiAoaXNBbnlSZXN1bHRNZXRhRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHZhbGlkOiByZXN1bHRzLmV2ZXJ5KChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gISFyZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQuJHZhbGlkO1xuICAgICAgICB9KSxcbiAgICAgICAgLi4ucmVzdWx0cy5yZWR1Y2UoKGFjYywgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyAkdmFsaWQsIC4uLnJlc3QgfSA9IHJlc3VsdDtcbiAgICAgICAgICByZXR1cm4geyAuLi5hY2MsIC4uLnJlc3QgfTtcbiAgICAgICAgfSwge30pLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlc3VsdCkgPT4gISFyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCB2YWxpZGF0b3I6IFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3I7XG5cbiAgaWYgKCEhcnVsZXMubGVuZ3RoKSB7XG4gICAgdmFsaWRhdG9yID0gaXNBbnlSdWxlQXN5bmNcbiAgICAgID8gYXN5bmMgKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGNvbXB1dGVSdWxlcyhydWxlcywgdmFsdWUsIC4uLnBhcmFtcykpO1xuICAgICAgICAgIHJldHVybiBjb21wdXRlTWV0YWRhdGEocmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgIDogKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJ1bGVzID0gY29tcHV0ZVJ1bGVzKHJ1bGVzLCB2YWx1ZSwgLi4ucGFyYW1zKTtcbiAgICAgICAgICByZXR1cm4gY29tcHV0ZU1ldGFkYXRhKCRydWxlcyk7XG4gICAgICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdG9yID0gKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbmV3UnVsZSA9IGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6ICdhbmQnLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGFsbCBvZiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycycsXG4gIH0pO1xuXG4gIG5ld1J1bGUuX3BhcmFtcyA9IF9wYXJhbXMgYXMgYW55O1xuXG4gIHJldHVybiBuZXdSdWxlIGFzIGFueTtcbn1cbiIsImltcG9ydCB0eXBlIHsgRm9ybVJ1bGVEZWNsYXJhdGlvbiwgUmVnbGVSdWxlRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEV4dHJhY3RQYXJhbXNGcm9tUnVsZXMsXG4gIEV4dHJhY3RWYWx1ZUZyb21SdWxlcyxcbiAgR3Vlc3NBc3luY0Zyb21SdWxlcyxcbiAgR3Vlc3NNZXRhZGF0YUZyb21SdWxlcyxcbiAgVW53cmFwVHVwbGVzLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvcjxUUnVsZXMgZXh0ZW5kcyBGb3JtUnVsZURlY2xhcmF0aW9uPGFueSwgYW55PltdPihcbiAgLi4ucnVsZXM6IFsuLi5UUnVsZXNdXG4pOiBSZWdsZVJ1bGVEZWZpbml0aW9uPFxuICBFeHRyYWN0VmFsdWVGcm9tUnVsZXM8VFJ1bGVzPltudW1iZXJdLFxuICBVbndyYXBUdXBsZXM8RXh0cmFjdFBhcmFtc0Zyb21SdWxlczxUUnVsZXM+PixcbiAgR3Vlc3NBc3luY0Zyb21SdWxlczxUUnVsZXM+LFxuICBHdWVzc01ldGFkYXRhRnJvbVJ1bGVzPFRSdWxlcz5cbj4ge1xuICBjb25zdCBpc0FueVJ1bGVBc3luYyA9IHJ1bGVzLnNvbWUoKHJ1bGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJ1bGUuX2FzeW5jO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zID0gcnVsZXNcbiAgICAubWFwKChydWxlKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcnVsZS5fcGFyYW1zO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZsYXQoKVxuICAgIC5maWx0ZXIoKHBhcmFtKTogcGFyYW0gaXMgYW55ID0+ICEhcGFyYW0pO1xuXG4gIGZ1bmN0aW9uIGNvbXB1dGVSdWxlcyhydWxlczogWy4uLlRSdWxlc10sIHZhbHVlOiBhbnksIC4uLnBhcmFtczogYW55W10pIHtcbiAgICBjb25zdCAkcnVsZXM6IGFueVtdID0gW107XG4gICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuXG4gICAgZm9yIChsZXQgcnVsZSBvZiBydWxlcykge1xuICAgICAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICRydWxlcy5wdXNoKHJ1bGUodmFsdWUpKTtcbiAgICAgICAgcGFyYW1JbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyYW1zTGVuZ3RoID0gcnVsZS5fcGFyYW1zPy5sZW5ndGggPz8gMDtcbiAgICAgICAgJHJ1bGVzLnB1c2gocnVsZS52YWxpZGF0b3IodmFsdWUsIC4uLnBhcmFtcy5zbGljZShwYXJhbUluZGV4LCBwYXJhbXNMZW5ndGgpKSk7XG4gICAgICAgIGlmIChwYXJhbXNMZW5ndGgpIHtcbiAgICAgICAgICBwYXJhbUluZGV4ICs9IHBhcmFtc0xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAkcnVsZXM7XG4gIH1cblxuICBmdW5jdGlvbiBjb21wdXRlTWV0YWRhdGEoXG4gICAgcmVzdWx0czogKGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9KVtdXG4gICk6IGJvb2xlYW4gfCB7ICR2YWxpZDogYm9vbGVhbjsgW3g6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBpc0FueVJlc3VsdE1ldGFEYXRhID0gcmVzdWx0cy5zb21lKChzKSA9PiB0eXBlb2YgcyAhPT0gJ2Jvb2xlYW4nKTtcbiAgICBpZiAoaXNBbnlSZXN1bHRNZXRhRGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJHZhbGlkOiByZXN1bHRzLnNvbWUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC4kdmFsaWQ7XG4gICAgICAgIH0pLFxuICAgICAgICAuLi5yZXN1bHRzLnJlZHVjZSgoYWNjLCByZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7ICR2YWxpZCwgLi4ucmVzdCB9ID0gcmVzdWx0O1xuICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4ucmVzdCB9O1xuICAgICAgICB9LCB7fSksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0cy5zb21lKChyZXN1bHQpID0+ICEhcmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB2YWxpZGF0b3IgPSBpc0FueVJ1bGVBc3luY1xuICAgID8gYXN5bmMgKHZhbHVlOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5wYXJhbXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChjb21wdXRlUnVsZXMocnVsZXMsIHZhbHVlLCAuLi5wYXJhbXMpKTtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVNZXRhZGF0YShyZXN1bHRzKTtcbiAgICAgIH1cbiAgICA6ICh2YWx1ZTogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCAkcnVsZXMgPSBjb21wdXRlUnVsZXMocnVsZXMsIHZhbHVlLCAuLi5wYXJhbXMpO1xuICAgICAgICByZXR1cm4gY29tcHV0ZU1ldGFkYXRhKCRydWxlcyk7XG4gICAgICB9O1xuXG4gIGNvbnN0IG5ld1J1bGUgPSBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnb3InLFxuICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yIGFzIGFueSxcbiAgICBtZXNzYWdlOiAnVGhlIHZhbHVlIGRvZXMgbm90IG1hdGNoIGFueSBvZiB0aGUgcHJvdmlkZWQgdmFsaWRhdG9ycycsXG4gIH0pO1xuXG4gIG5ld1J1bGUuX3BhcmFtcyA9IHBhcmFtcyBhcyBhbnk7XG5cbiAgcmV0dXJuIG5ld1J1bGUgYXMgYW55O1xufVxuIiwiaW1wb3J0IHR5cGUge1xuICBJbmxpbmVSdWxlRGVjbGFyYXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb24sXG4gIFJlZ2xlUnVsZURlZmluaXRpb25Qcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZURlZmluaXRpb25XaXRoTWV0YWRhdGFQcm9jZXNzb3IsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhQ29uc3VtZXIsXG4gIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbixcbn0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi9ydWxlSGVscGVycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3Q8XG4gIFRWYWx1ZSxcbiAgVFBhcmFtcyBleHRlbmRzIGFueVtdID0gW10sXG4gIFRSZXR1cm4gZXh0ZW5kc1xuICAgIHwgUmVnbGVSdWxlTWV0YWRhdGFEZWZpbml0aW9uXG4gICAgfCBQcm9taXNlPFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbj4gPSBSZWdsZVJ1bGVNZXRhZGF0YURlZmluaXRpb24sXG4gIFRNZXRhZGF0YSBleHRlbmRzIFJlZ2xlUnVsZU1ldGFkYXRhRGVmaW5pdGlvbiA9IFRSZXR1cm4gZXh0ZW5kcyBQcm9taXNlPGluZmVyIE0+ID8gTSA6IFRSZXR1cm4sXG4gIFRBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBUUmV0dXJuIGV4dGVuZHMgUHJvbWlzZTxhbnk+ID8gdHJ1ZSA6IGZhbHNlLFxuPihcbiAgcnVsZTpcbiAgICB8IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT5cbiAgICB8IElubGluZVJ1bGVEZWNsYXJhdGlvbjxUVmFsdWUsIFRQYXJhbXMsIFRSZXR1cm4+LFxuICBtZXNzYWdlPzogUmVnbGVSdWxlRGVmaW5pdGlvbldpdGhNZXRhZGF0YVByb2Nlc3NvcjxcbiAgICBUVmFsdWUsXG4gICAgUmVnbGVSdWxlTWV0YWRhdGFDb25zdW1lcjxUUGFyYW1zLCBUTWV0YWRhdGE+LFxuICAgIHN0cmluZyB8IHN0cmluZ1tdXG4gID5cbik6IFJlZ2xlUnVsZURlZmluaXRpb248VFZhbHVlLCBUUGFyYW1zLCBUQXN5bmMsIFRNZXRhZGF0YT4ge1xuICBsZXQgX3R5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnksIGFueSwgYW55PjtcbiAgbGV0IG5ld1ZhbGlkYXRvcjogUmVnbGVSdWxlRGVmaW5pdGlvblByb2Nlc3NvcjxhbnksIGFueSwgYW55PjtcbiAgbGV0IF9wYXJhbXM6IGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGxldCBfYXN5bmM6IGJvb2xlYW47XG5cbiAgaWYgKHR5cGVvZiBydWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFsaWRhdG9yID0gcnVsZTtcbiAgICBfYXN5bmMgPSBydWxlLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdBc3luY0Z1bmN0aW9uJztcbiAgfSBlbHNlIHtcbiAgICAoeyBfdHlwZSwgdmFsaWRhdG9yLCBfcGFyYW1zIH0gPSBydWxlKTtcbiAgICBfYXN5bmMgPSBydWxlLl9hc3luYztcbiAgfVxuXG4gIGlmIChfYXN5bmMpIHtcbiAgICBuZXdWYWxpZGF0b3IgPSBhc3luYyAodmFsdWU6IGFueSwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0b3IodmFsdWUsIC4uLihwYXJhbXMgYXMgYW55KSk7XG4gICAgICAgIHJldHVybiAhcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBuZXdWYWxpZGF0b3IgPSAodmFsdWU6IGFueSwgLi4ucGFyYW1zOiBhbnlbXSkgPT4ge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gIXZhbGlkYXRvcih2YWx1ZSwgLi4uKHBhcmFtcyBhcyBhbnkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBuZXdSdWxlID0gY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ25vdCcsXG4gICAgdmFsaWRhdG9yOiBuZXdWYWxpZGF0b3IgYXMgYW55LFxuICAgIG1lc3NhZ2U6IChtZXNzYWdlIGFzIGFueSkgPz8gJ0Vycm9yJyxcbiAgfSk7XG5cbiAgbmV3UnVsZS5fcGFyYW1zID0gX3BhcmFtcyBhcyBhbnk7XG5cbiAgcmV0dXJuIG5ld1J1bGUgYXMgYW55O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlZDogUmVnbGVSdWxlRGVmaW5pdGlvbjx1bmtub3duLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHVua25vd24+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgcmV0dXJuIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKTtcbiAgfSxcbiAgbWVzc2FnZTogJ1RoaXMgZmllbGQgaXMgcmVxdWlyZWQnLFxufSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgbWF4TGVuZ3RoOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgYW55W10gfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4sXG4gIFtjb3VudDogbnVtYmVyXSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ21heExlbmd0aCcsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxzdHJpbmcgfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4gfCBhbnlbXT4sIGNvdW50OiBudW1iZXIpID0+IHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGNvdW50KSkge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzTnVtYmVyKGNvdW50KSkge1xuICAgICAgICByZXR1cm4gcnVsZUhlbHBlcnMuc2l6ZSh2YWx1ZSkgPD0gY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbbWF4TGVuZ3RoXSBWYWx1ZSBvciBwYXJhbWV0ZXIgaXNuJ3QgYSBudW1iZXIsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIHBhcmFtZXRlcjogJHtjb3VudH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKHZhbHVlLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGBUaGlzIGxpc3Qgc2hvdWxkIGhhdmUgbWF4aW11bSAke2NvdW50fSBpdGVtc2A7XG4gICAgfVxuICAgIHJldHVybiBgVGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQgaXMgJHtjb3VudH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCByZXF1aXJlZElmOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgdW5rbm93bixcbiAgW2NvbmRpdGlvbjogYm9vbGVhbl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogdW5rbm93biwgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2U6ICdUaGlzIGZpZWxkIGlzIHJlcXVpcmVkJyxcbiAgYWN0aXZlKF8sIHsgJHBhcmFtczogW2NvbmRpdGlvbl0gfSkge1xuICAgIHJldHVybiBjb25kaXRpb247XG4gIH0sXG59KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuY29uc3QgYWxwaGFSZWdleCA9IC9eW2EtekEtWl0qJC87XG5cbmV4cG9ydCBjb25zdCBhbHBoYTogUmVnbGVSdWxlRGVmaW5pdGlvbjxzdHJpbmcsIFtdLCBmYWxzZSwgYm9vbGVhbiwgc3RyaW5nPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnYWxwaGEnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIGFscGhhUmVnZXgpO1xuICB9LFxuICBtZXNzYWdlOiAnVGhlIHZhbHVlIGlzIG5vdCBhbHBoYWJldGljYWwnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGFscGhhTnVtUmVnZXggPSAvXlthLXpBLVowLTldKiQvO1xuXG5leHBvcnQgY29uc3QgYWxwaGFOdW06IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnYWxwaGEnLFxuICAgIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nIHwgbnVtYmVyPikge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLnJlZ2V4KHZhbHVlLCBhbHBoYU51bVJlZ2V4KTtcbiAgICB9LFxuICAgIG1lc3NhZ2U6ICdUaGUgdmFsdWUgbXVzdCBiZSBhbHBoYS1udW1lcmljJyxcbiAgfSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgYmV0d2VlbjogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIG51bWJlcixcbiAgW21pbjogbnVtYmVyLCBtYXg6IG51bWJlcl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdiZXR3ZWVuJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPG51bWJlcj4sIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQobWluKSAmJiBydWxlSGVscGVycy5pc0ZpbGxlZChtYXgpKSB7XG4gICAgICBjb25zdCB0VmFsdWUgPSBydWxlSGVscGVycy50b051bWJlcih2YWx1ZSk7XG4gICAgICBjb25zdCB0TWluID0gcnVsZUhlbHBlcnMudG9OdW1iZXIobWluKTtcbiAgICAgIGNvbnN0IHRNYXggPSBydWxlSGVscGVycy50b051bWJlcihtYXgpO1xuICAgICAgaWYgKFxuICAgICAgICBydWxlSGVscGVycy5pc051bWJlcih0VmFsdWUpICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHRNaW4pICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHRNYXgpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRWYWx1ZSA+PSB0TWluICYmIHRWYWx1ZSA8PSB0TWF4O1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2JldHdlZW5dIFZhbHVlIG9yIHBhcmFtZXRlcnMgYXJlbid0IG51bWJlcnMsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAoXywgeyAkcGFyYW1zOiBbbWluLCBtYXhdIH0pID0+IHtcbiAgICByZXR1cm4gYFRoZSB2YWx1ZSBtdXN0IGJlIGJldHdlZW4gJHttaW59IGFuZCAke21heH1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGRlY2ltYWxSZWdleCA9IC9eWy1dP1xcZCooXFwuXFxkKyk/JC87XG5cbmV4cG9ydCBjb25zdCBkZWNpbWFsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZyB8IG51bWJlciwgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmcgfCBudW1iZXI+ID1cbiAgY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ2RlY2ltYWwnLFxuICAgIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8bnVtYmVyIHwgc3RyaW5nPikge1xuICAgICAgaWYgKHJ1bGVIZWxwZXJzLmlzRW1wdHkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bGVIZWxwZXJzLnJlZ2V4KHZhbHVlLCBkZWNpbWFsUmVnZXgpO1xuICAgIH0sXG4gICAgbWVzc2FnZTogJ1ZhbHVlIG11c3QgYmUgZGVjaW1hbCcsXG4gIH0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5jb25zdCBlbWFpbFJlZ2V4ID1cbiAgL14oPzpbQS16MC05ISMkJSYnKisvPT9eX2B7fH1+LV0rKD86XFwuW0EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKykqfFwiKD86W1xceDAxLVxceDA4XFx4MGJcXHgwY1xceDBlLVxceDFmXFx4MjFcXHgyMy1cXHg1YlxceDVkLVxceDdmXXxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSpcIilAKD86KD86W2EtejAtOV0oPzpbYS16MC05LV0qW2EtejAtOV0pP1xcLikrW2EtejAtOV17Mix9KD86W2EtejAtOS1dKlthLXowLTldKT98XFxbKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT98W2EtejAtOS1dKlthLXowLTldOig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxLVxceDVhXFx4NTMtXFx4N2ZdfFxcXFxbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGUtXFx4N2ZdKSspXFxdKSQvaTtcblxuZXhwb3J0IGNvbnN0IGVtYWlsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdlbWFpbCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nPikge1xuICAgIGlmIChydWxlSGVscGVycy5pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBydWxlSGVscGVycy5yZWdleCh2YWx1ZSwgZW1haWxSZWdleCk7XG4gIH0sXG4gIG1lc3NhZ2U6ICdWYWx1ZSBtdXN0IGJlIGFuIHZhbGlkIGVtYWlsIGFkZHJlc3MnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IGludGVnZXJSZWdleCA9IC8oXlswLTldKiQpfCheLVswLTldKyQpLztcblxuZXhwb3J0IGNvbnN0IGludGVnZXI6IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnaW50ZWdlcicsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxudW1iZXIgfCBzdHJpbmc+KSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIGludGVnZXJSZWdleCk7XG4gICAgfSxcbiAgICBtZXNzYWdlOiAnVmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyJyxcbiAgfSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgbWF4VmFsdWU6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPG51bWJlciwgW2NvdW50OiBudW1iZXJdLCBmYWxzZSwgYm9vbGVhbj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnbWF4VmFsdWUnLFxuICAgIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxudW1iZXI+LCBjb3VudDogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGNvdW50KSkge1xuICAgICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpICYmIHJ1bGVIZWxwZXJzLmlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA8PSBjb3VudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFttYXhWYWx1ZV0gVmFsdWUgb3IgcGFyYW1ldGVyIGlzbid0IGEgbnVtYmVyLCBnb3QgdmFsdWU6ICR7dmFsdWV9LCBwYXJhbWV0ZXI6ICR7Y291bnR9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIG1lc3NhZ2U6IChfLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgICAgcmV0dXJuIGBUaGUgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGlzICR7Y291bnR9YDtcbiAgICB9LFxuICB9KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBtaW5MZW5ndGg6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBhbnlbXSB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PixcbiAgW2NvdW50OiBudW1iZXJdLFxuICBmYWxzZSxcbiAgYm9vbGVhblxuPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnbWluTGVuZ3RoJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPHN0cmluZyB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PiB8IGFueVtdPiwgY291bnQ6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpKSB7XG4gICAgICAgIHJldHVybiBydWxlSGVscGVycy5zaXplKHZhbHVlKSA+PSBjb3VudDtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihgW21pbkxlbmd0aF0gUGFyYW1ldGVyIGlzbid0IGEgbnVtYmVyLCBnb3QgcGFyYW1ldGVyOiAke2NvdW50fWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKHZhbHVlLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGBUaGlzIGxpc3Qgc2hvdWxkIGhhdmUgYXQgbGVhc3QgJHtjb3VudH0gaXRlbXNgO1xuICAgIH1cbiAgICByZXR1cm4gYFRoaXMgZmllbGQgc2hvdWxkIGJlIGF0IGxlYXN0ICR7Y291bnR9IGNoYXJhY3RlcnMgbG9uZ2A7XG4gIH0sXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBtaW5WYWx1ZTogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248bnVtYmVyLCBbY291bnQ6IG51bWJlcl0sIGZhbHNlLCBib29sZWFuPiA9XG4gIGNyZWF0ZVJ1bGUoe1xuICAgIHR5cGU6ICdtaW5WYWx1ZScsXG4gICAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPG51bWJlcj4sIGNvdW50OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICAgIGlmIChydWxlSGVscGVycy5pc051bWJlcihjb3VudCkgJiYgcnVsZUhlbHBlcnMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID49IGNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW21pblZhbHVlXSBWYWx1ZSBvciBwYXJhbWV0ZXIgaXNuJ3QgYSBudW1iZXIsIGdvdCB2YWx1ZTogJHt2YWx1ZX0sIHBhcmFtZXRlcjogJHtjb3VudH1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2NvdW50XSB9KSA9PiB7XG4gICAgICByZXR1cm4gYFRoZSBtaW5pbXVtIHZhbHVlIGFsbG93ZWQgaXMgJHtjb3VudH1gO1xuICAgIH0sXG4gIH0pO1xuIiwiaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgTWF5YmUsIFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcblxuZXhwb3J0IGNvbnN0IGV4YWN0TGVuZ3RoOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgYW55W10gfCBSZWNvcmQ8UHJvcGVydHlLZXksIGFueT4sXG4gIFtjb3VudDogbnVtYmVyXSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2V4YWN0TGVuZ3RoJyxcbiAgdmFsaWRhdG9yOiAodmFsdWU6IE1heWJlPHN0cmluZyB8IFJlY29yZDxQcm9wZXJ0eUtleSwgYW55PiB8IGFueVtdPiwgY291bnQ6IG51bWJlcikgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQoY291bnQpKSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNOdW1iZXIoY291bnQpKSB7XG4gICAgICAgIHJldHVybiBydWxlSGVscGVycy5zaXplKHZhbHVlKSA9PT0gY291bnQ7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oYFttaW5MZW5ndGhdIFBhcmFtZXRlciBpc24ndCBhIG51bWJlciwgZ290IHBhcmFtZXRlcjogJHtjb3VudH1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2U6IChfLCB7ICRwYXJhbXM6IFtjb3VudF0gfSkgPT4ge1xuICAgIHJldHVybiBgVGhpcyBmaWVsZCBzaG91bGQgYmUgZXhhY3RseSAke2NvdW50fSBjaGFyYWN0ZXJzIGxvbmdgO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmNvbnN0IG51bWVyaWNSZWdleCA9IC9eXFxkKihcXC5cXGQrKT8kLztcblxuZXhwb3J0IGNvbnN0IG51bWVyaWM6IFJlZ2xlUnVsZURlZmluaXRpb248c3RyaW5nIHwgbnVtYmVyLCBbXSwgZmFsc2UsIGJvb2xlYW4sIHN0cmluZyB8IG51bWJlcj4gPVxuICBjcmVhdGVSdWxlKHtcbiAgICB0eXBlOiAnbnVtZXJpYycsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxzdHJpbmcgfCBudW1iZXI+KSB7XG4gICAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIG51bWVyaWNSZWdleCk7XG4gICAgfSxcbiAgICBtZXNzYWdlOiAnVGhpcyBmaWVsZCBtdXN0IGJlIG51bWVyaWMnLFxuICB9KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb24gfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkVW5sZXNzOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgdW5rbm93bixcbiAgW2NvbmRpdGlvbjogYm9vbGVhbl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdyZXF1aXJlZCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogdW5rbm93biwgY29uZGl0aW9uOiBib29sZWFuKSB7XG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHJldHVybiBydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXG4gIGFjdGl2ZShfLCB7ICRwYXJhbXM6IFtjb25kaXRpb25dIH0pIHtcbiAgICByZXR1cm4gIWNvbmRpdGlvbjtcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3Qgc2FtZUFzOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjx1bmtub3duLCBbdGFyZ2V0OiB1bmtub3duXSwgZmFsc2UsIGJvb2xlYW4+ID1cbiAgY3JlYXRlUnVsZSh7XG4gICAgdHlwZTogJ3NhbWVBcycsXG4gICAgdmFsaWRhdG9yKHZhbHVlOiB1bmtub3duLCB0YXJnZXQ6IHVua25vd24pIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdGFyZ2V0O1xuICAgIH0sXG4gICAgbWVzc2FnZShfLCB7ICRwYXJhbXM6IFt0YXJnZXRdIH0pIHtcbiAgICAgIHJldHVybiBgVmFsdWUgbXVzdCBiZSBlcXVhbCB0byBcIiR7dGFyZ2V0fVwiYDtcbiAgICB9LFxuICB9KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuLyoqXG4gKiBSZWdleCB0YWtlbiBmcm9tIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kcGVyaW5pLzcyOTI5NH1cbiAqL1xuY29uc3QgdXJsUmVnZXggPVxuICAvXig/Oig/Oig/Omh0dHBzP3xmdHApOik/XFwvXFwvKSg/OlxcUysoPzo6XFxTKik/QCk/KD86KD8hKD86MTB8MTI3KSg/OlxcLlxcZHsxLDN9KXszfSkoPyEoPzoxNjlcXC4yNTR8MTkyXFwuMTY4KSg/OlxcLlxcZHsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlxcZHwzWzAtMV0pKD86XFwuXFxkezEsM30pezJ9KSg/OlsxLTldXFxkP3wxXFxkXFxkfDJbMDFdXFxkfDIyWzAtM10pKD86XFwuKD86MT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16MC05XFx1MDBhMS1cXHVmZmZmXVthLXowLTlcXHUwMGExLVxcdWZmZmZfLV17MCw2Mn0pP1thLXowLTlcXHUwMGExLVxcdWZmZmZdXFwuKSsoPzpbYS16XFx1MDBhMS1cXHVmZmZmXXsyLH1cXC4/KSkoPzo6XFxkezIsNX0pPyg/OlsvPyNdXFxTKik/JC9pO1xuXG5leHBvcnQgY29uc3QgdXJsOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICd1cmwnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcnVsZUhlbHBlcnMucmVnZXgodmFsdWUsIHVybFJlZ2V4KTtcbiAgfSxcbiAgbWVzc2FnZTogJ1RoZSB2YWx1ZSBpcyBub3QgYSB2YWxpZCBVUkwgYWRkcmVzcycsXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlLCBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkYXRlQWZ0ZXI6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBEYXRlLFxuICBbYWZ0ZXI6IE1heWJlPHN0cmluZyB8IERhdGU+XSxcbiAgZmFsc2UsXG4gIHwgdHJ1ZVxuICB8IHtcbiAgICAgICR2YWxpZDogZmFsc2U7XG4gICAgICBlcnJvcjogJ2RhdGUtbm90LWFmdGVyJztcbiAgICB9XG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnO1xuICAgIH1cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVBZnRlcicsXG4gIHZhbGlkYXRvcjogKHZhbHVlOiBNYXliZTxEYXRlIHwgc3RyaW5nPiwgYWZ0ZXI6IE1heWJlPERhdGUgfCBzdHJpbmc+KSA9PiB7XG4gICAgaWYgKHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHZhbHVlKSAmJiBydWxlSGVscGVycy5pc0ZpbGxlZChhZnRlcikpIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShhZnRlcikpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVsZUhlbHBlcnMudG9EYXRlKHZhbHVlKS5nZXRUaW1lKCkgPiBydWxlSGVscGVycy50b0RhdGUoYWZ0ZXIpLmdldFRpbWUoKTtcbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7ICR2YWxpZDogZmFsc2UsIGVycm9yOiAnZGF0ZS1ub3QtYWZ0ZXInIGFzIGNvbnN0IH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAkdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ3ZhbHVlLW9yLXBhcmFtYXRlci1ub3QtYS1kYXRlJyBhcyBjb25zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2FmdGVyXSB9KSA9PiB7XG4gICAgLy8gaWYgKGVycm9yID09PSAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnKSB7XG4gICAgLy8gICByZXR1cm4gJ1RoZSBpbnB1dHMgbXVzdCBiZSBEYXRlcyc7XG4gICAgLy8gfVxuICAgIHJldHVybiBgVGhlIGRhdGUgbXVzdCBiZSBhZnRlciAke2FmdGVyfWA7XG4gIH0sXG59KTtcbiIsImltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgdHlwZSB7IE1heWJlLCBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBkYXRlQmVmb3JlOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nIHwgRGF0ZSxcbiAgW2JlZm9yZTogTWF5YmU8c3RyaW5nIHwgRGF0ZT5dLFxuICBmYWxzZSxcbiAgfCB0cnVlXG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAnZGF0ZS1ub3QtYmVmb3JlJztcbiAgICB9XG4gIHwge1xuICAgICAgJHZhbGlkOiBmYWxzZTtcbiAgICAgIGVycm9yOiAndmFsdWUtb3ItcGFyYW1hdGVyLW5vdC1hLWRhdGUnO1xuICAgIH1cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVCZWZvcmUnLFxuICB2YWxpZGF0b3I6ICh2YWx1ZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4sIGJlZm9yZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4pID0+IHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKGJlZm9yZSkpIHtcbiAgICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShiZWZvcmUpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpIDwgcnVsZUhlbHBlcnMudG9EYXRlKGJlZm9yZSkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgJHZhbGlkOiBmYWxzZSwgZXJyb3I6ICdkYXRlLW5vdC1iZWZvcmUnIGFzIGNvbnN0IH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAkdmFsaWQ6IGZhbHNlLCBlcnJvcjogJ3ZhbHVlLW9yLXBhcmFtYXRlci1ub3QtYS1kYXRlJyBhcyBjb25zdCB9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbiAgbWVzc2FnZTogKF8sIHsgJHBhcmFtczogW2JlZm9yZV0sIGVycm9yIH0pID0+IHtcbiAgICBpZiAoZXJyb3IgPT09ICd2YWx1ZS1vci1wYXJhbWF0ZXItbm90LWEtZGF0ZScpIHtcbiAgICAgIHJldHVybiAnVGhlIGZpZWxkcyBtdXN0IGJlIERhdGVzJztcbiAgICB9XG4gICAgcmV0dXJuIGBUaGUgZGF0ZSBtdXN0IGJlIGJlZm9yZSAke2JlZm9yZX1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZSwgUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb24gfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuXG5leHBvcnQgY29uc3QgZGF0ZUJldHdlZW46IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcgfCBEYXRlLFxuICBbYmVmb3JlOiBNYXliZTxzdHJpbmcgfCBEYXRlPiwgYWZ0ZXI6IE1heWJlPHN0cmluZyB8IERhdGU+XSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2RhdGVCZXR3ZWVuJyxcbiAgdmFsaWRhdG9yOiAoXG4gICAgdmFsdWU6IE1heWJlPERhdGUgfCBzdHJpbmc+LFxuICAgIGJlZm9yZTogTWF5YmU8RGF0ZSB8IHN0cmluZz4sXG4gICAgYWZ0ZXI6IE1heWJlPERhdGUgfCBzdHJpbmc+XG4gICkgPT4ge1xuICAgIGlmIChydWxlSGVscGVycy5pc0RhdGUodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShiZWZvcmUpICYmIHJ1bGVIZWxwZXJzLmlzRGF0ZShhZnRlcikpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpID4gcnVsZUhlbHBlcnMudG9EYXRlKGJlZm9yZSkuZ2V0VGltZSgpICYmXG4gICAgICAgIHJ1bGVIZWxwZXJzLnRvRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpIDwgcnVsZUhlbHBlcnMudG9EYXRlKGFmdGVyKS5nZXRUaW1lKClcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlOiAoXywgeyAkcGFyYW1zOiBbYmVmb3JlLCBhZnRlcl0gfSkgPT4ge1xuICAgIHJldHVybiBgVGhlIGRhdGUgbXVzdCBiZSBiZXR3ZWVuICR7YmVmb3JlfSBhbmQgJHthZnRlcn1gO1xuICB9LFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZURlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmZ1bmN0aW9uIG5pYmJsZVZhbGlkKG5pYmJsZTogc3RyaW5nKSB7XG4gIGlmIChuaWJibGUubGVuZ3RoID4gMyB8fCBuaWJibGUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5pYmJsZVswXSA9PT0gJzAnICYmIG5pYmJsZSAhPT0gJzAnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFuaWJibGUubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9ICtuaWJibGUgfCAwO1xuICByZXR1cm4gbnVtZXJpYyA+PSAwICYmIG51bWVyaWMgPD0gMjU1O1xufVxuXG5leHBvcnQgY29uc3QgaXBBZGRyZXNzOiBSZWdsZVJ1bGVEZWZpbml0aW9uPHN0cmluZywgW10sIGZhbHNlLCBib29sZWFuLCBzdHJpbmc+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdpcEFkZHJlc3MnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmliYmxlcyA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIG5pYmJsZXMubGVuZ3RoID09PSA0ICYmIG5pYmJsZXMuZXZlcnkobmliYmxlVmFsaWQpO1xuICB9LFxuICBtZXNzYWdlOiAnVGhlIHZhbHVlIGlzIG5vdCBhIHZhbGlkIElQIGFkZHJlc3MnLFxufSk7XG4iLCJpbXBvcnQgdHlwZSB7IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uLCBNYXliZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBydWxlSGVscGVycyB9IGZyb20gJy4uL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgbWFjQWRkcmVzczogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIHN0cmluZyxcbiAgW3NlcGFyYXRvcj86IHN0cmluZyB8IHVuZGVmaW5lZF0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdtYWNBZGRyZXNzJyxcbiAgdmFsaWRhdG9yKHZhbHVlOiBNYXliZTxzdHJpbmc+LCBzZXBhcmF0b3IgPSAnOicpIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydHMgPVxuICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PT0gJ3N0cmluZycgJiYgc2VwYXJhdG9yICE9PSAnJ1xuICAgICAgICA/IHZhbHVlLnNwbGl0KHNlcGFyYXRvcilcbiAgICAgICAgOiB2YWx1ZS5sZW5ndGggPT09IDEyIHx8IHZhbHVlLmxlbmd0aCA9PT0gMTZcbiAgICAgICAgICA/IHZhbHVlLm1hdGNoKC8uezJ9L2cpXG4gICAgICAgICAgOiBudWxsO1xuXG4gICAgcmV0dXJuIHBhcnRzICE9PSBudWxsICYmIChwYXJ0cy5sZW5ndGggPT09IDYgfHwgcGFydHMubGVuZ3RoID09PSA4KSAmJiBwYXJ0cy5ldmVyeShoZXhWYWxpZCk7XG4gIH0sXG4gIG1lc3NhZ2U6ICdUaGUgdmFsdWUgaXMgbm90IGEgdmFsaWQgTUFDIEFkZHJlc3MnLFxufSk7XG5cbmNvbnN0IGhleFZhbGlkID0gKGhleDogc3RyaW5nKSA9PiBoZXgudG9Mb3dlckNhc2UoKS5tYXRjaCgvXlswLTlhLWZdezJ9JC8pO1xuIiwiaW1wb3J0IHR5cGUgeyBNYXliZSwgUmVnbGVSdWxlRGVmaW5pdGlvbiB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVJ1bGUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBjaGVja2VkOiBSZWdsZVJ1bGVEZWZpbml0aW9uPGJvb2xlYW4sIFtdLCBmYWxzZSwgYm9vbGVhbiwgYm9vbGVhbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ2NoZWNrZWQnLFxuICB2YWxpZGF0b3I6ICh2YWx1ZTogTWF5YmU8Ym9vbGVhbj4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHRydWU7XG4gIH0sXG4gIG1lc3NhZ2U6ICdUaGlzIGZpZWxkIG11c3QgYmUgY2hlY2tlZCcsXG59KTtcbiIsImltcG9ydCB0eXBlIHsgUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb24sIE1heWJlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlUnVsZSB9IGZyb20gJ0ByZWdsZS9jb3JlJztcbmltcG9ydCB7IHJ1bGVIZWxwZXJzIH0gZnJvbSAnLi4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBjb250YWluczogUmVnbGVSdWxlV2l0aFBhcmFtc0RlZmluaXRpb248XG4gIHN0cmluZyxcbiAgW3BhcnQ6IE1heWJlPHN0cmluZz5dLFxuICBmYWxzZSxcbiAgYm9vbGVhblxuPiA9IGNyZWF0ZVJ1bGUoe1xuICB0eXBlOiAnY29udGFpbnMnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4sIHBhcnQ6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHBhcnQpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuaW5jbHVkZXMocGFydCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBtZXNzYWdlKF8sIHsgJHBhcmFtczogW3BhcnRdIH0pIHtcbiAgICByZXR1cm4gYEZpZWxkIG11c3QgY29udGFpbiAke3BhcnR9YDtcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IHN0YXJ0c1dpdGg6IFJlZ2xlUnVsZVdpdGhQYXJhbXNEZWZpbml0aW9uPFxuICBzdHJpbmcsXG4gIFtwYXJ0OiBNYXliZTxzdHJpbmc+XSxcbiAgZmFsc2UsXG4gIGJvb2xlYW5cbj4gPSBjcmVhdGVSdWxlKHtcbiAgdHlwZTogJ3N0YXJ0c1dpdGgnLFxuICB2YWxpZGF0b3IodmFsdWU6IE1heWJlPHN0cmluZz4sIHBhcnQ6IE1heWJlPHN0cmluZz4pIHtcbiAgICBpZiAocnVsZUhlbHBlcnMuaXNGaWxsZWQodmFsdWUpICYmIHJ1bGVIZWxwZXJzLmlzRmlsbGVkKHBhcnQpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuc3RhcnRzV2l0aChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2UoXywgeyAkcGFyYW1zOiBbcGFydF0gfSkge1xuICAgIHJldHVybiBgRmllbGQgbXVzdCBlbmQgd2l0aCAke3BhcnR9YDtcbiAgfSxcbn0pO1xuIiwiaW1wb3J0IHR5cGUgeyBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbiwgTWF5YmUgfSBmcm9tICdAcmVnbGUvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVSdWxlIH0gZnJvbSAnQHJlZ2xlL2NvcmUnO1xuaW1wb3J0IHsgcnVsZUhlbHBlcnMgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IGVuZHNXaXRoOiBSZWdsZVJ1bGVXaXRoUGFyYW1zRGVmaW5pdGlvbjxcbiAgc3RyaW5nLFxuICBbcGFydDogTWF5YmU8c3RyaW5nPl0sXG4gIGZhbHNlLFxuICBib29sZWFuXG4+ID0gY3JlYXRlUnVsZSh7XG4gIHR5cGU6ICdlbmRzV2l0aCcsXG4gIHZhbGlkYXRvcih2YWx1ZTogTWF5YmU8c3RyaW5nPiwgcGFydDogTWF5YmU8c3RyaW5nPikge1xuICAgIGlmIChydWxlSGVscGVycy5pc0ZpbGxlZCh2YWx1ZSkgJiYgcnVsZUhlbHBlcnMuaXNGaWxsZWQocGFydCkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5lbmRzV2l0aChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIG1lc3NhZ2UoXywgeyAkcGFyYW1zOiBbcGFydF0gfSkge1xuICAgIHJldHVybiBgRmllbGQgbXVzdCBlbmQgd2l0aCAke3BhcnR9YDtcbiAgfSxcbn0pO1xuIl19
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@regle/rules",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Collection of rules and helpers for Regle",
5
5
  "dependencies": {
6
- "@regle/core": "0.1.4"
6
+ "@regle/core": "0.1.5"
7
7
  },
8
8
  "devDependencies": {
9
9
  "@types/prettier": "3.0.0",
@@ -47,10 +47,10 @@
47
47
  "license": "MIT",
48
48
  "scripts": {
49
49
  "lint": "eslint --ext .ts --ext .vue .",
50
- "typecheck": "tsc --noEmit && vitest run --typecheck",
50
+ "typecheck": "tsc --noEmit",
51
51
  "release": "pnpm publish --report-summary",
52
52
  "build": "tsup --minify",
53
- "build:local": "tsup --clean false",
53
+ "build:sourcemaps": "tsup --clean false --sourcemap inline",
54
54
  "dev": "tsup --config=tsup.dev.ts --watch",
55
55
  "test": "vitest run"
56
56
  }