@rusticarcade/palette 0.2.0 → 0.3.1
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/README.md +73 -1
- package/dist/dev/index.js +4 -4
- package/dist/prod/index.js +2 -2
- package/dist/test/index.d.ts +803 -0
- package/dist/test/index.js +347 -0
- package/package.json +37 -10
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/test-util/global-env.ts
|
|
3
|
+
import { GlobalRegistrator } from "@happy-dom/global-registrator";
|
|
4
|
+
async function prepareGlobalTestDOM() {
|
|
5
|
+
await cleanupGlobalTestDOM();
|
|
6
|
+
GlobalRegistrator.register();
|
|
7
|
+
}
|
|
8
|
+
async function cleanupGlobalTestDOM() {
|
|
9
|
+
if (typeof document !== "undefined") {
|
|
10
|
+
while (document.firstChild) {
|
|
11
|
+
document.removeChild(document.firstChild);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
await Bun.sleep(1);
|
|
15
|
+
if (GlobalRegistrator.isRegistered) {
|
|
16
|
+
GlobalRegistrator.unregister();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// src/errors.ts
|
|
20
|
+
function getDevError(code) {
|
|
21
|
+
const DEV_ERROR_INFO = {
|
|
22
|
+
[0 /* INVARIANT */]: `
|
|
23
|
+
INVARIANT
|
|
24
|
+
A condition has occurred which should never happen, such as a code path that
|
|
25
|
+
shouldn't be reachable when using correct types, or a disallowed state.
|
|
26
|
+
`,
|
|
27
|
+
[1 /* INVALID_ENV */]: `
|
|
28
|
+
INVALID_ENV
|
|
29
|
+
Failed to find a custom elements registry in this environment. Is a window
|
|
30
|
+
global available with a customElements property?
|
|
31
|
+
`,
|
|
32
|
+
[100 /* DUPE_TAGNAME */]: `
|
|
33
|
+
DUPE_TAGNAME
|
|
34
|
+
Failed to register a custom element with the tagname %s because another
|
|
35
|
+
custom element is already defined with that name.
|
|
36
|
+
`,
|
|
37
|
+
[101 /* INVALID_TAGNAME */]: `
|
|
38
|
+
INVALID_TAGNAME
|
|
39
|
+
Failed to determine a valid HTML Tag to use when registering a component as a
|
|
40
|
+
custom element. Specify a static readonly tagName property on your component
|
|
41
|
+
class or provide a tagName argument to Component.register.
|
|
42
|
+
|
|
43
|
+
Alternatively, you can directly register your element as you would any other
|
|
44
|
+
HTML custom element: customElements.define("my-tag", MyComponentClass);
|
|
45
|
+
`,
|
|
46
|
+
[300 /* MISSING_ELEMENT */]: `
|
|
47
|
+
MISSING_ELEMENT
|
|
48
|
+
An element was expected to exist but was not found when the DOM was queried.
|
|
49
|
+
`,
|
|
50
|
+
[301 /* MISSING_STATE */]: `
|
|
51
|
+
MISSING_STATE
|
|
52
|
+
A Component's reactive state was accessed, but no initialState is defined for
|
|
53
|
+
the Component's class. Initial state must be defined as an object or function.
|
|
54
|
+
`,
|
|
55
|
+
[302 /* INVALID_CONTENT */]: `
|
|
56
|
+
INVALID_CONTENT
|
|
57
|
+
Tried to set a value as content in a template, but the value was not a supported
|
|
58
|
+
type. Values must be a string, HTMLElement.
|
|
59
|
+
|
|
60
|
+
Instead, got %s: %s.
|
|
61
|
+
`,
|
|
62
|
+
[200 /* TEMPLATE_INVALID */]: `
|
|
63
|
+
TEMPLATE_INVALID
|
|
64
|
+
The value %s cannot be interpolated via the Template html string helper.
|
|
65
|
+
Values may only be HTMLTemplateElements (template content is adopted) or
|
|
66
|
+
strings (shorthand for a ::swap directive on an element)
|
|
67
|
+
`,
|
|
68
|
+
[201 /* TEMPLATE_INVALID_NOTATION */]: `
|
|
69
|
+
TEMPLATE_INVALID_NOTATION
|
|
70
|
+
A template value notation failed to parse. Notations must begin with one of
|
|
71
|
+
@, $, *, or #, followed by a dot-separated path of accessor names. Optionally,
|
|
72
|
+
notations may have modifiers around them, such as the NOT() modifier.
|
|
73
|
+
|
|
74
|
+
The notation that failed to parse was "%s"
|
|
75
|
+
`,
|
|
76
|
+
[202 /* TEMPLATE_INVALID_COMPONENT */]: `
|
|
77
|
+
TEMPLATE_INVALID_COMPONENT
|
|
78
|
+
Failed to interpolate a Component in an html template string due to the
|
|
79
|
+
Component having an invalid tagName property.
|
|
80
|
+
|
|
81
|
+
Component "%s" has an invalid tagName property "%s"
|
|
82
|
+
`,
|
|
83
|
+
[205 /* TEMPLATE_MISSING_LIST_PARENT */]: `
|
|
84
|
+
TEMPLATE_MISSING_LIST_PARENT
|
|
85
|
+
A template failed to prepare an ::each directive because no valid parent node
|
|
86
|
+
was found for the list to render into.
|
|
87
|
+
`,
|
|
88
|
+
[203 /* TEMPLATE_INVALID_LIST */]: `
|
|
89
|
+
TEMPLATE_INVALID_LIST
|
|
90
|
+
A template failed to render because an ::each directive fetched a value which
|
|
91
|
+
was not an array of actionable data.
|
|
92
|
+
`,
|
|
93
|
+
[204 /* TEMPLATE_INVALID_NODE_REF */]: `
|
|
94
|
+
TEMPLATE_INVALID_NODE_REF
|
|
95
|
+
A template failed to prepare a node from a compiled source. Typically, this
|
|
96
|
+
means something is broken within the compiled template rather than an error with
|
|
97
|
+
the template content itself.
|
|
98
|
+
`,
|
|
99
|
+
[206 /* TEMPLATE_MISSING_LIST_KEY */]: `
|
|
100
|
+
TEMPLATE_MISSING_LIST_KEY
|
|
101
|
+
A template failed to compile because an ::each directive was found on an element
|
|
102
|
+
without a corresponding ::key directive. ::each directives must have a ::key
|
|
103
|
+
directive specified on the same element, whose notation evaluates to a unique
|
|
104
|
+
value for each item in the list.
|
|
105
|
+
|
|
106
|
+
Example: <li ::each="$items" ::key="#id"> ... </li>
|
|
107
|
+
`,
|
|
108
|
+
[207 /* TEMPLATE_DUPLICATE_LIST_KEY */]: `
|
|
109
|
+
TEMPLATE_DUPLICATE_LIST_KEY
|
|
110
|
+
A list failed to render because item key %s appeared multiple times when
|
|
111
|
+
resolving list item keys. Each ::key directive must reference a notation whose
|
|
112
|
+
value is unique for each list item.
|
|
113
|
+
`,
|
|
114
|
+
[303 /* INVALID_STATE_KEY */]: `
|
|
115
|
+
INVALID_STATE_KEY
|
|
116
|
+
Tried to access a state property which does not exist
|
|
117
|
+
|
|
118
|
+
Key path: %s
|
|
119
|
+
`,
|
|
120
|
+
[304 /* INVALID_STATE_UPDATE */]: `
|
|
121
|
+
INVALID_STATE_UPDATE
|
|
122
|
+
A Component's setState() was called with a value which could not be patched in
|
|
123
|
+
to the existing component state.
|
|
124
|
+
|
|
125
|
+
setState() takes a partial object describing state keys to update.
|
|
126
|
+
|
|
127
|
+
Instead, received: %s
|
|
128
|
+
`,
|
|
129
|
+
[305 /* STATE_LOCKED */]: `
|
|
130
|
+
STATE_LOCKED
|
|
131
|
+
A State received a request to update or lock while already locked.
|
|
132
|
+
States may be locked using the .lock() method and unlocked using the .unlock()
|
|
133
|
+
method. States lock during async mutations done through the .mutateAsync()
|
|
134
|
+
method if "true" is passed as the second parameter.
|
|
135
|
+
|
|
136
|
+
You can check the lock status of a State instance with .isLocked
|
|
137
|
+
`,
|
|
138
|
+
[306 /* MAX_SEQUENTIAL_RENDERS */]: `
|
|
139
|
+
MAX_SEQUENTIAL_RENDERS
|
|
140
|
+
A component has errored after re-rendering more than %s times in the same frame.
|
|
141
|
+
|
|
142
|
+
This typically happens because state or live attributes are being modified
|
|
143
|
+
during a render lifecycle method such as beforeUpdate() or afterUpdate(). If
|
|
144
|
+
state changes unconditionally during a render, the render will infinitely loop.
|
|
145
|
+
Updating render source data during a render cycle is supported, but infinite
|
|
146
|
+
update loops may occur if unchecked.
|
|
147
|
+
`
|
|
148
|
+
};
|
|
149
|
+
return DEV_ERROR_INFO[code];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
class PaletteError extends Error {
|
|
153
|
+
name = "PaletteError";
|
|
154
|
+
code;
|
|
155
|
+
constructor(code, ...values) {
|
|
156
|
+
let message = `Code: ${code}`;
|
|
157
|
+
if (true) {
|
|
158
|
+
message += getDevError(code);
|
|
159
|
+
for (const val of values) {
|
|
160
|
+
message = message.replace(`%s`, String(val));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
super(message);
|
|
164
|
+
this.code = code;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// src/util/attributes.ts
|
|
169
|
+
function serializeAttribute(value) {
|
|
170
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
171
|
+
return `${value}`;
|
|
172
|
+
}
|
|
173
|
+
if (value === true) {
|
|
174
|
+
return "";
|
|
175
|
+
}
|
|
176
|
+
if (value === null || value === false || value === undefined) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
return value.toString();
|
|
180
|
+
}
|
|
181
|
+
function createAttributeMap(source) {
|
|
182
|
+
const map = new Map;
|
|
183
|
+
if (source instanceof HTMLElement) {
|
|
184
|
+
for (const name of source.getAttributeNames()) {
|
|
185
|
+
map.set(name, serializeAttribute(source.getAttribute(name)));
|
|
186
|
+
}
|
|
187
|
+
return map;
|
|
188
|
+
}
|
|
189
|
+
if (source instanceof Map) {
|
|
190
|
+
for (const [key, val] of source) {
|
|
191
|
+
map.set(key, serializeAttribute(val));
|
|
192
|
+
}
|
|
193
|
+
return map;
|
|
194
|
+
}
|
|
195
|
+
if (typeof source === "object" && source !== null) {
|
|
196
|
+
for (const [key, val] of Object.entries(source)) {
|
|
197
|
+
map.set(key, serializeAttribute(val));
|
|
198
|
+
}
|
|
199
|
+
return map;
|
|
200
|
+
}
|
|
201
|
+
throw new PaletteError(0 /* INVARIANT */);
|
|
202
|
+
}
|
|
203
|
+
function applyAttributeMap(target, attrs) {
|
|
204
|
+
const currentNames = new Set(target.getAttributeNames());
|
|
205
|
+
const incomingNames = new Set(attrs.keys());
|
|
206
|
+
const attributesToRemove = currentNames.difference(incomingNames);
|
|
207
|
+
for (const attr of attributesToRemove) {
|
|
208
|
+
target.removeAttribute(attr);
|
|
209
|
+
}
|
|
210
|
+
for (const [name, val] of attrs) {
|
|
211
|
+
if (val === null) {
|
|
212
|
+
target.removeAttribute(name);
|
|
213
|
+
} else {
|
|
214
|
+
target.setAttribute(name, val);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// src/util/lru-cache.ts
|
|
219
|
+
class LRUCache {
|
|
220
|
+
_maxSize;
|
|
221
|
+
_data;
|
|
222
|
+
_metrics = { hits: 0, misses: 0 };
|
|
223
|
+
constructor(maxSize = 500) {
|
|
224
|
+
if (maxSize <= 0) {
|
|
225
|
+
throw new Error("LRU Cache capacity must be >= 1");
|
|
226
|
+
}
|
|
227
|
+
if (true) {
|
|
228
|
+
this._metrics = { hits: 0, misses: 0 };
|
|
229
|
+
}
|
|
230
|
+
this._maxSize = maxSize;
|
|
231
|
+
this._data = new Map;
|
|
232
|
+
}
|
|
233
|
+
_trim = () => {
|
|
234
|
+
while (this._data.size > this._maxSize) {
|
|
235
|
+
const firstKey = this._data.keys().next().value;
|
|
236
|
+
if (firstKey === undefined) {
|
|
237
|
+
throw new Error("Absurd");
|
|
238
|
+
}
|
|
239
|
+
this._data.delete(firstKey);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
get metrics() {
|
|
243
|
+
if (true) {
|
|
244
|
+
const { hits = 0, misses = 0 } = this._metrics ?? {};
|
|
245
|
+
const lookups = hits + misses;
|
|
246
|
+
const hitRate = lookups === 0 ? 0 : hits / lookups;
|
|
247
|
+
return {
|
|
248
|
+
lookups,
|
|
249
|
+
hits,
|
|
250
|
+
misses,
|
|
251
|
+
capacity: this._maxSize,
|
|
252
|
+
entries: this._data.size,
|
|
253
|
+
hitRate
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
lookups: 0,
|
|
258
|
+
hits: 0,
|
|
259
|
+
misses: 0,
|
|
260
|
+
capacity: 0,
|
|
261
|
+
entries: 0,
|
|
262
|
+
hitRate: 0
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
setCapacity = (maxSize) => {
|
|
266
|
+
if (maxSize <= 0 && true) {
|
|
267
|
+
console.warn("[Palette LRU Cache] Cache size is <= 0. Cache is disabled.");
|
|
268
|
+
}
|
|
269
|
+
this._maxSize = maxSize;
|
|
270
|
+
this._trim();
|
|
271
|
+
};
|
|
272
|
+
get(key) {
|
|
273
|
+
const value = this._data.get(key);
|
|
274
|
+
if (value === undefined) {
|
|
275
|
+
if (true) {
|
|
276
|
+
this._metrics.misses += 1;
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
this._data.delete(key);
|
|
281
|
+
this._data.set(key, value);
|
|
282
|
+
if (true) {
|
|
283
|
+
this._metrics.hits += 1;
|
|
284
|
+
}
|
|
285
|
+
return value;
|
|
286
|
+
}
|
|
287
|
+
set(key, value) {
|
|
288
|
+
if (this._data.has(key)) {
|
|
289
|
+
this._data.delete(key);
|
|
290
|
+
}
|
|
291
|
+
this._data.set(key, value);
|
|
292
|
+
if (this._data.size > this._maxSize) {
|
|
293
|
+
this._trim();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
clear() {
|
|
297
|
+
this._data.clear();
|
|
298
|
+
}
|
|
299
|
+
get size() {
|
|
300
|
+
return this._data.size;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
var lru_cache_default = LRUCache;
|
|
304
|
+
|
|
305
|
+
// src/util/fragments.ts
|
|
306
|
+
var fragmentCache = new lru_cache_default;
|
|
307
|
+
// src/test-util/tags.ts
|
|
308
|
+
var randomTagName = () => {
|
|
309
|
+
const id = crypto.randomUUID().replaceAll("-", "").slice(0, 10);
|
|
310
|
+
return `test-element-${id}`;
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
// src/test-util/render.ts
|
|
314
|
+
async function renderTestComponent(component, attributes2) {
|
|
315
|
+
if (typeof window === "undefined" || typeof window.customElements === "undefined") {
|
|
316
|
+
throw new Error("Failed to render test component: " + "window.customElements is not available in this environment.");
|
|
317
|
+
}
|
|
318
|
+
const useTagname = component.tagName === "" ? randomTagName() : component.tagName;
|
|
319
|
+
component.tagName = useTagname;
|
|
320
|
+
if (!customElements.get(useTagname)) {
|
|
321
|
+
customElements.define(useTagname, component);
|
|
322
|
+
}
|
|
323
|
+
const $component = document.createElement(component.tagName);
|
|
324
|
+
const attributeMap = createAttributeMap(attributes2 ?? {});
|
|
325
|
+
applyAttributeMap($component, attributeMap);
|
|
326
|
+
document.body.append($component);
|
|
327
|
+
await Bun.sleep(1);
|
|
328
|
+
return $component;
|
|
329
|
+
}
|
|
330
|
+
async function rerenderTestComponent(element) {
|
|
331
|
+
return new Promise((resolve) => {
|
|
332
|
+
element.requestRender(async () => {
|
|
333
|
+
await Bun.sleep(1);
|
|
334
|
+
resolve();
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
export {
|
|
339
|
+
rerenderTestComponent,
|
|
340
|
+
renderTestComponent,
|
|
341
|
+
randomTagName,
|
|
342
|
+
prepareGlobalTestDOM,
|
|
343
|
+
cleanupGlobalTestDOM
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
//# debugId=925A43921950535764756E2164756E21
|
|
347
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3QtdXRpbC9nbG9iYWwtZW52LnRzIiwgInNyYy9lcnJvcnMudHMiLCAic3JjL3V0aWwvYXR0cmlidXRlcy50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy90ZXN0LXV0aWwvdGFncy50cyIsICJzcmMvdGVzdC11dGlsL3JlbmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogQ29weXJpZ2h0IMKpIFJ1c3RpYyBBcmNhZGUsIExMQyAyMDI2XG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBHbG9iYWxSZWdpc3RyYXRvciB9IGZyb20gXCJAaGFwcHktZG9tL2dsb2JhbC1yZWdpc3RyYXRvclwiO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGdsb2JhbCB0ZXN0IERPTSBlbnZpcm9ubWVudCAodXNpbmcgSGFwcHlET00pXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcmVwYXJlR2xvYmFsVGVzdERPTSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xlYW51cEdsb2JhbFRlc3RET00oKTtcbiAgR2xvYmFsUmVnaXN0cmF0b3IucmVnaXN0ZXIoKTtcbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRoZSBnbG9iYWwgdGVzdCBET00gZW52aXJvbm1lbnQgKHVzaW5nIEhhcHB5RE9NKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW51cEdsb2JhbFRlc3RET00oKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB3aGlsZSAoZG9jdW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jdW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgQnVuLnNsZWVwKDEpO1xuXG4gIGlmIChHbG9iYWxSZWdpc3RyYXRvci5pc1JlZ2lzdGVyZWQpIHtcbiAgICBHbG9iYWxSZWdpc3RyYXRvci51bnJlZ2lzdGVyKCk7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIFBvc3NpYmxlIGVycm9yIHR5cGVzIGZvciB7QGxpbmsgUGFsZXR0ZUVycm9yfVxuICpcbiAqIENvZGVzIGFyZSBjYXRlZ29yaXplZCBpbnRvIGdyb3VwcyBieSB0aGUgMTAwJ3M6XG4gKlxuICogLSAwIC0gOTk6IEludmFyaWFudHNcbiAqIC0gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgLyBFbnZpcm9ubWVudCBFcnJvcnNcbiAqIC0gMjAwIC0gMjk5OiBUZW1wbGF0aW5nIEVycm9yc1xuICogLSAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEVycm9yQ29kZSB7XG4gIC8vIDAgLSA5OTogSW52YXJpYW50c1xuICBJTlZBUklBTlQgPSAwLFxuICBJTlZBTElEX0VOViA9IDEsXG5cbiAgLy8gMTAwIC0gMTk5OiBDdXN0b20gRWxlbWVudHMgRXJyb3JzXG4gIERVUEVfVEFHTkFNRSA9IDEwMCxcbiAgSU5WQUxJRF9UQUdOQU1FID0gMTAxLFxuXG4gIC8vIDIwMCAtIDI5OTogVGVtcGxhdGUgRXJyb3JzXG4gIFRFTVBMQVRFX0lOVkFMSUQgPSAyMDAsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04gPSAyMDEsXG4gIFRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UID0gMjAyLFxuICBURU1QTEFURV9JTlZBTElEX0xJU1QgPSAyMDMsXG4gIFRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUYgPSAyMDQsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlQgPSAyMDUsXG4gIFRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkgPSAyMDYsXG4gIFRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWSA9IDIwNyxcblxuICAvLyAzMDAgLSAzOTk6IFJ1bnRpbWUgRXJyb3JzXG4gIE1JU1NJTkdfRUxFTUVOVCA9IDMwMCxcbiAgTUlTU0lOR19TVEFURSA9IDMwMSxcbiAgSU5WQUxJRF9DT05URU5UID0gMzAyLFxuICBJTlZBTElEX1NUQVRFX0tFWSA9IDMwMyxcbiAgSU5WQUxJRF9TVEFURV9VUERBVEUgPSAzMDQsXG4gIFNUQVRFX0xPQ0tFRCA9IDMwNSxcbiAgTUFYX1NFUVVFTlRJQUxfUkVOREVSUyA9IDMwNixcbn1cblxuZnVuY3Rpb24gZ2V0RGV2RXJyb3IoY29kZTogRXJyb3JDb2RlKSB7XG4gIGNvbnN0IERFVl9FUlJPUl9JTkZPOiBSZWNvcmQ8RXJyb3JDb2RlLCBzdHJpbmc+ID0ge1xuICAgIFtFcnJvckNvZGUuSU5WQVJJQU5UXTogYFxuSU5WQVJJQU5UXG5BIGNvbmRpdGlvbiBoYXMgb2NjdXJyZWQgd2hpY2ggc2hvdWxkIG5ldmVyIGhhcHBlbiwgc3VjaCBhcyBhIGNvZGUgcGF0aCB0aGF0XG5zaG91bGRuJ3QgYmUgcmVhY2hhYmxlIHdoZW4gdXNpbmcgY29ycmVjdCB0eXBlcywgb3IgYSBkaXNhbGxvd2VkIHN0YXRlLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9FTlZdOiBgXG5JTlZBTElEX0VOVlxuRmFpbGVkIHRvIGZpbmQgYSBjdXN0b20gZWxlbWVudHMgcmVnaXN0cnkgaW4gdGhpcyBlbnZpcm9ubWVudC4gSXMgYSB3aW5kb3dcbmdsb2JhbCBhdmFpbGFibGUgd2l0aCBhIGN1c3RvbUVsZW1lbnRzIHByb3BlcnR5P1xuYCxcblxuICAgIFtFcnJvckNvZGUuRFVQRV9UQUdOQU1FXTogYFxuRFVQRV9UQUdOQU1FXG5GYWlsZWQgdG8gcmVnaXN0ZXIgYSBjdXN0b20gZWxlbWVudCB3aXRoIHRoZSB0YWduYW1lICVzIGJlY2F1c2UgYW5vdGhlclxuY3VzdG9tIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWZpbmVkIHdpdGggdGhhdCBuYW1lLlxuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FXTogYFxuSU5WQUxJRF9UQUdOQU1FXG5GYWlsZWQgdG8gZGV0ZXJtaW5lIGEgdmFsaWQgSFRNTCBUYWcgdG8gdXNlIHdoZW4gcmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYXMgYVxuY3VzdG9tIGVsZW1lbnQuIFNwZWNpZnkgYSBzdGF0aWMgcmVhZG9ubHkgdGFnTmFtZSBwcm9wZXJ0eSBvbiB5b3VyIGNvbXBvbmVudFxuY2xhc3Mgb3IgcHJvdmlkZSBhIHRhZ05hbWUgYXJndW1lbnQgdG8gQ29tcG9uZW50LnJlZ2lzdGVyLlxuXG5BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRpcmVjdGx5IHJlZ2lzdGVyIHlvdXIgZWxlbWVudCBhcyB5b3Ugd291bGQgYW55IG90aGVyXG5IVE1MIGN1c3RvbSBlbGVtZW50OiBjdXN0b21FbGVtZW50cy5kZWZpbmUoXCJteS10YWdcIiwgTXlDb21wb25lbnRDbGFzcyk7XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlRdOiBgXG5NSVNTSU5HX0VMRU1FTlRcbkFuIGVsZW1lbnQgd2FzIGV4cGVjdGVkIHRvIGV4aXN0IGJ1dCB3YXMgbm90IGZvdW5kIHdoZW4gdGhlIERPTSB3YXMgcXVlcmllZC5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVdOiBgXG5NSVNTSU5HX1NUQVRFXG5BIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdhcyBhY2Nlc3NlZCwgYnV0IG5vIGluaXRpYWxTdGF0ZSBpcyBkZWZpbmVkIGZvclxudGhlIENvbXBvbmVudCdzIGNsYXNzLiBJbml0aWFsIHN0YXRlIG11c3QgYmUgZGVmaW5lZCBhcyBhbiBvYmplY3Qgb3IgZnVuY3Rpb24uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0NPTlRFTlRdOiBgXG5JTlZBTElEX0NPTlRFTlRcblRyaWVkIHRvIHNldCBhIHZhbHVlIGFzIGNvbnRlbnQgaW4gYSB0ZW1wbGF0ZSwgYnV0IHRoZSB2YWx1ZSB3YXMgbm90IGEgc3VwcG9ydGVkXG50eXBlLiBWYWx1ZXMgbXVzdCBiZSBhIHN0cmluZywgSFRNTEVsZW1lbnQuXG5cbkluc3RlYWQsIGdvdCAlczogJXMuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEXTogYFxuVEVNUExBVEVfSU5WQUxJRFxuVGhlIHZhbHVlICVzIGNhbm5vdCBiZSBpbnRlcnBvbGF0ZWQgdmlhIHRoZSBUZW1wbGF0ZSBodG1sIHN0cmluZyBoZWxwZXIuXG5WYWx1ZXMgbWF5IG9ubHkgYmUgSFRNTFRlbXBsYXRlRWxlbWVudHMgKHRlbXBsYXRlIGNvbnRlbnQgaXMgYWRvcHRlZCkgb3JcbnN0cmluZ3MgKHNob3J0aGFuZCBmb3IgYSA6OnN3YXAgZGlyZWN0aXZlIG9uIGFuIGVsZW1lbnQpXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTlxuQSB0ZW1wbGF0ZSB2YWx1ZSBub3RhdGlvbiBmYWlsZWQgdG8gcGFyc2UuIE5vdGF0aW9ucyBtdXN0IGJlZ2luIHdpdGggb25lIG9mXG5ALCAkLCAqLCBvciAjLCBmb2xsb3dlZCBieSBhIGRvdC1zZXBhcmF0ZWQgcGF0aCBvZiBhY2Nlc3NvciBuYW1lcy4gT3B0aW9uYWxseSxcbm5vdGF0aW9ucyBtYXkgaGF2ZSBtb2RpZmllcnMgYXJvdW5kIHRoZW0sIHN1Y2ggYXMgdGhlIE5PVCgpIG1vZGlmaWVyLlxuXG5UaGUgbm90YXRpb24gdGhhdCBmYWlsZWQgdG8gcGFyc2Ugd2FzIFwiJXNcIlxuYCxcbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfQ09NUE9ORU5UXTogYFxuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRcbkZhaWxlZCB0byBpbnRlcnBvbGF0ZSBhIENvbXBvbmVudCBpbiBhbiBodG1sIHRlbXBsYXRlIHN0cmluZyBkdWUgdG8gdGhlXG5Db21wb25lbnQgaGF2aW5nIGFuIGludmFsaWQgdGFnTmFtZSBwcm9wZXJ0eS5cblxuQ29tcG9uZW50IFwiJXNcIiBoYXMgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5IFwiJXNcIlxuICAgIGAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRdOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfUEFSRU5UXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBwcmVwYXJlIGFuIDo6ZWFjaCBkaXJlY3RpdmUgYmVjYXVzZSBubyB2YWxpZCBwYXJlbnQgbm9kZVxud2FzIGZvdW5kIGZvciB0aGUgbGlzdCB0byByZW5kZXIgaW50by5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVF06IGBcblRFTVBMQVRFX0lOVkFMSURfTElTVFxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcmVuZGVyIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSBmZXRjaGVkIGEgdmFsdWUgd2hpY2hcbndhcyBub3QgYW4gYXJyYXkgb2YgYWN0aW9uYWJsZSBkYXRhLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRl06IGBcblRFTVBMQVRFX0lOVkFMSURfTk9ERV9SRUZcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYSBub2RlIGZyb20gYSBjb21waWxlZCBzb3VyY2UuIFR5cGljYWxseSwgdGhpc1xubWVhbnMgc29tZXRoaW5nIGlzIGJyb2tlbiB3aXRoaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHJhdGhlciB0aGFuIGFuIGVycm9yIHdpdGhcbnRoZSB0ZW1wbGF0ZSBjb250ZW50IGl0c2VsZi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVldOiBgXG5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZXG5BIHRlbXBsYXRlIGZhaWxlZCB0byBjb21waWxlIGJlY2F1c2UgYW4gOjplYWNoIGRpcmVjdGl2ZSB3YXMgZm91bmQgb24gYW4gZWxlbWVudFxud2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgOjprZXkgZGlyZWN0aXZlLiA6OmVhY2ggZGlyZWN0aXZlcyBtdXN0IGhhdmUgYSA6OmtleVxuZGlyZWN0aXZlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBlbGVtZW50LCB3aG9zZSBub3RhdGlvbiBldmFsdWF0ZXMgdG8gYSB1bmlxdWVcbnZhbHVlIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbkV4YW1wbGU6IDxsaSA6OmVhY2g9XCIkaXRlbXNcIiA6OmtleT1cIiNpZFwiPiAuLi4gPC9saT5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWV06IGBcblRFTVBMQVRFX0RVUExJQ0FURV9MSVNUX0tFWVxuQSBsaXN0IGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBpdGVtIGtleSAlcyBhcHBlYXJlZCBtdWx0aXBsZSB0aW1lcyB3aGVuXG5yZXNvbHZpbmcgbGlzdCBpdGVtIGtleXMuIEVhY2ggOjprZXkgZGlyZWN0aXZlIG11c3QgcmVmZXJlbmNlIGEgbm90YXRpb24gd2hvc2VcbnZhbHVlIGlzIHVuaXF1ZSBmb3IgZWFjaCBsaXN0IGl0ZW0uXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWV06IGBcbklOVkFMSURfU1RBVEVfS0VZXG5UcmllZCB0byBhY2Nlc3MgYSBzdGF0ZSBwcm9wZXJ0eSB3aGljaCBkb2VzIG5vdCBleGlzdFxuXG5LZXkgcGF0aDogJXNcbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFXTogYFxuSU5WQUxJRF9TVEFURV9VUERBVEVcbkEgQ29tcG9uZW50J3Mgc2V0U3RhdGUoKSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB3aGljaCBjb3VsZCBub3QgYmUgcGF0Y2hlZCBpblxudG8gdGhlIGV4aXN0aW5nIGNvbXBvbmVudCBzdGF0ZS5cblxuc2V0U3RhdGUoKSB0YWtlcyBhIHBhcnRpYWwgb2JqZWN0IGRlc2NyaWJpbmcgc3RhdGUga2V5cyB0byB1cGRhdGUuXG5cbkluc3RlYWQsIHJlY2VpdmVkOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuU1RBVEVfTE9DS0VEXTogYFxuU1RBVEVfTE9DS0VEXG5BIFN0YXRlIHJlY2VpdmVkIGEgcmVxdWVzdCB0byB1cGRhdGUgb3IgbG9jayB3aGlsZSBhbHJlYWR5IGxvY2tlZC5cblN0YXRlcyBtYXkgYmUgbG9ja2VkIHVzaW5nIHRoZSAubG9jaygpIG1ldGhvZCBhbmQgdW5sb2NrZWQgdXNpbmcgdGhlIC51bmxvY2soKVxubWV0aG9kLiBTdGF0ZXMgbG9jayBkdXJpbmcgYXN5bmMgbXV0YXRpb25zIGRvbmUgdGhyb3VnaCB0aGUgLm11dGF0ZUFzeW5jKClcbm1ldGhvZCBpZiBcInRydWVcIiBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuXG5cbllvdSBjYW4gY2hlY2sgdGhlIGxvY2sgc3RhdHVzIG9mIGEgU3RhdGUgaW5zdGFuY2Ugd2l0aCAuaXNMb2NrZWRcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlNdOiBgXG5NQVhfU0VRVUVOVElBTF9SRU5ERVJTXG5BIGNvbXBvbmVudCBoYXMgZXJyb3JlZCBhZnRlciByZS1yZW5kZXJpbmcgbW9yZSB0aGFuICVzIHRpbWVzIGluIHRoZSBzYW1lIGZyYW1lLlxuXG5UaGlzIHR5cGljYWxseSBoYXBwZW5zIGJlY2F1c2Ugc3RhdGUgb3IgbGl2ZSBhdHRyaWJ1dGVzIGFyZSBiZWluZyBtb2RpZmllZFxuZHVyaW5nIGEgcmVuZGVyIGxpZmVjeWNsZSBtZXRob2Qgc3VjaCBhcyBiZWZvcmVVcGRhdGUoKSBvciBhZnRlclVwZGF0ZSgpLiBJZlxuc3RhdGUgY2hhbmdlcyB1bmNvbmRpdGlvbmFsbHkgZHVyaW5nIGEgcmVuZGVyLCB0aGUgcmVuZGVyIHdpbGwgaW5maW5pdGVseSBsb29wLlxuVXBkYXRpbmcgcmVuZGVyIHNvdXJjZSBkYXRhIGR1cmluZyBhIHJlbmRlciBjeWNsZSBpcyBzdXBwb3J0ZWQsIGJ1dCBpbmZpbml0ZVxudXBkYXRlIGxvb3BzIG1heSBvY2N1ciBpZiB1bmNoZWNrZWQuXG5gLFxuICB9O1xuXG4gIHJldHVybiBERVZfRVJST1JfSU5GT1tjb2RlXTtcbn1cblxuLyoqXG4gKiBBbiBlcnJvciBvcmlnaW5hdGluZyBmcm9tIHdpdGhpbiBhIFBhbGV0dGUgc3Vic3lzdGVtLlxuICpcbiAqIEluIHRoZSBgZGV2ZWxvcG1lbnRgIGVudmlyb25tZW50LCB0aGUgZXJyb3Igd2lsbCBzdXJmYWNlIHdpdGggZXh0ZW5kZWQgaW5mb1xuICogYWJvdXQgdGhlIGVycm9yIGFuZCBhbnkgZGV0YWlscyB3aGljaCBtYXkgYmUgcmVsZXZhbnQgdG8gaGVscCB3aXRoIGRlYnVnZ2luZy5cbiAqXG4gKiBJbiB0aGUgYHByb2R1Y3Rpb25gIGVudmlyb25tZW50LCBhIG1pbmltYWwgZXJyb3Igb25seSBzdXJmYWNpbmcgdGhlIG51bWVyaWNcbiAqIGVycm9yIGNvZGUgaXMgdGhyb3duIGluc3RlYWQuXG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhbGV0dGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbmFtZSA9IFwiUGFsZXR0ZUVycm9yXCI7XG4gIGNvZGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb2RlOiBudW1iZXIsIC4uLnZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWVzc2FnZSA9IGBDb2RlOiAke2NvZGV9YDtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgbWVzc2FnZSArPSBnZXREZXZFcnJvcihjb2RlKTtcblxuICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoYCVzYCwgU3RyaW5nKHZhbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5cbi8qKiBBbiBhdHRyaWJ1dGUgdmFsdWUgYXMgcmVhZCBmcm9tIGEgRE9NIGVsZW1lbnQgKi9cbnR5cGUgQXR0cmlidXRlVmFsdWUgPSBzdHJpbmcgfCBudWxsO1xuXG4vKiogQSBNYXAgb2Ygc3RyaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB7QGxpbmsgQXR0cmlidXRlVmFsdWV9ICovXG50eXBlIEF0dHJpYnV0ZU1hcCA9IE1hcDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZTogdW5rbm93bik6IEF0dHJpYnV0ZVZhbHVlIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZU1hcChcbiAgc291cmNlOiBvYmplY3QgfCBNYXA8c3RyaW5nLCB1bmtub3duPiB8IEhUTUxFbGVtZW50LFxuKTogQXR0cmlidXRlTWFwIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHNvdXJjZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBtYXAuc2V0KG5hbWUsIHNlcmlhbGl6ZUF0dHJpYnV0ZShzb3VyY2UuZ2V0QXR0cmlidXRlKG5hbWUpKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHNvdXJjZSkge1xuICAgICAgbWFwLnNldChrZXksIHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWwpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc291cmNlID09PSBcIm9iamVjdFwiICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXR0cmlidXRlTWFwKFxuICB0YXJnZXQ6IEhUTUxFbGVtZW50LFxuICBhdHRyczogQXR0cmlidXRlTWFwLFxuKTogdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnROYW1lcyA9IG5ldyBTZXQodGFyZ2V0LmdldEF0dHJpYnV0ZU5hbWVzKCkpO1xuICBjb25zdCBpbmNvbWluZ05hbWVzID0gbmV3IFNldChhdHRycy5rZXlzKCkpO1xuICBjb25zdCBhdHRyaWJ1dGVzVG9SZW1vdmUgPSBjdXJyZW50TmFtZXMuZGlmZmVyZW5jZShpbmNvbWluZ05hbWVzKTtcblxuICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cmlidXRlc1RvUmVtb3ZlKSB7XG4gICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShhdHRyKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbF0gb2YgYXR0cnMpIHtcbiAgICBpZiAodmFsID09PSBudWxsKSB7XG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xudHlwZSBNZXRyaWNzID0ge1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTFJVQ2FjaGVNZXRyaWNzID0ge1xuICBsb29rdXBzOiBudW1iZXI7XG4gIGhpdHM6IG51bWJlcjtcbiAgbWlzc2VzOiBudW1iZXI7XG4gIGNhcGFjaXR5OiBudW1iZXI7XG4gIGVudHJpZXM6IG51bWJlcjtcbiAgaGl0UmF0ZTogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgTFJVIENhY2hlIHVzaW5nIEphdmFTY3JpcHQgbWFwcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIENhY2hlZCBuZXR3b3JrIHJlcXVlc3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBBIGNhY2hlIG9mIEFQSSBVUkxzIHRvIHRoZWlyIHJldHVybmVkIHBheWxvYWRzXG4gKiBjb25zdCBjYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIEFQSVBheWxvYWQ+KCk7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAqICAgbGV0IGNhY2hlZCA9IGNhY2hlLmdldCh1cmwpO1xuICogICBpZiAoY2FjaGVkKSB7XG4gKiAgICAgcmV0dXJuIGNhY2hlZDtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uIE1ha2UgdGhlIHJlcXVlc3QgYW5kIGNhY2hlLnNldCgpIHRoZSByZXNwb25zZVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMUlVDYWNoZTxLLCBWPiB7XG4gIHByaXZhdGUgX21heFNpemU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZGF0YTogTWFwPEssIFY+O1xuICBwcml2YXRlIF9tZXRyaWNzOiBNZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplOiBudW1iZXIgPSA1MDApIHtcbiAgICBpZiAobWF4U2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMUlUgQ2FjaGUgY2FwYWNpdHkgbXVzdCBiZSA+PSAxXCIpO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB0aGlzLl9tZXRyaWNzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IE1hcDxLLCBWPigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpbSA9ICgpID0+IHtcbiAgICB3aGlsZSAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLl9kYXRhLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBYnN1cmRcIik7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgcGVyZm9ybWFuY2UgbWV0cmljcyBmcm9tIHRoaXMgTFJVIENhY2hlIGluc3RhbmNlLlxuICAgKlxuICAgKiBJbiBkZXZlbG9wbWVudCBtb2RlLCB0aGlzIHJldHVybnMgaW5zaWdodHMgaW50byBoaXRzL21pc3NlcyBvZiB0aGUgY2FjaGUsXG4gICAqIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZW50cnkgY291bnQuXG4gICAqXG4gICAqIEluIHByb2R1Y3Rpb24gbW9kZSwgdGhpcyByZXR1cm5zIGEgcGxhY2Vob2xkZXIgb2JqZWN0LCBhcyBtZXRyaWMgY29sbGVjdGlvblxuICAgKiBpcyBub3QgYWN0aXZlIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBnZXQgbWV0cmljcygpOiBMUlVDYWNoZU1ldHJpY3Mge1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBjb25zdCB7IGhpdHMgPSAwLCBtaXNzZXMgPSAwIH0gPSB0aGlzLl9tZXRyaWNzID8/IHt9O1xuICAgICAgY29uc3QgbG9va3VwcyA9IGhpdHMgKyBtaXNzZXM7XG4gICAgICBjb25zdCBoaXRSYXRlID0gbG9va3VwcyA9PT0gMCA/IDAgOiBoaXRzIC8gbG9va3VwcztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9va3VwcyxcbiAgICAgICAgaGl0czogaGl0cyxcbiAgICAgICAgbWlzc2VzOiBtaXNzZXMsXG4gICAgICAgIGNhcGFjaXR5OiB0aGlzLl9tYXhTaXplLFxuICAgICAgICBlbnRyaWVzOiB0aGlzLl9kYXRhLnNpemUsXG4gICAgICAgIGhpdFJhdGUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBzOiAwLFxuICAgICAgaGl0czogMCxcbiAgICAgIG1pc3NlczogMCxcbiAgICAgIGNhcGFjaXR5OiAwLFxuICAgICAgZW50cmllczogMCxcbiAgICAgIGhpdFJhdGU6IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSBmb3IgdGhpcyBpbnN0YW5jZS4gSW1tZWRpYXRlbHkgdHJpZ2dlcnMgYVxuICAgKiBwdXJnZSBvZiBjYWNoZWQgY29udGVudHMgaWYgdGhlIG5ldyBjYXBhY2l0eSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnRcbiAgICogbnVtYmVyIG9mIGNhY2hlZCBlbnRyaWVzLlxuICAgKi9cbiAgc2V0Q2FwYWNpdHkgPSAobWF4U2l6ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKG1heFNpemUgPD0gMCAmJiBfX0RFVl9fKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiW1BhbGV0dGUgTFJVIENhY2hlXSBDYWNoZSBzaXplIGlzIDw9IDAuIENhY2hlIGlzIGRpc2FibGVkLlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9tYXhTaXplID0gbWF4U2l6ZTtcbiAgICB0aGlzLl90cmltKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgdmFsdWUgZnJvbSB0aGUgY2FjaGUsIHJldHVybmluZyBgdW5kZWZpbmVkYCBpZiBubyB2YWx1ZSB3YXMgZm91bmRcbiAgICovXG4gIGdldChrZXk6IEspOiBWIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEuZ2V0KGtleSk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbWV0cmljcy5taXNzZXMgKz0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVsZXRlIGFuZCByZS1zZXQgdGhlIHZhbHVlIHRvIG1vdmUgdGhlIGtleSB0byB0aGUgZW5kIG9mIHRoZSBrZXkgbGlzdFxuICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcy5oaXRzICs9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGluIHRoZSBjYWNoZS4gVGhpcyBhbHNvIG1vdmVzIHRoZSB2YWx1ZSB0byB0aGUgYmFjayBvZiB0aGUgbGlzdFxuICAgKiBvZiB2YWx1ZXMgdG8gY29uc2lkZXIgZXZpY3Rpbmcgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC5cbiAgICovXG4gIHNldChrZXk6IEssIHZhbHVlOiBWKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGlmIGV4aXN0cyB0byB1cGRhdGUgcG9zaXRpb25cbiAgICBpZiAodGhpcy5fZGF0YS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhLnNldChrZXksIHZhbHVlKTtcblxuICAgIGlmICh0aGlzLl9kYXRhLnNpemUgPiB0aGlzLl9tYXhTaXplKSB7XG4gICAgICB0aGlzLl90cmltKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjb250ZW50cyBvZiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIGNhY2hlIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLnNpemU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTFJVQ2FjaGU7XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IExSVUNhY2hlIGZyb20gXCIuL2xydS1jYWNoZVwiO1xuXG5leHBvcnQgY29uc3QgZnJhZ21lbnRDYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmcsIERvY3VtZW50RnJhZ21lbnQ+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBodG1sVG9GcmFnbWVudChodG1sOiBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgbG9va3VwID0gZnJhZ21lbnRDYWNoZS5nZXQoaHRtbCk7XG5cbiAgaWYgKGxvb2t1cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGxvb2t1cC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgfVxuXG4gIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gIHRlbXAuaW5uZXJIVE1MID0gaHRtbDtcbiAgZnJhZ21lbnRDYWNoZS5zZXQoaHRtbCwgdGVtcC5jb250ZW50KTtcbiAgcmV0dXJuIHRlbXAuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIHRhZyBuYW1lIGZvciB1c2UgaW4gYSB0ZXN0IGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNvbnN0IHJhbmRvbVRhZ05hbWUgPSAoKSA9PiB7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5yZXBsYWNlQWxsKFwiLVwiLCBcIlwiKS5zbGljZSgwLCAxMCk7XG4gIHJldHVybiBgdGVzdC1lbGVtZW50LSR7aWR9YDtcbn07XG4iLAogICAgIi8qXG4gKiBDb3B5cmlnaHQgwqkgUnVzdGljIEFyY2FkZSwgTExDIDIwMjZcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IGFwcGx5QXR0cmlidXRlTWFwLCBjcmVhdGVBdHRyaWJ1dGVNYXAgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IHJhbmRvbVRhZ05hbWUgfSBmcm9tIFwiLi90YWdzXCI7XG5cbi8qKlxuICogUmVuZGVyIGEgUGFsZXR0ZSBDb21wb25lbnQgY2xhc3MgYXMgYSB0ZXN0IGVsZW1lbnRcbiAqXG4gKiBJZiB0aGUgY2xhc3MgaXMgbm90IHlldCByZWdpc3RlcmVkLCBpdCBpcyBhdXRvLXJlZ2lzdGVyZWQgYmVmb3JlIGNyZWF0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogdGVzdChcImNvbXBvbmVudCBkb2VzIHNvbWV0aGluZ1wiLCBhc3luYyAoKSA9PiB7XG4gKiAgIGxldCBzb21ldGhpbmdNb2NrID0gbW9jaygpO1xuICpcbiAqICAgY2xhc3MgTXlUZXN0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAqICAgICBzY3JpcHQoKSB7XG4gKiAgICAgICBzb21ldGhpbmdNb2NrKCk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBhd2FpdCByZW5kZXJUZXN0Q29tcG9uZW50KE15VGVzdENvbXBvbmVudCk7XG4gKiAgIGV4cGVjdChzb21ldGhpbmdNb2NrKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCBjbGFzcyB0byByZWdpc3RlciBhbmQgY3JlYXRlXG4gKiBAcGFyYW0gYXR0cmlidXRlcyBBIHJlY29yZCBvZiBhdHRyaWJ1dGVzIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZWQgQ29tcG9uZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJUZXN0Q29tcG9uZW50PEUgZXh0ZW5kcyB0eXBlb2YgQ29tcG9uZW50PGFueT4+KFxuICBjb21wb25lbnQ6IEUsXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFByb21pc2U8SW5zdGFuY2VUeXBlPEU+PiB7XG4gIC8vIEVycm9yIGVhcmx5IGlmIG1pc2NvbmZpZ3VyZWRcbiAgaWYgKFxuICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICB0eXBlb2Ygd2luZG93LmN1c3RvbUVsZW1lbnRzID09PSBcInVuZGVmaW5lZFwiXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiRmFpbGVkIHRvIHJlbmRlciB0ZXN0IGNvbXBvbmVudDogXCIgK1xuICAgICAgICBcIndpbmRvdy5jdXN0b21FbGVtZW50cyBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVzZVRhZ25hbWUgPVxuICAgIGNvbXBvbmVudC50YWdOYW1lID09PSBcIlwiID8gcmFuZG9tVGFnTmFtZSgpIDogY29tcG9uZW50LnRhZ05hbWU7XG5cbiAgLy8gUmVhc3NpZ24gdGhlIHRhZ25hbWUgYmFjayB0byB0aGUgY29tcG9uZW50IHRvIGVuc3VyZSBpdCBpcyBzZXQgYmVmb3JlIHJlZ2lzdHJhdGlvblxuICBjb21wb25lbnQudGFnTmFtZSA9IHVzZVRhZ25hbWU7XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGNvbXBvbmVudCBpZiBuZWVkIGJlXG4gIGlmICghY3VzdG9tRWxlbWVudHMuZ2V0KHVzZVRhZ25hbWUpKSB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKFxuICAgICAgdXNlVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyB1bmtub3duIGFzIEN1c3RvbUVsZW1lbnRDb25zdHJ1Y3RvcixcbiAgICApO1xuICB9XG5cbiAgLy8gQ29uc3RydWN0IGEgdGVzdCBpbnN0YW5jZVxuICBjb25zdCAkY29tcG9uZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnQudGFnTmFtZSk7XG5cbiAgLy8gQXBwbHkgYXR0cmlidXRlcyBiZWZvcmUgcmVuZGVyaW5nXG4gIGNvbnN0IGF0dHJpYnV0ZU1hcCA9IGNyZWF0ZUF0dHJpYnV0ZU1hcChhdHRyaWJ1dGVzID8/IHt9KTtcbiAgYXBwbHlBdHRyaWJ1dGVNYXAoJGNvbXBvbmVudCwgYXR0cmlidXRlTWFwKTtcblxuICAvLyBSZW5kZXIgYW5kIGF3YWl0IHRvIGFsbG93IG1pY3JvdGFza3MgdG8gc2V0dGxlXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kKCRjb21wb25lbnQpO1xuICBhd2FpdCBCdW4uc2xlZXAoMSk7XG5cbiAgLy8gUmV0dXJuIHRoZSByZW5kZXJlZCBpbnN0YW5jZVxuICByZXR1cm4gJGNvbXBvbmVudCBhcyBJbnN0YW5jZVR5cGU8RT47XG59XG5cbi8qKlxuICogRm9yY2UgYSByZW5kZXIgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gKlxuICogUmV0dXJucyBhIHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcmVuZGVyIGhhcyBjb21wbGV0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcmVuZGVyVGVzdENvbXBvbmVudChlbGVtZW50OiBDb21wb25lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgZWxlbWVudC5yZXF1ZXN0UmVuZGVyKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IEJ1bi5zbGVlcCgxKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOztB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
|
package/package.json
CHANGED
|
@@ -1,13 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rusticarcade/palette",
|
|
3
|
+
"version": "0.3.1",
|
|
3
4
|
"description": "Native web development, but make it joyful",
|
|
4
|
-
"
|
|
5
|
-
|
|
5
|
+
"keywords": [
|
|
6
|
+
"palette",
|
|
7
|
+
"component",
|
|
8
|
+
"web components",
|
|
9
|
+
"template",
|
|
10
|
+
"state",
|
|
11
|
+
"ui",
|
|
12
|
+
"framework"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://palette.camp",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://git.astral.camp/rusticarcade/palette/issues",
|
|
17
|
+
"email": "palette@endeavorance.camp"
|
|
18
|
+
},
|
|
19
|
+
"license": "MPL-2.0",
|
|
20
|
+
"author": {
|
|
21
|
+
"name": "endeavorance",
|
|
22
|
+
"url": "https://endeavorance.camp",
|
|
23
|
+
"email": "hello@endeavorance.camp"
|
|
24
|
+
},
|
|
25
|
+
"funding": [
|
|
26
|
+
{
|
|
27
|
+
"type": "patreon",
|
|
28
|
+
"url": "https://patreon.com/endeavorance"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
6
31
|
"files": [
|
|
7
32
|
"dist/prod",
|
|
8
|
-
"dist/dev"
|
|
33
|
+
"dist/dev",
|
|
34
|
+
"dist/test"
|
|
9
35
|
],
|
|
10
|
-
"types": "./dist/prod/index.d.ts",
|
|
11
36
|
"exports": {
|
|
12
37
|
".": {
|
|
13
38
|
"import": {
|
|
@@ -17,14 +42,16 @@
|
|
|
17
42
|
"default": "./dist/prod/index.js"
|
|
18
43
|
}
|
|
19
44
|
},
|
|
45
|
+
"./test": {
|
|
46
|
+
"import": {
|
|
47
|
+
"types": "./dist/test/index.d.ts",
|
|
48
|
+
"default": "./dist/test/index.js"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
20
51
|
"./package.json": "./package.json"
|
|
21
52
|
},
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"name": "endeavorance",
|
|
25
|
-
"url": "https://endeavorance.camp",
|
|
26
|
-
"email": "hello@endeavorance.camp"
|
|
27
|
-
},
|
|
53
|
+
"type": "module",
|
|
54
|
+
"types": "./dist/prod/index.d.ts",
|
|
28
55
|
"repository": {
|
|
29
56
|
"type": "git",
|
|
30
57
|
"url": "https://git.astral.camp/rusticarcade/palette"
|