@openelement/element 0.41.0-alpha.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.
@@ -0,0 +1,419 @@
1
+ /**
2
+ * @openelement/element - OpenElement base class.
3
+ *
4
+ * Zero-dependency Custom Element base class providing:
5
+ * - Declarative Shadow DOM (DSD) detection at upgrade time
6
+ * - Client-Side Rendering (CSR) fallback when no DSD content exists
7
+ * - StyleSheet (SSR-safe CSSStyleSheet) via adoptedStyleSheets
8
+ * - Declarative event binding via html template @click / @keydown etc.
9
+ * - Signal-driven fine-grained DOM patching via data-signal markers
10
+ * - AbortController cleanup on disconnect
11
+ * - formAssociated + delegatesFocus support
12
+ *
13
+ * OpenElement extends HTMLElement directly - ZERO Lit dependency.
14
+ * Components return `render(): VNode | null`.
15
+ *
16
+ * Lifecycle:
17
+ * SSR: instantiate -> set props -> render() -> wrap in DSD template
18
+ * Client (DSD): browser attaches shadow root from DSD -> upgrade -> bind template events
19
+ * Client (CSR): connectedCallback -> createRenderRoot -> render into shadowRoot
20
+ *
21
+ * Usage (static DSD component):
22
+ * ```ts
23
+ * class MyCard extends OpenElement {
24
+ * static styles = myStyleSheet;
25
+ * render(): VNode {
26
+ * return <div class="card"><slot /></div>;
27
+ * }
28
+ * }
29
+ * customElements.define('my-card', MyCard);
30
+ * ```
31
+ *
32
+ * Usage (reactive DSD component):
33
+ * ```ts
34
+ * class MyToggle extends OpenElement {
35
+ * #active = signal(false);
36
+ * render() {
37
+ * return (
38
+ * <button onClick={() => this.#active.value = !this.#active.value}>
39
+ * {this.#active.value ? 'ON' : 'OFF'}
40
+ * </button>
41
+ * );
42
+ * }
43
+ * }
44
+ * ```
45
+ *
46
+ * @module @openelement/element/open-element
47
+ */ import { formatError } from '@openelement/core/errors';
48
+ import { disposeStaticProps, handleStaticPropAttributeChange, initializeStaticProps, syncStaticPropsFromAttributes } from '@openelement/core/prop';
49
+ import { signal } from '@openelement/signal';
50
+ import { createLogger } from '@openelement/core/logger';
51
+ import { disposeRenderBindings, renderErrorFallback, renderIntoLightDom, renderIntoShadowRoot } from './open-element-render.js';
52
+ import { hydrateExistingDom, hydrateSignals } from './open-element-hydration.js';
53
+ /**
54
+ * SSR-safe base class for OpenElement.
55
+ *
56
+ * In browser: extends HTMLElement directly.
57
+ * In SSR: assigns a minimal stub to globalThis.HTMLElement so the entire
58
+ * dependency graph shares the same base class.
59
+ */ const _Base = typeof HTMLElement !== 'undefined' ? HTMLElement : class {
60
+ hasAttribute(_name) {
61
+ return false;
62
+ }
63
+ getAttribute(_name) {
64
+ return null;
65
+ }
66
+ setAttribute(_name, _value) {}
67
+ removeAttribute(_name) {}
68
+ get tagName() {
69
+ return '';
70
+ }
71
+ get isConnected() {
72
+ return false;
73
+ }
74
+ };
75
+ // In SSR, assign globalThis.HTMLElement so other code can reference it
76
+ if (typeof HTMLElement === 'undefined') {
77
+ globalThis.HTMLElement = _Base;
78
+ }
79
+ /**
80
+ * Zero-dependency Custom Element base class for DSD rendering.
81
+ *
82
+ * Provides DSD detection, CSR fallback, event hydration, and style management
83
+ * without any framework dependency (no Lit, no reactive-element).
84
+ *
85
+ * Subclasses MUST override `render(): VNode | null`.
86
+ */ export class OpenElement extends _Base {
87
+ /** Component stylesheets (SSR-safe - StyleSheet delegates to native CSSStyleSheet in browser). */ static styles;
88
+ /** Rendering mode. Defaults to shadow/DSD; light DOM is explicit opt-in. */ static renderMode;
89
+ /** v0.25.0: Page head metadata. SSG reads this to inject <title> and <meta> tags. */ static head;
90
+ /** @internal — use openPipeline({ island: { upgradeStrategy } }) instead */ static client;
91
+ /**
92
+ * Attributes that trigger attributeChangedCallback.
93
+ * Subclasses override this to declare reactive attributes.
94
+ */ static observedAttributes;
95
+ /**
96
+ * Whether to delegate focus within the shadow root.
97
+ * When true, attachShadow is called with `delegatesFocus: true`.
98
+ */ static delegatesFocus;
99
+ /**
100
+ * Whether this element participates in form submission.
101
+ * When true, ElementInternals are attached in connectedCallback.
102
+ */ static formAssociated;
103
+ /**
104
+ * Effect dispose tracking (ADR-0065).
105
+ * Replaces effectScope() — effects are created at top level
106
+ * so they fire on signal changes. Disposed as a batch in
107
+ * disconnectedCallback.
108
+ */ #effectDisposers = new Set();
109
+ /** v0.28 (ADR-0067): Event listener cleanup tracking for _hydrateSignals(). */ #eventCleanups = [];
110
+ /** v0.28.1: Cached VNode from render() — avoids double-render mismatch between SSR and hydration. */ #vnodeCache = undefined;
111
+ #vnodeCacheValid = false;
112
+ /**
113
+ * Signal registry for attribute-based hydration (ADR-0065).
114
+ * Maps signal names → signal objects. Built by registerSignal()
115
+ * in component constructors, consumed during hydration.
116
+ *
117
+ * Exposed internally for render helper modules.
118
+ */ signalRegistry = new Map();
119
+ /**
120
+ * Register a signal for hydration by name.
121
+ * Call in constructor: this.registerSignal('count', this.#count);
122
+ */ registerSignal(name, sig) {
123
+ this.signalRegistry.set(name, sig);
124
+ }
125
+ /** Reactive route parameters Signal. Updates automatically on SPA navigation. */ #params = signal({});
126
+ /** Reactive route parameters. Updates automatically on SPA navigation. */ get params() {
127
+ return this.#params.value;
128
+ }
129
+ set params(value) {
130
+ this.#params.value = {
131
+ ...value
132
+ };
133
+ }
134
+ /** ElementInternals for form-associated custom elements */ _internals;
135
+ /**
136
+ * Create or reuse the shadow root.
137
+ *
138
+ * DSD detection: if `this.shadowRoot` already exists and has nodes,
139
+ * the browser pre-populated it from a <template shadowrootmode> tag.
140
+ * In that case we mark `_dsdHydrated = true` and return the existing root.
141
+ *
142
+ * CSR fallback: if no shadow root exists, we call `attachShadow()`. If an
143
+ * empty shadow root already exists, we reuse it and let connectedCallback()
144
+ * populate it from render().
145
+ *
146
+ * @returns The existing or newly created ShadowRoot.
147
+ */ createRenderRoot() {
148
+ const ctor = this.constructor;
149
+ if (ctor.renderMode === 'light') {
150
+ return this;
151
+ }
152
+ // DSD pre-populated shadow root detection
153
+ if (this.shadowRoot) {
154
+ this._applyStyles(ctor, this.shadowRoot);
155
+ return this.shadowRoot;
156
+ }
157
+ // CSR: create a new shadow root
158
+ const delegatesFocus = ctor.delegatesFocus ?? false;
159
+ const root = this.attachShadow({
160
+ mode: 'open',
161
+ delegatesFocus
162
+ });
163
+ // Apply static styles via adoptedStyleSheets
164
+ this._applyStyles(ctor, root);
165
+ return root;
166
+ }
167
+ /**
168
+ * Apply static styles to the shadow root via adoptedStyleSheets.
169
+ * Shared between CSR (createRenderRoot) and DSD (connectedCallback) paths.
170
+ */ _applyStyles(ctor, root) {
171
+ const target = root ?? this.shadowRoot;
172
+ if (!target || !ctor.styles) return;
173
+ const sheets = Array.isArray(ctor.styles) ? ctor.styles : [
174
+ ctor.styles
175
+ ];
176
+ if (sheets.length > 0) {
177
+ // StyleSheet delegates to native CSSStyleSheet in browser
178
+ // type-escape: adoptedStyleSheets may not be in the configured DOM lib
179
+ target.adoptedStyleSheets = sheets;
180
+ }
181
+ }
182
+ /**
183
+ * Lifecycle: called when the element is connected to the DOM.
184
+ *
185
+ * DSD path (_dsdHydrated = true):
186
+ * - Calls _hydrateEvents() to bind declarative events on existing DOM.
187
+ *
188
+ * CSR path (_dsdHydrated = false):
189
+ * - Calls createRenderRoot() if no shadow root exists.
190
+ * - Renders this.render() through the VNode DOM renderer.
191
+ *
192
+ * If formAssociated is true, ElementInternals are attached.
193
+ */ connectedCallback() {
194
+ const ctor = this.constructor;
195
+ // v0.24.1 (ADR-0057): Initialize static props signals and accessors
196
+ initializeStaticProps(this);
197
+ syncStaticPropsFromAttributes(this);
198
+ const isLightDom = ctor.renderMode === 'light';
199
+ // Ensure render target exists and detect DSD pre-population
200
+ if (!this.shadowRoot && !isLightDom) {
201
+ this.createRenderRoot();
202
+ } else if (this.shadowRoot) {
203
+ // DSD path: shadow root already populated.
204
+ this.style.display = 'block';
205
+ this._applyStyles(ctor);
206
+ }
207
+ // Sync data-theme from document root
208
+ const docTheme = document.documentElement?.dataset?.theme;
209
+ if (docTheme && !this.hasAttribute('data-theme')) {
210
+ this.setAttribute('data-theme', docTheme);
211
+ }
212
+ // TG-01: Read route params from attribute if present.
213
+ // (SSR/SSG injects params as JS property via injectProps — setter handles it)
214
+ const attrParams = this.getAttribute('params');
215
+ if (attrParams) {
216
+ try {
217
+ this.#params.value = JSON.parse(attrParams);
218
+ } catch {}
219
+ }
220
+ // v0.25.0 (SOP-012): Unified render path — DSD and CSR both go through
221
+ // _renderOrHydrate(). The _dsdHydrated flag and _bindCurrentRenderTemplate()
222
+ // are removed. DSD pre-populated DOM is preserved; only events and signal
223
+ // subscriptions are added.
224
+ this._renderOrHydrate();
225
+ // v0.40.0: Client-side activation hook for framework hydration
226
+ this.clientActivate();
227
+ // Attach ElementInternals for form-associated custom elements
228
+ if (ctor.formAssociated && typeof this.attachInternals === 'function') {
229
+ this._internals = this.attachInternals();
230
+ }
231
+ }
232
+ /**
233
+ * v0.25.0 (SOP-012): Unified render path.
234
+ */ _renderOrHydrate() {
235
+ try {
236
+ const ctor = this.constructor;
237
+ if (ctor.renderMode === 'light') {
238
+ this._renderIntoLightDom();
239
+ this.onCsrRendered();
240
+ return;
241
+ }
242
+ const isDsd = this.shadowRoot && this.shadowRoot.childNodes.length > 0;
243
+ if (isDsd) {
244
+ // DSD: DOM already correct — bind events via VNode walk
245
+ this._hydrateExistingDom();
246
+ this.onDsdHydrated();
247
+ } else if (this.shadowRoot) {
248
+ // CSR: full render from VNode
249
+ this._renderIntoShadowRoot();
250
+ this.onCsrRendered();
251
+ }
252
+ } catch (err) {
253
+ this._renderErrorFallback(err);
254
+ }
255
+ }
256
+ /**
257
+ * v0.28 (ADR-0067): Signal-native hydration.
258
+ *
259
+ * Replaces _walkAndBind() — reads data-signal markers
260
+ * from DSD shadow root and creates direct signal→DOM effect bindings.
261
+ * No position matching, no childNodes filtering, no VNode traversal.
262
+ *
263
+ * Effects are tracked in #effectDisposers for batch cleanup.
264
+ * VNode event marker listeners are tracked in #eventCleanups.
265
+ *
266
+ * Implementation lives in open-element-hydration.ts.
267
+ */ _hydrateSignals() {
268
+ if (!this.shadowRoot) return;
269
+ hydrateSignals(this, this.shadowRoot, this.signalRegistry, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
270
+ }
271
+ /**
272
+ * Hydrate DSD DOM with signal and event bindings.
273
+ *
274
+ * v0.28 (ADR-0067): Delegates to _hydrateSignals().
275
+ * _walkAndBind position matching is DELETED.
276
+ *
277
+ * Implementation lives in open-element-hydration.ts.
278
+ */ _hydrateExistingDom() {
279
+ this.#eventCleanups = hydrateExistingDom(this, this.signalRegistry, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
280
+ }
281
+ /**
282
+ * v0.23.0: Hook called after DSD hydration completes.
283
+ *
284
+ * Subclasses override this instead of relying on fragile
285
+ * `super.connectedCallback()` call order. At this point the
286
+ * shadow DOM is populated from DSD and declarative events
287
+ * (@click, @keydown) are bound.
288
+ *
289
+ * No-op by default.
290
+ */ onDsdHydrated() {}
291
+ /**
292
+ * v0.23.0: Hook called after CSR first render completes.
293
+ *
294
+ * Subclasses override this for post-render initialization
295
+ * that depends on the shadow DOM being populated. At this
296
+ * point render() has been called and declarative events
297
+ * are bound.
298
+ *
299
+ * No-op by default.
300
+ */ onCsrRendered() {}
301
+ /**
302
+ * v0.40.0: Client-side activation hook.
303
+ *
304
+ * Called once after the element is connected, the shadow root
305
+ * is ready, and any DSD hydration or CSR rendering has completed.
306
+ * This is the right place for framework hydration (Preact, React,
307
+ * Vue, Lit) to take over the shadow DOM.
308
+ *
309
+ * Default implementation is a no-op. Subclasses override this to
310
+ * hydrate or render framework components into the shadow root.
311
+ */ clientActivate() {
312
+ // default no-op
313
+ }
314
+ /**
315
+ * Hook called when the unified client render/hydrate path throws.
316
+ * Subclasses may return a VNode fallback.
317
+ */ onRenderError(error) {
318
+ createLogger('dsd').error(`<${this.tagName.toLowerCase()}> render/hydrate failed: ${formatError(error)}`);
319
+ return null;
320
+ }
321
+ _renderErrorFallback(error) {
322
+ this.#eventCleanups = renderErrorFallback(this, error, this.#effectDisposers, this.#eventCleanups, (err)=>this.onRenderError(err));
323
+ }
324
+ /**
325
+ * Lifecycle: called when the element is disconnected from the DOM.
326
+ * Aborts all hydration event listeners for cleanup.
327
+ */ disconnectedCallback() {
328
+ this.#eventCleanups = disposeRenderBindings(this.#effectDisposers, this.#eventCleanups);
329
+ disposeStaticProps(this);
330
+ }
331
+ // v0.28 (ADR-0067): Effect + event lifecycle managed by Set/Array.
332
+ // _walkAndBind DELETED — replaced by _hydrateSignals().
333
+ /**
334
+ * Lifecycle: called when an observed attribute changes.
335
+ *
336
+ * Base implementation is a no-op. Subclasses override this to react
337
+ * to attribute changes, typically by calling `this.render()` to update
338
+ * the shadow DOM.
339
+ *
340
+ * @param name - Attribute name (lowercase).
341
+ * @param oldValue - Previous value, or null if the attribute was not set.
342
+ * @param newValue - New value, or null if the attribute was removed.
343
+ */ attributeChangedCallback(_name, _oldValue, _newValue) {
344
+ // v0.24.1 (ADR-0057): Route to static props handler
345
+ handleStaticPropAttributeChange(this, _name, _oldValue, _newValue);
346
+ // Subclass override point - base implementation is intentionally empty.
347
+ }
348
+ /**
349
+ * Re-render the shadow DOM from `render()` and re-bind declarative events.
350
+ *
351
+ * OpenElement intentionally does not include a reactive scheduler. Components
352
+ * with local state can call this method after state changes instead of
353
+ * duplicating renderToDom() and event hydration.
354
+ */ update() {
355
+ const ctor = this.constructor;
356
+ if (ctor.renderMode === 'light') {
357
+ this._renderIntoLightDom();
358
+ return;
359
+ }
360
+ this._renderIntoShadowRoot();
361
+ }
362
+ /**
363
+ * ReactiveController-compatible update hook.
364
+ *
365
+ * Async state controllers call this method when state changes. Keeping this
366
+ * tiny alias lets OpenElement host controllers without inheriting Lit or a
367
+ * scheduler.
368
+ */ requestUpdate() {
369
+ this.update();
370
+ }
371
+ _renderIntoLightDom() {
372
+ this.#eventCleanups = renderIntoLightDom(this, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
373
+ }
374
+ _renderIntoShadowRoot() {
375
+ this.#eventCleanups = renderIntoShadowRoot(this, this.#effectDisposers, this.#eventCleanups, this.#cacheAccess());
376
+ }
377
+ /**
378
+ * Accessor for the private VNode cache used by extracted render/hydration
379
+ * helpers. Keeps #vnodeCache / #vnodeCacheValid encapsulated while allowing
380
+ * the logic to live in separate modules.
381
+ */ #cacheAccess() {
382
+ return {
383
+ get: ()=>({
384
+ vnode: this.#vnodeCache,
385
+ valid: this.#vnodeCacheValid
386
+ }),
387
+ set: (vnode)=>{
388
+ this.#vnodeCache = vnode;
389
+ this.#vnodeCacheValid = true;
390
+ }
391
+ };
392
+ }
393
+ /**
394
+ * Read locale from JS property (set by SSR injectProps) first,
395
+ * then HTML attribute, then fallback to provided default.
396
+ *
397
+ * SSR injectProps() sets camelCase JS properties (e.g. this.locale = 'en')
398
+ * but getAttribute() only reads HTML attributes, which remain null.
399
+ * This method resolves the mismatch by checking JS property first.
400
+ *
401
+ * @param fallback - Default value when neither source has a value. Defaults to 'en'.
402
+ */ _getLocale(fallback = 'en') {
403
+ const prop = this.locale;
404
+ if (typeof prop === 'string' && prop) return prop;
405
+ return this.getAttribute('locale') || fallback;
406
+ }
407
+ /**
408
+ * Return Shadow DOM content as a VNode.
409
+ *
410
+ * Subclasses MUST override this method. During SSR, rendered content is
411
+ * wrapped in a <template shadowrootmode="open"> tag. During CSR, VNode values
412
+ * are rendered via renderToDom() with event binding and signal tracking.
413
+ *
414
+ * @returns VNode for the shadow DOM content, or null for empty content.
415
+ */ render() {
416
+ return null;
417
+ }
418
+ }
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy9vcGVuLWVsZW1lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAb3BlbmVsZW1lbnQvZWxlbWVudCAtIE9wZW5FbGVtZW50IGJhc2UgY2xhc3MuXG4gKlxuICogWmVyby1kZXBlbmRlbmN5IEN1c3RvbSBFbGVtZW50IGJhc2UgY2xhc3MgcHJvdmlkaW5nOlxuICogICAtIERlY2xhcmF0aXZlIFNoYWRvdyBET00gKERTRCkgZGV0ZWN0aW9uIGF0IHVwZ3JhZGUgdGltZVxuICogICAtIENsaWVudC1TaWRlIFJlbmRlcmluZyAoQ1NSKSBmYWxsYmFjayB3aGVuIG5vIERTRCBjb250ZW50IGV4aXN0c1xuICogICAtIFN0eWxlU2hlZXQgKFNTUi1zYWZlIENTU1N0eWxlU2hlZXQpIHZpYSBhZG9wdGVkU3R5bGVTaGVldHNcbiAqICAgLSBEZWNsYXJhdGl2ZSBldmVudCBiaW5kaW5nIHZpYSBodG1sIHRlbXBsYXRlIEBjbGljayAvIEBrZXlkb3duIGV0Yy5cbiAqICAgLSBTaWduYWwtZHJpdmVuIGZpbmUtZ3JhaW5lZCBET00gcGF0Y2hpbmcgdmlhIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAqICAgLSBBYm9ydENvbnRyb2xsZXIgY2xlYW51cCBvbiBkaXNjb25uZWN0XG4gKiAgIC0gZm9ybUFzc29jaWF0ZWQgKyBkZWxlZ2F0ZXNGb2N1cyBzdXBwb3J0XG4gKlxuICogT3BlbkVsZW1lbnQgZXh0ZW5kcyBIVE1MRWxlbWVudCBkaXJlY3RseSAtIFpFUk8gTGl0IGRlcGVuZGVuY3kuXG4gKiBDb21wb25lbnRzIHJldHVybiBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKlxuICogTGlmZWN5Y2xlOlxuICogICBTU1I6IGluc3RhbnRpYXRlIC0+IHNldCBwcm9wcyAtPiByZW5kZXIoKSAtPiB3cmFwIGluIERTRCB0ZW1wbGF0ZVxuICogICBDbGllbnQgKERTRCk6IGJyb3dzZXIgYXR0YWNoZXMgc2hhZG93IHJvb3QgZnJvbSBEU0QgLT4gdXBncmFkZSAtPiBiaW5kIHRlbXBsYXRlIGV2ZW50c1xuICogICBDbGllbnQgKENTUik6IGNvbm5lY3RlZENhbGxiYWNrIC0+IGNyZWF0ZVJlbmRlclJvb3QgLT4gcmVuZGVyIGludG8gc2hhZG93Um9vdFxuICpcbiAqIFVzYWdlIChzdGF0aWMgRFNEIGNvbXBvbmVudCk6XG4gKiBgYGB0c1xuICogY2xhc3MgTXlDYXJkIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICBzdGF0aWMgc3R5bGVzID0gbXlTdHlsZVNoZWV0O1xuICogICByZW5kZXIoKTogVk5vZGUge1xuICogICAgIHJldHVybiA8ZGl2IGNsYXNzPVwiY2FyZFwiPjxzbG90IC8+PC9kaXY+O1xuICogICB9XG4gKiB9XG4gKiBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ215LWNhcmQnLCBNeUNhcmQpO1xuICogYGBgXG4gKlxuICogVXNhZ2UgKHJlYWN0aXZlIERTRCBjb21wb25lbnQpOlxuICogYGBgdHNcbiAqIGNsYXNzIE15VG9nZ2xlIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICogICAjYWN0aXZlID0gc2lnbmFsKGZhbHNlKTtcbiAqICAgcmVuZGVyKCkge1xuICogICAgIHJldHVybiAoXG4gKiAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHRoaXMuI2FjdGl2ZS52YWx1ZSA9ICF0aGlzLiNhY3RpdmUudmFsdWV9PlxuICogICAgICAgICB7dGhpcy4jYWN0aXZlLnZhbHVlID8gJ09OJyA6ICdPRkYnfVxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogQG1vZHVsZSBAb3BlbmVsZW1lbnQvZWxlbWVudC9vcGVuLWVsZW1lbnRcbiAqL1xuXG5pbXBvcnQgeyBmb3JtYXRFcnJvciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcbmltcG9ydCB7XG4gIGRpc3Bvc2VTdGF0aWNQcm9wcyxcbiAgaGFuZGxlU3RhdGljUHJvcEF0dHJpYnV0ZUNoYW5nZSxcbiAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzLFxuICBzeW5jU3RhdGljUHJvcHNGcm9tQXR0cmlidXRlcyxcbn0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvcHJvcCc7XG5pbXBvcnQgdHlwZSB7IFZOb2RlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3Zub2RlJztcbmltcG9ydCB0eXBlIHsgU2lnbmFsIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3NpZ25hbCc7XG5pbXBvcnQgeyBzaWduYWwgfSBmcm9tICdAb3BlbmVsZW1lbnQvc2lnbmFsJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL2xvZ2dlcic7XG5pbXBvcnQge1xuICBkaXNwb3NlUmVuZGVyQmluZGluZ3MsXG4gIHJlbmRlckVycm9yRmFsbGJhY2ssXG4gIHJlbmRlckludG9MaWdodERvbSxcbiAgcmVuZGVySW50b1NoYWRvd1Jvb3QsXG4gIHR5cGUgVk5vZGVDYWNoZUFjY2Vzcyxcbn0gZnJvbSAnLi9vcGVuLWVsZW1lbnQtcmVuZGVyLmpzJztcbmltcG9ydCB7IGh5ZHJhdGVFeGlzdGluZ0RvbSwgaHlkcmF0ZVNpZ25hbHMgfSBmcm9tICcuL29wZW4tZWxlbWVudC1oeWRyYXRpb24uanMnO1xuXG4vKipcbiAqIFNTUi1zYWZlIGJhc2UgY2xhc3MgZm9yIE9wZW5FbGVtZW50LlxuICpcbiAqIEluIGJyb3dzZXI6IGV4dGVuZHMgSFRNTEVsZW1lbnQgZGlyZWN0bHkuXG4gKiBJbiBTU1I6IGFzc2lnbnMgYSBtaW5pbWFsIHN0dWIgdG8gZ2xvYmFsVGhpcy5IVE1MRWxlbWVudCBzbyB0aGUgZW50aXJlXG4gKiBkZXBlbmRlbmN5IGdyYXBoIHNoYXJlcyB0aGUgc2FtZSBiYXNlIGNsYXNzLlxuICovXG5jb25zdCBfQmFzZSA9IHR5cGVvZiBIVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBIVE1MRWxlbWVudCA6IChjbGFzcyB7XG4gIGhhc0F0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldEF0dHJpYnV0ZShfbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0QXR0cmlidXRlKF9uYW1lOiBzdHJpbmcsIF92YWx1ZTogc3RyaW5nKTogdm9pZCB7fVxuICByZW1vdmVBdHRyaWJ1dGUoX25hbWU6IHN0cmluZyk6IHZvaWQge31cbiAgZ2V0IHRhZ05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgZ2V0IGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSBhcyB1bmtub3duIGFzIHR5cGVvZiBIVE1MRWxlbWVudCk7XG5cbi8vIEluIFNTUiwgYXNzaWduIGdsb2JhbFRoaXMuSFRNTEVsZW1lbnQgc28gb3RoZXIgY29kZSBjYW4gcmVmZXJlbmNlIGl0XG5pZiAodHlwZW9mIEhUTUxFbGVtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuSFRNTEVsZW1lbnQgPSBfQmFzZTtcbn1cblxuLyoqXG4gKiBaZXJvLWRlcGVuZGVuY3kgQ3VzdG9tIEVsZW1lbnQgYmFzZSBjbGFzcyBmb3IgRFNEIHJlbmRlcmluZy5cbiAqXG4gKiBQcm92aWRlcyBEU0QgZGV0ZWN0aW9uLCBDU1IgZmFsbGJhY2ssIGV2ZW50IGh5ZHJhdGlvbiwgYW5kIHN0eWxlIG1hbmFnZW1lbnRcbiAqIHdpdGhvdXQgYW55IGZyYW1ld29yayBkZXBlbmRlbmN5IChubyBMaXQsIG5vIHJlYWN0aXZlLWVsZW1lbnQpLlxuICpcbiAqIFN1YmNsYXNzZXMgTVVTVCBvdmVycmlkZSBgcmVuZGVyKCk6IFZOb2RlIHwgbnVsbGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVuRWxlbWVudCBleHRlbmRzIF9CYXNlIHtcbiAgLyoqIENvbXBvbmVudCBzdHlsZXNoZWV0cyAoU1NSLXNhZmUgLSBTdHlsZVNoZWV0IGRlbGVnYXRlcyB0byBuYXRpdmUgQ1NTU3R5bGVTaGVldCBpbiBicm93c2VyKS4gKi9cbiAgc3RhdGljIHN0eWxlcz86IFN0eWxlU2hlZXRMaWtlIHwgU3R5bGVTaGVldExpa2VbXTtcblxuICAvKiogUmVuZGVyaW5nIG1vZGUuIERlZmF1bHRzIHRvIHNoYWRvdy9EU0Q7IGxpZ2h0IERPTSBpcyBleHBsaWNpdCBvcHQtaW4uICovXG4gIHN0YXRpYyByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuXG4gIC8qKiB2MC4yNS4wOiBQYWdlIGhlYWQgbWV0YWRhdGEuIFNTRyByZWFkcyB0aGlzIHRvIGluamVjdCA8dGl0bGU+IGFuZCA8bWV0YT4gdGFncy4gKi9cbiAgc3RhdGljIGhlYWQ/OiB7IHRpdGxlPzogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgb2dJbWFnZT86IHN0cmluZyB9O1xuXG4gIC8qKiBAaW50ZXJuYWwg4oCUIHVzZSBvcGVuUGlwZWxpbmUoeyBpc2xhbmQ6IHsgdXBncmFkZVN0cmF0ZWd5IH0gfSkgaW5zdGVhZCAqL1xuICBzdGF0aWMgY2xpZW50PzogeyBzdHJhdGVneT86ICdsb2FkJyB8ICdpZGxlJyB8ICd2aXNpYmxlJyB8ICdvbmx5JyB9O1xuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIHRoYXQgdHJpZ2dlciBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suXG4gICAqIFN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyB0byBkZWNsYXJlIHJlYWN0aXZlIGF0dHJpYnV0ZXMuXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZWdhdGUgZm9jdXMgd2l0aGluIHRoZSBzaGFkb3cgcm9vdC5cbiAgICogV2hlbiB0cnVlLCBhdHRhY2hTaGFkb3cgaXMgY2FsbGVkIHdpdGggYGRlbGVnYXRlc0ZvY3VzOiB0cnVlYC5cbiAgICovXG4gIHN0YXRpYyBkZWxlZ2F0ZXNGb2N1cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBlbGVtZW50IHBhcnRpY2lwYXRlcyBpbiBmb3JtIHN1Ym1pc3Npb24uXG4gICAqIFdoZW4gdHJ1ZSwgRWxlbWVudEludGVybmFscyBhcmUgYXR0YWNoZWQgaW4gY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICBzdGF0aWMgZm9ybUFzc29jaWF0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFZmZlY3QgZGlzcG9zZSB0cmFja2luZyAoQURSLTAwNjUpLlxuICAgKiBSZXBsYWNlcyBlZmZlY3RTY29wZSgpIOKAlCBlZmZlY3RzIGFyZSBjcmVhdGVkIGF0IHRvcCBsZXZlbFxuICAgKiBzbyB0aGV5IGZpcmUgb24gc2lnbmFsIGNoYW5nZXMuIERpc3Bvc2VkIGFzIGEgYmF0Y2ggaW5cbiAgICogZGlzY29ubmVjdGVkQ2FsbGJhY2suXG4gICAqL1xuICAjZWZmZWN0RGlzcG9zZXJzOiBTZXQ8KCkgPT4gdm9pZD4gPSBuZXcgU2V0KCk7XG5cbiAgLyoqIHYwLjI4IChBRFItMDA2Nyk6IEV2ZW50IGxpc3RlbmVyIGNsZWFudXAgdHJhY2tpbmcgZm9yIF9oeWRyYXRlU2lnbmFscygpLiAqL1xuICAjZXZlbnRDbGVhbnVwczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICAvKiogdjAuMjguMTogQ2FjaGVkIFZOb2RlIGZyb20gcmVuZGVyKCkg4oCUIGF2b2lkcyBkb3VibGUtcmVuZGVyIG1pc21hdGNoIGJldHdlZW4gU1NSIGFuZCBoeWRyYXRpb24uICovXG4gICN2bm9kZUNhY2hlOiB1bmtub3duID0gdW5kZWZpbmVkO1xuICAjdm5vZGVDYWNoZVZhbGlkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNpZ25hbCByZWdpc3RyeSBmb3IgYXR0cmlidXRlLWJhc2VkIGh5ZHJhdGlvbiAoQURSLTAwNjUpLlxuICAgKiBNYXBzIHNpZ25hbCBuYW1lcyDihpIgc2lnbmFsIG9iamVjdHMuIEJ1aWx0IGJ5IHJlZ2lzdGVyU2lnbmFsKClcbiAgICogaW4gY29tcG9uZW50IGNvbnN0cnVjdG9ycywgY29uc3VtZWQgZHVyaW5nIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogRXhwb3NlZCBpbnRlcm5hbGx5IGZvciByZW5kZXIgaGVscGVyIG1vZHVsZXMuXG4gICAqL1xuICBzaWduYWxSZWdpc3RyeTogTWFwPHN0cmluZywgU2lnbmFsPHVua25vd24+PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzaWduYWwgZm9yIGh5ZHJhdGlvbiBieSBuYW1lLlxuICAgKiBDYWxsIGluIGNvbnN0cnVjdG9yOiB0aGlzLnJlZ2lzdGVyU2lnbmFsKCdjb3VudCcsIHRoaXMuI2NvdW50KTtcbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlclNpZ25hbChuYW1lOiBzdHJpbmcsIHNpZzogU2lnbmFsPHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy5zaWduYWxSZWdpc3RyeS5zZXQobmFtZSwgc2lnKTtcbiAgfVxuXG4gIC8qKiBSZWFjdGl2ZSByb3V0ZSBwYXJhbWV0ZXJzIFNpZ25hbC4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICAjcGFyYW1zID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcblxuICAvKiogUmVhY3RpdmUgcm91dGUgcGFyYW1ldGVycy4gVXBkYXRlcyBhdXRvbWF0aWNhbGx5IG9uIFNQQSBuYXZpZ2F0aW9uLiAqL1xuICBnZXQgcGFyYW1zKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLiNwYXJhbXMudmFsdWU7XG4gIH1cblxuICBzZXQgcGFyYW1zKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy4jcGFyYW1zLnZhbHVlID0geyAuLi52YWx1ZSB9O1xuICB9XG5cbiAgLyoqIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHMgKi9cbiAgcHJvdGVjdGVkIF9pbnRlcm5hbHM/OiBFbGVtZW50SW50ZXJuYWxzO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgb3IgcmV1c2UgdGhlIHNoYWRvdyByb290LlxuICAgKlxuICAgKiBEU0QgZGV0ZWN0aW9uOiBpZiBgdGhpcy5zaGFkb3dSb290YCBhbHJlYWR5IGV4aXN0cyBhbmQgaGFzIG5vZGVzLFxuICAgKiB0aGUgYnJvd3NlciBwcmUtcG9wdWxhdGVkIGl0IGZyb20gYSA8dGVtcGxhdGUgc2hhZG93cm9vdG1vZGU+IHRhZy5cbiAgICogSW4gdGhhdCBjYXNlIHdlIG1hcmsgYF9kc2RIeWRyYXRlZCA9IHRydWVgIGFuZCByZXR1cm4gdGhlIGV4aXN0aW5nIHJvb3QuXG4gICAqXG4gICAqIENTUiBmYWxsYmFjazogaWYgbm8gc2hhZG93IHJvb3QgZXhpc3RzLCB3ZSBjYWxsIGBhdHRhY2hTaGFkb3coKWAuIElmIGFuXG4gICAqIGVtcHR5IHNoYWRvdyByb290IGFscmVhZHkgZXhpc3RzLCB3ZSByZXVzZSBpdCBhbmQgbGV0IGNvbm5lY3RlZENhbGxiYWNrKClcbiAgICogcG9wdWxhdGUgaXQgZnJvbSByZW5kZXIoKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGV4aXN0aW5nIG9yIG5ld2x5IGNyZWF0ZWQgU2hhZG93Um9vdC5cbiAgICovXG4gIGNyZWF0ZVJlbmRlclJvb3QoKTogU2hhZG93Um9vdCB8IHRoaXMge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcbiAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEU0QgcHJlLXBvcHVsYXRlZCBzaGFkb3cgcm9vdCBkZXRlY3Rpb25cbiAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICB0aGlzLl9hcHBseVN0eWxlcyhjdG9yLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvLyBDU1I6IGNyZWF0ZSBhIG5ldyBzaGFkb3cgcm9vdFxuICAgIGNvbnN0IGRlbGVnYXRlc0ZvY3VzID0gY3Rvci5kZWxlZ2F0ZXNGb2N1cyA/PyBmYWxzZTtcbiAgICBjb25zdCByb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicsIGRlbGVnYXRlc0ZvY3VzIH0pO1xuXG4gICAgLy8gQXBwbHkgc3RhdGljIHN0eWxlcyB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzXG4gICAgdGhpcy5fYXBwbHlTdHlsZXMoY3Rvciwgcm9vdCk7XG5cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBzdGF0aWMgc3R5bGVzIHRvIHRoZSBzaGFkb3cgcm9vdCB2aWEgYWRvcHRlZFN0eWxlU2hlZXRzLlxuICAgKiBTaGFyZWQgYmV0d2VlbiBDU1IgKGNyZWF0ZVJlbmRlclJvb3QpIGFuZCBEU0QgKGNvbm5lY3RlZENhbGxiYWNrKSBwYXRocy5cbiAgICovXG4gIHByaXZhdGUgX2FwcGx5U3R5bGVzKGN0b3I6IHR5cGVvZiBPcGVuRWxlbWVudCwgcm9vdD86IFNoYWRvd1Jvb3QpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSByb290ID8/IHRoaXMuc2hhZG93Um9vdDtcbiAgICBpZiAoIXRhcmdldCB8fCAhY3Rvci5zdHlsZXMpIHJldHVybjtcbiAgICBjb25zdCBzaGVldHMgPSBBcnJheS5pc0FycmF5KGN0b3Iuc3R5bGVzKSA/IGN0b3Iuc3R5bGVzIDogW2N0b3Iuc3R5bGVzXTtcbiAgICBpZiAoc2hlZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFN0eWxlU2hlZXQgZGVsZWdhdGVzIHRvIG5hdGl2ZSBDU1NTdHlsZVNoZWV0IGluIGJyb3dzZXJcbiAgICAgIC8vIHR5cGUtZXNjYXBlOiBhZG9wdGVkU3R5bGVTaGVldHMgbWF5IG5vdCBiZSBpbiB0aGUgY29uZmlndXJlZCBET00gbGliXG4gICAgICAodGFyZ2V0IGFzIHVua25vd24gYXMgeyBhZG9wdGVkU3R5bGVTaGVldHM6IHR5cGVvZiBzaGVldHMgfSkuYWRvcHRlZFN0eWxlU2hlZXRzID0gc2hlZXRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUgRE9NLlxuICAgKlxuICAgKiBEU0QgcGF0aCAoX2RzZEh5ZHJhdGVkID0gdHJ1ZSk6XG4gICAqICAgLSBDYWxscyBfaHlkcmF0ZUV2ZW50cygpIHRvIGJpbmQgZGVjbGFyYXRpdmUgZXZlbnRzIG9uIGV4aXN0aW5nIERPTS5cbiAgICpcbiAgICogQ1NSIHBhdGggKF9kc2RIeWRyYXRlZCA9IGZhbHNlKTpcbiAgICogICAtIENhbGxzIGNyZWF0ZVJlbmRlclJvb3QoKSBpZiBubyBzaGFkb3cgcm9vdCBleGlzdHMuXG4gICAqICAgLSBSZW5kZXJzIHRoaXMucmVuZGVyKCkgdGhyb3VnaCB0aGUgVk5vZGUgRE9NIHJlbmRlcmVyLlxuICAgKlxuICAgKiBJZiBmb3JtQXNzb2NpYXRlZCBpcyB0cnVlLCBFbGVtZW50SW50ZXJuYWxzIGFyZSBhdHRhY2hlZC5cbiAgICovXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IGN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBPcGVuRWxlbWVudDtcblxuICAgIC8vIHYwLjI0LjEgKEFEUi0wMDU3KTogSW5pdGlhbGl6ZSBzdGF0aWMgcHJvcHMgc2lnbmFscyBhbmQgYWNjZXNzb3JzXG4gICAgaW5pdGlhbGl6ZVN0YXRpY1Byb3BzKHRoaXMpO1xuICAgIHN5bmNTdGF0aWNQcm9wc0Zyb21BdHRyaWJ1dGVzKHRoaXMpO1xuXG4gICAgY29uc3QgaXNMaWdodERvbSA9IGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0JztcblxuICAgIC8vIEVuc3VyZSByZW5kZXIgdGFyZ2V0IGV4aXN0cyBhbmQgZGV0ZWN0IERTRCBwcmUtcG9wdWxhdGlvblxuICAgIGlmICghdGhpcy5zaGFkb3dSb290ICYmICFpc0xpZ2h0RG9tKSB7XG4gICAgICB0aGlzLmNyZWF0ZVJlbmRlclJvb3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgLy8gRFNEIHBhdGg6IHNoYWRvdyByb290IGFscmVhZHkgcG9wdWxhdGVkLlxuICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2FwcGx5U3R5bGVzKGN0b3IpO1xuICAgIH1cblxuICAgIC8vIFN5bmMgZGF0YS10aGVtZSBmcm9tIGRvY3VtZW50IHJvb3RcbiAgICBjb25zdCBkb2NUaGVtZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uZGF0YXNldD8udGhlbWU7XG4gICAgaWYgKGRvY1RoZW1lICYmICF0aGlzLmhhc0F0dHJpYnV0ZSgnZGF0YS10aGVtZScpKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnZGF0YS10aGVtZScsIGRvY1RoZW1lKTtcbiAgICB9XG5cbiAgICAvLyBURy0wMTogUmVhZCByb3V0ZSBwYXJhbXMgZnJvbSBhdHRyaWJ1dGUgaWYgcHJlc2VudC5cbiAgICAvLyAoU1NSL1NTRyBpbmplY3RzIHBhcmFtcyBhcyBKUyBwcm9wZXJ0eSB2aWEgaW5qZWN0UHJvcHMg4oCUIHNldHRlciBoYW5kbGVzIGl0KVxuICAgIGNvbnN0IGF0dHJQYXJhbXMgPSB0aGlzLmdldEF0dHJpYnV0ZSgncGFyYW1zJyk7XG4gICAgaWYgKGF0dHJQYXJhbXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI3BhcmFtcy52YWx1ZSA9IEpTT04ucGFyc2UoYXR0clBhcmFtcyk7XG4gICAgICB9IGNhdGNoIHsgLyogaWdub3JlIG1hbGZvcm1lZCBKU09OICovIH1cbiAgICB9XG5cbiAgICAvLyB2MC4yNS4wIChTT1AtMDEyKTogVW5pZmllZCByZW5kZXIgcGF0aCDigJQgRFNEIGFuZCBDU1IgYm90aCBnbyB0aHJvdWdoXG4gICAgLy8gX3JlbmRlck9ySHlkcmF0ZSgpLiBUaGUgX2RzZEh5ZHJhdGVkIGZsYWcgYW5kIF9iaW5kQ3VycmVudFJlbmRlclRlbXBsYXRlKClcbiAgICAvLyBhcmUgcmVtb3ZlZC4gRFNEIHByZS1wb3B1bGF0ZWQgRE9NIGlzIHByZXNlcnZlZDsgb25seSBldmVudHMgYW5kIHNpZ25hbFxuICAgIC8vIHN1YnNjcmlwdGlvbnMgYXJlIGFkZGVkLlxuICAgIHRoaXMuX3JlbmRlck9ySHlkcmF0ZSgpO1xuXG4gICAgLy8gdjAuNDAuMDogQ2xpZW50LXNpZGUgYWN0aXZhdGlvbiBob29rIGZvciBmcmFtZXdvcmsgaHlkcmF0aW9uXG4gICAgdGhpcy5jbGllbnRBY3RpdmF0ZSgpO1xuXG4gICAgLy8gQXR0YWNoIEVsZW1lbnRJbnRlcm5hbHMgZm9yIGZvcm0tYXNzb2NpYXRlZCBjdXN0b20gZWxlbWVudHNcbiAgICBpZiAoY3Rvci5mb3JtQXNzb2NpYXRlZCAmJiB0eXBlb2YgdGhpcy5hdHRhY2hJbnRlcm5hbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2ludGVybmFscyA9IHRoaXMuYXR0YWNoSW50ZXJuYWxzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHYwLjI1LjAgKFNPUC0wMTIpOiBVbmlmaWVkIHJlbmRlciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyT3JIeWRyYXRlKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgICBpZiAoY3Rvci5yZW5kZXJNb2RlID09PSAnbGlnaHQnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlckludG9MaWdodERvbSgpO1xuICAgICAgICB0aGlzLm9uQ3NyUmVuZGVyZWQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0RzZCA9IHRoaXMuc2hhZG93Um9vdCAmJiB0aGlzLnNoYWRvd1Jvb3QuY2hpbGROb2Rlcy5sZW5ndGggPiAwO1xuICAgICAgaWYgKGlzRHNkKSB7XG4gICAgICAgIC8vIERTRDogRE9NIGFscmVhZHkgY29ycmVjdCDigJQgYmluZCBldmVudHMgdmlhIFZOb2RlIHdhbGtcbiAgICAgICAgdGhpcy5faHlkcmF0ZUV4aXN0aW5nRG9tKCk7XG4gICAgICAgIHRoaXMub25Ec2RIeWRyYXRlZCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgLy8gQ1NSOiBmdWxsIHJlbmRlciBmcm9tIFZOb2RlXG4gICAgICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gICAgICAgIHRoaXMub25Dc3JSZW5kZXJlZCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fcmVuZGVyRXJyb3JGYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yOCAoQURSLTAwNjcpOiBTaWduYWwtbmF0aXZlIGh5ZHJhdGlvbi5cbiAgICpcbiAgICogUmVwbGFjZXMgX3dhbGtBbmRCaW5kKCkg4oCUIHJlYWRzIGRhdGEtc2lnbmFsIG1hcmtlcnNcbiAgICogZnJvbSBEU0Qgc2hhZG93IHJvb3QgYW5kIGNyZWF0ZXMgZGlyZWN0IHNpZ25hbOKGkkRPTSBlZmZlY3QgYmluZGluZ3MuXG4gICAqIE5vIHBvc2l0aW9uIG1hdGNoaW5nLCBubyBjaGlsZE5vZGVzIGZpbHRlcmluZywgbm8gVk5vZGUgdHJhdmVyc2FsLlxuICAgKlxuICAgKiBFZmZlY3RzIGFyZSB0cmFja2VkIGluICNlZmZlY3REaXNwb3NlcnMgZm9yIGJhdGNoIGNsZWFudXAuXG4gICAqIFZOb2RlIGV2ZW50IG1hcmtlciBsaXN0ZW5lcnMgYXJlIHRyYWNrZWQgaW4gI2V2ZW50Q2xlYW51cHMuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlU2lnbmFscygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgcmV0dXJuO1xuICAgIGh5ZHJhdGVTaWduYWxzKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuc2hhZG93Um9vdCxcbiAgICAgIHRoaXMuc2lnbmFsUmVnaXN0cnksXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgdGhpcy4jY2FjaGVBY2Nlc3MoKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEh5ZHJhdGUgRFNEIERPTSB3aXRoIHNpZ25hbCBhbmQgZXZlbnQgYmluZGluZ3MuXG4gICAqXG4gICAqIHYwLjI4IChBRFItMDA2Nyk6IERlbGVnYXRlcyB0byBfaHlkcmF0ZVNpZ25hbHMoKS5cbiAgICogX3dhbGtBbmRCaW5kIHBvc2l0aW9uIG1hdGNoaW5nIGlzIERFTEVURUQuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9uIGxpdmVzIGluIG9wZW4tZWxlbWVudC1oeWRyYXRpb24udHMuXG4gICAqL1xuICBwcml2YXRlIF9oeWRyYXRlRXhpc3RpbmdEb20oKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IGh5ZHJhdGVFeGlzdGluZ0RvbShcbiAgICAgIHRoaXMsXG4gICAgICB0aGlzLnNpZ25hbFJlZ2lzdHJ5LFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB2MC4yMy4wOiBIb29rIGNhbGxlZCBhZnRlciBEU0QgaHlkcmF0aW9uIGNvbXBsZXRlcy5cbiAgICpcbiAgICogU3ViY2xhc3NlcyBvdmVycmlkZSB0aGlzIGluc3RlYWQgb2YgcmVseWluZyBvbiBmcmFnaWxlXG4gICAqIGBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpYCBjYWxsIG9yZGVyLiBBdCB0aGlzIHBvaW50IHRoZVxuICAgKiBzaGFkb3cgRE9NIGlzIHBvcHVsYXRlZCBmcm9tIERTRCBhbmQgZGVjbGFyYXRpdmUgZXZlbnRzXG4gICAqIChAY2xpY2ssIEBrZXlkb3duKSBhcmUgYm91bmQuXG4gICAqXG4gICAqIE5vLW9wIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Ec2RIeWRyYXRlZCgpOiB2b2lkIHt9XG5cbiAgLyoqXG4gICAqIHYwLjIzLjA6IEhvb2sgY2FsbGVkIGFmdGVyIENTUiBmaXJzdCByZW5kZXIgY29tcGxldGVzLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgZm9yIHBvc3QtcmVuZGVyIGluaXRpYWxpemF0aW9uXG4gICAqIHRoYXQgZGVwZW5kcyBvbiB0aGUgc2hhZG93IERPTSBiZWluZyBwb3B1bGF0ZWQuIEF0IHRoaXNcbiAgICogcG9pbnQgcmVuZGVyKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBkZWNsYXJhdGl2ZSBldmVudHNcbiAgICogYXJlIGJvdW5kLlxuICAgKlxuICAgKiBOby1vcCBieSBkZWZhdWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ3NyUmVuZGVyZWQoKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiB2MC40MC4wOiBDbGllbnQtc2lkZSBhY3RpdmF0aW9uIGhvb2suXG4gICAqXG4gICAqIENhbGxlZCBvbmNlIGFmdGVyIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCwgdGhlIHNoYWRvdyByb290XG4gICAqIGlzIHJlYWR5LCBhbmQgYW55IERTRCBoeWRyYXRpb24gb3IgQ1NSIHJlbmRlcmluZyBoYXMgY29tcGxldGVkLlxuICAgKiBUaGlzIGlzIHRoZSByaWdodCBwbGFjZSBmb3IgZnJhbWV3b3JrIGh5ZHJhdGlvbiAoUHJlYWN0LCBSZWFjdCxcbiAgICogVnVlLCBMaXQpIHRvIHRha2Ugb3ZlciB0aGUgc2hhZG93IERPTS5cbiAgICpcbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG9cbiAgICogaHlkcmF0ZSBvciByZW5kZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgaW50byB0aGUgc2hhZG93IHJvb3QuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2xpZW50QWN0aXZhdGUoKTogdm9pZCB7XG4gICAgLy8gZGVmYXVsdCBuby1vcFxuICB9XG5cbiAgLyoqXG4gICAqIEhvb2sgY2FsbGVkIHdoZW4gdGhlIHVuaWZpZWQgY2xpZW50IHJlbmRlci9oeWRyYXRlIHBhdGggdGhyb3dzLlxuICAgKiBTdWJjbGFzc2VzIG1heSByZXR1cm4gYSBWTm9kZSBmYWxsYmFjay5cbiAgICovXG4gIHByb3RlY3RlZCBvblJlbmRlckVycm9yKGVycm9yOiB1bmtub3duKTogVk5vZGUgfCBudWxsIHtcbiAgICBjcmVhdGVMb2dnZXIoJ2RzZCcpLmVycm9yKFxuICAgICAgYDwke3RoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gcmVuZGVyL2h5ZHJhdGUgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGVycm9yKX1gLFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJFcnJvckZhbGxiYWNrKGVycm9yOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy4jZXZlbnRDbGVhbnVwcyA9IHJlbmRlckVycm9yRmFsbGJhY2soXG4gICAgICB0aGlzLFxuICAgICAgZXJyb3IsXG4gICAgICB0aGlzLiNlZmZlY3REaXNwb3NlcnMsXG4gICAgICB0aGlzLiNldmVudENsZWFudXBzLFxuICAgICAgKGVycikgPT4gdGhpcy5vblJlbmRlckVycm9yKGVyciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGU6IGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBET00uXG4gICAqIEFib3J0cyBhbGwgaHlkcmF0aW9uIGV2ZW50IGxpc3RlbmVycyBmb3IgY2xlYW51cC5cbiAgICovXG4gIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMgPSBkaXNwb3NlUmVuZGVyQmluZGluZ3ModGhpcy4jZWZmZWN0RGlzcG9zZXJzLCB0aGlzLiNldmVudENsZWFudXBzKTtcbiAgICBkaXNwb3NlU3RhdGljUHJvcHModGhpcyk7XG4gIH1cblxuICAvLyB2MC4yOCAoQURSLTAwNjcpOiBFZmZlY3QgKyBldmVudCBsaWZlY3ljbGUgbWFuYWdlZCBieSBTZXQvQXJyYXkuXG4gIC8vIF93YWxrQW5kQmluZCBERUxFVEVEIOKAlCByZXBsYWNlZCBieSBfaHlkcmF0ZVNpZ25hbHMoKS5cblxuICAvKipcbiAgICogTGlmZWN5Y2xlOiBjYWxsZWQgd2hlbiBhbiBvYnNlcnZlZCBhdHRyaWJ1dGUgY2hhbmdlcy5cbiAgICpcbiAgICogQmFzZSBpbXBsZW1lbnRhdGlvbiBpcyBhIG5vLW9wLiBTdWJjbGFzc2VzIG92ZXJyaWRlIHRoaXMgdG8gcmVhY3RcbiAgICogdG8gYXR0cmlidXRlIGNoYW5nZXMsIHR5cGljYWxseSBieSBjYWxsaW5nIGB0aGlzLnJlbmRlcigpYCB0byB1cGRhdGVcbiAgICogdGhlIHNoYWRvdyBET00uXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQXR0cmlidXRlIG5hbWUgKGxvd2VyY2FzZSkuXG4gICAqIEBwYXJhbSBvbGRWYWx1ZSAtIFByZXZpb3VzIHZhbHVlLCBvciBudWxsIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBzZXQuXG4gICAqIEBwYXJhbSBuZXdWYWx1ZSAtIE5ldyB2YWx1ZSwgb3IgbnVsbCBpZiB0aGUgYXR0cmlidXRlIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIF9uYW1lOiBzdHJpbmcsXG4gICAgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgIF9uZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gdjAuMjQuMSAoQURSLTAwNTcpOiBSb3V0ZSB0byBzdGF0aWMgcHJvcHMgaGFuZGxlclxuICAgIGhhbmRsZVN0YXRpY1Byb3BBdHRyaWJ1dGVDaGFuZ2UoXG4gICAgICB0aGlzLFxuICAgICAgX25hbWUsXG4gICAgICBfb2xkVmFsdWUsXG4gICAgICBfbmV3VmFsdWUsXG4gICAgKTtcbiAgICAvLyBTdWJjbGFzcyBvdmVycmlkZSBwb2ludCAtIGJhc2UgaW1wbGVtZW50YXRpb24gaXMgaW50ZW50aW9uYWxseSBlbXB0eS5cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZW5kZXIgdGhlIHNoYWRvdyBET00gZnJvbSBgcmVuZGVyKClgIGFuZCByZS1iaW5kIGRlY2xhcmF0aXZlIGV2ZW50cy5cbiAgICpcbiAgICogT3BlbkVsZW1lbnQgaW50ZW50aW9uYWxseSBkb2VzIG5vdCBpbmNsdWRlIGEgcmVhY3RpdmUgc2NoZWR1bGVyLiBDb21wb25lbnRzXG4gICAqIHdpdGggbG9jYWwgc3RhdGUgY2FuIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgc3RhdGUgY2hhbmdlcyBpbnN0ZWFkIG9mXG4gICAqIGR1cGxpY2F0aW5nIHJlbmRlclRvRG9tKCkgYW5kIGV2ZW50IGh5ZHJhdGlvbi5cbiAgICovXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgT3BlbkVsZW1lbnQ7XG4gICAgaWYgKGN0b3IucmVuZGVyTW9kZSA9PT0gJ2xpZ2h0Jykge1xuICAgICAgdGhpcy5fcmVuZGVySW50b0xpZ2h0RG9tKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckludG9TaGFkb3dSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhY3RpdmVDb250cm9sbGVyLWNvbXBhdGlibGUgdXBkYXRlIGhvb2suXG4gICAqXG4gICAqIEFzeW5jIHN0YXRlIGNvbnRyb2xsZXJzIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBzdGF0ZSBjaGFuZ2VzLiBLZWVwaW5nIHRoaXNcbiAgICogdGlueSBhbGlhcyBsZXRzIE9wZW5FbGVtZW50IGhvc3QgY29udHJvbGxlcnMgd2l0aG91dCBpbmhlcml0aW5nIExpdCBvciBhXG4gICAqIHNjaGVkdWxlci5cbiAgICovXG4gIHJlcXVlc3RVcGRhdGUoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlckludG9MaWdodERvbSgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b0xpZ2h0RG9tKFxuICAgICAgdGhpcyxcbiAgICAgIHRoaXMuI2VmZmVjdERpc3Bvc2VycyxcbiAgICAgIHRoaXMuI2V2ZW50Q2xlYW51cHMsXG4gICAgICB0aGlzLiNjYWNoZUFjY2VzcygpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJJbnRvU2hhZG93Um9vdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNldmVudENsZWFudXBzID0gcmVuZGVySW50b1NoYWRvd1Jvb3QoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy4jZWZmZWN0RGlzcG9zZXJzLFxuICAgICAgdGhpcy4jZXZlbnRDbGVhbnVwcyxcbiAgICAgIHRoaXMuI2NhY2hlQWNjZXNzKCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3NvciBmb3IgdGhlIHByaXZhdGUgVk5vZGUgY2FjaGUgdXNlZCBieSBleHRyYWN0ZWQgcmVuZGVyL2h5ZHJhdGlvblxuICAgKiBoZWxwZXJzLiBLZWVwcyAjdm5vZGVDYWNoZSAvICN2bm9kZUNhY2hlVmFsaWQgZW5jYXBzdWxhdGVkIHdoaWxlIGFsbG93aW5nXG4gICAqIHRoZSBsb2dpYyB0byBsaXZlIGluIHNlcGFyYXRlIG1vZHVsZXMuXG4gICAqL1xuICAjY2FjaGVBY2Nlc3MoKTogVk5vZGVDYWNoZUFjY2VzcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldDogKCkgPT4gKHsgdm5vZGU6IHRoaXMuI3Zub2RlQ2FjaGUsIHZhbGlkOiB0aGlzLiN2bm9kZUNhY2hlVmFsaWQgfSksXG4gICAgICBzZXQ6ICh2bm9kZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aGlzLiN2bm9kZUNhY2hlID0gdm5vZGU7XG4gICAgICAgIHRoaXMuI3Zub2RlQ2FjaGVWYWxpZCA9IHRydWU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBsb2NhbGUgZnJvbSBKUyBwcm9wZXJ0eSAoc2V0IGJ5IFNTUiBpbmplY3RQcm9wcykgZmlyc3QsXG4gICAqIHRoZW4gSFRNTCBhdHRyaWJ1dGUsIHRoZW4gZmFsbGJhY2sgdG8gcHJvdmlkZWQgZGVmYXVsdC5cbiAgICpcbiAgICogU1NSIGluamVjdFByb3BzKCkgc2V0cyBjYW1lbENhc2UgSlMgcHJvcGVydGllcyAoZS5nLiB0aGlzLmxvY2FsZSA9ICdlbicpXG4gICAqIGJ1dCBnZXRBdHRyaWJ1dGUoKSBvbmx5IHJlYWRzIEhUTUwgYXR0cmlidXRlcywgd2hpY2ggcmVtYWluIG51bGwuXG4gICAqIFRoaXMgbWV0aG9kIHJlc29sdmVzIHRoZSBtaXNtYXRjaCBieSBjaGVja2luZyBKUyBwcm9wZXJ0eSBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gRGVmYXVsdCB2YWx1ZSB3aGVuIG5laXRoZXIgc291cmNlIGhhcyBhIHZhbHVlLiBEZWZhdWx0cyB0byAnZW4nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRMb2NhbGUoZmFsbGJhY2sgPSAnZW4nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wID0gKHRoaXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmxvY2FsZTtcbiAgICBpZiAodHlwZW9mIHByb3AgPT09ICdzdHJpbmcnICYmIHByb3ApIHJldHVybiBwcm9wO1xuICAgIHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgnbG9jYWxlJykgfHwgZmFsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIFNoYWRvdyBET00gY29udGVudCBhcyBhIFZOb2RlLlxuICAgKlxuICAgKiBTdWJjbGFzc2VzIE1VU1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuIER1cmluZyBTU1IsIHJlbmRlcmVkIGNvbnRlbnQgaXNcbiAgICogd3JhcHBlZCBpbiBhIDx0ZW1wbGF0ZSBzaGFkb3dyb290bW9kZT1cIm9wZW5cIj4gdGFnLiBEdXJpbmcgQ1NSLCBWTm9kZSB2YWx1ZXNcbiAgICogYXJlIHJlbmRlcmVkIHZpYSByZW5kZXJUb0RvbSgpIHdpdGggZXZlbnQgYmluZGluZyBhbmQgc2lnbmFsIHRyYWNraW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBWTm9kZSBmb3IgdGhlIHNoYWRvdyBET00gY29udGVudCwgb3IgbnVsbCBmb3IgZW1wdHkgY29udGVudC5cbiAgICovXG4gIHJlbmRlcigpOiBWTm9kZSB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBPcGVuRWxlbWVudCBjb25zdHJ1Y3RvciB3aXRoIGZyYW1ld29yay1jb252ZW50aW9uIHN0YXRpYyBwcm9wZXJ0aWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRWxlbWVudENvbXBvbmVudENvbnN0cnVjdG9yIGV4dGVuZHMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yIHtcbiAgc3R5bGVzPzpcbiAgICB8IFN0eWxlU2hlZXRMaWtlXG4gICAgfCBTdHlsZVNoZWV0TGlrZVtdO1xuICB0YWdOYW1lPzogc3RyaW5nO1xuICByZW5kZXJNb2RlPzogJ3NoYWRvdycgfCAnbGlnaHQnO1xuICBvYnNlcnZlZEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThDQyxHQUVE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
package/src/types.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @openelement/element — Public types.
3
+ */ import type { VNode } from '@openelement/protocol/vnode';
4
+ import type { StyleSheetLike } from '@openelement/protocol/style-sheet';
5
+ export interface ElementDefinition<Props extends Record<string, unknown> = Record<string, unknown>> {
6
+ styles?: StyleSheetLike | StyleSheetLike[];
7
+ render: (props: Props) => VNode | null;
8
+ }
package/src/types.js ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * @openelement/element — Public types.
3
+ */
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy9lbGVtZW50L3NyYy90eXBlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBvcGVuZWxlbWVudC9lbGVtZW50IOKAlCBQdWJsaWMgdHlwZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTm9kZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9wcm90b2NvbC92bm9kZSc7XG5pbXBvcnQgdHlwZSB7IFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L3Byb3RvY29sL3N0eWxlLXNoZWV0JztcblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGVmaW5pdGlvbjxcbiAgUHJvcHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiB7XG4gIHN0eWxlcz86IFN0eWxlU2hlZXRMaWtlIHwgU3R5bGVTaGVldExpa2VbXTtcbiAgcmVuZGVyOiAocHJvcHM6IFByb3BzKSA9PiBWTm9kZSB8IG51bGw7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0NBRUMsR0FFRCJ9