valyrian.js 7.0.0 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,71 @@
1
- import { Component, Current, Directive, Directives, DomElement, V, VnodeComponentInterface, VnodeInterface, VnodeWithDom } from "valyrian.js";
2
- export * from "valyrian.js";
1
+ export interface Props {
2
+ key?: string | number;
3
+ state?: any;
4
+ oncreate?: {
5
+ (vnode: VnodeInterface): never;
6
+ };
7
+ onupdate?: {
8
+ (vnode: VnodeInterface, oldVnode: VnodeInterface): never;
9
+ };
10
+ onremove?: {
11
+ (oldVnode: VnodeInterface): never;
12
+ };
13
+ shouldupdate?: {
14
+ (vnode: VnodeInterface, oldVnode: VnodeInterface): undefined | boolean;
15
+ };
16
+ [key: string | number | symbol]: any;
17
+ }
18
+ export interface DomElement extends Element {
19
+ [key: string]: any;
20
+ }
21
+ export interface VnodeInterface {
22
+ new (tag: string | Component | POJOComponent, props: Props, children: Children): VnodeInterface;
23
+ tag: string | Component | POJOComponent;
24
+ props: Props;
25
+ children: Children;
26
+ isSVG?: boolean;
27
+ dom?: DomElement;
28
+ processed?: boolean;
29
+ [key: string | number | symbol]: any;
30
+ }
31
+ export interface VnodeWithDom extends VnodeInterface {
32
+ dom: DomElement;
33
+ }
34
+ export interface Component {
35
+ (props?: Props | null, ...children: any[]): VnodeInterface | Children | any;
36
+ [key: string]: any;
37
+ }
38
+ export interface POJOComponent {
39
+ view: Component;
40
+ props?: Props | null;
41
+ children?: any[];
42
+ [key: string]: any;
43
+ }
44
+ export interface VnodeComponentInterface extends VnodeInterface {
45
+ tag: Component | POJOComponent;
46
+ props: Props;
47
+ children: Children;
48
+ }
49
+ export interface Children extends Array<VnodeInterface | VnodeComponentInterface | any> {
50
+ }
51
+ export interface Directive {
52
+ (value: any, vnode: VnodeWithDom, oldVnode?: VnodeWithDom): void | boolean;
53
+ }
54
+ export interface Directives {
55
+ [key: string]: Directive;
56
+ }
57
+ export interface ReservedProps {
58
+ [key: string]: true;
59
+ }
60
+ export interface Current {
61
+ component: Component | POJOComponent | null;
62
+ vnode: VnodeWithDom | null;
63
+ oldVnode?: VnodeWithDom | null;
64
+ }
65
+ export interface V {
66
+ (tagOrComponent: string | Component | POJOComponent, props: Props | null, ...children: Children): VnodeInterface | VnodeComponentInterface;
67
+ fragment(_: any, ...children: Children): Children;
68
+ }
3
69
  export declare let isNodeJs: boolean;
4
70
  export declare function createDomElement(tag: string, isSVG?: boolean): DomElement;
5
71
  export declare const Vnode: VnodeInterface;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,SAAS,EACT,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EAEV,CAAC,EACD,uBAAuB,EACvB,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AAErB,cAAc,aAAa,CAAC;AAI5B,eAAO,IAAI,QAAQ,SAAuF,CAAC;AAE3G,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,OAAe,GAAG,UAAU,CAEhF;AAED,eAAO,MAAM,KAAK,gBAIY,CAAC;AAE/B,wBAAgB,WAAW,CAAC,SAAS,KAAA,GAAG,SAAS,IAAI,SAAS,CAE7D;AAED,eAAO,MAAM,OAAO,YAAa,OAAO,GAAG,cAAc,6BAExD,CAAC;AAEF,eAAO,MAAM,gBAAgB,YAAa,OAAO,GAAG,uBAAuB,sCAE1E,CAAC;AA8BF,wBAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,OAKvC;AAUD,eAAO,MAAM,OAAO,EAAE,OAIrB,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAgB9C,CAAC;AAQF,wBAAgB,OAAO,CAAC,QAAQ,KAAA,QAE/B;AAED,wBAAgB,QAAQ,CAAC,QAAQ,KAAA,QAEhC;AAED,wBAAgB,SAAS,CAAC,QAAQ,KAAA,QAEjC;AAED,wBAAgB,SAAS,CAAC,QAAQ,KAAA,QAEjC;AA4CD,eAAO,MAAM,UAAU,EAAE,UAkKxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,QAI3D;AA8BD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAM5G;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAsBtF;AAKD,wBAAgB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAuJ3E;AAED,wBAAgB,MAAM,IAAI,IAAI,GAAG,MAAM,CAiBtC;AAED,wBAAgB,OAAO,kBAmBtB;AAED,wBAAgB,KAAK,CAAC,GAAG,KAAA,EAAE,SAAS,KAAA,iBAqBnC;AAED,eAAO,MAAM,CAAC,EAAE,CAEf,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwibm9kZVR5cGUiLCJwdXNoIiwidm5vZGUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwibm9kZVZhbHVlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsInJlc2VydmVkUHJvcHMiLCJrZXkiLCJzdGF0ZSIsIm9uQ2xlYW51cFNldCIsIlNldCIsIm9uTW91bnRTZXQiLCJvblVwZGF0ZVNldCIsIm9uVW5tb3VudFNldCIsIm9uQ2xlYW51cCIsImNhbGxiYWNrIiwiYWRkIiwiY2FsbFNldCIsInNldCIsImNsZWFyIiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwiZXZlbnRMaXN0ZW5lciIsImUiLCJ0YXJnZXQiLCJuYW1lIiwidHlwZSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJ1cGRhdGUiLCJwYXJlbnROb2RlIiwiaGlkZURpcmVjdGl2ZSIsInRlc3QiLCJib29sIiwib2xkbm9kZSIsIm5ld2RvbSIsImNyZWF0ZVRleHROb2RlIiwicmVwbGFjZUNoaWxkIiwiZGlyZWN0aXZlcyIsIm5ld0NoaWxkcmVuIiwic3R5bGUiLCJkaXNwbGF5IiwiY2xhc3NlcyIsImNsYXNzTGlzdCIsInRvZ2dsZSIsImh0bWwiLCJtb2RlbCIsInByb3BlcnR5IiwiZXZlbnQiLCJvbGRNb2RlbCIsIm9sZFByb3BlcnR5Iiwib2xkRXZlbnQiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJuZXdWbm9kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJwYXRjaCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJ0ZXh0Q29udGVudCIsIm9sZE1haW5Wbm9kZSIsInVubW91bnQiLCJyZXN1bHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwidiIsInRhZ09yQ29tcG9uZW50IiwiZnJhZ21lbnQiLCJkaXJlY3RpdmUiLCJkaXJlY3RpdmVOYW1lIiwiY29udGFpbmVyIiwicXVlcnlTZWxlY3RvckFsbCIsInZub2RlQ29tcG9uZW50Il0sInNvdXJjZXMiOlsiLi4vbGliL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG5pbXBvcnQge1xuICBDaGlsZHJlbixcbiAgQ29tcG9uZW50LFxuICBDdXJyZW50LFxuICBEaXJlY3RpdmUsXG4gIERpcmVjdGl2ZXMsXG4gIERvbUVsZW1lbnQsXG4gIFByb3BzLFxuICBWLFxuICBWbm9kZUNvbXBvbmVudEludGVyZmFjZSxcbiAgVm5vZGVJbnRlcmZhY2UsXG4gIFZub2RlV2l0aERvbVxufSBmcm9tIFwidmFseXJpYW4uanNcIjtcblxuZXhwb3J0ICogZnJvbSBcInZhbHlyaWFuLmpzXCI7XG5cbmNvbnN0IHRleHRUYWcgPSBcIiN0ZXh0XCI7XG5cbmV4cG9ydCBsZXQgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURvbUVsZW1lbnQodGFnOiBzdHJpbmcsIGlzU1ZHOiBib29sZWFuID0gZmFsc2UpOiBEb21FbGVtZW50IHtcbiAgcmV0dXJuIGlzU1ZHID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdGFnKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbn1cblxuZXhwb3J0IGNvbnN0IFZub2RlID0gZnVuY3Rpb24gVm5vZGUodGhpczogVm5vZGVJbnRlcmZhY2UsIHRhZzogc3RyaW5nLCBwcm9wczogUHJvcHMsIGNoaWxkcmVuOiBDaGlsZHJlbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG59IGFzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb21wb25lbnQpOiBjb21wb25lbnQgaXMgQ29tcG9uZW50IHtcbiAgcmV0dXJuIGNvbXBvbmVudCAmJiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8ICh0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xufVxuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICByZXR1cm4gaXNWbm9kZShvYmplY3QpICYmIGlzQ29tcG9uZW50KG9iamVjdC50YWcpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhIERPTSBub2RlIHRvIGEgVk5vZGVcbmZ1bmN0aW9uIGRvbVRvVm5vZGUoZG9tOiBhbnkpOiBWbm9kZVdpdGhEb20ge1xuICBsZXQgY2hpbGRyZW46IFZub2RlV2l0aERvbVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwLCBsID0gZG9tLmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGNoaWxkRG9tID0gZG9tLmNoaWxkTm9kZXNbaV07XG4gICAgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICBsZXQgdm5vZGUgPSBuZXcgVm5vZGUodGV4dFRhZywge30sIFtdKTtcbiAgICAgIHZub2RlLmRvbSA9IGNoaWxkRG9tO1xuICAgICAgY2hpbGRyZW4ucHVzaCh2bm9kZSBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRvbVRvVm5vZGUoY2hpbGREb20pKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcHJvcHM6IFByb3BzID0ge307XG4gIGZvciAobGV0IGkgPSAwLCBsID0gZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgbGV0IHZub2RlID0gbmV3IFZub2RlKGRvbS50YWdOYW1lLnRvTG93ZXJDYXNlKCksIHByb3BzLCBjaGlsZHJlbik7XG4gIHZub2RlLmRvbSA9IGRvbTtcbiAgcmV0dXJuIHZub2RlIGFzIFZub2RlV2l0aERvbTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBsZXQgZGl2ID0gY3JlYXRlRG9tRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChkaXYuY2hpbGROb2RlcywgKGl0ZW0pID0+IGRvbVRvVm5vZGUoaXRlbSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTWFpbiBDb21wb25lbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbmV4cG9ydCBjb25zdCBjdXJyZW50OiBDdXJyZW50ID0ge1xuICB2bm9kZTogbnVsbCxcbiAgb2xkVm5vZGU6IG51bGwsXG4gIGNvbXBvbmVudDogbnVsbFxufTtcblxuLyogUmVzZXJ2ZWQgcHJvcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHtcbiAga2V5OiB0cnVlLFxuICBzdGF0ZTogdHJ1ZSxcbiAgXCJ2LWtlZXBcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWUsXG4gIFwidi1tb2RlbFwiOiB0cnVlLFxuICBcInYtY3JlYXRlXCI6IHRydWUsXG4gIFwidi11cGRhdGVcIjogdHJ1ZSxcbiAgXCJ2LWNsZWFudXBcIjogdHJ1ZVxufTtcblxuLyogTW91bnRpbmcsIFVwZGF0aW5nLCBDbGVhbnVwIGFuZCBVbm1vdW50aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IG9uQ2xlYW51cFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uTW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVwZGF0ZVNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uVW5tb3VudFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIG9uTW91bnQoY2FsbGJhY2spIHtcbiAgb25Nb3VudFNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGUoY2FsbGJhY2spIHtcbiAgb25VcGRhdGVTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjaykge1xuICBvbkNsZWFudXBTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVW5tb3VudChjYWxsYmFjaykge1xuICBvblVubW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gY2FsbFNldChzZXQpIHtcbiAgZm9yIChsZXQgY2FsbGJhY2sgb2Ygc2V0KSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHNldC5jbGVhcigpO1xufVxuXG4vKiBFdmVudCBsaXN0ZW5lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHt9O1xuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICBsZXQgZG9tID0gZS50YXJnZXQgYXMgRG9tRWxlbWVudDtcbiAgbGV0IG5hbWUgPSBgdi1vbiR7ZS50eXBlfWA7XG4gIHdoaWxlIChkb20pIHtcbiAgICBpZiAoZG9tW25hbWVdKSB7XG4gICAgICBkb21bbmFtZV0oZSwgZG9tKTtcbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICB1cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGUgYXMgRG9tRWxlbWVudDtcbiAgfVxufVxuXG4vKiBEaXJlY3RpdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xubGV0IGhpZGVEaXJlY3RpdmUgPSAodGVzdDogYm9vbGVhbikgPT4gKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZUludGVyZmFjZSwgb2xkbm9kZT86IFZub2RlSW50ZXJmYWNlKSA9PiB7XG4gIGxldCB2YWx1ZSA9IHRlc3QgPyBib29sIDogIWJvb2w7XG4gIGlmICh2YWx1ZSkge1xuICAgIGxldCBuZXdkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBpZiAob2xkbm9kZSAmJiBvbGRub2RlLmRvbSAmJiBvbGRub2RlLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICBvbGRub2RlLmRvbS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIG9sZG5vZGUuZG9tKTtcbiAgICB9XG4gICAgdm5vZGUudGFnID0gXCIjdGV4dFwiO1xuICAgIHZub2RlLmNoaWxkcmVuID0gW107XG4gICAgdm5vZGUucHJvcHMgPSB7fTtcbiAgICB2bm9kZS5kb20gPSBuZXdkb20gYXMgdW5rbm93biBhcyBEb21FbGVtZW50O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXM6IERpcmVjdGl2ZXMgPSB7XG4gIFwidi1pZlwiOiBoaWRlRGlyZWN0aXZlKGZhbHNlKSxcbiAgXCJ2LXVubGVzc1wiOiBoaWRlRGlyZWN0aXZlKHRydWUpLFxuICBcInYtZm9yXCI6IChzZXQ6IHVua25vd25bXSwgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGxldCBuZXdDaGlsZHJlbjogVm5vZGVJbnRlcmZhY2VbXSA9IFtdO1xuICAgIGxldCBjYWxsYmFjayA9IHZub2RlLmNoaWxkcmVuWzBdO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc2V0Lmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaChjYWxsYmFjayhzZXRbaV0sIGkpKTtcbiAgICB9XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgfSxcbiAgXCJ2LXNob3dcIjogKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAoXG4gICAgICB2bm9kZS5kb20gYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICkuc3R5bGUuZGlzcGxheSA9IGJvb2wgPyBcIlwiIDogXCJub25lXCI7XG4gIH0sXG4gIFwidi1jbGFzc1wiOiAoY2xhc3NlczogeyBbeDogc3RyaW5nXTogYm9vbGVhbiB9LCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBjbGFzc2VzKSB7XG4gICAgICAodm5vZGUuZG9tIGFzIERvbUVsZW1lbnQpLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgY2xhc3Nlc1tuYW1lXSk7XG4gICAgfVxuICB9LFxuICBcInYtaHRtbFwiOiAoaHRtbDogc3RyaW5nLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbdHJ1c3QoaHRtbCldO1xuICB9LFxuICBcInYtbW9kZWxcIjogKFttb2RlbCwgcHJvcGVydHksIGV2ZW50XTogYW55W10sIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gV2UgdHJ5IHRvIGlkZW50aWZ5IGlmIHRoZSBvbGQgdm5vZGUgaGFzIHRoZSB2LW1vZGVsIGRpcmVjdGl2ZSBpbml0aWFsaXplZCBvciBub3RcbiAgICAvLyBJZiBpdCBpcywgd2UgZG9uJ3QgbmVlZCB0byByZWluaXRpYWxpemUgaXRcbiAgICBpZiAob2xkVm5vZGUgJiYgb2xkVm5vZGUuZG9tID09PSB2bm9kZS5kb20pIHtcbiAgICAgIGxldCBbb2xkTW9kZWwsIG9sZFByb3BlcnR5LCBvbGRFdmVudF0gPSBvbGRWbm9kZS5wcm9wc1tcInYtbW9kZWxcIl0gfHwgW107XG5cbiAgICAgIGlmIChvbGRNb2RlbCA9PT0gbW9kZWwgJiYgb2xkUHJvcGVydHkgPT09IHByb3BlcnR5ICYmIG9sZEV2ZW50ID09PSBldmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHZhbHVlO1xuICAgIGxldCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiAobW9kZWxbcHJvcGVydHldID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZSk7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgc3dpdGNoICh2bm9kZS5wcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHldKSkge1xuICAgICAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZub2RlLmRvbS52YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXCJ2YWx1ZVwiIGluIHZub2RlLnByb3BzKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAobW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gdm5vZGUucHJvcHMudmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLmRvbS52YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB7XG4gICAgICAgICAgbGV0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgaWYgKGUuY3RybEtleSkge1xuICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IHZhbHVlID09PSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJ0ZXh0YXJlYVwiKSB7XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgdm5vZGUuY2hpbGRyZW4gPSBbbW9kZWxbcHJvcGVydHldXTtcbiAgICB9XG5cbiAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcHJldiBoYW5kbGVyIGlmIGFueSB3aWxsIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIGFjcm9zcyBwYXRjaHNcbiAgICBsZXQgcHJldkhhbmRsZXIgPSB2bm9kZS5wcm9wc1tldmVudF07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXG4gICAgICBldmVudCxcbiAgICAgIChlOiBFdmVudCkgPT4ge1xuICAgICAgICBoYW5kbGVyKGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgaGFuZGxlciBmb3IgdGhlIGV2ZW50LCB3ZSBjYWxsIGl0IHJpZ2h0IGF3YXlcbiAgICAgICAgaWYgKHByZXZIYW5kbGVyKSB7XG4gICAgICAgICAgcHJldkhhbmRsZXIoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB2bm9kZSxcbiAgICAgIG9sZFZub2RlXG4gICAgKTtcbiAgfSxcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgXCJ2LWNyZWF0ZVwiOiAoY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB2b2lkLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGlmICghb2xkVm5vZGUpIHtcbiAgICAgIGNhbGxiYWNrKHZub2RlKTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LXVwZGF0ZVwiOiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tKSA9PiB2b2lkLFxuICAgIHZub2RlOiBWbm9kZVdpdGhEb20sXG4gICAgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb21cbiAgKSA9PiB7XG4gICAgaWYgKG9sZFZub2RlKSB7XG4gICAgICBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpO1xuICAgIH1cbiAgfSxcblxuICBcInYtY2xlYW51cFwiOiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIG9uQ2xlYW51cCgoKSA9PiBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpKTtcbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpcmVjdGl2ZTogRGlyZWN0aXZlKSB7XG4gIGxldCBkaXJlY3RpdmVOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHNbZGlyZWN0aXZlTmFtZV0gPSB0cnVlO1xufVxuXG4vKiBTZXQgYXR0cmlidXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHwgYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcyA9PT0gZmFsc2UpIHtcbiAgICAgIChtYWluVm5vZGUgYXMgVm5vZGVXaXRoRG9tKS5kb20uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLnNsaWNlKDIpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIGV2ZW50TGlzdGVuZXJOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgfVxuICAgIG5ld1Zub2RlLmRvbVtgdi0ke25hbWV9YF0gPSB2YWx1ZTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChuZXdWbm9kZS5kb21bbmFtZV0gIT0gdmFsdWUpIHtcbiAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9sZFZub2RlIHx8IHZhbHVlICE9PSBvbGRWbm9kZS5wcm9wc1tuYW1lXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgaWYgKG5hbWUgaW4gcmVzZXJ2ZWRQcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICBuZXdWbm9kZS5wcm9wc1tuYW1lXSA9IHZhbHVlO1xuICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIG5ld1Zub2RlIGFzIFZub2RlV2l0aERvbSwgb2xkVm5vZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBpZiAob2xkVm5vZGUpIHtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9sZFZub2RlLnByb3BzKSB7XG4gICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5wcm9wcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlICYmIG5hbWUgaW4gcmVzZXJ2ZWRQcm9wcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgICAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IG5hbWUgaW4gbmV3Vm5vZGUucHJvcHMpIHtcbiAgICBpZiAobmFtZSBpbiByZXNlcnZlZFByb3BzKSB7XG4gICAgICBpZiAobmFtZSBpbiBkaXJlY3RpdmVzICYmIGRpcmVjdGl2ZXNbbmFtZV0obmV3Vm5vZGUucHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCBuZXdWbm9kZS5wcm9wc1tuYW1lXSwgbmV3Vm5vZGUsIG9sZFZub2RlKTtcbiAgfVxufVxuXG4vKiBwYXRjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFBhdGNoIGEgRE9NIG5vZGUgd2l0aCBhIG5ldyBWTm9kZSB0cmVlXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2gobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgbGV0IG5ld1RyZWUgPSBuZXdWbm9kZS5jaGlsZHJlbjtcbiAgbGV0IG9sZFRyZWUgPSBvbGRWbm9kZT8uY2hpbGRyZW4gfHwgW107XG4gIGxldCBvbGRUcmVlTGVuZ3RoID0gb2xkVHJlZS5sZW5ndGg7XG5cbiAgLy8gSXMga2V5ZWQgbGlzdCBhbmQgdXBkYXRlIGluIHBsYWNlXG4gIGlmIChvbGRUcmVlTGVuZ3RoICYmIG5ld1RyZWVbMF0gaW5zdGFuY2VvZiBWbm9kZSAmJiBcImtleVwiIGluIG5ld1RyZWVbMF0ucHJvcHMgJiYgXCJrZXlcIiBpbiBvbGRUcmVlWzBdLnByb3BzKSB7XG4gICAgbGV0IG5ld1RyZWVMZW5ndGggPSBuZXdUcmVlLmxlbmd0aDtcblxuICAgIGxldCBvbGRLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgbGV0IG5ld0tleWVkTGlzdDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdLZXllZExpc3RbbmV3VHJlZVtpXS5wcm9wcy5rZXldID0gaTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG5ld0NoaWxkID0gbmV3VHJlZVtpXTtcbiAgICAgIGxldCBvbGRDaGlsZCA9IG9sZFRyZWVbb2xkS2V5ZWRMaXN0W25ld0NoaWxkLnByb3BzLmtleV1dO1xuICAgICAgbGV0IHNob3VsZFBhdGNoID0gdHJ1ZTtcblxuICAgICAgaWYgKG9sZENoaWxkKSB7XG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAgICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMgJiYgbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gPT09IG9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICAgICAgbmV3Q2hpbGQuY2hpbGRyZW4gPSBvbGRDaGlsZC5jaGlsZHJlbjtcbiAgICAgICAgICBzaG91bGRQYXRjaCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQsIG9sZENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0pIHtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICB9IGVsc2UgaWYgKG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldICE9PSBuZXdDaGlsZC5kb20pIHtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5kb20sIG5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKTtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkUGF0Y2ggJiYgcGF0Y2gobmV3Q2hpbGQsIG9sZENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW1cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFuZXdLZXllZExpc3Rbb2xkVHJlZVtpXS5wcm9wcy5rZXldKSB7XG4gICAgICAgIG9sZFRyZWVbaV0uZG9tLnBhcmVudE5vZGUgJiYgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRUcmVlW2ldLmRvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChuZXdUcmVlLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld1Zub2RlLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gb2xkVm5vZGU7XG5cbiAgLy8gRmxhdCBuZXdUcmVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSAmJiBuZXdDaGlsZC50YWcgIT09IHRleHRUYWcpIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQudGFnICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbmV3Q2hpbGQudGFnO1xuICAgICAgICBuZXdUcmVlLnNwbGljZShcbiAgICAgICAgICBpLS0sXG4gICAgICAgICAgMSxcbiAgICAgICAgICAoXCJ2aWV3XCIgaW4gbmV3Q2hpbGQudGFnID8gbmV3Q2hpbGQudGFnLnZpZXcuYmluZChuZXdDaGlsZC50YWcpIDogbmV3Q2hpbGQudGFnLmJpbmQobmV3Q2hpbGQudGFnKSkoXG4gICAgICAgICAgICBuZXdDaGlsZC5wcm9wcyxcbiAgICAgICAgICAgIC4uLm5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3Q2hpbGQuaXNTVkcgPSBuZXdWbm9kZS5pc1NWRyB8fCBuZXdDaGlsZC50YWcgPT09IFwic3ZnXCI7XG5cbiAgICAgIGlmIChpIDwgb2xkVHJlZUxlbmd0aCkge1xuICAgICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW2ldO1xuICAgICAgICBpZiAobmV3Q2hpbGQudGFnID09PSBvbGRDaGlsZC50YWcpIHtcbiAgICAgICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMgJiYgbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gPT09IG9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICAgICAgICBuZXdDaGlsZC5jaGlsZHJlbiA9IG9sZENoaWxkLmNoaWxkcmVuO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgICAgICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGQudGFnLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5kb20sIG9sZENoaWxkLmRvbSk7XG4gICAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZywgbmV3Q2hpbGQuaXNTVkcpO1xuICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEsIC4uLm5ld0NoaWxkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuZXdDaGlsZCA9PT0gbnVsbCB8fCBuZXdDaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbmV3VHJlZVtpXSA9IG5ldyBWbm9kZSh0ZXh0VGFnLCB7fSwgW10pO1xuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICBuZXdUcmVlW2ldLmRvbSA9IG5ld0NoaWxkLmRvbTtcbiAgICAgIG5ld0NoaWxkID0gKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSkuZG9tLnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChpIDwgb2xkVHJlZUxlbmd0aCkge1xuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgICAgaWYgKG9sZENoaWxkLnRhZyA9PT0gdGV4dFRhZykge1xuICAgICAgICBuZXdUcmVlW2ldLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgICBpZiAobmV3Q2hpbGQgIT0gb2xkQ2hpbGQuZG9tLnRleHRDb250ZW50KSB7XG4gICAgICAgICAgb2xkQ2hpbGQuZG9tLnRleHRDb250ZW50ID0gbmV3Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG5ld1RyZWVbaV0uZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpO1xuICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdUcmVlW2ldLmRvbSwgb2xkQ2hpbGQuZG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5ld1RyZWVbaV0uZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQpO1xuICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdUcmVlW2ldLmRvbSk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gbmV3VHJlZS5sZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQ2hpbGQob2xkVHJlZVtpXS5kb20pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGUoKTogdm9pZCB8IHN0cmluZyB7XG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG4gICAgbGV0IG9sZE1haW5Wbm9kZSA9IG1haW5Wbm9kZTtcbiAgICBtYWluVm5vZGUgPSBuZXcgVm5vZGUob2xkTWFpblZub2RlLnRhZywgb2xkTWFpblZub2RlLnByb3BzLCBbbWFpbkNvbXBvbmVudF0pIGFzIFZub2RlV2l0aERvbTtcbiAgICBtYWluVm5vZGUuZG9tID0gb2xkTWFpblZub2RlLmRvbTtcbiAgICBtYWluVm5vZGUuaXNTVkcgPSBvbGRNYWluVm5vZGUuaXNTVkc7XG4gICAgcGF0Y2gobWFpblZub2RlLCBvbGRNYWluVm5vZGUpO1xuICAgIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcbiAgICBpc01vdW50ZWQgPSB0cnVlO1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICBpZiAoaXNOb2RlSnMpIHtcbiAgICAgIHJldHVybiBtYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVubW91bnQoKSB7XG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICBtYWluQ29tcG9uZW50ID0gbmV3IFZub2RlKCgpID0+IG51bGwsIHt9LCBbXSkgYXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2U7XG4gICAgbGV0IHJlc3VsdCA9IHVwZGF0ZSgpO1xuICAgIGNhbGxTZXQob25Vbm1vdW50U2V0KTtcblxuICAgIGZvciAobGV0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudChkb20sIGNvbXBvbmVudCkge1xuICBsZXQgY29udGFpbmVyID1cbiAgICB0eXBlb2YgZG9tID09PSBcInN0cmluZ1wiXG4gICAgICA/IGlzTm9kZUpzXG4gICAgICAgID8gY3JlYXRlRG9tRWxlbWVudChkb20sIGRvbSA9PT0gXCJzdmdcIilcbiAgICAgICAgOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGRvbSlbMF1cbiAgICAgIDogZG9tO1xuXG4gIGxldCB2bm9kZUNvbXBvbmVudCA9IGlzVm5vZGVDb21wb25lbnQoY29tcG9uZW50KVxuICAgID8gY29tcG9uZW50XG4gICAgOiBpc0NvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBuZXcgVm5vZGUoY29tcG9uZW50LCB7fSwgW10pXG4gICAgOiBuZXcgVm5vZGUoKCkgPT4gY29tcG9uZW50LCB7fSwgW10pO1xuXG4gIGlmIChtYWluQ29tcG9uZW50ICYmIG1haW5Db21wb25lbnQudGFnICE9PSB2bm9kZUNvbXBvbmVudC50YWcpIHtcbiAgICB1bm1vdW50KCk7XG4gIH1cblxuICBtYWluQ29tcG9uZW50ID0gdm5vZGVDb21wb25lbnQgYXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2U7XG4gIG1haW5Wbm9kZSA9IGRvbVRvVm5vZGUoY29udGFpbmVyKTtcbiAgcmV0dXJuIHVwZGF0ZSgpO1xufVxuXG5leHBvcnQgY29uc3QgdjogViA9ICh0YWdPckNvbXBvbmVudCwgcHJvcHMgPSB7fSwgLi4uY2hpbGRyZW4pID0+IHtcbiAgcmV0dXJuIG5ldyBWbm9kZSh0YWdPckNvbXBvbmVudCwgcHJvcHMgfHwge30sIGNoaWxkcmVuKTtcbn07XG5cbnYuZnJhZ21lbnQgPSAocHJvcHM6IFByb3BzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuIl0sIm1h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
1
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwibm9kZVR5cGUiLCJwdXNoIiwidm5vZGUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwibm9kZVZhbHVlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsInJlc2VydmVkUHJvcHMiLCJrZXkiLCJzdGF0ZSIsIm9uQ2xlYW51cFNldCIsIlNldCIsIm9uTW91bnRTZXQiLCJvblVwZGF0ZVNldCIsIm9uVW5tb3VudFNldCIsIm9uQ2xlYW51cCIsImNhbGxiYWNrIiwiYWRkIiwiY2FsbFNldCIsInNldCIsImNsZWFyIiwiZXZlbnRMaXN0ZW5lck5hbWVzIiwiZXZlbnRMaXN0ZW5lciIsImUiLCJ0YXJnZXQiLCJuYW1lIiwidHlwZSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJ1cGRhdGUiLCJwYXJlbnROb2RlIiwiaGlkZURpcmVjdGl2ZSIsInRlc3QiLCJib29sIiwib2xkbm9kZSIsIm5ld2RvbSIsImNyZWF0ZVRleHROb2RlIiwicmVwbGFjZUNoaWxkIiwiZGlyZWN0aXZlcyIsIm5ld0NoaWxkcmVuIiwic3R5bGUiLCJkaXNwbGF5IiwiY2xhc3NlcyIsImNsYXNzTGlzdCIsInRvZ2dsZSIsImh0bWwiLCJtb2RlbCIsInByb3BlcnR5IiwiZXZlbnQiLCJvbGRNb2RlbCIsIm9sZFByb3BlcnR5Iiwib2xkRXZlbnQiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJuZXdWbm9kZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJzbGljZSIsInJlbW92ZUF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJwYXRjaCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJ0ZXh0Q29udGVudCIsIm9sZE1haW5Wbm9kZSIsInVubW91bnQiLCJyZXN1bHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwidiIsInRhZ09yQ29tcG9uZW50IiwiZnJhZ21lbnQiLCJkaXJlY3RpdmUiLCJkaXJlY3RpdmVOYW1lIiwiY29udGFpbmVyIiwicXVlcnlTZWxlY3RvckFsbCIsInZub2RlQ29tcG9uZW50Il0sInNvdXJjZXMiOlsiLi4vbGliL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BzIHtcbiAga2V5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBzdGF0ZT86IGFueTtcbiAgb25jcmVhdGU/OiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICh2bm9kZTogVm5vZGVJbnRlcmZhY2UpOiBuZXZlcjtcbiAgfTtcbiAgb251cGRhdGU/OiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICh2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZFZub2RlOiBWbm9kZUludGVyZmFjZSk6IG5ldmVyO1xuICB9O1xuICBvbnJlbW92ZT86IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgKG9sZFZub2RlOiBWbm9kZUludGVyZmFjZSk6IG5ldmVyO1xuICB9O1xuICBzaG91bGR1cGRhdGU/OiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICh2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZFZub2RlOiBWbm9kZUludGVyZmFjZSk6IHVuZGVmaW5lZCB8IGJvb2xlYW47XG4gIH07XG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRG9tRWxlbWVudCBleHRlbmRzIEVsZW1lbnQge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIFZub2RlSW50ZXJmYWNlIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICBuZXcgKHRhZzogc3RyaW5nIHwgQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCwgcHJvcHM6IFByb3BzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICB0YWc6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBQcm9wcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICBjaGlsZHJlbjogQ2hpbGRyZW47XG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgcHJvY2Vzc2VkPzogYm9vbGVhbjtcbiAgW2tleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sXTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVdpdGhEb20gZXh0ZW5kcyBWbm9kZUludGVyZmFjZSB7XG4gIGRvbTogRG9tRWxlbWVudDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAocHJvcHM/OiBQcm9wcyB8IG51bGwsIC4uLmNoaWxkcmVuOiBhbnlbXSk6IFZub2RlSW50ZXJmYWNlIHwgQ2hpbGRyZW4gfCBhbnk7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUE9KT0NvbXBvbmVudCB7XG4gIHZpZXc6IENvbXBvbmVudDtcbiAgcHJvcHM/OiBQcm9wcyB8IG51bGw7XG4gIGNoaWxkcmVuPzogYW55W107XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBWbm9kZUludGVyZmFjZSB7XG4gIHRhZzogQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudDtcbiAgcHJvcHM6IFByb3BzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICh2YWx1ZTogYW55LCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQgfCBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVzIHtcbiAgW2tleTogc3RyaW5nXTogRGlyZWN0aXZlO1xufVxuZXhwb3J0IGludGVyZmFjZSBSZXNlcnZlZFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogdHJ1ZTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIGNvbXBvbmVudDogQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCB8IG51bGw7XG4gIHZub2RlOiBWbm9kZVdpdGhEb20gfCBudWxsO1xuICBvbGRWbm9kZT86IFZub2RlV2l0aERvbSB8IG51bGw7XG59XG5leHBvcnQgaW50ZXJmYWNlIFYge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICh0YWdPckNvbXBvbmVudDogc3RyaW5nIHwgQ29tcG9uZW50IHwgUE9KT0NvbXBvbmVudCwgcHJvcHM6IFByb3BzIHwgbnVsbCwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTpcbiAgICB8IFZub2RlSW50ZXJmYWNlXG4gICAgfCBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICBmcmFnbWVudChfOiBhbnksIC4uLmNoaWxkcmVuOiBDaGlsZHJlbik6IENoaWxkcmVuO1xufVxuXG5jb25zdCB0ZXh0VGFnID0gXCIjdGV4dFwiO1xuXG5leHBvcnQgbGV0IGlzTm9kZUpzID0gQm9vbGVhbih0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEb21FbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbiA9IGZhbHNlKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZykgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbmV4cG9ydCBjb25zdCBWbm9kZSA9IGZ1bmN0aW9uIFZub2RlKHRoaXM6IFZub2RlSW50ZXJmYWNlLCB0YWc6IHN0cmluZywgcHJvcHM6IFByb3BzLCBjaGlsZHJlbjogQ2hpbGRyZW4pIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSBhcyB1bmtub3duIGFzIFZub2RlSW50ZXJmYWNlO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wb25lbnQoY29tcG9uZW50KTogY29tcG9uZW50IGlzIENvbXBvbmVudCB7XG4gIHJldHVybiBjb21wb25lbnQgJiYgKHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiB8fCAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJvYmplY3RcIiAmJiBcInZpZXdcIiBpbiBjb21wb25lbnQpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzVm5vZGUgPSAob2JqZWN0PzogdW5rbm93biB8IFZub2RlSW50ZXJmYWNlKTogb2JqZWN0IGlzIFZub2RlSW50ZXJmYWNlID0+IHtcbiAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIFZub2RlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVm5vZGVDb21wb25lbnQgPSAob2JqZWN0PzogdW5rbm93biB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlKTogb2JqZWN0IGlzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlID0+IHtcbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vIFRyYW5zZm9ybXMgYSBET00gbm9kZSB0byBhIFZOb2RlXG5mdW5jdGlvbiBkb21Ub1Zub2RlKGRvbTogYW55KTogVm5vZGVXaXRoRG9tIHtcbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIGlmIChjaGlsZERvbS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgbGV0IHZub2RlID0gbmV3IFZub2RlKHRleHRUYWcsIHt9LCBbXSk7XG4gICAgICB2bm9kZS5kb20gPSBjaGlsZERvbTtcbiAgICAgIGNoaWxkcmVuLnB1c2godm5vZGUgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGlsZERvbS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgY2hpbGRyZW4ucHVzaChkb21Ub1Zub2RlKGNoaWxkRG9tKSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHByb3BzOiBQcm9wcyA9IHt9O1xuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5hdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBhdHRyID0gZG9tLmF0dHJpYnV0ZXNbaV07XG4gICAgcHJvcHNbYXR0ci5ub2RlTmFtZV0gPSBhdHRyLm5vZGVWYWx1ZTtcbiAgfVxuXG4gIGxldCB2bm9kZSA9IG5ldyBWbm9kZShkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdChodG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgbGV0IGRpdiA9IGNyZWF0ZURvbUVsZW1lbnQoXCJkaXZcIik7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nLnRyaW0oKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoZGl2LmNoaWxkTm9kZXMsIChpdGVtKSA9PiBkb21Ub1Zub2RlKGl0ZW0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qIE1haW4gQ29tcG9uZW50IGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG5sZXQgbWFpbkNvbXBvbmVudDogVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBtYWluVm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGwgPSBudWxsO1xubGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgY3VycmVudDogQ3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwsXG4gIG9sZFZub2RlOiBudWxsLFxuICBjb21wb25lbnQ6IG51bGxcbn07XG5cbi8qIFJlc2VydmVkIHByb3BzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5leHBvcnQgY29uc3QgcmVzZXJ2ZWRQcm9wczogUmVjb3JkPHN0cmluZywgdHJ1ZT4gPSB7XG4gIGtleTogdHJ1ZSxcbiAgc3RhdGU6IHRydWUsXG4gIFwidi1rZWVwXCI6IHRydWUsXG5cbiAgLy8gQnVpbHQgaW4gZGlyZWN0aXZlc1xuICBcInYtaWZcIjogdHJ1ZSxcbiAgXCJ2LXVubGVzc1wiOiB0cnVlLFxuICBcInYtZm9yXCI6IHRydWUsXG4gIFwidi1zaG93XCI6IHRydWUsXG4gIFwidi1jbGFzc1wiOiB0cnVlLFxuICBcInYtaHRtbFwiOiB0cnVlLFxuICBcInYtbW9kZWxcIjogdHJ1ZSxcbiAgXCJ2LWNyZWF0ZVwiOiB0cnVlLFxuICBcInYtdXBkYXRlXCI6IHRydWUsXG4gIFwidi1jbGVhbnVwXCI6IHRydWVcbn07XG5cbi8qIE1vdW50aW5nLCBVcGRhdGluZywgQ2xlYW51cCBhbmQgVW5tb3VudGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBvbkNsZWFudXBTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvbk1vdW50U2V0OiBTZXQ8RnVuY3Rpb24+ID0gbmV3IFNldCgpO1xuY29uc3Qgb25VcGRhdGVTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVubW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrKSB7XG4gIG9uTW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVXBkYXRlKGNhbGxiYWNrKSB7XG4gIG9uVXBkYXRlU2V0LmFkZChjYWxsYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvbkNsZWFudXAoY2FsbGJhY2spIHtcbiAgb25DbGVhbnVwU2V0LmFkZChjYWxsYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVubW91bnQoY2FsbGJhY2spIHtcbiAgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIGNhbGxTZXQoc2V0KSB7XG4gIGZvciAobGV0IGNhbGxiYWNrIG9mIHNldCkge1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBzZXQuY2xlYXIoKTtcbn1cblxuLyogRXZlbnQgbGlzdGVuZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IGV2ZW50TGlzdGVuZXJOYW1lczogUmVjb3JkPHN0cmluZywgdHJ1ZT4gPSB7fTtcbmZ1bmN0aW9uIGV2ZW50TGlzdGVuZXIoZTogRXZlbnQpIHtcbiAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQ7XG4gIGxldCBuYW1lID0gYHYtb24ke2UudHlwZX1gO1xuICB3aGlsZSAoZG9tKSB7XG4gICAgaWYgKGRvbVtuYW1lXSkge1xuICAgICAgZG9tW25hbWVdKGUsIGRvbSk7XG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgdXBkYXRlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGRvbSA9IGRvbS5wYXJlbnROb2RlIGFzIERvbUVsZW1lbnQ7XG4gIH1cbn1cblxuLyogRGlyZWN0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmxldCBoaWRlRGlyZWN0aXZlID0gKHRlc3Q6IGJvb2xlYW4pID0+IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZG5vZGU/OiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICBsZXQgdmFsdWUgPSB0ZXN0ID8gYm9vbCA6ICFib29sO1xuICBpZiAodmFsdWUpIHtcbiAgICBsZXQgbmV3ZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgaWYgKG9sZG5vZGUgJiYgb2xkbm9kZS5kb20gJiYgb2xkbm9kZS5kb20ucGFyZW50Tm9kZSkge1xuICAgICAgb2xkbm9kZS5kb20ucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3ZG9tLCBvbGRub2RlLmRvbSk7XG4gICAgfVxuICAgIHZub2RlLnRhZyA9IFwiI3RleHRcIjtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFtdO1xuICAgIHZub2RlLnByb3BzID0ge307XG4gICAgdm5vZGUuZG9tID0gbmV3ZG9tIGFzIHVua25vd24gYXMgRG9tRWxlbWVudDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXJlY3RpdmVzOiBEaXJlY3RpdmVzID0ge1xuICBcInYtaWZcIjogaGlkZURpcmVjdGl2ZShmYWxzZSksXG4gIFwidi11bmxlc3NcIjogaGlkZURpcmVjdGl2ZSh0cnVlKSxcbiAgXCJ2LWZvclwiOiAoc2V0OiB1bmtub3duW10sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgbmV3Q2hpbGRyZW46IFZub2RlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBsZXQgY2FsbGJhY2sgPSB2bm9kZS5jaGlsZHJlblswXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goY2FsbGJhY2soc2V0W2ldLCBpKSk7XG4gICAgfVxuICAgIHZub2RlLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH0sXG4gIFwidi1zaG93XCI6IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuICBcInYtY2xhc3NcIjogKGNsYXNzZXM6IHsgW3g6IHN0cmluZ106IGJvb2xlYW4gfSwgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGZvciAobGV0IG5hbWUgaW4gY2xhc3Nlcykge1xuICAgICAgKHZub2RlLmRvbSBhcyBEb21FbGVtZW50KS5jbGFzc0xpc3QudG9nZ2xlKG5hbWUsIGNsYXNzZXNbbmFtZV0pO1xuICAgIH1cbiAgfSxcbiAgXCJ2LWh0bWxcIjogKGh0bWw6IHN0cmluZywgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIHZub2RlLmNoaWxkcmVuID0gW3RydXN0KGh0bWwpXTtcbiAgfSxcbiAgXCJ2LW1vZGVsXCI6IChbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIFdlIHRyeSB0byBpZGVudGlmeSBpZiB0aGUgb2xkIHZub2RlIGhhcyB0aGUgdi1tb2RlbCBkaXJlY3RpdmUgaW5pdGlhbGl6ZWQgb3Igbm90XG4gICAgLy8gSWYgaXQgaXMsIHdlIGRvbid0IG5lZWQgdG8gcmVpbml0aWFsaXplIGl0XG4gICAgaWYgKG9sZFZub2RlICYmIG9sZFZub2RlLmRvbSA9PT0gdm5vZGUuZG9tKSB7XG4gICAgICBsZXQgW29sZE1vZGVsLCBvbGRQcm9wZXJ0eSwgb2xkRXZlbnRdID0gb2xkVm5vZGUucHJvcHNbXCJ2LW1vZGVsXCJdIHx8IFtdO1xuXG4gICAgICBpZiAob2xkTW9kZWwgPT09IG1vZGVsICYmIG9sZFByb3BlcnR5ID09PSBwcm9wZXJ0eSAmJiBvbGRFdmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB2YWx1ZTtcbiAgICBsZXQgaGFuZGxlciA9IChlOiBFdmVudCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWUpO1xuICAgIGlmICh2bm9kZS50YWcgPT09IFwiaW5wdXRcIikge1xuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIHN3aXRjaCAodm5vZGUucHJvcHMudHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjoge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHZhbCA9IChlLnRhcmdldCBhcyBEb21FbGVtZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikudmFsdWU7XG4gICAgICAgICAgICAgIGxldCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgdmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicmFkaW9cIjoge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIGxldCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZSgwLCBtb2RlbFtwcm9wZXJ0eV0ubGVuZ3RoKTtcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5wdXNoKHZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW21vZGVsW3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHByZXYgaGFuZGxlciBpZiBhbnkgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBhY3Jvc3MgcGF0Y2hzXG4gICAgbGV0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgZGVmaW5lZCBhIGhhbmRsZXIgZm9yIHRoZSBldmVudCwgd2UgY2FsbCBpdCByaWdodCBhd2F5XG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGUsXG4gICAgICBvbGRWbm9kZVxuICAgICk7XG4gIH0sXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIFwidi1jcmVhdGVcIjogKGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSkgPT4gdm9pZCwgdm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBpZiAoIW9sZFZub2RlKSB7XG4gICAgICBjYWxsYmFjayh2bm9kZSk7XG4gICAgfVxuICB9LFxuXG4gIFwidi11cGRhdGVcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU6IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIGlmIChvbGRWbm9kZSkge1xuICAgICAgY2FsbGJhY2sodm5vZGUsIG9sZFZub2RlKTtcbiAgICB9XG4gIH0sXG5cbiAgXCJ2LWNsZWFudXBcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHZvaWQsXG4gICAgdm5vZGU6IFZub2RlV2l0aERvbSxcbiAgICBvbGRWbm9kZT86IFZub2RlV2l0aERvbVxuICApID0+IHtcbiAgICBvbkNsZWFudXAoKCkgPT4gY2FsbGJhY2sodm5vZGUsIG9sZFZub2RlKSk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUobmFtZTogc3RyaW5nLCBkaXJlY3RpdmU6IERpcmVjdGl2ZSkge1xuICBsZXQgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzW2RpcmVjdGl2ZU5hbWVdID0gdHJ1ZTtcbn1cblxuLyogU2V0IGF0dHJpYnV0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpZiAobmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlKSB7XG4gICAgICAobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSkuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBldmVudExpc3RlbmVyTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgICBuZXdWbm9kZS5kb21bYHYtJHtuYW1lfWBdID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICBpZiAobmV3Vm5vZGUuZG9tW25hbWVdICE9IHZhbHVlKSB7XG4gICAgICBuZXdWbm9kZS5kb21bbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFvbGRWbm9kZSB8fCB2YWx1ZSAhPT0gb2xkVm5vZGUucHJvcHNbbmFtZV0pIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWbm9kZS5kb20uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSBhcyBWbm9kZVdpdGhEb20sIG9sZFZub2RlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHtcbiAgaWYgKG9sZFZub2RlKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvbGRWbm9kZS5wcm9wcykge1xuICAgICAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUucHJvcHMgPT09IGZhbHNlICYmIG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzID09PSBmYWxzZSAmJiBuYW1lIGluIHJlc2VydmVkUHJvcHMgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmIChuYW1lIGluIG5ld1Zub2RlLmRvbSAmJiBuZXdWbm9kZS5pc1NWRyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBuZXdWbm9kZS5kb21bbmFtZV0gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1Zub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBuYW1lIGluIG5ld1Zub2RlLnByb3BzKSB7XG4gICAgaWYgKG5hbWUgaW4gcmVzZXJ2ZWRQcm9wcykge1xuICAgICAgaWYgKG5hbWUgaW4gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzW25hbWVdKG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgbmV3Vm5vZGUucHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZSk7XG4gIH1cbn1cblxuLyogcGF0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBQYXRjaCBhIERPTSBub2RlIHdpdGggYSBuZXcgVk5vZGUgdHJlZVxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGxldCBuZXdUcmVlID0gbmV3Vm5vZGUuY2hpbGRyZW47XG4gIGxldCBvbGRUcmVlID0gb2xkVm5vZGU/LmNoaWxkcmVuIHx8IFtdO1xuICBsZXQgb2xkVHJlZUxlbmd0aCA9IG9sZFRyZWUubGVuZ3RoO1xuXG4gIC8vIElzIGtleWVkIGxpc3QgYW5kIHVwZGF0ZSBpbiBwbGFjZVxuICBpZiAob2xkVHJlZUxlbmd0aCAmJiBuZXdUcmVlWzBdIGluc3RhbmNlb2YgVm5vZGUgJiYgXCJrZXlcIiBpbiBuZXdUcmVlWzBdLnByb3BzICYmIFwia2V5XCIgaW4gb2xkVHJlZVswXS5wcm9wcykge1xuICAgIGxldCBuZXdUcmVlTGVuZ3RoID0gbmV3VHJlZS5sZW5ndGg7XG5cbiAgICBsZXQgb2xkS2V5ZWRMaXN0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEtleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIGxldCBuZXdLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbmV3S2V5ZWRMaXN0W25ld1RyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG4gICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXldXTtcbiAgICAgIGxldCBzaG91bGRQYXRjaCA9IHRydWU7XG5cbiAgICAgIGlmIChvbGRDaGlsZCkge1xuICAgICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgIGlmIChcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICAgICAgc2hvdWxkUGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGQudGFnLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdDaGlsZC5kb20pO1xuICAgICAgfSBlbHNlIGlmIChuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSAhPT0gbmV3Q2hpbGQuZG9tKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIHNob3VsZFBhdGNoICYmIHBhdGNoKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSByZXN0IG9mIHRoZSBjaGlsZHJlbiwgd2Ugc2hvdWxkIHJlbW92ZSB0aGVtXG4gICAgZm9yIChsZXQgaSA9IG5ld1RyZWVMZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbmV3S2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSkge1xuICAgICAgICBvbGRUcmVlW2ldLmRvbS5wYXJlbnROb2RlICYmIG9sZFRyZWVbaV0uZG9tLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob2xkVHJlZVtpXS5kb20pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobmV3VHJlZS5sZW5ndGggPT09IDApIHtcbiAgICBuZXdWbm9kZS5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGN1cnJlbnQudm5vZGUgPSBuZXdWbm9kZTtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG9sZFZub2RlO1xuXG4gIC8vIEZsYXQgbmV3VHJlZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuXG4gICAgaWYgKG5ld0NoaWxkIGluc3RhbmNlb2YgVm5vZGUgJiYgbmV3Q2hpbGQudGFnICE9PSB0ZXh0VGFnKSB7XG4gICAgICBpZiAodHlwZW9mIG5ld0NoaWxkLnRhZyAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjdXJyZW50LmNvbXBvbmVudCA9IG5ld0NoaWxkLnRhZztcbiAgICAgICAgbmV3VHJlZS5zcGxpY2UoXG4gICAgICAgICAgaS0tLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgKFwidmlld1wiIGluIG5ld0NoaWxkLnRhZyA/IG5ld0NoaWxkLnRhZy52aWV3LmJpbmQobmV3Q2hpbGQudGFnKSA6IG5ld0NoaWxkLnRhZy5iaW5kKG5ld0NoaWxkLnRhZykpKFxuICAgICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgICAuLi5uZXdDaGlsZC5jaGlsZHJlblxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgICBpZiAoaSA8IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcbiAgICAgICAgaWYgKG5ld0NoaWxkLnRhZyA9PT0gb2xkQ2hpbGQudGFnKSB7XG4gICAgICAgICAgbmV3Q2hpbGQuZG9tID0gb2xkQ2hpbGQuZG9tO1xuICAgICAgICAgIGlmIChcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICAgICAgbmV3Q2hpbGQuY2hpbGRyZW4gPSBvbGRDaGlsZC5jaGlsZHJlbjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gICAgICAgICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZywgbmV3Q2hpbGQuaXNTVkcpO1xuICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdDaGlsZC5kb20pO1xuICAgICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobmV3Q2hpbGQgPT09IG51bGwgfHwgbmV3Q2hpbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5ld1RyZWVbaV0gPSBuZXcgVm5vZGUodGV4dFRhZywge30sIFtdKTtcbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgbmV3VHJlZVtpXS5kb20gPSBuZXdDaGlsZC5kb207XG4gICAgICBuZXdDaGlsZCA9IChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pLmRvbS50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICBpZiAoaSA8IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgIGxldCBvbGRDaGlsZCA9IG9sZFRyZWVbaV07XG5cbiAgICAgIGlmIChvbGRDaGlsZC50YWcgPT09IHRleHRUYWcpIHtcbiAgICAgICAgbmV3VHJlZVtpXS5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICAgICAgaWYgKG5ld0NoaWxkICE9IG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCkge1xuICAgICAgICAgIG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBuZXdUcmVlW2ldLmRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld0NoaWxkKTtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3VHJlZVtpXS5kb20sIG9sZENoaWxkLmRvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBuZXdUcmVlW2ldLmRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld0NoaWxkKTtcbiAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3VHJlZVtpXS5kb20pO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IG5ld1RyZWUubGVuZ3RoOyBpIDwgb2xkVHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlKCk6IHZvaWQgfCBzdHJpbmcge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgY2FsbFNldChvbkNsZWFudXBTZXQpO1xuICAgIGxldCBvbGRNYWluVm5vZGUgPSBtYWluVm5vZGU7XG4gICAgbWFpblZub2RlID0gbmV3IFZub2RlKG9sZE1haW5Wbm9kZS50YWcsIG9sZE1haW5Wbm9kZS5wcm9wcywgW21haW5Db21wb25lbnRdKSBhcyBWbm9kZVdpdGhEb207XG4gICAgbWFpblZub2RlLmRvbSA9IG9sZE1haW5Wbm9kZS5kb207XG4gICAgbWFpblZub2RlLmlzU1ZHID0gb2xkTWFpblZub2RlLmlzU1ZHO1xuICAgIHBhdGNoKG1haW5Wbm9kZSwgb2xkTWFpblZub2RlKTtcbiAgICBjYWxsU2V0KGlzTW91bnRlZCA/IG9uVXBkYXRlU2V0IDogb25Nb3VudFNldCk7XG4gICAgaXNNb3VudGVkID0gdHJ1ZTtcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gICAgaWYgKGlzTm9kZUpzKSB7XG4gICAgICByZXR1cm4gbWFpblZub2RlLmRvbS5pbm5lckhUTUw7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBudWxsLCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIGxldCByZXN1bHQgPSB1cGRhdGUoKTtcbiAgICBjYWxsU2V0KG9uVW5tb3VudFNldCk7XG5cbiAgICBmb3IgKGxldCBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcykge1xuICAgICAgbWFpblZub2RlLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGV2ZW50TGlzdGVuZXJOYW1lcywgbmFtZSk7XG4gICAgfVxuXG4gICAgbWFpbkNvbXBvbmVudCA9IG51bGw7XG4gICAgbWFpblZub2RlID0gbnVsbDtcbiAgICBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnQoZG9tLCBjb21wb25lbnQpIHtcbiAgbGV0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBpc05vZGVKc1xuICAgICAgICA/IGNyZWF0ZURvbUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkb20pWzBdXG4gICAgICA6IGRvbTtcblxuICBsZXQgdm5vZGVDb21wb25lbnQgPSBpc1Zub2RlQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IGNvbXBvbmVudFxuICAgIDogaXNDb21wb25lbnQoY29tcG9uZW50KVxuICAgID8gbmV3IFZub2RlKGNvbXBvbmVudCwge30sIFtdKVxuICAgIDogbmV3IFZub2RlKCgpID0+IGNvbXBvbmVudCwge30sIFtdKTtcblxuICBpZiAobWFpbkNvbXBvbmVudCAmJiBtYWluQ29tcG9uZW50LnRhZyAhPT0gdm5vZGVDb21wb25lbnQudGFnKSB7XG4gICAgdW5tb3VudCgpO1xuICB9XG5cbiAgbWFpbkNvbXBvbmVudCA9IHZub2RlQ29tcG9uZW50IGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICBtYWluVm5vZGUgPSBkb21Ub1Zub2RlKGNvbnRhaW5lcik7XG4gIHJldHVybiB1cGRhdGUoKTtcbn1cblxuZXhwb3J0IGNvbnN0IHY6IFYgPSAodGFnT3JDb21wb25lbnQsIHByb3BzID0ge30sIC4uLmNoaWxkcmVuKSA9PiB7XG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG59O1xuXG52LmZyYWdtZW50ID0gKHByb3BzOiBQcm9wcywgLi4uY2hpbGRyZW46IENoaWxkcmVuKSA9PiBjaGlsZHJlbjtcbiJdLCJtYXBwaW5ncyI6Ik1Bc0ZBLElBQU1BLEVBQVUsUUFFTEMsRUFBV0MsUUFBMkIsb0JBQVpDLFNBQTJCQSxRQUFRQyxVQUFZRCxRQUFRQyxTQUFTQyxNQUU5RixTQUFT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
package/lib/index.ts CHANGED
@@ -2,21 +2,87 @@
2
2
  /* eslint-disable sonarjs/cognitive-complexity */
3
3
  /* eslint-disable complexity */
4
4
 
5
- import {
6
- Children,
7
- Component,
8
- Current,
9
- Directive,
10
- Directives,
11
- DomElement,
12
- Props,
13
- V,
14
- VnodeComponentInterface,
15
- VnodeInterface,
16
- VnodeWithDom
17
- } from "valyrian.js";
18
-
19
- export * from "valyrian.js";
5
+ export interface Props {
6
+ key?: string | number;
7
+ state?: any;
8
+ oncreate?: {
9
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
10
+ (vnode: VnodeInterface): never;
11
+ };
12
+ onupdate?: {
13
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
14
+ (vnode: VnodeInterface, oldVnode: VnodeInterface): never;
15
+ };
16
+ onremove?: {
17
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
18
+ (oldVnode: VnodeInterface): never;
19
+ };
20
+ shouldupdate?: {
21
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
22
+ (vnode: VnodeInterface, oldVnode: VnodeInterface): undefined | boolean;
23
+ };
24
+ [key: string | number | symbol]: any;
25
+ }
26
+ export interface DomElement extends Element {
27
+ [key: string]: any;
28
+ }
29
+ export interface VnodeInterface {
30
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
31
+ new (tag: string | Component | POJOComponent, props: Props, children: Children): VnodeInterface;
32
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
33
+ tag: string | Component | POJOComponent;
34
+ props: Props;
35
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
36
+ children: Children;
37
+ isSVG?: boolean;
38
+ dom?: DomElement;
39
+ processed?: boolean;
40
+ [key: string | number | symbol]: any;
41
+ }
42
+ export interface VnodeWithDom extends VnodeInterface {
43
+ dom: DomElement;
44
+ }
45
+ export interface Component {
46
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
47
+ (props?: Props | null, ...children: any[]): VnodeInterface | Children | any;
48
+ [key: string]: any;
49
+ }
50
+ export interface POJOComponent {
51
+ view: Component;
52
+ props?: Props | null;
53
+ children?: any[];
54
+ [key: string]: any;
55
+ }
56
+ export interface VnodeComponentInterface extends VnodeInterface {
57
+ tag: Component | POJOComponent;
58
+ props: Props;
59
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
60
+ children: Children;
61
+ }
62
+ export interface Children extends Array<VnodeInterface | VnodeComponentInterface | any> {}
63
+ export interface Directive {
64
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
65
+ (value: any, vnode: VnodeWithDom, oldVnode?: VnodeWithDom): void | boolean;
66
+ }
67
+ export interface Directives {
68
+ [key: string]: Directive;
69
+ }
70
+ export interface ReservedProps {
71
+ [key: string]: true;
72
+ }
73
+ export interface Current {
74
+ component: Component | POJOComponent | null;
75
+ vnode: VnodeWithDom | null;
76
+ oldVnode?: VnodeWithDom | null;
77
+ }
78
+ export interface V {
79
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
80
+ (tagOrComponent: string | Component | POJOComponent, props: Props | null, ...children: Children):
81
+ | VnodeInterface
82
+ | VnodeComponentInterface;
83
+ // eslint-disable-next-line no-unused-vars, no-use-before-define
84
+ fragment(_: any, ...children: Children): Children;
85
+ }
20
86
 
21
87
  const textTag = "#text";
22
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valyrian.js",
3
- "version": "7.0.0",
3
+ "version": "7.0.2",
4
4
  "description": "Lightweight steel to forge PWAs. (Minimal Frontend Framework with server side rendering and other capabilities)",
5
5
  "repository": "git@github.com:Masquerade-Circus/valyrian.js.git",
6
6
  "author": "Masquerade <christian@masquerade-circus.net>",
@@ -16,10 +16,12 @@
16
16
  "types": "dist/**/*.d.ts",
17
17
  "exports": {
18
18
  ".": {
19
+ "types": "./dist/index.d.ts",
19
20
  "import": "./dist/index.mjs",
20
21
  "require": "./dist/index.js"
21
22
  },
22
23
  "./*": {
24
+ "types": "./dist/*.d.ts",
23
25
  "import": "./dist/*/index.mjs",
24
26
  "require": "./dist/*/index.js"
25
27
  }
@@ -58,7 +60,7 @@
58
60
  "dev:test": "nodemon --enable-source-maps -e mjs,js,ts,json,css,tsx,jsx -w ./lib -w ./test -w ./dist --exec 'mocha --bail --timeout 15000 --slow 0 --require ./register --enable-source-maps \"test/**/*_test.js\"'",
59
61
  "dev:test:nyc": "nodemon --enable-source-maps -w ./test -w ./lib -w ./plugins --exec 'nyc --reporter=text --reporter=lcov mocha --timeout 15000 --slow 0 --require ./register \"test/**/*_test.js\"'",
60
62
  "dev:web": "browser-sync start --config 'www/bs-config.js'",
61
- "build": "yarn build:source && yarn remark",
63
+ "build": "npm run build:source && npm run remark",
62
64
  "build:source": "cross-env NODE_ENV=production node source.js",
63
65
  "test": "cross-env NODE_ENV=development nyc mocha --forbid-only --timeout 15000 --require ./register --exit \"test/**/*_test.js\"",
64
66
  "coverage": "nyc report --reporter=lcov",
@@ -198,10 +200,11 @@
198
200
  },
199
201
  "hooks": {
200
202
  "before:init": [
203
+ "npm run build",
201
204
  "npm run test"
202
205
  ],
203
206
  "after:bump": [
204
- "npm run build"
207
+ "npm run remark"
205
208
  ],
206
209
  "after:@release-it/conventional-changelog": [
207
210
  "npm run remark"
package/tsconfig.json CHANGED
@@ -10,10 +10,8 @@
10
10
  "esModuleInterop": true,
11
11
  "jsxFactory": "v",
12
12
  "jsxFragmentFactory": "v.fragment",
13
- "rootDir": "./lib",
13
+ "rootDir": "lib",
14
14
  "paths": {
15
- "valyrian.js": ["./lib/index.ts"],
16
- "valyrian.js/*": ["./lib/*"],
17
15
  "node_modules/*": ["./node_modules/*"]
18
16
  }
19
17
  },