snabberb 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 369d9786428f032c2c1469feb43f8e9945a64f321ae6e43cec71d79f4aaf5df2
4
- data.tar.gz: 8f6e1288c3255f2348a4507935666a83c5935f2c7d095596c174edd146b87b82
3
+ metadata.gz: cedc3e54bfcb4b628750f8a7779975624cb72226c46ca0c2e7ea787d5b31e9f2
4
+ data.tar.gz: e0d593a26c2058022d6e6c3df9dc200c235aedf2524a9c774ebcabbfa8df7d3a
5
5
  SHA512:
6
- metadata.gz: ee8dd3445a8f30df166e099d0e4ec2b5982787c307f4bdac7457b61195fd907940e75fb63c6cb0cccc870cc8ca32360615c12bdbc5aef2ad2b5ce747385c55d1
7
- data.tar.gz: 716c08332f52cb7751506e4add860fee6be25fb546f66e31dfb6d794796a65a47bb01a78e10ceb2f2a9873e6cef050fba2ec2f93cb40e0368571a507a1fb3a8a
6
+ metadata.gz: c0d1c3b840a0f0475204cdcdf8a603441bbbcc5f7fb1b3653081e4b8e25690663116ba639775b4ae8f7c045f904207225fa6d7bee27931a778c441c76e8385d9
7
+ data.tar.gz: f32c2619a9c422fe33cf7fdeddd97b968c7a68002865619f1077c63349e66caa24c820aad00fa66bf60de623d5e8e7f46f7a16ba374f9836cd9ce653badffddc
data/.gitignore CHANGED
@@ -8,6 +8,8 @@
8
8
  /tmp/
9
9
  /examples/roda/public
10
10
  /examples/roda/build
11
+ /node_modules/
12
+ package-lock.json
11
13
 
12
14
  .DS_STORE
13
15
  *.swp
data/README.md CHANGED
@@ -105,7 +105,7 @@ class NestedExample < Snabberb::Component
105
105
  h(:div, { style: { width: '100px' } }, [
106
106
  h(:div, 'hello'),
107
107
  ])
108
- ](
108
+ ])
109
109
  end
110
110
  end
111
111
  ```
@@ -0,0 +1,20 @@
1
+ // browserify deps.js -p esmify -s snabbdom > opal/vendor/snabbdom.js
2
+ import { init } from './node_modules/snabbdom/build/package/init'
3
+ import { h } from './node_modules/snabbdom/build/package/h'
4
+ import { toVNode } from './node_modules/snabbdom/build/package/tovnode'
5
+
6
+ import { attributesModule } from './node_modules/snabbdom/build/package/modules/attributes'
7
+ import { classModule } from './node_modules/snabbdom/build/package/modules/class'
8
+ import { eventListenersModule } from './node_modules/snabbdom/build/package/modules/eventlisteners'
9
+ import { propsModule } from './node_modules/snabbdom/build/package/modules/props'
10
+ import { styleModule } from './node_modules/snabbdom/build/package/modules/style'
11
+
12
+ module.exports.init = init
13
+ module.exports.h = h
14
+ module.exports.toVNode = toVNode
15
+
16
+ module.exports.attributesModule = attributesModule
17
+ module.exports.classModule = classModule
18
+ module.exports.eventListenersModule = eventListenersModule
19
+ module.exports.propsModule = propsModule
20
+ module.exports.styleModule = styleModule
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- snabberb (0.2.3)
4
+ snabberb (0.4.2)
5
5
  opal (~> 1.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.0)
10
+ ast (2.4.1)
11
11
  c_lexer (2.6.4.1.1)
12
12
  ast (~> 2.4.0)
13
13
  parser (= 2.6.4.1)
@@ -16,7 +16,7 @@ GEM
16
16
  parser (~> 2.6)
17
17
  parser (2.6.4.1)
18
18
  ast (~> 2.4.0)
19
- rack (2.2.2)
19
+ rack (2.2.3)
20
20
 
21
21
  PLATFORMS
22
22
  ruby
@@ -28,4 +28,4 @@ DEPENDENCIES
28
28
  snabberb!
29
29
 
30
30
  BUNDLED WITH
31
- 2.1.2
31
+ 2.1.4
@@ -1,32 +1,32 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- snabberb (0.2.5)
4
+ snabberb (0.4.2)
5
5
  opal (~> 1.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.4.0)
10
+ ast (2.4.1)
11
11
  c_lexer (2.6.4.1.1)
12
12
  ast (~> 2.4.0)
13
13
  parser (= 2.6.4.1)
14
- concurrent-ruby (1.1.6)
14
+ concurrent-ruby (1.1.7)
15
15
  execjs (2.7.0)
16
- libv8 (7.3.492.27.1)
17
- mini_racer (0.2.9)
18
- libv8 (>= 6.9.411)
16
+ libv8 (8.4.255.0)
17
+ mini_racer (0.3.1)
18
+ libv8 (~> 8.4.255)
19
19
  opal (1.0.3)
20
20
  ast (>= 2.3.0)
21
21
  parser (~> 2.6)
22
- opal-sprockets (0.4.8.1.0.3.7)
22
+ opal-sprockets (0.4.9.1.0.3.7)
23
23
  opal (~> 1.0.0)
24
24
  sprockets (~> 3.7)
25
25
  tilt (>= 1.4)
26
26
  parser (2.6.4.1)
27
27
  ast (~> 2.4.0)
28
- rack (2.2.2)
29
- roda (3.30.0)
28
+ rack (2.2.3)
29
+ roda (3.36.0)
30
30
  rack
31
31
  sprockets (3.7.2)
32
32
  concurrent-ruby (~> 1.0)
@@ -46,4 +46,4 @@ DEPENDENCIES
46
46
  snabberb!
47
47
 
48
48
  BUNDLED WITH
49
- 2.1.2
49
+ 2.1.4
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Snabberb
4
- VERSION = '0.4.2'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -3,13 +3,7 @@
3
3
  require 'native'
4
4
 
5
5
  require 'vendor/snabbdom'
6
- require 'vendor/snabbdom-attributes'
7
- require 'vendor/snabbdom-class'
8
- require 'vendor/snabbdom-eventlisteners'
9
- require 'vendor/snabbdom-props'
10
- require 'vendor/snabbdom-style'
11
6
  require 'vendor/snabbdom-to-html'
12
- require 'vendor/tovnode'
13
7
 
14
8
  require 'snabberb/component'
15
9
 
@@ -96,11 +96,11 @@ module Snabberb
96
96
  return unless request_ids.empty?
97
97
 
98
98
  @@patcher ||= %x{snabbdom.init([
99
- snabbdom_attributes.default,
100
- snabbdom_class.default,
101
- snabbdom_eventlisteners.default,
102
- snabbdom_props.default,
103
- snabbdom_style.default,
99
+ snabbdom.attributesModule,
100
+ snabbdom.classModule,
101
+ snabbdom.eventListenersModule,
102
+ snabbdom.propsModule,
103
+ snabbdom.styleModule,
104
104
  ])}
105
105
  node = @root.render
106
106
  @@patcher.call(@root.node, node)
@@ -1,506 +1,1020 @@
1
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
2
  "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- var vnode_1 = require("./vnode");
5
- var is = require("./is");
3
+
4
+ var _init = require("./node_modules/snabbdom/build/package/init");
5
+
6
+ var _h = require("./node_modules/snabbdom/build/package/h");
7
+
8
+ var _tovnode = require("./node_modules/snabbdom/build/package/tovnode");
9
+
10
+ var _attributes = require("./node_modules/snabbdom/build/package/modules/attributes");
11
+
12
+ var _class = require("./node_modules/snabbdom/build/package/modules/class");
13
+
14
+ var _eventlisteners = require("./node_modules/snabbdom/build/package/modules/eventlisteners");
15
+
16
+ var _props = require("./node_modules/snabbdom/build/package/modules/props");
17
+
18
+ var _style = require("./node_modules/snabbdom/build/package/modules/style");
19
+
20
+ module.exports.init = _init.init;
21
+ module.exports.h = _h.h;
22
+ module.exports.toVNode = _tovnode.toVNode;
23
+ module.exports.attributesModule = _attributes.attributesModule;
24
+ module.exports.classModule = _class.classModule;
25
+ module.exports.eventListenersModule = _eventlisteners.eventListenersModule;
26
+ module.exports.propsModule = _props.propsModule;
27
+ module.exports.styleModule = _style.styleModule;
28
+
29
+ },{"./node_modules/snabbdom/build/package/h":2,"./node_modules/snabbdom/build/package/init":4,"./node_modules/snabbdom/build/package/modules/attributes":6,"./node_modules/snabbdom/build/package/modules/class":7,"./node_modules/snabbdom/build/package/modules/eventlisteners":8,"./node_modules/snabbdom/build/package/modules/props":9,"./node_modules/snabbdom/build/package/modules/style":10,"./node_modules/snabbdom/build/package/tovnode":11}],2:[function(require,module,exports){
30
+ "use strict";
31
+
32
+ Object.defineProperty(exports, "__esModule", {
33
+ value: true
34
+ });
35
+ exports.h = h;
36
+
37
+ var _vnode = require("./vnode.js");
38
+
39
+ var is = _interopRequireWildcard(require("./is.js"));
40
+
41
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
42
+
43
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
44
+
6
45
  function addNS(data, children, sel) {
7
- data.ns = 'http://www.w3.org/2000/svg';
8
- if (sel !== 'foreignObject' && children !== undefined) {
9
- for (var i = 0; i < children.length; ++i) {
10
- var childData = children[i].data;
11
- if (childData !== undefined) {
12
- addNS(childData, children[i].children, children[i].sel);
13
- }
14
- }
46
+ data.ns = 'http://www.w3.org/2000/svg';
47
+
48
+ if (sel !== 'foreignObject' && children !== undefined) {
49
+ for (let i = 0; i < children.length; ++i) {
50
+ const childData = children[i].data;
51
+
52
+ if (childData !== undefined) {
53
+ addNS(childData, children[i].children, children[i].sel);
54
+ }
15
55
  }
56
+ }
16
57
  }
58
+
17
59
  function h(sel, b, c) {
18
- var data = {}, children, text, i;
19
- if (c !== undefined) {
20
- data = b;
21
- if (is.array(c)) {
22
- children = c;
23
- }
24
- else if (is.primitive(c)) {
25
- text = c;
26
- }
27
- else if (c && c.sel) {
28
- children = [c];
29
- }
60
+ var data = {};
61
+ var children;
62
+ var text;
63
+ var i;
64
+
65
+ if (c !== undefined) {
66
+ if (b !== null) {
67
+ data = b;
30
68
  }
31
- else if (b !== undefined) {
32
- if (is.array(b)) {
33
- children = b;
34
- }
35
- else if (is.primitive(b)) {
36
- text = b;
37
- }
38
- else if (b && b.sel) {
39
- children = [b];
40
- }
41
- else {
42
- data = b;
43
- }
69
+
70
+ if (is.array(c)) {
71
+ children = c;
72
+ } else if (is.primitive(c)) {
73
+ text = c;
74
+ } else if (c && c.sel) {
75
+ children = [c];
44
76
  }
45
- if (is.array(children)) {
46
- for (i = 0; i < children.length; ++i) {
47
- if (is.primitive(children[i]))
48
- children[i] = vnode_1.vnode(undefined, undefined, undefined, children[i]);
49
- }
77
+ } else if (b !== undefined && b !== null) {
78
+ if (is.array(b)) {
79
+ children = b;
80
+ } else if (is.primitive(b)) {
81
+ text = b;
82
+ } else if (b && b.sel) {
83
+ children = [b];
84
+ } else {
85
+ data = b;
50
86
  }
51
- if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&
52
- (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
53
- addNS(data, children, sel);
87
+ }
88
+
89
+ if (children !== undefined) {
90
+ for (i = 0; i < children.length; ++i) {
91
+ if (is.primitive(children[i])) children[i] = (0, _vnode.vnode)(undefined, undefined, undefined, children[i], undefined);
54
92
  }
55
- return vnode_1.vnode(sel, data, children, text, undefined);
93
+ }
94
+
95
+ if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' && (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {
96
+ addNS(data, children, sel);
97
+ }
98
+
99
+ return (0, _vnode.vnode)(sel, data, children, text, undefined);
56
100
  }
57
- exports.h = h;
101
+
58
102
  ;
59
- exports.default = h;
60
103
 
61
- },{"./is":3,"./vnode":6}],2:[function(require,module,exports){
104
+ },{"./is.js":5,"./vnode.js":12}],3:[function(require,module,exports){
62
105
  "use strict";
63
- Object.defineProperty(exports, "__esModule", { value: true });
106
+
107
+ Object.defineProperty(exports, "__esModule", {
108
+ value: true
109
+ });
110
+ exports.htmlDomApi = void 0;
111
+
64
112
  function createElement(tagName) {
65
- return document.createElement(tagName);
113
+ return document.createElement(tagName);
66
114
  }
115
+
67
116
  function createElementNS(namespaceURI, qualifiedName) {
68
- return document.createElementNS(namespaceURI, qualifiedName);
117
+ return document.createElementNS(namespaceURI, qualifiedName);
69
118
  }
119
+
70
120
  function createTextNode(text) {
71
- return document.createTextNode(text);
121
+ return document.createTextNode(text);
72
122
  }
123
+
73
124
  function createComment(text) {
74
- return document.createComment(text);
125
+ return document.createComment(text);
75
126
  }
127
+
76
128
  function insertBefore(parentNode, newNode, referenceNode) {
77
- parentNode.insertBefore(newNode, referenceNode);
129
+ parentNode.insertBefore(newNode, referenceNode);
78
130
  }
131
+
79
132
  function removeChild(node, child) {
80
- node.removeChild(child);
133
+ node.removeChild(child);
81
134
  }
135
+
82
136
  function appendChild(node, child) {
83
- node.appendChild(child);
137
+ node.appendChild(child);
84
138
  }
139
+
85
140
  function parentNode(node) {
86
- return node.parentNode;
141
+ return node.parentNode;
87
142
  }
143
+
88
144
  function nextSibling(node) {
89
- return node.nextSibling;
145
+ return node.nextSibling;
90
146
  }
147
+
91
148
  function tagName(elm) {
92
- return elm.tagName;
149
+ return elm.tagName;
93
150
  }
151
+
94
152
  function setTextContent(node, text) {
95
- node.textContent = text;
153
+ node.textContent = text;
96
154
  }
155
+
97
156
  function getTextContent(node) {
98
- return node.textContent;
157
+ return node.textContent;
99
158
  }
159
+
100
160
  function isElement(node) {
101
- return node.nodeType === 1;
161
+ return node.nodeType === 1;
102
162
  }
163
+
103
164
  function isText(node) {
104
- return node.nodeType === 3;
165
+ return node.nodeType === 3;
105
166
  }
167
+
106
168
  function isComment(node) {
107
- return node.nodeType === 8;
108
- }
109
- exports.htmlDomApi = {
110
- createElement: createElement,
111
- createElementNS: createElementNS,
112
- createTextNode: createTextNode,
113
- createComment: createComment,
114
- insertBefore: insertBefore,
115
- removeChild: removeChild,
116
- appendChild: appendChild,
117
- parentNode: parentNode,
118
- nextSibling: nextSibling,
119
- tagName: tagName,
120
- setTextContent: setTextContent,
121
- getTextContent: getTextContent,
122
- isElement: isElement,
123
- isText: isText,
124
- isComment: isComment,
169
+ return node.nodeType === 8;
170
+ }
171
+
172
+ const htmlDomApi = {
173
+ createElement,
174
+ createElementNS,
175
+ createTextNode,
176
+ createComment,
177
+ insertBefore,
178
+ removeChild,
179
+ appendChild,
180
+ parentNode,
181
+ nextSibling,
182
+ tagName,
183
+ setTextContent,
184
+ getTextContent,
185
+ isElement,
186
+ isText,
187
+ isComment
125
188
  };
126
- exports.default = exports.htmlDomApi;
189
+ exports.htmlDomApi = htmlDomApi;
127
190
 
128
- },{}],3:[function(require,module,exports){
191
+ },{}],4:[function(require,module,exports){
129
192
  "use strict";
130
- Object.defineProperty(exports, "__esModule", { value: true });
131
- exports.array = Array.isArray;
132
- function primitive(s) {
133
- return typeof s === 'string' || typeof s === 'number';
193
+
194
+ Object.defineProperty(exports, "__esModule", {
195
+ value: true
196
+ });
197
+ exports.init = init;
198
+
199
+ var _vnode = require("./vnode.js");
200
+
201
+ var is = _interopRequireWildcard(require("./is.js"));
202
+
203
+ var _htmldomapi = require("./htmldomapi.js");
204
+
205
+ function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
206
+
207
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
208
+
209
+ function isUndef(s) {
210
+ return s === undefined;
134
211
  }
135
- exports.primitive = primitive;
136
212
 
137
- },{}],4:[function(require,module,exports){
138
- "use strict";
139
- Object.defineProperty(exports, "__esModule", { value: true });
140
- var vnode_1 = require("./vnode");
141
- var is = require("./is");
142
- var htmldomapi_1 = require("./htmldomapi");
143
- function isUndef(s) { return s === undefined; }
144
- function isDef(s) { return s !== undefined; }
145
- var emptyNode = vnode_1.default('', {}, [], undefined, undefined);
213
+ function isDef(s) {
214
+ return s !== undefined;
215
+ }
216
+
217
+ const emptyNode = (0, _vnode.vnode)('', {}, [], undefined, undefined);
218
+
146
219
  function sameVnode(vnode1, vnode2) {
147
- return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
220
+ return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;
148
221
  }
222
+
149
223
  function isVnode(vnode) {
150
- return vnode.sel !== undefined;
224
+ return vnode.sel !== undefined;
151
225
  }
226
+
152
227
  function createKeyToOldIdx(children, beginIdx, endIdx) {
153
- var i, map = {}, key, ch;
154
- for (i = beginIdx; i <= endIdx; ++i) {
155
- ch = children[i];
156
- if (ch != null) {
157
- key = ch.key;
158
- if (key !== undefined)
159
- map[key] = i;
160
- }
228
+ var _a;
229
+
230
+ const map = {};
231
+
232
+ for (let i = beginIdx; i <= endIdx; ++i) {
233
+ const key = (_a = children[i]) === null || _a === void 0 ? void 0 : _a.key;
234
+
235
+ if (key !== undefined) {
236
+ map[key] = i;
161
237
  }
162
- return map;
238
+ }
239
+
240
+ return map;
163
241
  }
164
- var hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
165
- var h_1 = require("./h");
166
- exports.h = h_1.h;
167
- var thunk_1 = require("./thunk");
168
- exports.thunk = thunk_1.thunk;
242
+
243
+ const hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];
244
+
169
245
  function init(modules, domApi) {
170
- var i, j, cbs = {};
171
- var api = domApi !== undefined ? domApi : htmldomapi_1.default;
172
- for (i = 0; i < hooks.length; ++i) {
173
- cbs[hooks[i]] = [];
174
- for (j = 0; j < modules.length; ++j) {
175
- var hook = modules[j][hooks[i]];
176
- if (hook !== undefined) {
177
- cbs[hooks[i]].push(hook);
178
- }
179
- }
180
- }
181
- function emptyNodeAt(elm) {
182
- var id = elm.id ? '#' + elm.id : '';
183
- var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
184
- return vnode_1.default(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
246
+ let i;
247
+ let j;
248
+ const cbs = {
249
+ create: [],
250
+ update: [],
251
+ remove: [],
252
+ destroy: [],
253
+ pre: [],
254
+ post: []
255
+ };
256
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
257
+
258
+ for (i = 0; i < hooks.length; ++i) {
259
+ cbs[hooks[i]] = [];
260
+
261
+ for (j = 0; j < modules.length; ++j) {
262
+ const hook = modules[j][hooks[i]];
263
+
264
+ if (hook !== undefined) {
265
+ cbs[hooks[i]].push(hook);
266
+ }
185
267
  }
186
- function createRmCb(childElm, listeners) {
187
- return function rmCb() {
188
- if (--listeners === 0) {
189
- var parent_1 = api.parentNode(childElm);
190
- api.removeChild(parent_1, childElm);
191
- }
192
- };
268
+ }
269
+
270
+ function emptyNodeAt(elm) {
271
+ const id = elm.id ? '#' + elm.id : '';
272
+ const c = elm.className ? '.' + elm.className.split(' ').join('.') : '';
273
+ return (0, _vnode.vnode)(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);
274
+ }
275
+
276
+ function createRmCb(childElm, listeners) {
277
+ return function rmCb() {
278
+ if (--listeners === 0) {
279
+ const parent = api.parentNode(childElm);
280
+ api.removeChild(parent, childElm);
281
+ }
282
+ };
283
+ }
284
+
285
+ function createElm(vnode, insertedVnodeQueue) {
286
+ var _a, _b;
287
+
288
+ let i;
289
+ let data = vnode.data;
290
+
291
+ if (data !== undefined) {
292
+ const init = (_a = data.hook) === null || _a === void 0 ? void 0 : _a.init;
293
+
294
+ if (isDef(init)) {
295
+ init(vnode);
296
+ data = vnode.data;
297
+ }
193
298
  }
194
- function createElm(vnode, insertedVnodeQueue) {
195
- var i, data = vnode.data;
196
- if (data !== undefined) {
197
- if (isDef(i = data.hook) && isDef(i = i.init)) {
198
- i(vnode);
199
- data = vnode.data;
200
- }
201
- }
202
- var children = vnode.children, sel = vnode.sel;
203
- if (sel === '!') {
204
- if (isUndef(vnode.text)) {
205
- vnode.text = '';
206
- }
207
- vnode.elm = api.createComment(vnode.text);
208
- }
209
- else if (sel !== undefined) {
210
- // Parse selector
211
- var hashIdx = sel.indexOf('#');
212
- var dotIdx = sel.indexOf('.', hashIdx);
213
- var hash = hashIdx > 0 ? hashIdx : sel.length;
214
- var dot = dotIdx > 0 ? dotIdx : sel.length;
215
- var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
216
- var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)
217
- : api.createElement(tag);
218
- if (hash < dot)
219
- elm.setAttribute('id', sel.slice(hash + 1, dot));
220
- if (dotIdx > 0)
221
- elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
222
- for (i = 0; i < cbs.create.length; ++i)
223
- cbs.create[i](emptyNode, vnode);
224
- if (is.array(children)) {
225
- for (i = 0; i < children.length; ++i) {
226
- var ch = children[i];
227
- if (ch != null) {
228
- api.appendChild(elm, createElm(ch, insertedVnodeQueue));
229
- }
230
- }
231
- }
232
- else if (is.primitive(vnode.text)) {
233
- api.appendChild(elm, api.createTextNode(vnode.text));
234
- }
235
- i = vnode.data.hook; // Reuse variable
236
- if (isDef(i)) {
237
- if (i.create)
238
- i.create(emptyNode, vnode);
239
- if (i.insert)
240
- insertedVnodeQueue.push(vnode);
241
- }
299
+
300
+ const children = vnode.children;
301
+ const sel = vnode.sel;
302
+
303
+ if (sel === '!') {
304
+ if (isUndef(vnode.text)) {
305
+ vnode.text = '';
306
+ }
307
+
308
+ vnode.elm = api.createComment(vnode.text);
309
+ } else if (sel !== undefined) {
310
+ // Parse selector
311
+ const hashIdx = sel.indexOf('#');
312
+ const dotIdx = sel.indexOf('.', hashIdx);
313
+ const hash = hashIdx > 0 ? hashIdx : sel.length;
314
+ const dot = dotIdx > 0 ? dotIdx : sel.length;
315
+ const tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;
316
+ const elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag) : api.createElement(tag);
317
+ if (hash < dot) elm.setAttribute('id', sel.slice(hash + 1, dot));
318
+ if (dotIdx > 0) elm.setAttribute('class', sel.slice(dot + 1).replace(/\./g, ' '));
319
+
320
+ for (i = 0; i < cbs.create.length; ++i) cbs.create[i](emptyNode, vnode);
321
+
322
+ if (is.array(children)) {
323
+ for (i = 0; i < children.length; ++i) {
324
+ const ch = children[i];
325
+
326
+ if (ch != null) {
327
+ api.appendChild(elm, createElm(ch, insertedVnodeQueue));
328
+ }
242
329
  }
243
- else {
244
- vnode.elm = api.createTextNode(vnode.text);
330
+ } else if (is.primitive(vnode.text)) {
331
+ api.appendChild(elm, api.createTextNode(vnode.text));
332
+ }
333
+
334
+ const hook = vnode.data.hook;
335
+
336
+ if (isDef(hook)) {
337
+ (_b = hook.create) === null || _b === void 0 ? void 0 : _b.call(hook, emptyNode, vnode);
338
+
339
+ if (hook.insert) {
340
+ insertedVnodeQueue.push(vnode);
245
341
  }
246
- return vnode.elm;
342
+ }
343
+ } else {
344
+ vnode.elm = api.createTextNode(vnode.text);
247
345
  }
248
- function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
249
- for (; startIdx <= endIdx; ++startIdx) {
250
- var ch = vnodes[startIdx];
251
- if (ch != null) {
252
- api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
253
- }
254
- }
346
+
347
+ return vnode.elm;
348
+ }
349
+
350
+ function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {
351
+ for (; startIdx <= endIdx; ++startIdx) {
352
+ const ch = vnodes[startIdx];
353
+
354
+ if (ch != null) {
355
+ api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);
356
+ }
255
357
  }
256
- function invokeDestroyHook(vnode) {
257
- var i, j, data = vnode.data;
258
- if (data !== undefined) {
259
- if (isDef(i = data.hook) && isDef(i = i.destroy))
260
- i(vnode);
261
- for (i = 0; i < cbs.destroy.length; ++i)
262
- cbs.destroy[i](vnode);
263
- if (vnode.children !== undefined) {
264
- for (j = 0; j < vnode.children.length; ++j) {
265
- i = vnode.children[j];
266
- if (i != null && typeof i !== "string") {
267
- invokeDestroyHook(i);
268
- }
269
- }
270
- }
358
+ }
359
+
360
+ function invokeDestroyHook(vnode) {
361
+ var _a, _b;
362
+
363
+ const data = vnode.data;
364
+
365
+ if (data !== undefined) {
366
+ (_b = (_a = data === null || data === void 0 ? void 0 : data.hook) === null || _a === void 0 ? void 0 : _a.destroy) === null || _b === void 0 ? void 0 : _b.call(_a, vnode);
367
+
368
+ for (let i = 0; i < cbs.destroy.length; ++i) cbs.destroy[i](vnode);
369
+
370
+ if (vnode.children !== undefined) {
371
+ for (let j = 0; j < vnode.children.length; ++j) {
372
+ const child = vnode.children[j];
373
+
374
+ if (child != null && typeof child !== 'string') {
375
+ invokeDestroyHook(child);
376
+ }
271
377
  }
378
+ }
272
379
  }
273
- function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
274
- for (; startIdx <= endIdx; ++startIdx) {
275
- var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];
276
- if (ch != null) {
277
- if (isDef(ch.sel)) {
278
- invokeDestroyHook(ch);
279
- listeners = cbs.remove.length + 1;
280
- rm = createRmCb(ch.elm, listeners);
281
- for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)
282
- cbs.remove[i_1](ch, rm);
283
- if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {
284
- i_1(ch, rm);
285
- }
286
- else {
287
- rm();
288
- }
289
- }
290
- else {
291
- api.removeChild(parentElm, ch.elm);
292
- }
293
- }
380
+ }
381
+
382
+ function removeVnodes(parentElm, vnodes, startIdx, endIdx) {
383
+ var _a, _b;
384
+
385
+ for (; startIdx <= endIdx; ++startIdx) {
386
+ let listeners;
387
+ let rm;
388
+ const ch = vnodes[startIdx];
389
+
390
+ if (ch != null) {
391
+ if (isDef(ch.sel)) {
392
+ invokeDestroyHook(ch);
393
+ listeners = cbs.remove.length + 1;
394
+ rm = createRmCb(ch.elm, listeners);
395
+
396
+ for (let i = 0; i < cbs.remove.length; ++i) cbs.remove[i](ch, rm);
397
+
398
+ const removeHook = (_b = (_a = ch === null || ch === void 0 ? void 0 : ch.data) === null || _a === void 0 ? void 0 : _a.hook) === null || _b === void 0 ? void 0 : _b.remove;
399
+
400
+ if (isDef(removeHook)) {
401
+ removeHook(ch, rm);
402
+ } else {
403
+ rm();
404
+ }
405
+ } else {
406
+ // Text node
407
+ api.removeChild(parentElm, ch.elm);
294
408
  }
409
+ }
295
410
  }
296
- function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
297
- var oldStartIdx = 0, newStartIdx = 0;
298
- var oldEndIdx = oldCh.length - 1;
299
- var oldStartVnode = oldCh[0];
300
- var oldEndVnode = oldCh[oldEndIdx];
301
- var newEndIdx = newCh.length - 1;
302
- var newStartVnode = newCh[0];
303
- var newEndVnode = newCh[newEndIdx];
304
- var oldKeyToIdx;
305
- var idxInOld;
306
- var elmToMove;
307
- var before;
308
- while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
309
- if (oldStartVnode == null) {
310
- oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
311
- }
312
- else if (oldEndVnode == null) {
313
- oldEndVnode = oldCh[--oldEndIdx];
314
- }
315
- else if (newStartVnode == null) {
316
- newStartVnode = newCh[++newStartIdx];
317
- }
318
- else if (newEndVnode == null) {
319
- newEndVnode = newCh[--newEndIdx];
320
- }
321
- else if (sameVnode(oldStartVnode, newStartVnode)) {
322
- patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
323
- oldStartVnode = oldCh[++oldStartIdx];
324
- newStartVnode = newCh[++newStartIdx];
325
- }
326
- else if (sameVnode(oldEndVnode, newEndVnode)) {
327
- patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
328
- oldEndVnode = oldCh[--oldEndIdx];
329
- newEndVnode = newCh[--newEndIdx];
330
- }
331
- else if (sameVnode(oldStartVnode, newEndVnode)) {
332
- patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
333
- api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
334
- oldStartVnode = oldCh[++oldStartIdx];
335
- newEndVnode = newCh[--newEndIdx];
336
- }
337
- else if (sameVnode(oldEndVnode, newStartVnode)) {
338
- patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
339
- api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
340
- oldEndVnode = oldCh[--oldEndIdx];
341
- newStartVnode = newCh[++newStartIdx];
342
- }
343
- else {
344
- if (oldKeyToIdx === undefined) {
345
- oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
346
- }
347
- idxInOld = oldKeyToIdx[newStartVnode.key];
348
- if (isUndef(idxInOld)) {
349
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
350
- newStartVnode = newCh[++newStartIdx];
351
- }
352
- else {
353
- elmToMove = oldCh[idxInOld];
354
- if (elmToMove.sel !== newStartVnode.sel) {
355
- api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
356
- }
357
- else {
358
- patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
359
- oldCh[idxInOld] = undefined;
360
- api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
361
- }
362
- newStartVnode = newCh[++newStartIdx];
363
- }
364
- }
365
- }
366
- if (oldStartIdx > oldEndIdx) {
367
- before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
368
- addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
411
+ }
412
+
413
+ function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {
414
+ let oldStartIdx = 0;
415
+ let newStartIdx = 0;
416
+ let oldEndIdx = oldCh.length - 1;
417
+ let oldStartVnode = oldCh[0];
418
+ let oldEndVnode = oldCh[oldEndIdx];
419
+ let newEndIdx = newCh.length - 1;
420
+ let newStartVnode = newCh[0];
421
+ let newEndVnode = newCh[newEndIdx];
422
+ let oldKeyToIdx;
423
+ let idxInOld;
424
+ let elmToMove;
425
+ let before;
426
+
427
+ while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
428
+ if (oldStartVnode == null) {
429
+ oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left
430
+ } else if (oldEndVnode == null) {
431
+ oldEndVnode = oldCh[--oldEndIdx];
432
+ } else if (newStartVnode == null) {
433
+ newStartVnode = newCh[++newStartIdx];
434
+ } else if (newEndVnode == null) {
435
+ newEndVnode = newCh[--newEndIdx];
436
+ } else if (sameVnode(oldStartVnode, newStartVnode)) {
437
+ patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
438
+ oldStartVnode = oldCh[++oldStartIdx];
439
+ newStartVnode = newCh[++newStartIdx];
440
+ } else if (sameVnode(oldEndVnode, newEndVnode)) {
441
+ patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
442
+ oldEndVnode = oldCh[--oldEndIdx];
443
+ newEndVnode = newCh[--newEndIdx];
444
+ } else if (sameVnode(oldStartVnode, newEndVnode)) {
445
+ // Vnode moved right
446
+ patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
447
+ api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));
448
+ oldStartVnode = oldCh[++oldStartIdx];
449
+ newEndVnode = newCh[--newEndIdx];
450
+ } else if (sameVnode(oldEndVnode, newStartVnode)) {
451
+ // Vnode moved left
452
+ patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
453
+ api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
454
+ oldEndVnode = oldCh[--oldEndIdx];
455
+ newStartVnode = newCh[++newStartIdx];
456
+ } else {
457
+ if (oldKeyToIdx === undefined) {
458
+ oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);
369
459
  }
370
- else if (newStartIdx > newEndIdx) {
371
- removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
460
+
461
+ idxInOld = oldKeyToIdx[newStartVnode.key];
462
+
463
+ if (isUndef(idxInOld)) {
464
+ // New element
465
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
466
+ } else {
467
+ elmToMove = oldCh[idxInOld];
468
+
469
+ if (elmToMove.sel !== newStartVnode.sel) {
470
+ api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);
471
+ } else {
472
+ patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
473
+ oldCh[idxInOld] = undefined;
474
+ api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
475
+ }
372
476
  }
477
+
478
+ newStartVnode = newCh[++newStartIdx];
479
+ }
373
480
  }
374
- function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
375
- var i, hook;
376
- if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {
377
- i(oldVnode, vnode);
378
- }
379
- var elm = vnode.elm = oldVnode.elm;
380
- var oldCh = oldVnode.children;
381
- var ch = vnode.children;
382
- if (oldVnode === vnode)
383
- return;
384
- if (vnode.data !== undefined) {
385
- for (i = 0; i < cbs.update.length; ++i)
386
- cbs.update[i](oldVnode, vnode);
387
- i = vnode.data.hook;
388
- if (isDef(i) && isDef(i = i.update))
389
- i(oldVnode, vnode);
390
- }
391
- if (isUndef(vnode.text)) {
392
- if (isDef(oldCh) && isDef(ch)) {
393
- if (oldCh !== ch)
394
- updateChildren(elm, oldCh, ch, insertedVnodeQueue);
395
- }
396
- else if (isDef(ch)) {
397
- if (isDef(oldVnode.text))
398
- api.setTextContent(elm, '');
399
- addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
400
- }
401
- else if (isDef(oldCh)) {
402
- removeVnodes(elm, oldCh, 0, oldCh.length - 1);
403
- }
404
- else if (isDef(oldVnode.text)) {
405
- api.setTextContent(elm, '');
406
- }
407
- }
408
- else if (oldVnode.text !== vnode.text) {
409
- api.setTextContent(elm, vnode.text);
410
- }
411
- if (isDef(hook) && isDef(i = hook.postpatch)) {
412
- i(oldVnode, vnode);
413
- }
481
+
482
+ if (oldStartIdx <= oldEndIdx || newStartIdx <= newEndIdx) {
483
+ if (oldStartIdx > oldEndIdx) {
484
+ before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;
485
+ addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
486
+ } else {
487
+ removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
488
+ }
414
489
  }
415
- return function patch(oldVnode, vnode) {
416
- var i, elm, parent;
417
- var insertedVnodeQueue = [];
418
- for (i = 0; i < cbs.pre.length; ++i)
419
- cbs.pre[i]();
420
- if (!isVnode(oldVnode)) {
421
- oldVnode = emptyNodeAt(oldVnode);
422
- }
423
- if (sameVnode(oldVnode, vnode)) {
424
- patchVnode(oldVnode, vnode, insertedVnodeQueue);
490
+ }
491
+
492
+ function patchVnode(oldVnode, vnode, insertedVnodeQueue) {
493
+ var _a, _b, _c, _d, _e;
494
+
495
+ const hook = (_a = vnode.data) === null || _a === void 0 ? void 0 : _a.hook;
496
+ (_b = hook === null || hook === void 0 ? void 0 : hook.prepatch) === null || _b === void 0 ? void 0 : _b.call(hook, oldVnode, vnode);
497
+ const elm = vnode.elm = oldVnode.elm;
498
+ const oldCh = oldVnode.children;
499
+ const ch = vnode.children;
500
+ if (oldVnode === vnode) return;
501
+
502
+ if (vnode.data !== undefined) {
503
+ for (let i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode);
504
+
505
+ (_d = (_c = vnode.data.hook) === null || _c === void 0 ? void 0 : _c.update) === null || _d === void 0 ? void 0 : _d.call(_c, oldVnode, vnode);
506
+ }
507
+
508
+ if (isUndef(vnode.text)) {
509
+ if (isDef(oldCh) && isDef(ch)) {
510
+ if (oldCh !== ch) updateChildren(elm, oldCh, ch, insertedVnodeQueue);
511
+ } else if (isDef(ch)) {
512
+ if (isDef(oldVnode.text)) api.setTextContent(elm, '');
513
+ addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
514
+ } else if (isDef(oldCh)) {
515
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
516
+ } else if (isDef(oldVnode.text)) {
517
+ api.setTextContent(elm, '');
518
+ }
519
+ } else if (oldVnode.text !== vnode.text) {
520
+ if (isDef(oldCh)) {
521
+ removeVnodes(elm, oldCh, 0, oldCh.length - 1);
522
+ }
523
+
524
+ api.setTextContent(elm, vnode.text);
525
+ }
526
+
527
+ (_e = hook === null || hook === void 0 ? void 0 : hook.postpatch) === null || _e === void 0 ? void 0 : _e.call(hook, oldVnode, vnode);
528
+ }
529
+
530
+ return function patch(oldVnode, vnode) {
531
+ let i, elm, parent;
532
+ const insertedVnodeQueue = [];
533
+
534
+ for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();
535
+
536
+ if (!isVnode(oldVnode)) {
537
+ oldVnode = emptyNodeAt(oldVnode);
538
+ }
539
+
540
+ if (sameVnode(oldVnode, vnode)) {
541
+ patchVnode(oldVnode, vnode, insertedVnodeQueue);
542
+ } else {
543
+ elm = oldVnode.elm;
544
+ parent = api.parentNode(elm);
545
+ createElm(vnode, insertedVnodeQueue);
546
+
547
+ if (parent !== null) {
548
+ api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
549
+ removeVnodes(parent, [oldVnode], 0, 0);
550
+ }
551
+ }
552
+
553
+ for (i = 0; i < insertedVnodeQueue.length; ++i) {
554
+ insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
555
+ }
556
+
557
+ for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
558
+
559
+ return vnode;
560
+ };
561
+ }
562
+
563
+ },{"./htmldomapi.js":3,"./is.js":5,"./vnode.js":12}],5:[function(require,module,exports){
564
+ "use strict";
565
+
566
+ Object.defineProperty(exports, "__esModule", {
567
+ value: true
568
+ });
569
+ exports.primitive = primitive;
570
+ exports.array = void 0;
571
+ const array = Array.isArray;
572
+ exports.array = array;
573
+
574
+ function primitive(s) {
575
+ return typeof s === 'string' || typeof s === 'number';
576
+ }
577
+
578
+ },{}],6:[function(require,module,exports){
579
+ "use strict";
580
+
581
+ Object.defineProperty(exports, "__esModule", {
582
+ value: true
583
+ });
584
+ exports.attributesModule = void 0;
585
+ const xlinkNS = 'http://www.w3.org/1999/xlink';
586
+ const xmlNS = 'http://www.w3.org/XML/1998/namespace';
587
+ const colonChar = 58;
588
+ const xChar = 120;
589
+
590
+ function updateAttrs(oldVnode, vnode) {
591
+ var key;
592
+ var elm = vnode.elm;
593
+ var oldAttrs = oldVnode.data.attrs;
594
+ var attrs = vnode.data.attrs;
595
+ if (!oldAttrs && !attrs) return;
596
+ if (oldAttrs === attrs) return;
597
+ oldAttrs = oldAttrs || {};
598
+ attrs = attrs || {}; // update modified attributes, add new attributes
599
+
600
+ for (key in attrs) {
601
+ const cur = attrs[key];
602
+ const old = oldAttrs[key];
603
+
604
+ if (old !== cur) {
605
+ if (cur === true) {
606
+ elm.setAttribute(key, '');
607
+ } else if (cur === false) {
608
+ elm.removeAttribute(key);
609
+ } else {
610
+ if (key.charCodeAt(0) !== xChar) {
611
+ elm.setAttribute(key, cur);
612
+ } else if (key.charCodeAt(3) === colonChar) {
613
+ // Assume xml namespace
614
+ elm.setAttributeNS(xmlNS, key, cur);
615
+ } else if (key.charCodeAt(5) === colonChar) {
616
+ // Assume xlink namespace
617
+ elm.setAttributeNS(xlinkNS, key, cur);
618
+ } else {
619
+ elm.setAttribute(key, cur);
425
620
  }
426
- else {
427
- elm = oldVnode.elm;
428
- parent = api.parentNode(elm);
429
- createElm(vnode, insertedVnodeQueue);
430
- if (parent !== null) {
431
- api.insertBefore(parent, vnode.elm, api.nextSibling(elm));
432
- removeVnodes(parent, [oldVnode], 0, 0);
433
- }
621
+ }
622
+ }
623
+ } // remove removed attributes
624
+ // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)
625
+ // the other option is to remove all attributes with value == undefined
626
+
627
+
628
+ for (key in oldAttrs) {
629
+ if (!(key in attrs)) {
630
+ elm.removeAttribute(key);
631
+ }
632
+ }
633
+ }
634
+
635
+ const attributesModule = {
636
+ create: updateAttrs,
637
+ update: updateAttrs
638
+ };
639
+ exports.attributesModule = attributesModule;
640
+
641
+ },{}],7:[function(require,module,exports){
642
+ "use strict";
643
+
644
+ Object.defineProperty(exports, "__esModule", {
645
+ value: true
646
+ });
647
+ exports.classModule = void 0;
648
+
649
+ function updateClass(oldVnode, vnode) {
650
+ var cur;
651
+ var name;
652
+ var elm = vnode.elm;
653
+ var oldClass = oldVnode.data.class;
654
+ var klass = vnode.data.class;
655
+ if (!oldClass && !klass) return;
656
+ if (oldClass === klass) return;
657
+ oldClass = oldClass || {};
658
+ klass = klass || {};
659
+
660
+ for (name in oldClass) {
661
+ if (oldClass[name] && !Object.prototype.hasOwnProperty.call(klass, name)) {
662
+ // was `true` and now not provided
663
+ elm.classList.remove(name);
664
+ }
665
+ }
666
+
667
+ for (name in klass) {
668
+ cur = klass[name];
669
+
670
+ if (cur !== oldClass[name]) {
671
+ elm.classList[cur ? 'add' : 'remove'](name);
672
+ }
673
+ }
674
+ }
675
+
676
+ const classModule = {
677
+ create: updateClass,
678
+ update: updateClass
679
+ };
680
+ exports.classModule = classModule;
681
+
682
+ },{}],8:[function(require,module,exports){
683
+ "use strict";
684
+
685
+ Object.defineProperty(exports, "__esModule", {
686
+ value: true
687
+ });
688
+ exports.eventListenersModule = void 0;
689
+
690
+ function invokeHandler(handler, vnode, event) {
691
+ if (typeof handler === 'function') {
692
+ // call function handler
693
+ handler.call(vnode, event, vnode);
694
+ } else if (typeof handler === 'object') {
695
+ // call multiple handlers
696
+ for (var i = 0; i < handler.length; i++) {
697
+ invokeHandler(handler[i], vnode, event);
698
+ }
699
+ }
700
+ }
701
+
702
+ function handleEvent(event, vnode) {
703
+ var name = event.type;
704
+ var on = vnode.data.on; // call event handler(s) if exists
705
+
706
+ if (on && on[name]) {
707
+ invokeHandler(on[name], vnode, event);
708
+ }
709
+ }
710
+
711
+ function createListener() {
712
+ return function handler(event) {
713
+ handleEvent(event, handler.vnode);
714
+ };
715
+ }
716
+
717
+ function updateEventListeners(oldVnode, vnode) {
718
+ var oldOn = oldVnode.data.on;
719
+ var oldListener = oldVnode.listener;
720
+ var oldElm = oldVnode.elm;
721
+ var on = vnode && vnode.data.on;
722
+ var elm = vnode && vnode.elm;
723
+ var name; // optimization for reused immutable handlers
724
+
725
+ if (oldOn === on) {
726
+ return;
727
+ } // remove existing listeners which no longer used
728
+
729
+
730
+ if (oldOn && oldListener) {
731
+ // if element changed or deleted we remove all existing listeners unconditionally
732
+ if (!on) {
733
+ for (name in oldOn) {
734
+ // remove listener if element was changed or existing listeners removed
735
+ oldElm.removeEventListener(name, oldListener, false);
736
+ }
737
+ } else {
738
+ for (name in oldOn) {
739
+ // remove listener if existing listener removed
740
+ if (!on[name]) {
741
+ oldElm.removeEventListener(name, oldListener, false);
434
742
  }
435
- for (i = 0; i < insertedVnodeQueue.length; ++i) {
436
- insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);
743
+ }
744
+ }
745
+ } // add new listeners which has not already attached
746
+
747
+
748
+ if (on) {
749
+ // reuse existing listener or create new
750
+ var listener = vnode.listener = oldVnode.listener || createListener(); // update vnode for listener
751
+
752
+ listener.vnode = vnode; // if element changed or added we add all needed listeners unconditionally
753
+
754
+ if (!oldOn) {
755
+ for (name in on) {
756
+ // add listener if element was changed or new listeners added
757
+ elm.addEventListener(name, listener, false);
758
+ }
759
+ } else {
760
+ for (name in on) {
761
+ // add listener if new listener added
762
+ if (!oldOn[name]) {
763
+ elm.addEventListener(name, listener, false);
437
764
  }
438
- for (i = 0; i < cbs.post.length; ++i)
439
- cbs.post[i]();
440
- return vnode;
441
- };
765
+ }
766
+ }
767
+ }
442
768
  }
443
- exports.init = init;
444
769
 
445
- },{"./h":1,"./htmldomapi":2,"./is":3,"./thunk":5,"./vnode":6}],5:[function(require,module,exports){
770
+ const eventListenersModule = {
771
+ create: updateEventListeners,
772
+ update: updateEventListeners,
773
+ destroy: updateEventListeners
774
+ };
775
+ exports.eventListenersModule = eventListenersModule;
776
+
777
+ },{}],9:[function(require,module,exports){
446
778
  "use strict";
447
- Object.defineProperty(exports, "__esModule", { value: true });
448
- var h_1 = require("./h");
449
- function copyToThunk(vnode, thunk) {
450
- thunk.elm = vnode.elm;
451
- vnode.data.fn = thunk.data.fn;
452
- vnode.data.args = thunk.data.args;
453
- thunk.data = vnode.data;
454
- thunk.children = vnode.children;
455
- thunk.text = vnode.text;
456
- thunk.elm = vnode.elm;
457
- }
458
- function init(thunk) {
459
- var cur = thunk.data;
460
- var vnode = cur.fn.apply(undefined, cur.args);
461
- copyToThunk(vnode, thunk);
462
- }
463
- function prepatch(oldVnode, thunk) {
464
- var i, old = oldVnode.data, cur = thunk.data;
465
- var oldArgs = old.args, args = cur.args;
466
- if (old.fn !== cur.fn || oldArgs.length !== args.length) {
467
- copyToThunk(cur.fn.apply(undefined, args), thunk);
468
- return;
779
+
780
+ Object.defineProperty(exports, "__esModule", {
781
+ value: true
782
+ });
783
+ exports.propsModule = void 0;
784
+
785
+ function updateProps(oldVnode, vnode) {
786
+ var key;
787
+ var cur;
788
+ var old;
789
+ var elm = vnode.elm;
790
+ var oldProps = oldVnode.data.props;
791
+ var props = vnode.data.props;
792
+ if (!oldProps && !props) return;
793
+ if (oldProps === props) return;
794
+ oldProps = oldProps || {};
795
+ props = props || {};
796
+
797
+ for (key in props) {
798
+ cur = props[key];
799
+ old = oldProps[key];
800
+
801
+ if (old !== cur && (key !== 'value' || elm[key] !== cur)) {
802
+ elm[key] = cur;
469
803
  }
470
- for (i = 0; i < args.length; ++i) {
471
- if (oldArgs[i] !== args[i]) {
472
- copyToThunk(cur.fn.apply(undefined, args), thunk);
473
- return;
804
+ }
805
+ }
806
+
807
+ const propsModule = {
808
+ create: updateProps,
809
+ update: updateProps
810
+ };
811
+ exports.propsModule = propsModule;
812
+
813
+ },{}],10:[function(require,module,exports){
814
+ "use strict";
815
+
816
+ Object.defineProperty(exports, "__esModule", {
817
+ value: true
818
+ });
819
+ exports.styleModule = void 0;
820
+ // Bindig `requestAnimationFrame` like this fixes a bug in IE/Edge. See #360 and #409.
821
+ var raf = typeof window !== 'undefined' && window.requestAnimationFrame.bind(window) || setTimeout;
822
+
823
+ var nextFrame = function (fn) {
824
+ raf(function () {
825
+ raf(fn);
826
+ });
827
+ };
828
+
829
+ var reflowForced = false;
830
+
831
+ function setNextFrame(obj, prop, val) {
832
+ nextFrame(function () {
833
+ obj[prop] = val;
834
+ });
835
+ }
836
+
837
+ function updateStyle(oldVnode, vnode) {
838
+ var cur;
839
+ var name;
840
+ var elm = vnode.elm;
841
+ var oldStyle = oldVnode.data.style;
842
+ var style = vnode.data.style;
843
+ if (!oldStyle && !style) return;
844
+ if (oldStyle === style) return;
845
+ oldStyle = oldStyle || {};
846
+ style = style || {};
847
+ var oldHasDel = ('delayed' in oldStyle);
848
+
849
+ for (name in oldStyle) {
850
+ if (!style[name]) {
851
+ if (name[0] === '-' && name[1] === '-') {
852
+ elm.style.removeProperty(name);
853
+ } else {
854
+ elm.style[name] = '';
855
+ }
856
+ }
857
+ }
858
+
859
+ for (name in style) {
860
+ cur = style[name];
861
+
862
+ if (name === 'delayed' && style.delayed) {
863
+ for (const name2 in style.delayed) {
864
+ cur = style.delayed[name2];
865
+
866
+ if (!oldHasDel || cur !== oldStyle.delayed[name2]) {
867
+ setNextFrame(elm.style, name2, cur);
474
868
  }
869
+ }
870
+ } else if (name !== 'remove' && cur !== oldStyle[name]) {
871
+ if (name[0] === '-' && name[1] === '-') {
872
+ elm.style.setProperty(name, cur);
873
+ } else {
874
+ elm.style[name] = cur;
875
+ }
475
876
  }
476
- copyToThunk(oldVnode, thunk);
877
+ }
477
878
  }
478
- exports.thunk = function thunk(sel, key, fn, args) {
479
- if (args === undefined) {
480
- args = fn;
481
- fn = key;
482
- key = undefined;
483
- }
484
- return h_1.h(sel, {
485
- key: key,
486
- hook: { init: init, prepatch: prepatch },
487
- fn: fn,
488
- args: args
489
- });
879
+
880
+ function applyDestroyStyle(vnode) {
881
+ var style;
882
+ var name;
883
+ var elm = vnode.elm;
884
+ var s = vnode.data.style;
885
+ if (!s || !(style = s.destroy)) return;
886
+
887
+ for (name in style) {
888
+ elm.style[name] = style[name];
889
+ }
890
+ }
891
+
892
+ function applyRemoveStyle(vnode, rm) {
893
+ var s = vnode.data.style;
894
+
895
+ if (!s || !s.remove) {
896
+ rm();
897
+ return;
898
+ }
899
+
900
+ if (!reflowForced) {
901
+ // eslint-disable-next-line @typescript-eslint/no-unused-expressions
902
+ vnode.elm.offsetLeft;
903
+ reflowForced = true;
904
+ }
905
+
906
+ var name;
907
+ var elm = vnode.elm;
908
+ var i = 0;
909
+ var compStyle;
910
+ var style = s.remove;
911
+ var amount = 0;
912
+ var applied = [];
913
+
914
+ for (name in style) {
915
+ applied.push(name);
916
+ elm.style[name] = style[name];
917
+ }
918
+
919
+ compStyle = getComputedStyle(elm);
920
+ var props = compStyle['transition-property'].split(', ');
921
+
922
+ for (; i < props.length; ++i) {
923
+ if (applied.indexOf(props[i]) !== -1) amount++;
924
+ }
925
+
926
+ elm.addEventListener('transitionend', function (ev) {
927
+ if (ev.target === elm) --amount;
928
+ if (amount === 0) rm();
929
+ });
930
+ }
931
+
932
+ function forceReflow() {
933
+ reflowForced = false;
934
+ }
935
+
936
+ const styleModule = {
937
+ pre: forceReflow,
938
+ create: updateStyle,
939
+ update: updateStyle,
940
+ destroy: applyDestroyStyle,
941
+ remove: applyRemoveStyle
490
942
  };
491
- exports.default = exports.thunk;
943
+ exports.styleModule = styleModule;
492
944
 
493
- },{"./h":1}],6:[function(require,module,exports){
945
+ },{}],11:[function(require,module,exports){
494
946
  "use strict";
495
- Object.defineProperty(exports, "__esModule", { value: true });
496
- function vnode(sel, data, children, text, elm) {
497
- var key = data === undefined ? undefined : data.key;
498
- return { sel: sel, data: data, children: children,
499
- text: text, elm: elm, key: key };
947
+
948
+ Object.defineProperty(exports, "__esModule", {
949
+ value: true
950
+ });
951
+ exports.toVNode = toVNode;
952
+
953
+ var _vnode = require("./vnode.js");
954
+
955
+ var _htmldomapi = require("./htmldomapi.js");
956
+
957
+ function toVNode(node, domApi) {
958
+ const api = domApi !== undefined ? domApi : _htmldomapi.htmlDomApi;
959
+ let text;
960
+
961
+ if (api.isElement(node)) {
962
+ const id = node.id ? '#' + node.id : '';
963
+ const cn = node.getAttribute('class');
964
+ const c = cn ? '.' + cn.split(' ').join('.') : '';
965
+ const sel = api.tagName(node).toLowerCase() + id + c;
966
+ const attrs = {};
967
+ const children = [];
968
+ let name;
969
+ let i, n;
970
+ const elmAttrs = node.attributes;
971
+ const elmChildren = node.childNodes;
972
+
973
+ for (i = 0, n = elmAttrs.length; i < n; i++) {
974
+ name = elmAttrs[i].nodeName;
975
+
976
+ if (name !== 'id' && name !== 'class') {
977
+ attrs[name] = elmAttrs[i].nodeValue;
978
+ }
979
+ }
980
+
981
+ for (i = 0, n = elmChildren.length; i < n; i++) {
982
+ children.push(toVNode(elmChildren[i], domApi));
983
+ }
984
+
985
+ return (0, _vnode.vnode)(sel, {
986
+ attrs
987
+ }, children, undefined, node);
988
+ } else if (api.isText(node)) {
989
+ text = api.getTextContent(node);
990
+ return (0, _vnode.vnode)(undefined, undefined, undefined, text, node);
991
+ } else if (api.isComment(node)) {
992
+ text = api.getTextContent(node);
993
+ return (0, _vnode.vnode)('!', {}, [], text, node);
994
+ } else {
995
+ return (0, _vnode.vnode)('', {}, [], undefined, node);
996
+ }
500
997
  }
998
+
999
+ },{"./htmldomapi.js":3,"./vnode.js":12}],12:[function(require,module,exports){
1000
+ "use strict";
1001
+
1002
+ Object.defineProperty(exports, "__esModule", {
1003
+ value: true
1004
+ });
501
1005
  exports.vnode = vnode;
502
- exports.default = vnode;
503
1006
 
504
- },{}]},{},[4])(4)
1007
+ function vnode(sel, data, children, text, elm) {
1008
+ const key = data === undefined ? undefined : data.key;
1009
+ return {
1010
+ sel,
1011
+ data,
1012
+ children,
1013
+ text,
1014
+ elm,
1015
+ key
1016
+ };
1017
+ }
1018
+
1019
+ },{}]},{},[1])(1)
505
1020
  });
506
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy8ucmVnaXN0cnkubnBtanMub3JnL2Jyb3dzZXItcGFjay82LjAuMi9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiaC5qcyIsImh0bWxkb21hcGkuanMiLCJpcy5qcyIsInNuYWJiZG9tLmpzIiwidGh1bmsuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgdm5vZGVfMSA9IHJlcXVpcmUoXCIuL3Zub2RlXCIpO1xudmFyIGlzID0gcmVxdWlyZShcIi4vaXNcIik7XG5mdW5jdGlvbiBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKSB7XG4gICAgZGF0YS5ucyA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG4gICAgaWYgKHNlbCAhPT0gJ2ZvcmVpZ25PYmplY3QnICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIGNoaWxkRGF0YSA9IGNoaWxkcmVuW2ldLmRhdGE7XG4gICAgICAgICAgICBpZiAoY2hpbGREYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhZGROUyhjaGlsZERhdGEsIGNoaWxkcmVuW2ldLmNoaWxkcmVuLCBjaGlsZHJlbltpXS5zZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gaChzZWwsIGIsIGMpIHtcbiAgICB2YXIgZGF0YSA9IHt9LCBjaGlsZHJlbiwgdGV4dCwgaTtcbiAgICBpZiAoYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGEgPSBiO1xuICAgICAgICBpZiAoaXMuYXJyYXkoYykpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYykpIHtcbiAgICAgICAgICAgIHRleHQgPSBjO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgJiYgYy5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2NdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXMuYXJyYXkoYikpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUoYikpIHtcbiAgICAgICAgICAgIHRleHQgPSBiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGIgJiYgYi5zZWwpIHtcbiAgICAgICAgICAgIGNoaWxkcmVuID0gW2JdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IGI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChpcy5wcmltaXRpdmUoY2hpbGRyZW5baV0pKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuW2ldID0gdm5vZGVfMS52bm9kZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjaGlsZHJlbltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlbFswXSA9PT0gJ3MnICYmIHNlbFsxXSA9PT0gJ3YnICYmIHNlbFsyXSA9PT0gJ2cnICYmXG4gICAgICAgIChzZWwubGVuZ3RoID09PSAzIHx8IHNlbFszXSA9PT0gJy4nIHx8IHNlbFszXSA9PT0gJyMnKSkge1xuICAgICAgICBhZGROUyhkYXRhLCBjaGlsZHJlbiwgc2VsKTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlXzEudm5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaCA9IGg7XG47XG5leHBvcnRzLmRlZmF1bHQgPSBoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTtcbn1cbmZ1bmN0aW9uIGluc2VydEJlZm9yZShwYXJlbnROb2RlLCBuZXdOb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5mdW5jdGlvbiByZW1vdmVDaGlsZChub2RlLCBjaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIHBhcmVudE5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBuZXh0U2libGluZyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG59XG5mdW5jdGlvbiB0YWdOYW1lKGVsbSkge1xuICAgIHJldHVybiBlbG0udGFnTmFtZTtcbn1cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50KG5vZGUsIHRleHQpIHtcbiAgICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50ZXh0Q29udGVudDtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDE7XG59XG5mdW5jdGlvbiBpc1RleHQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAzO1xufVxuZnVuY3Rpb24gaXNDb21tZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gODtcbn1cbmV4cG9ydHMuaHRtbERvbUFwaSA9IHtcbiAgICBjcmVhdGVFbGVtZW50OiBjcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZUVsZW1lbnROUzogY3JlYXRlRWxlbWVudE5TLFxuICAgIGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcbiAgICBjcmVhdGVDb21tZW50OiBjcmVhdGVDb21tZW50LFxuICAgIGluc2VydEJlZm9yZTogaW5zZXJ0QmVmb3JlLFxuICAgIHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcbiAgICBhcHBlbmRDaGlsZDogYXBwZW5kQ2hpbGQsXG4gICAgcGFyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG4gICAgdGFnTmFtZTogdGFnTmFtZSxcbiAgICBzZXRUZXh0Q29udGVudDogc2V0VGV4dENvbnRlbnQsXG4gICAgZ2V0VGV4dENvbnRlbnQ6IGdldFRleHRDb250ZW50LFxuICAgIGlzRWxlbWVudDogaXNFbGVtZW50LFxuICAgIGlzVGV4dDogaXNUZXh0LFxuICAgIGlzQ29tbWVudDogaXNDb21tZW50LFxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuaHRtbERvbUFwaTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0bWxkb21hcGkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmFycmF5ID0gQXJyYXkuaXNBcnJheTtcbmZ1bmN0aW9uIHByaW1pdGl2ZShzKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLnByaW1pdGl2ZSA9IHByaW1pdGl2ZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xudmFyIGh0bWxkb21hcGlfMSA9IHJlcXVpcmUoXCIuL2h0bWxkb21hcGlcIik7XG5mdW5jdGlvbiBpc1VuZGVmKHMpIHsgcmV0dXJuIHMgPT09IHVuZGVmaW5lZDsgfVxuZnVuY3Rpb24gaXNEZWYocykgeyByZXR1cm4gcyAhPT0gdW5kZWZpbmVkOyB9XG52YXIgZW1wdHlOb2RlID0gdm5vZGVfMS5kZWZhdWx0KCcnLCB7fSwgW10sIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbmZ1bmN0aW9uIHNhbWVWbm9kZSh2bm9kZTEsIHZub2RlMikge1xuICAgIHJldHVybiB2bm9kZTEua2V5ID09PSB2bm9kZTIua2V5ICYmIHZub2RlMS5zZWwgPT09IHZub2RlMi5zZWw7XG59XG5mdW5jdGlvbiBpc1Zub2RlKHZub2RlKSB7XG4gICAgcmV0dXJuIHZub2RlLnNlbCAhPT0gdW5kZWZpbmVkO1xufVxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHgoY2hpbGRyZW4sIGJlZ2luSWR4LCBlbmRJZHgpIHtcbiAgICB2YXIgaSwgbWFwID0ge30sIGtleSwgY2g7XG4gICAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICAgICAgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGtleSA9IGNoLmtleTtcbiAgICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBtYXBba2V5XSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbnZhciBob29rcyA9IFsnY3JlYXRlJywgJ3VwZGF0ZScsICdyZW1vdmUnLCAnZGVzdHJveScsICdwcmUnLCAncG9zdCddO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5leHBvcnRzLmggPSBoXzEuaDtcbnZhciB0aHVua18xID0gcmVxdWlyZShcIi4vdGh1bmtcIik7XG5leHBvcnRzLnRodW5rID0gdGh1bmtfMS50aHVuaztcbmZ1bmN0aW9uIGluaXQobW9kdWxlcywgZG9tQXBpKSB7XG4gICAgdmFyIGksIGosIGNicyA9IHt9O1xuICAgIHZhciBhcGkgPSBkb21BcGkgIT09IHVuZGVmaW5lZCA/IGRvbUFwaSA6IGh0bWxkb21hcGlfMS5kZWZhdWx0O1xuICAgIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dID0gW107XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBtb2R1bGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIgaG9vayA9IG1vZHVsZXNbal1baG9va3NbaV1dO1xuICAgICAgICAgICAgaWYgKGhvb2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNic1tob29rc1tpXV0ucHVzaChob29rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBlbXB0eU5vZGVBdChlbG0pIHtcbiAgICAgICAgdmFyIGlkID0gZWxtLmlkID8gJyMnICsgZWxtLmlkIDogJyc7XG4gICAgICAgIHZhciBjID0gZWxtLmNsYXNzTmFtZSA/ICcuJyArIGVsbS5jbGFzc05hbWUuc3BsaXQoJyAnKS5qb2luKCcuJykgOiAnJztcbiAgICAgICAgcmV0dXJuIHZub2RlXzEuZGVmYXVsdChhcGkudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCkgKyBpZCArIGMsIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVSbUNiKGNoaWxkRWxtLCBsaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJtQ2IoKSB7XG4gICAgICAgICAgICBpZiAoLS1saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50XzEgPSBhcGkucGFyZW50Tm9kZShjaGlsZEVsbSk7XG4gICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudF8xLCBjaGlsZEVsbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsbSh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgICAgIHZhciBpLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmluaXQpKSB7XG4gICAgICAgICAgICAgICAgaSh2bm9kZSk7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW4sIHNlbCA9IHZub2RlLnNlbDtcbiAgICAgICAgaWYgKHNlbCA9PT0gJyEnKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZih2bm9kZS50ZXh0KSkge1xuICAgICAgICAgICAgICAgIHZub2RlLnRleHQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZub2RlLmVsbSA9IGFwaS5jcmVhdGVDb21tZW50KHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBQYXJzZSBzZWxlY3RvclxuICAgICAgICAgICAgdmFyIGhhc2hJZHggPSBzZWwuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgdmFyIGRvdElkeCA9IHNlbC5pbmRleE9mKCcuJywgaGFzaElkeCk7XG4gICAgICAgICAgICB2YXIgaGFzaCA9IGhhc2hJZHggPiAwID8gaGFzaElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgZG90ID0gZG90SWR4ID4gMCA/IGRvdElkeCA6IHNlbC5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdGFnID0gaGFzaElkeCAhPT0gLTEgfHwgZG90SWR4ICE9PSAtMSA/IHNlbC5zbGljZSgwLCBNYXRoLm1pbihoYXNoLCBkb3QpKSA6IHNlbDtcbiAgICAgICAgICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBpc0RlZihkYXRhKSAmJiBpc0RlZihpID0gZGF0YS5ucykgPyBhcGkuY3JlYXRlRWxlbWVudE5TKGksIHRhZylcbiAgICAgICAgICAgICAgICA6IGFwaS5jcmVhdGVFbGVtZW50KHRhZyk7XG4gICAgICAgICAgICBpZiAoaGFzaCA8IGRvdClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdpZCcsIHNlbC5zbGljZShoYXNoICsgMSwgZG90KSk7XG4gICAgICAgICAgICBpZiAoZG90SWR4ID4gMClcbiAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlKCdjbGFzcycsIHNlbC5zbGljZShkb3QgKyAxKS5yZXBsYWNlKC9cXC4vZywgJyAnKSk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBhcGkuYXBwZW5kQ2hpbGQoZWxtLCBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkuaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bm9kZS5lbG0gPSBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVm5vZGVzKHBhcmVudEVsbSwgYmVmb3JlLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKGNoLCBpbnNlcnRlZFZub2RlUXVldWUpLCBiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rKHZub2RlKSB7XG4gICAgICAgIHZhciBpLCBqLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKVxuICAgICAgICAgICAgICAgIGkodm5vZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKHZub2RlKTtcbiAgICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB2bm9kZS5jaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiB0eXBlb2YgaSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgICAgICAgIHZhciBpXzEgPSB2b2lkIDAsIGxpc3RlbmVycyA9IHZvaWQgMCwgcm0gPSB2b2lkIDAsIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgICAgICAgIGlmIChjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVmKGNoLnNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHJtID0gY3JlYXRlUm1DYihjaC5lbG0sIGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaV8xID0gMDsgaV8xIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraV8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JzLnJlbW92ZVtpXzFdKGNoLCBybSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZihpXzEgPSBjaC5kYXRhKSAmJiBpc0RlZihpXzEgPSBpXzEuaG9vaykgJiYgaXNEZWYoaV8xID0gaV8xLnJlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlfMShjaCwgcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdO1xuICAgICAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgICAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFswXTtcbiAgICAgICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICAgICAgdmFyIG9sZEtleVRvSWR4O1xuICAgICAgICB2YXIgaWR4SW5PbGQ7XG4gICAgICAgIHZhciBlbG1Ub01vdmU7XG4gICAgICAgIHZhciBiZWZvcmU7XG4gICAgICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICBpZiAob2xkU3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBtaWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkRW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3RW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBhcGkubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHhJbk9sZCA9IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUuc2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSksIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGVsbVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgICAgICAgYmVmb3JlID0gbmV3Q2hbbmV3RW5kSWR4ICsgMV0gPT0gbnVsbCA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgaSwgaG9vaztcbiAgICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgICAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuICAgICAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2bm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSlcbiAgICAgICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENoICE9PSBjaClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgICAgICAgICBhZGRWbm9kZXMoZWxtLCBudWxsLCBjaCwgMCwgY2gubGVuZ3RoIC0gMSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZVZub2RlcyhlbG0sIG9sZENoLCAwLCBvbGRDaC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgYXBpLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihob29rKSAmJiBpc0RlZihpID0gaG9vay5wb3N0cGF0Y2gpKSB7XG4gICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGNoKG9sZFZub2RlLCB2bm9kZSkge1xuICAgICAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5wcmUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjYnMucHJlW2ldKCk7XG4gICAgICAgIGlmICghaXNWbm9kZShvbGRWbm9kZSkpIHtcbiAgICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuICAgICAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50LCB2bm9kZS5lbG0sIGFwaS5uZXh0U2libGluZyhlbG0pKTtcbiAgICAgICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucG9zdC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNicy5wb3N0W2ldKCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9O1xufVxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNuYWJiZG9tLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5mdW5jdGlvbiBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspIHtcbiAgICB0aHVuay5lbG0gPSB2bm9kZS5lbG07XG4gICAgdm5vZGUuZGF0YS5mbiA9IHRodW5rLmRhdGEuZm47XG4gICAgdm5vZGUuZGF0YS5hcmdzID0gdGh1bmsuZGF0YS5hcmdzO1xuICAgIHRodW5rLmRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHRodW5rLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdGh1bmsudGV4dCA9IHZub2RlLnRleHQ7XG4gICAgdGh1bmsuZWxtID0gdm5vZGUuZWxtO1xufVxuZnVuY3Rpb24gaW5pdCh0aHVuaykge1xuICAgIHZhciBjdXIgPSB0aHVuay5kYXRhO1xuICAgIHZhciB2bm9kZSA9IGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGN1ci5hcmdzKTtcbiAgICBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspO1xufVxuZnVuY3Rpb24gcHJlcGF0Y2gob2xkVm5vZGUsIHRodW5rKSB7XG4gICAgdmFyIGksIG9sZCA9IG9sZFZub2RlLmRhdGEsIGN1ciA9IHRodW5rLmRhdGE7XG4gICAgdmFyIG9sZEFyZ3MgPSBvbGQuYXJncywgYXJncyA9IGN1ci5hcmdzO1xuICAgIGlmIChvbGQuZm4gIT09IGN1ci5mbiB8fCBvbGRBcmdzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAob2xkQXJnc1tpXSAhPT0gYXJnc1tpXSkge1xuICAgICAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb3B5VG9UaHVuayhvbGRWbm9kZSwgdGh1bmspO1xufVxuZXhwb3J0cy50aHVuayA9IGZ1bmN0aW9uIHRodW5rKHNlbCwga2V5LCBmbiwgYXJncykge1xuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXJncyA9IGZuO1xuICAgICAgICBmbiA9IGtleTtcbiAgICAgICAga2V5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaF8xLmgoc2VsLCB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBob29rOiB7IGluaXQ6IGluaXQsIHByZXBhdGNoOiBwcmVwYXRjaCB9LFxuICAgICAgICBmbjogZm4sXG4gICAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KTtcbn07XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLnRodW5rO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGh1bmsuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiB2bm9kZShzZWwsIGRhdGEsIGNoaWxkcmVuLCB0ZXh0LCBlbG0pIHtcbiAgICB2YXIga2V5ID0gZGF0YSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZGF0YS5rZXk7XG4gICAgcmV0dXJuIHsgc2VsOiBzZWwsIGRhdGE6IGRhdGEsIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgdGV4dDogdGV4dCwgZWxtOiBlbG0sIGtleToga2V5IH07XG59XG5leHBvcnRzLnZub2RlID0gdm5vZGU7XG5leHBvcnRzLmRlZmF1bHQgPSB2bm9kZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZub2RlLmpzLm1hcCJdfQ==