angular-three 2.0.0-beta.4 → 2.0.0-beta.41
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 +4 -147
- package/esm2022/angular-three.mjs +1 -1
- package/esm2022/index.mjs +10 -11
- package/esm2022/lib/before-render.mjs +13 -0
- package/esm2022/lib/canvas.mjs +137 -161
- package/esm2022/lib/directives/args.mjs +13 -11
- package/esm2022/lib/directives/common.mjs +28 -27
- package/esm2022/lib/directives/key.mjs +29 -0
- package/esm2022/lib/directives/parent.mjs +13 -11
- package/esm2022/lib/dom/events.mjs +6 -1
- package/esm2022/lib/events.mjs +77 -60
- package/esm2022/lib/instance.mjs +65 -0
- package/esm2022/lib/loader.mjs +35 -41
- package/esm2022/lib/loop.mjs +6 -3
- package/esm2022/lib/portal.mjs +103 -112
- package/esm2022/lib/ref.mjs +48 -0
- package/esm2022/lib/renderer/catalogue.mjs +7 -0
- package/esm2022/lib/renderer/constants.mjs +21 -0
- package/esm2022/lib/renderer/index.mjs +419 -0
- package/esm2022/lib/renderer/store.mjs +148 -112
- package/esm2022/lib/renderer/utils.mjs +63 -48
- package/esm2022/lib/roots.mjs +249 -0
- package/esm2022/lib/routed-scene.mjs +11 -8
- package/esm2022/lib/store.mjs +207 -0
- package/esm2022/lib/three-types.mjs +2 -2
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/apply-props.mjs +23 -11
- package/esm2022/lib/utils/attach.mjs +2 -2
- package/esm2022/lib/utils/is.mjs +1 -1
- package/esm2022/lib/utils/make.mjs +1 -1
- package/esm2022/lib/utils/safe-detect-changes.mjs +15 -13
- package/esm2022/lib/utils/signal-store.mjs +99 -0
- package/esm2022/lib/utils/update.mjs +1 -1
- package/fesm2022/angular-three.mjs +2014 -1882
- package/fesm2022/angular-three.mjs.map +1 -1
- package/index.d.ts +9 -10
- package/lib/{di/before-render.d.ts → before-render.d.ts} +1 -1
- package/lib/canvas.d.ts +82 -12
- package/lib/directives/args.d.ts +2 -2
- package/lib/directives/common.d.ts +5 -1
- package/lib/directives/key.d.ts +10 -0
- package/lib/directives/parent.d.ts +5 -5
- package/lib/dom/events.d.ts +3 -2
- package/lib/events.d.ts +78 -2
- package/lib/instance.d.ts +36 -0
- package/lib/loader.d.ts +21 -3
- package/lib/loop.d.ts +68 -6
- package/lib/portal.d.ts +21 -12
- package/lib/{di/ref.d.ts → ref.d.ts} +3 -2
- package/lib/renderer/catalogue.d.ts +13 -0
- package/lib/renderer/constants.d.ts +20 -0
- package/lib/renderer/index.d.ts +5 -0
- package/lib/renderer/store.d.ts +21 -15
- package/lib/renderer/utils.d.ts +29 -19
- package/lib/roots.d.ts +11 -0
- package/lib/routed-scene.d.ts +1 -1
- package/lib/store.d.ts +147 -0
- package/lib/three-types.d.ts +5 -5
- package/lib/types.d.ts +1 -309
- package/lib/utils/apply-props.d.ts +4 -2
- package/lib/utils/attach.d.ts +5 -3
- package/lib/utils/is.d.ts +5 -4
- package/lib/utils/make.d.ts +12 -1
- package/lib/utils/safe-detect-changes.d.ts +2 -2
- package/lib/utils/signal-store.d.ts +17 -0
- package/lib/utils/update.d.ts +1 -1
- package/metadata.json +1 -1
- package/package.json +24 -5
- package/plugin/generators.json +57 -17
- package/plugin/migrations.json +27 -0
- package/plugin/package.json +22 -4
- package/plugin/src/generators/init/compat.d.ts +3 -1
- package/plugin/src/generators/init/compat.js +2 -2
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
- package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
- package/plugin/src/generators/init/generator.d.ts +6 -0
- package/plugin/src/generators/init/generator.js +160 -0
- package/plugin/src/generators/init/generator.js.map +1 -0
- package/plugin/src/generators/init/schema.json +15 -4
- package/plugin/src/generators/init-cannon/compat.d.ts +2 -0
- package/plugin/src/generators/init-cannon/compat.js +6 -0
- package/plugin/src/generators/init-cannon/compat.js.map +1 -0
- package/plugin/src/generators/init-cannon/generator.d.ts +2 -0
- package/plugin/src/generators/init-cannon/generator.js +23 -0
- package/plugin/src/generators/init-cannon/generator.js.map +1 -0
- package/plugin/src/generators/init-cannon/schema.json +6 -0
- package/plugin/src/generators/init-postprocessing/compat.d.ts +2 -0
- package/plugin/src/generators/init-postprocessing/compat.js +6 -0
- package/plugin/src/generators/init-postprocessing/compat.js.map +1 -0
- package/plugin/src/generators/init-postprocessing/generator.d.ts +2 -0
- package/plugin/src/generators/init-postprocessing/generator.js +21 -0
- package/plugin/src/generators/init-postprocessing/generator.js.map +1 -0
- package/plugin/src/generators/init-postprocessing/schema.json +6 -0
- package/plugin/src/generators/init-rapier/compat.d.ts +2 -0
- package/plugin/src/generators/init-rapier/compat.js +6 -0
- package/plugin/src/generators/init-rapier/compat.js.map +1 -0
- package/plugin/src/generators/init-rapier/generator.d.ts +2 -0
- package/plugin/src/generators/init-rapier/generator.js +22 -0
- package/plugin/src/generators/init-rapier/generator.js.map +1 -0
- package/plugin/src/generators/init-rapier/schema.json +6 -0
- package/plugin/src/generators/init-soba/compat.d.ts +2 -0
- package/plugin/src/generators/init-soba/compat.js +6 -0
- package/plugin/src/generators/init-soba/compat.js.map +1 -0
- package/plugin/src/generators/init-soba/generator.d.ts +2 -0
- package/plugin/src/generators/init-soba/generator.js +27 -0
- package/plugin/src/generators/init-soba/generator.js.map +1 -0
- package/plugin/src/generators/init-soba/schema.json +6 -0
- package/plugin/src/generators/utils.d.ts +2 -0
- package/plugin/src/generators/utils.js +34 -0
- package/plugin/src/generators/utils.js.map +1 -0
- package/plugin/src/generators/versions.d.ts +14 -0
- package/plugin/src/generators/versions.js +18 -0
- package/plugin/src/generators/versions.js.map +1 -0
- package/plugin/src/index.d.ts +5 -1
- package/plugin/src/index.js +11 -3
- package/plugin/src/index.js.map +1 -1
- package/plugin/src/migrations/migrate-to-ngxtension/compat.d.ts +2 -0
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js +6 -0
- package/plugin/src/migrations/migrate-to-ngxtension/compat.js.map +1 -0
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.d.ts +2 -0
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js +55 -0
- package/plugin/src/migrations/migrate-to-ngxtension/migrate-to-ngxtension.js.map +1 -0
- package/web-types.json +1 -1
- package/esm2022/lib/di/before-render.mjs +0 -13
- package/esm2022/lib/di/catalogue.mjs +0 -7
- package/esm2022/lib/di/ref.mjs +0 -49
- package/esm2022/lib/directives/repeat.mjs +0 -18
- package/esm2022/lib/renderer/di.mjs +0 -3
- package/esm2022/lib/renderer/enums.mjs +0 -2
- package/esm2022/lib/renderer/provider.mjs +0 -18
- package/esm2022/lib/renderer/renderer.mjs +0 -368
- package/esm2022/lib/stores/signal.store.mjs +0 -79
- package/esm2022/lib/stores/store.mjs +0 -420
- package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
- package/esm2022/lib/utils/instance.mjs +0 -63
- package/esm2022/lib/utils/signal.mjs +0 -24
- package/esm2022/lib/utils/timing.mjs +0 -21
- package/lib/di/catalogue.d.ts +0 -3
- package/lib/directives/repeat.d.ts +0 -7
- package/lib/renderer/di.d.ts +0 -2
- package/lib/renderer/enums.d.ts +0 -26
- package/lib/renderer/provider.d.ts +0 -8
- package/lib/renderer/renderer.d.ts +0 -49
- package/lib/stores/signal.store.d.ts +0 -21
- package/lib/stores/store.d.ts +0 -13
- package/lib/utils/assert-in-injection-context.d.ts +0 -2
- package/lib/utils/instance.d.ts +0 -4
- package/lib/utils/signal.d.ts +0 -2
- package/lib/utils/timing.d.ts +0 -4
- package/plugin/src/generators/init/init.d.ts +0 -5
- package/plugin/src/generators/init/init.js +0 -56
- package/plugin/src/generators/init/init.js.map +0 -1
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, computed, untracked, } from '@angular/core';
|
|
2
|
-
import { createSignal } from '../utils/signal';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
const STORE_COMPUTED_KEY = '__ngt_store_computed__';
|
|
5
|
-
class NgtSignalStore {
|
|
6
|
-
#state;
|
|
7
|
-
#computedCache = new Map();
|
|
8
|
-
constructor(initialState = {}) {
|
|
9
|
-
initialState ??= {};
|
|
10
|
-
this.#state = createSignal(Object.assign(initialState, { __ngt_dummy_state__: Date.now() }));
|
|
11
|
-
this.state = this.#state.asReadonly();
|
|
12
|
-
}
|
|
13
|
-
select(...keysAndOptions) {
|
|
14
|
-
if (keysAndOptions.length === 0)
|
|
15
|
-
return this.state;
|
|
16
|
-
if (keysAndOptions.length === 1 && typeof keysAndOptions[0] === 'object') {
|
|
17
|
-
if (!this.#computedCache.has(STORE_COMPUTED_KEY)) {
|
|
18
|
-
this.#computedCache.set(STORE_COMPUTED_KEY, computed(this.state, keysAndOptions));
|
|
19
|
-
return this.#computedCache.get(STORE_COMPUTED_KEY);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const [keys, options] = parseOptions(keysAndOptions);
|
|
23
|
-
const joinedKeys = keys.join('-');
|
|
24
|
-
if (!this.#computedCache.has(joinedKeys)) {
|
|
25
|
-
this.#computedCache.set(joinedKeys, computed(() => keys.reduce((value, key) => value[key], this.state()), options));
|
|
26
|
-
}
|
|
27
|
-
return this.#computedCache.get(joinedKeys);
|
|
28
|
-
}
|
|
29
|
-
get(...keys) {
|
|
30
|
-
const state = untracked(this.state);
|
|
31
|
-
if (keys.length === 0)
|
|
32
|
-
return state;
|
|
33
|
-
return keys.reduce((value, key) => value[key], state);
|
|
34
|
-
}
|
|
35
|
-
set(state) {
|
|
36
|
-
const updater = (previous) => {
|
|
37
|
-
const partial = typeof state === 'function' ? state(previous) : state;
|
|
38
|
-
Object.keys(partial).forEach((key) => {
|
|
39
|
-
const partialKey = key;
|
|
40
|
-
if (partial[partialKey] === undefined && previous[partialKey] != null) {
|
|
41
|
-
partial[partialKey] = previous[partialKey];
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
return partial;
|
|
45
|
-
};
|
|
46
|
-
this.#state.update((previous) => ({ ...previous, ...updater(previous) }));
|
|
47
|
-
// this.#state.update(previous => ({...previous, ...(typeof state === 'function' ? state(previous) : state)}))
|
|
48
|
-
}
|
|
49
|
-
patch(state) {
|
|
50
|
-
const updater = (previous) => {
|
|
51
|
-
Object.keys(state).forEach((key) => {
|
|
52
|
-
const partialKey = key;
|
|
53
|
-
if (state[partialKey] === undefined && previous[partialKey] != null) {
|
|
54
|
-
state[partialKey] = previous[partialKey];
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
return state;
|
|
58
|
-
};
|
|
59
|
-
this.#state.update((previous) => ({ ...updater(previous), ...previous }));
|
|
60
|
-
}
|
|
61
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtSignalStore, deps: [{ token: 'INITIAL_STATE', optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
62
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtSignalStore }); }
|
|
63
|
-
}
|
|
64
|
-
export { NgtSignalStore };
|
|
65
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtSignalStore, decorators: [{
|
|
66
|
-
type: Injectable
|
|
67
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
68
|
-
type: Optional
|
|
69
|
-
}, {
|
|
70
|
-
type: Inject,
|
|
71
|
-
args: ['INITIAL_STATE']
|
|
72
|
-
}] }]; } });
|
|
73
|
-
function parseOptions(keysAndOptions) {
|
|
74
|
-
if (typeof keysAndOptions.at(-1) === 'object') {
|
|
75
|
-
return [keysAndOptions.slice(0, -1), keysAndOptions.at(-1)];
|
|
76
|
-
}
|
|
77
|
-
return [keysAndOptions];
|
|
78
|
-
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvc3RvcmVzL3NpZ25hbC5zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLFNBQVMsR0FJWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRS9DLE1BQU0sa0JBQWtCLEdBQUcsd0JBQWlDLENBQUM7QUFFN0QsTUFDYSxjQUFjO0lBQ2QsTUFBTSxDQUF5QjtJQUMvQixjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUdwQyxZQUdJLGVBQWdDLEVBQWdDO1FBRWhFLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBVyxDQUFDLENBQUM7UUFDdkcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUEyQkQsTUFBTSxDQUFDLEdBQUcsY0FBcUI7UUFDM0IsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkQsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxD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QUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7OEdBL0dRLGNBQWMsa0JBT1gsZUFBZTtrSEFQbEIsY0FBYzs7U0FBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQU9GLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsZUFBZTs7QUEyRy9CLFNBQVMsWUFBWSxDQUFDLGNBQXFCO0lBQ3ZDLElBQUksT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQzNDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEluamVjdCxcbiAgICBJbmplY3RhYmxlLFxuICAgIE9wdGlvbmFsLFxuICAgIGNvbXB1dGVkLFxuICAgIHVudHJhY2tlZCxcbiAgICB0eXBlIENyZWF0ZUNvbXB1dGVkT3B0aW9ucyxcbiAgICB0eXBlIFNpZ25hbCxcbiAgICB0eXBlIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2lnbmFsIH0gZnJvbSAnLi4vdXRpbHMvc2lnbmFsJztcblxuY29uc3QgU1RPUkVfQ09NUFVURURfS0VZID0gJ19fbmd0X3N0b3JlX2NvbXB1dGVkX18nIGFzIGNvbnN0O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd0U2lnbmFsU3RvcmU8VFN0YXRlIGV4dGVuZHMgb2JqZWN0PiB7XG4gICAgcmVhZG9ubHkgI3N0YXRlOiBXcml0YWJsZVNpZ25hbDxUU3RhdGU+O1xuICAgIHJlYWRvbmx5ICNjb21wdXRlZENhY2hlID0gbmV3IE1hcCgpO1xuICAgIHJlYWRvbmx5IHN0YXRlOiBTaWduYWw8VFN0YXRlPjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBASW5qZWN0KCdJTklUSUFMX1NUQVRFJylcbiAgICAgICAgaW5pdGlhbFN0YXRlOiBQYXJ0aWFsPFRTdGF0ZT4gPSB7fSBhcyB1bmtub3duIGFzIFBhcnRpYWw8VFN0YXRlPlxuICAgICkge1xuICAgICAgICBpbml0aWFsU3RhdGUgPz89IHt9O1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IGNyZWF0ZVNpZ25hbChPYmplY3QuYXNzaWduKGluaXRpYWxTdGF0ZSwgeyBfX25ndF9kdW1teV9zdGF0ZV9fOiBEYXRlLm5vdygpIH0pIGFzIFRTdGF0ZSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLiNzdGF0ZS5hc1JlYWRvbmx5KCk7XG4gICAgfVxuXG4gICAgc2VsZWN0PFxuICAgICAgICBUS2V5MSBleHRlbmRzIGtleW9mIFRTdGF0ZSxcbiAgICAgICAgVEtleTIgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdLFxuICAgICAgICBUS2V5MyBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdLFxuICAgICAgICBUS2V5NCBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXVxuICAgID4oXG4gICAgICAgIGtleTE6IFRLZXkxLFxuICAgICAgICBrZXkyOiBUS2V5MixcbiAgICAgICAga2V5MzogVEtleTMsXG4gICAgICAgIGtleTQ6IFRLZXk0LFxuICAgICAgICBvcHRpb25zPzogQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXVtUS2V5NF0+XG4gICAgKTogU2lnbmFsPFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXVtUS2V5NF0+O1xuICAgIHNlbGVjdDxUS2V5MSBleHRlbmRzIGtleW9mIFRTdGF0ZSwgVEtleTIgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdLCBUS2V5MyBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdPihcbiAgICAgICAga2V5MTogVEtleTEsXG4gICAgICAgIGtleTI6IFRLZXkyLFxuICAgICAgICBrZXkzOiBUS2V5MyxcbiAgICAgICAgb3B0aW9ucz86IENyZWF0ZUNvbXB1dGVkT3B0aW9uczxUU3RhdGVbVEtleTFdW1RLZXkyXVtUS2V5M10+XG4gICAgKTogU2lnbmFsPFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXT47XG4gICAgc2VsZWN0PFRLZXkxIGV4dGVuZHMga2V5b2YgVFN0YXRlLCBUS2V5MiBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV0+KFxuICAgICAgICBrZXkxOiBUS2V5MSxcbiAgICAgICAga2V5MjogVEtleTIsXG4gICAgICAgIG9wdGlvbnM/OiBDcmVhdGVDb21wdXRlZE9wdGlvbnM8VFN0YXRlW1RLZXkxXVtUS2V5Ml0+XG4gICAgKTogU2lnbmFsPFRTdGF0ZVtUS2V5MV1bVEtleTJdPjtcbiAgICBzZWxlY3Q8VEtleSBleHRlbmRzIGtleW9mIFRTdGF0ZT4oa2V5OiBUS2V5LCBvcHRpb25zPzogQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPFRTdGF0ZVtUS2V5XT4pOiBTaWduYWw8VFN0YXRlW1RLZXldPjtcbiAgICBzZWxlY3Qob3B0aW9ucz86IENyZWF0ZUNvbXB1dGVkT3B0aW9uczxUU3RhdGU+KTogU2lnbmFsPFRTdGF0ZT47XG4gICAgc2VsZWN0KC4uLmtleXNBbmRPcHRpb25zOiBhbnlbXSkge1xuICAgICAgICBpZiAoa2V5c0FuZE9wdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICAgICAgaWYgKGtleXNBbmRPcHRpb25zLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2Yga2V5c0FuZE9wdGlvbnNbMF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuI2NvbXB1dGVkQ2FjaGUuaGFzKFNUT1JFX0NPTVBVVEVEX0tFWSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb21wdXRlZENhY2hlLnNldChcbiAgICAgICAgICAgICAgICAgICAgU1RPUkVfQ09NUFVURURfS0VZLFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCh0aGlzLnN0YXRlLCBrZXlzQW5kT3B0aW9ucyBhcyBDcmVhdGVDb21wdXRlZE9wdGlvbnM8VFN0YXRlPilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiNjb21wdXRlZENhY2hlLmdldChTVE9SRV9DT01QVVRFRF9LRVkpITtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBba2V5cywgb3B0aW9uc10gPSBwYXJzZU9wdGlvbnMoa2V5c0FuZE9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IGpvaW5lZEtleXMgPSBrZXlzLmpvaW4oJy0nKTtcblxuICAgICAgICBpZiAoIXRoaXMuI2NvbXB1dGVkQ2FjaGUuaGFzKGpvaW5lZEtleXMpKSB7XG4gICAgICAgICAgICB0aGlzLiNjb21wdXRlZENhY2hlLnNldChcbiAgICAgICAgICAgICAgICBqb2luZWRLZXlzLFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkKCgpID0+IGtleXMucmVkdWNlKCh2YWx1ZSwga2V5KSA9PiAodmFsdWUgYXMgTmd0QW55UmVjb3JkKVtrZXldLCB0aGlzLnN0YXRlKCkpLCBvcHRpb25zKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNjb21wdXRlZENhY2hlLmdldChqb2luZWRLZXlzKSE7XG4gICAgfVxuXG4gICAgZ2V0PFxuICAgICAgICBUS2V5MSBleHRlbmRzIGtleW9mIFRTdGF0ZSxcbiAgICAgICAgVEtleTIgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdLFxuICAgICAgICBUS2V5MyBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdLFxuICAgICAgICBUS2V5NCBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXVxuICAgID4oa2V5MTogVEtleTEsIGtleTI6IFRLZXkyLCBrZXkzOiBUS2V5Mywga2V5NDogVEtleTQpOiBUU3RhdGVbVEtleTFdW1RLZXkyXVtUS2V5M11bVEtleTRdO1xuICAgIGdldDxUS2V5MSBleHRlbmRzIGtleW9mIFRTdGF0ZSwgVEtleTIgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdLCBUS2V5MyBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV1bVEtleTJdPihcbiAgICAgICAga2V5MTogVEtleTEsXG4gICAgICAgIGtleTI6IFRLZXkyLFxuICAgICAgICBrZXkzOiBUS2V5M1xuICAgICk6IFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXTtcbiAgICBnZXQ8VEtleTEgZXh0ZW5kcyBrZXlvZiBUU3RhdGUsIFRLZXkyIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXT4oa2V5MTogVEtleTEsIGtleTI6IFRLZXkyKTogVFN0YXRlW1RLZXkxXVtUS2V5Ml07XG4gICAgZ2V0PFRLZXkgZXh0ZW5kcyBrZXlvZiBUU3RhdGU+KGtleTogVEtleSk6IFRTdGF0ZVtUS2V5XTtcbiAgICBnZXQoKTogVFN0YXRlO1xuICAgIGdldCguLi5rZXlzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHVudHJhY2tlZCh0aGlzLnN0YXRlKTtcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gc3RhdGU7XG4gICAgICAgIHJldHVybiBrZXlzLnJlZHVjZSgodmFsdWUsIGtleSkgPT4gKHZhbHVlIGFzIE5ndEFueVJlY29yZClba2V5XSwgc3RhdGUpO1xuICAgIH1cblxuICAgIHNldChzdGF0ZTogUGFydGlhbDxUU3RhdGU+IHwgKChwcmV2aW91czogVFN0YXRlKSA9PiBQYXJ0aWFsPFRTdGF0ZT4pKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXIgPSAocHJldmlvdXM6IFRTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFydGlhbCA9IHR5cGVvZiBzdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHN0YXRlKHByZXZpb3VzKSA6IHN0YXRlO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFydGlhbCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGlhbEtleSA9IGtleSBhcyBrZXlvZiBUU3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRpYWxbcGFydGlhbEtleV0gPT09IHVuZGVmaW5lZCAmJiBwcmV2aW91c1twYXJ0aWFsS2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxbcGFydGlhbEtleV0gPSBwcmV2aW91c1twYXJ0aWFsS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzdGF0ZS51cGRhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgLi4udXBkYXRlcihwcmV2aW91cykgfSkpO1xuICAgICAgICAvLyB0aGlzLiNzdGF0ZS51cGRhdGUocHJldmlvdXMgPT4gKHsuLi5wcmV2aW91cywgLi4uKHR5cGVvZiBzdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHN0YXRlKHByZXZpb3VzKSA6IHN0YXRlKX0pKVxuICAgIH1cblxuICAgIHBhdGNoKHN0YXRlOiBQYXJ0aWFsPFRTdGF0ZT4pIHtcbiAgICAgICAgY29uc3QgdXBkYXRlciA9IChwcmV2aW91czogVFN0YXRlKSA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzdGF0ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydGlhbEtleSA9IGtleSBhcyBrZXlvZiBUU3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlW3BhcnRpYWxLZXldID09PSB1bmRlZmluZWQgJiYgcHJldmlvdXNbcGFydGlhbEtleV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZVtwYXJ0aWFsS2V5XSA9IHByZXZpb3VzW3BhcnRpYWxLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiNzdGF0ZS51cGRhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi51cGRhdGVyKHByZXZpb3VzKSwgLi4ucHJldmlvdXMgfSkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKGtleXNBbmRPcHRpb25zOiBhbnlbXSk6IFtzdHJpbmdbXSwgQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPGFueT4/XSB7XG4gICAgaWYgKHR5cGVvZiBrZXlzQW5kT3B0aW9ucy5hdCgtMSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBba2V5c0FuZE9wdGlvbnMuc2xpY2UoMCwgLTEpLCBrZXlzQW5kT3B0aW9ucy5hdCgtMSldO1xuICAgIH1cblxuICAgIHJldHVybiBba2V5c0FuZE9wdGlvbnNdO1xufVxuIl19
|
|
@@ -1,420 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { ElementRef, Injectable, Injector, computed, effect, inject } from '@angular/core';
|
|
3
|
-
import * as THREE from 'three';
|
|
4
|
-
import { createLoop } from '../loop';
|
|
5
|
-
import { applyProps } from '../utils/apply-props';
|
|
6
|
-
import { prepare } from '../utils/instance';
|
|
7
|
-
import { is } from '../utils/is';
|
|
8
|
-
import { makeDefaultCamera, makeDefaultRenderer, makeDpr } from '../utils/make';
|
|
9
|
-
import { checkNeedsUpdate, updateCamera } from '../utils/update';
|
|
10
|
-
import { NgtSignalStore } from './signal.store';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
export const rootStateMap = new Map();
|
|
13
|
-
const { invalidate, advance } = createLoop(rootStateMap);
|
|
14
|
-
const shallowLoose = { objects: 'shallow', strict: false };
|
|
15
|
-
class NgtStore extends NgtSignalStore {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(...arguments);
|
|
18
|
-
this.#parentStore = inject(NgtStore, { optional: true, skipSelf: true });
|
|
19
|
-
this.#window = inject(DOCUMENT).defaultView;
|
|
20
|
-
this.#injector = inject(Injector);
|
|
21
|
-
this.isInit = false;
|
|
22
|
-
}
|
|
23
|
-
#parentStore;
|
|
24
|
-
#window;
|
|
25
|
-
#injector;
|
|
26
|
-
init() {
|
|
27
|
-
if (!this.isInit) {
|
|
28
|
-
const position = new THREE.Vector3();
|
|
29
|
-
const defaultTarget = new THREE.Vector3();
|
|
30
|
-
const tempTarget = new THREE.Vector3();
|
|
31
|
-
const getCurrentViewport = (camera = this.get('camera'), target = defaultTarget, size = this.get('size')) => {
|
|
32
|
-
const { width, height, top, left } = size;
|
|
33
|
-
const aspect = width / height;
|
|
34
|
-
if (target instanceof THREE.Vector3)
|
|
35
|
-
tempTarget.copy(target);
|
|
36
|
-
else
|
|
37
|
-
tempTarget.set(...target);
|
|
38
|
-
const distance = camera.getWorldPosition(position).distanceTo(tempTarget);
|
|
39
|
-
if (is.orthographicCamera(camera)) {
|
|
40
|
-
return {
|
|
41
|
-
width: width / camera.zoom,
|
|
42
|
-
height: height / camera.zoom,
|
|
43
|
-
top,
|
|
44
|
-
left,
|
|
45
|
-
factor: 1,
|
|
46
|
-
distance,
|
|
47
|
-
aspect,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const fov = (camera.fov * Math.PI) / 180; // convert vertical fov to radians
|
|
51
|
-
const h = 2 * Math.tan(fov / 2) * distance; // visible height
|
|
52
|
-
const w = h * aspect;
|
|
53
|
-
return { width: w, height: h, top, left, factor: width / w, distance, aspect };
|
|
54
|
-
};
|
|
55
|
-
let performanceTimeout;
|
|
56
|
-
const setPerformanceCurrent = (current) => {
|
|
57
|
-
this.set((state) => ({ performance: { ...state.performance, current } }));
|
|
58
|
-
};
|
|
59
|
-
this.set({
|
|
60
|
-
get: this.get.bind(this),
|
|
61
|
-
set: this.set.bind(this),
|
|
62
|
-
ready: false,
|
|
63
|
-
events: { priority: 1, enabled: true, connected: false },
|
|
64
|
-
invalidate: (frames = 1) => invalidate(this, frames),
|
|
65
|
-
advance: (timestamp, runGlobalEffects) => advance(timestamp, runGlobalEffects, this),
|
|
66
|
-
legacy: false,
|
|
67
|
-
linear: false,
|
|
68
|
-
flat: false,
|
|
69
|
-
controls: null,
|
|
70
|
-
clock: new THREE.Clock(),
|
|
71
|
-
pointer: new THREE.Vector2(),
|
|
72
|
-
frameloop: 'always',
|
|
73
|
-
performance: {
|
|
74
|
-
current: 1,
|
|
75
|
-
min: 0.5,
|
|
76
|
-
max: 1,
|
|
77
|
-
debounce: 200,
|
|
78
|
-
regress: () => {
|
|
79
|
-
const state = this.get();
|
|
80
|
-
// clear timeout
|
|
81
|
-
if (performanceTimeout)
|
|
82
|
-
clearTimeout(performanceTimeout);
|
|
83
|
-
// set lower bound
|
|
84
|
-
if (state.performance.current !== state.performance.min)
|
|
85
|
-
setPerformanceCurrent(state.performance.min);
|
|
86
|
-
// go back to upper bound
|
|
87
|
-
performanceTimeout = setTimeout(() => {
|
|
88
|
-
setPerformanceCurrent(this.get('performance', 'max') || 1);
|
|
89
|
-
}, state.performance.debounce);
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
size: { width: 0, height: 0, top: 0, left: 0 },
|
|
93
|
-
viewport: {
|
|
94
|
-
initialDpr: 0,
|
|
95
|
-
dpr: 0,
|
|
96
|
-
width: 0,
|
|
97
|
-
height: 0,
|
|
98
|
-
top: 0,
|
|
99
|
-
left: 0,
|
|
100
|
-
aspect: 0,
|
|
101
|
-
distance: 0,
|
|
102
|
-
factor: 0,
|
|
103
|
-
getCurrentViewport,
|
|
104
|
-
},
|
|
105
|
-
previousStore: this.#parentStore,
|
|
106
|
-
internal: {
|
|
107
|
-
active: false,
|
|
108
|
-
priority: 0,
|
|
109
|
-
frames: 0,
|
|
110
|
-
lastEvent: new ElementRef(null),
|
|
111
|
-
interaction: [],
|
|
112
|
-
hovered: new Map(),
|
|
113
|
-
subscribers: [],
|
|
114
|
-
initialClick: [0, 0],
|
|
115
|
-
initialHits: [],
|
|
116
|
-
capturedMap: new Map(),
|
|
117
|
-
subscribe: (callback, priority = 0, store = this) => {
|
|
118
|
-
const internal = this.get('internal');
|
|
119
|
-
// If this subscription was given a priority, it takes rendering into its own hands
|
|
120
|
-
// For that reason we switch off automatic rendering and increase the manual flag
|
|
121
|
-
// As long as this flag is positive there can be no internal rendering at all
|
|
122
|
-
// because there could be multiple render subscriptions
|
|
123
|
-
internal.priority = internal.priority + (priority > 0 ? 1 : 0);
|
|
124
|
-
internal.subscribers.push({ priority, store, callback });
|
|
125
|
-
// Register subscriber and sort layers from lowest to highest, meaning,
|
|
126
|
-
// highest priority renders last (on top of the other frames)
|
|
127
|
-
internal.subscribers.sort((a, b) => (a.priority || 0) - (b.priority || 0));
|
|
128
|
-
return () => {
|
|
129
|
-
const internal = this.get('internal');
|
|
130
|
-
if (internal?.subscribers) {
|
|
131
|
-
// Decrease manual flag if this subscription had a priority
|
|
132
|
-
internal.priority = internal.priority - (priority > 0 ? 1 : 0);
|
|
133
|
-
// Remove subscriber from list
|
|
134
|
-
internal.subscribers = internal.subscribers.filter((s) => s.callback !== callback);
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
setEvents: (events) => {
|
|
140
|
-
this.set((state) => ({ events: { ...state.events, ...events } }));
|
|
141
|
-
},
|
|
142
|
-
setSize: (width, height, top, left) => {
|
|
143
|
-
const camera = this.get('camera');
|
|
144
|
-
const size = { width, height, top: top || 0, left: left || 0 };
|
|
145
|
-
this.set((state) => ({
|
|
146
|
-
size,
|
|
147
|
-
viewport: { ...state.viewport, ...getCurrentViewport(camera, defaultTarget, size) },
|
|
148
|
-
}));
|
|
149
|
-
},
|
|
150
|
-
setDpr: (dpr) => {
|
|
151
|
-
const resolved = makeDpr(dpr, this.#window);
|
|
152
|
-
this.set((state) => ({
|
|
153
|
-
viewport: {
|
|
154
|
-
...state.viewport,
|
|
155
|
-
dpr: resolved,
|
|
156
|
-
initialDpr: state.viewport.initialDpr || resolved,
|
|
157
|
-
},
|
|
158
|
-
}));
|
|
159
|
-
},
|
|
160
|
-
setFrameloop: (frameloop = 'always') => {
|
|
161
|
-
const clock = this.get('clock');
|
|
162
|
-
clock.stop();
|
|
163
|
-
clock.elapsedTime = 0;
|
|
164
|
-
if (frameloop !== 'never') {
|
|
165
|
-
clock.start();
|
|
166
|
-
clock.elapsedTime = 0;
|
|
167
|
-
}
|
|
168
|
-
this.set({ frameloop });
|
|
169
|
-
},
|
|
170
|
-
});
|
|
171
|
-
this.isInit = true;
|
|
172
|
-
this.#resize();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
configure(inputs, canvasElement) {
|
|
176
|
-
const { gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, scene: sceneOptions, events, orthographic, lookAt, shadows, linear, legacy, flat, dpr, frameloop, performance, } = inputs;
|
|
177
|
-
const state = this.get();
|
|
178
|
-
const stateToUpdate = {};
|
|
179
|
-
// setup renderer
|
|
180
|
-
let gl = state.gl;
|
|
181
|
-
if (!state.gl)
|
|
182
|
-
stateToUpdate.gl = gl = makeDefaultRenderer(glOptions, canvasElement);
|
|
183
|
-
// setup raycaster
|
|
184
|
-
let raycaster = state.raycaster;
|
|
185
|
-
if (!raycaster)
|
|
186
|
-
stateToUpdate.raycaster = raycaster = new THREE.Raycaster();
|
|
187
|
-
// set raycaster options
|
|
188
|
-
const { params, ...options } = raycasterOptions || {};
|
|
189
|
-
if (!is.equ(options, raycaster, shallowLoose))
|
|
190
|
-
applyProps(raycaster, { ...options });
|
|
191
|
-
if (!is.equ(params, raycaster.params, shallowLoose)) {
|
|
192
|
-
applyProps(raycaster, { params: { ...raycaster.params, ...(params || {}) } });
|
|
193
|
-
}
|
|
194
|
-
// create default camera
|
|
195
|
-
if (!state.camera) {
|
|
196
|
-
const isCamera = is.camera(cameraOptions);
|
|
197
|
-
let camera = isCamera ? cameraOptions : makeDefaultCamera(orthographic || false, state.size);
|
|
198
|
-
if (!isCamera) {
|
|
199
|
-
if (cameraOptions)
|
|
200
|
-
applyProps(camera, cameraOptions);
|
|
201
|
-
// set position.z
|
|
202
|
-
if (!cameraOptions?.position)
|
|
203
|
-
camera.position.z = 5;
|
|
204
|
-
// always look at center or passed-in lookAt by default
|
|
205
|
-
if (!cameraOptions?.rotation && !cameraOptions?.quaternion) {
|
|
206
|
-
if (Array.isArray(lookAt))
|
|
207
|
-
camera.lookAt(lookAt[0], lookAt[1], lookAt[2]);
|
|
208
|
-
else if (lookAt instanceof THREE.Vector3)
|
|
209
|
-
camera.lookAt(lookAt);
|
|
210
|
-
else
|
|
211
|
-
camera.lookAt(0, 0, 0);
|
|
212
|
-
}
|
|
213
|
-
// update projection matrix after applyprops
|
|
214
|
-
camera.updateProjectionMatrix?.();
|
|
215
|
-
}
|
|
216
|
-
if (!is.instance(camera))
|
|
217
|
-
camera = prepare(camera, { store: this });
|
|
218
|
-
stateToUpdate.camera = camera;
|
|
219
|
-
}
|
|
220
|
-
// Set up scene (one time only!)
|
|
221
|
-
if (!state.scene) {
|
|
222
|
-
let scene;
|
|
223
|
-
if (sceneOptions instanceof THREE.Scene) {
|
|
224
|
-
scene = prepare(sceneOptions, { store: this });
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
scene = prepare(new THREE.Scene(), { store: this });
|
|
228
|
-
if (sceneOptions)
|
|
229
|
-
applyProps(scene, sceneOptions);
|
|
230
|
-
}
|
|
231
|
-
stateToUpdate.scene = scene;
|
|
232
|
-
}
|
|
233
|
-
// Set up XR (one time only!)
|
|
234
|
-
if (!state.xr) {
|
|
235
|
-
// Handle frame behavior in WebXR
|
|
236
|
-
const handleXRFrame = (timestamp, frame) => {
|
|
237
|
-
const state = this.get();
|
|
238
|
-
if (state.frameloop === 'never')
|
|
239
|
-
return;
|
|
240
|
-
advance(timestamp, true, this, frame);
|
|
241
|
-
};
|
|
242
|
-
// Toggle render switching on session
|
|
243
|
-
const handleSessionChange = () => {
|
|
244
|
-
const state = this.get();
|
|
245
|
-
state.gl.xr.enabled = state.gl.xr.isPresenting;
|
|
246
|
-
state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null);
|
|
247
|
-
if (!state.gl.xr.isPresenting)
|
|
248
|
-
state.invalidate();
|
|
249
|
-
};
|
|
250
|
-
// WebXR session manager
|
|
251
|
-
const xr = {
|
|
252
|
-
connect: () => {
|
|
253
|
-
gl.xr.addEventListener('sessionstart', handleSessionChange);
|
|
254
|
-
gl.xr.addEventListener('sessionend', handleSessionChange);
|
|
255
|
-
},
|
|
256
|
-
disconnect: () => {
|
|
257
|
-
gl.xr.removeEventListener('sessionstart', handleSessionChange);
|
|
258
|
-
gl.xr.removeEventListener('sessionend', handleSessionChange);
|
|
259
|
-
},
|
|
260
|
-
};
|
|
261
|
-
// Subscribe to WebXR session events
|
|
262
|
-
if (gl.xr)
|
|
263
|
-
xr.connect();
|
|
264
|
-
stateToUpdate.xr = xr;
|
|
265
|
-
}
|
|
266
|
-
// Set shadowmap
|
|
267
|
-
if (gl.shadowMap) {
|
|
268
|
-
const oldEnabled = gl.shadowMap.enabled;
|
|
269
|
-
const oldType = gl.shadowMap.type;
|
|
270
|
-
gl.shadowMap.enabled = !!shadows;
|
|
271
|
-
if (typeof shadows === 'boolean') {
|
|
272
|
-
gl.shadowMap.type = THREE.PCFSoftShadowMap;
|
|
273
|
-
}
|
|
274
|
-
else if (typeof shadows === 'string') {
|
|
275
|
-
const types = {
|
|
276
|
-
basic: THREE.BasicShadowMap,
|
|
277
|
-
percentage: THREE.PCFShadowMap,
|
|
278
|
-
soft: THREE.PCFSoftShadowMap,
|
|
279
|
-
variance: THREE.VSMShadowMap,
|
|
280
|
-
};
|
|
281
|
-
gl.shadowMap.type = types[shadows] ?? THREE.PCFSoftShadowMap;
|
|
282
|
-
}
|
|
283
|
-
else if (is.obj(shadows)) {
|
|
284
|
-
Object.assign(gl.shadowMap, shadows);
|
|
285
|
-
}
|
|
286
|
-
if (oldEnabled !== gl.shadowMap.enabled || oldType !== gl.shadowMap.type)
|
|
287
|
-
checkNeedsUpdate(gl.shadowMap);
|
|
288
|
-
}
|
|
289
|
-
// Safely set color management if available.
|
|
290
|
-
// Avoid accessing THREE.ColorManagement to play nice with older versions
|
|
291
|
-
if (THREE.ColorManagement) {
|
|
292
|
-
const ColorManagement = THREE.ColorManagement;
|
|
293
|
-
if ('enabled' in ColorManagement)
|
|
294
|
-
ColorManagement['enabled'] = !legacy ?? false;
|
|
295
|
-
else if ('legacyMode' in ColorManagement)
|
|
296
|
-
ColorManagement['legacyMode'] = legacy ?? true;
|
|
297
|
-
}
|
|
298
|
-
// set color space and tonemapping preferences
|
|
299
|
-
const LinearEncoding = 3000;
|
|
300
|
-
const sRGBEncoding = 3001;
|
|
301
|
-
applyProps(gl, {
|
|
302
|
-
outputEncoding: linear ? LinearEncoding : sRGBEncoding,
|
|
303
|
-
toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
|
|
304
|
-
});
|
|
305
|
-
// Update color management state
|
|
306
|
-
if (state.legacy !== legacy)
|
|
307
|
-
stateToUpdate.legacy = legacy;
|
|
308
|
-
if (state.linear !== linear)
|
|
309
|
-
stateToUpdate.linear = linear;
|
|
310
|
-
if (state.flat !== flat)
|
|
311
|
-
stateToUpdate.flat = flat;
|
|
312
|
-
// Set gl props
|
|
313
|
-
gl.setClearAlpha(0);
|
|
314
|
-
gl.setPixelRatio(makeDpr(state.viewport.dpr));
|
|
315
|
-
gl.setSize(state.size.width, state.size.height);
|
|
316
|
-
if (is.obj(glOptions) &&
|
|
317
|
-
!(typeof glOptions === 'function') &&
|
|
318
|
-
!is.renderer(glOptions) &&
|
|
319
|
-
!is.equ(glOptions, gl, shallowLoose)) {
|
|
320
|
-
applyProps(gl, glOptions);
|
|
321
|
-
}
|
|
322
|
-
// Store events internally
|
|
323
|
-
if (events && !state.events.handlers)
|
|
324
|
-
stateToUpdate.events = events(this);
|
|
325
|
-
// Check performance
|
|
326
|
-
if (performance && !is.equ(performance, state.performance, shallowLoose)) {
|
|
327
|
-
stateToUpdate.performance = { ...state.performance, ...performance };
|
|
328
|
-
}
|
|
329
|
-
this.set(stateToUpdate);
|
|
330
|
-
// Check pixelratio
|
|
331
|
-
if (dpr && state.viewport.dpr !== makeDpr(dpr))
|
|
332
|
-
state.setDpr(dpr);
|
|
333
|
-
// Check size, allow it to take on container bounds initially
|
|
334
|
-
const size = computeInitialSize(canvasElement, sizeOptions);
|
|
335
|
-
if (!is.equ(size, state.size, shallowLoose))
|
|
336
|
-
state.setSize(size.width, size.height, size.top, size.left);
|
|
337
|
-
// Check frameloop
|
|
338
|
-
if (state.frameloop !== frameloop)
|
|
339
|
-
state.setFrameloop(frameloop);
|
|
340
|
-
if (!this.get('ready'))
|
|
341
|
-
this.set({ ready: true });
|
|
342
|
-
this.#invalidate();
|
|
343
|
-
}
|
|
344
|
-
destroy(canvas) {
|
|
345
|
-
this.set((state) => ({ internal: { ...state.internal, active: false } }));
|
|
346
|
-
setTimeout(() => {
|
|
347
|
-
const { gl, xr, events } = this.get();
|
|
348
|
-
if (gl) {
|
|
349
|
-
if (events.disconnect) {
|
|
350
|
-
events.disconnect();
|
|
351
|
-
}
|
|
352
|
-
gl.renderLists.dispose();
|
|
353
|
-
gl.forceContextLoss();
|
|
354
|
-
if (gl.xr && gl.xr.enabled) {
|
|
355
|
-
gl.xr.setAnimationLoop(null);
|
|
356
|
-
xr.disconnect();
|
|
357
|
-
}
|
|
358
|
-
dispose(this.get());
|
|
359
|
-
rootStateMap.delete(canvas);
|
|
360
|
-
}
|
|
361
|
-
}, 500);
|
|
362
|
-
}
|
|
363
|
-
#resize() {
|
|
364
|
-
const state = this.get();
|
|
365
|
-
let oldSize = state.size;
|
|
366
|
-
let oldDpr = state.viewport.dpr;
|
|
367
|
-
let oldCamera = state.camera;
|
|
368
|
-
const camera = this.select('camera');
|
|
369
|
-
const size = this.select('size');
|
|
370
|
-
const viewport = this.select('viewport');
|
|
371
|
-
const triggers = computed(() => ({ camera: camera(), size: size(), viewport: viewport(), gl: this.get('gl') }));
|
|
372
|
-
effect(() => {
|
|
373
|
-
const { camera, size, viewport, gl } = triggers();
|
|
374
|
-
// resize camera and renderer on changes to size and dpr
|
|
375
|
-
if (size !== oldSize || viewport.dpr !== oldDpr) {
|
|
376
|
-
oldSize = size;
|
|
377
|
-
oldDpr = viewport.dpr;
|
|
378
|
-
// update camera
|
|
379
|
-
updateCamera(camera, size);
|
|
380
|
-
gl.setPixelRatio(viewport.dpr);
|
|
381
|
-
gl.setSize(size.width, size.height);
|
|
382
|
-
}
|
|
383
|
-
// update viewport when camera changes
|
|
384
|
-
if (camera !== oldCamera) {
|
|
385
|
-
oldCamera = camera;
|
|
386
|
-
updateCamera(camera, size);
|
|
387
|
-
this.set((state) => ({
|
|
388
|
-
viewport: { ...state.viewport, ...state.viewport.getCurrentViewport(camera) },
|
|
389
|
-
}));
|
|
390
|
-
}
|
|
391
|
-
}, { injector: this.#injector, allowSignalWrites: true });
|
|
392
|
-
}
|
|
393
|
-
#invalidate() {
|
|
394
|
-
effect(() => void this.state().invalidate(), { injector: this.#injector });
|
|
395
|
-
}
|
|
396
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
397
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore }); }
|
|
398
|
-
}
|
|
399
|
-
export { NgtStore };
|
|
400
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtStore, decorators: [{
|
|
401
|
-
type: Injectable
|
|
402
|
-
}] });
|
|
403
|
-
function computeInitialSize(canvas, defaultSize) {
|
|
404
|
-
if (defaultSize)
|
|
405
|
-
return defaultSize;
|
|
406
|
-
if (canvas instanceof HTMLCanvasElement && canvas.parentElement) {
|
|
407
|
-
return canvas.parentElement.getBoundingClientRect();
|
|
408
|
-
}
|
|
409
|
-
return { width: 0, height: 0, top: 0, left: 0 };
|
|
410
|
-
}
|
|
411
|
-
// Disposes an object and all its properties
|
|
412
|
-
function dispose(obj) {
|
|
413
|
-
if (obj.dispose && !is.scene(obj))
|
|
414
|
-
obj.dispose();
|
|
415
|
-
for (const p in obj) {
|
|
416
|
-
p.dispose?.();
|
|
417
|
-
delete obj[p];
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9zdG9yZXMvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBWXJDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRWhELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQztBQUN6RSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN6RCxNQUFNLFlBQVksR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0IsQ0FBQztBQUUzRSxNQUNhLFFBQVMsU0FBUSxjQUF3QjtJQUR0RDs7UUFFYSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFR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RSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pCO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdGFibGUsIEluamVjdG9yLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IGNyZWF0ZUxvb3AgfSBmcm9tICcuLi9sb29wJztcbmltcG9ydCB0eXBlIHtcbiAgICBOZ3RBbnlSZWNvcmQsXG4gICAgTmd0QmVmb3JlUmVuZGVyUmVjb3JkLFxuICAgIE5ndENhbnZhc0lucHV0cyxcbiAgICBOZ3REcHIsXG4gICAgTmd0RXF1Q29uZmlnLFxuICAgIE5ndEV2ZW50TWFuYWdlcixcbiAgICBOZ3RTaXplLFxuICAgIE5ndFN0YXRlLFxuICAgIE5ndFZpZXdwb3J0LFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgcHJlcGFyZSB9IGZyb20gJy4uL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgbWFrZURlZmF1bHRDYW1lcmEsIG1ha2VEZWZhdWx0UmVuZGVyZXIsIG1ha2VEcHIgfSBmcm9tICcuLi91dGlscy9tYWtlJztcbmltcG9ydCB7IGNoZWNrTmVlZHNVcGRhdGUsIHVwZGF0ZUNhbWVyYSB9IGZyb20gJy4uL3V0aWxzL3VwZGF0ZSc7XG5pbXBvcnQgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4vc2lnbmFsLnN0b3JlJztcblxuZXhwb3J0IGNvbnN0IHJvb3RTdGF0ZU1hcCA9IG5ldyBNYXA8RWxlbWVudCwgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PigpO1xuY29uc3QgeyBpbnZhbGlkYXRlLCBhZHZhbmNlIH0gPSBjcmVhdGVMb29wKHJvb3RTdGF0ZU1hcCk7XG5jb25zdCBzaGFsbG93TG9vc2UgPSB7IG9iamVjdHM6ICdzaGFsbG93Jywgc3RyaWN0OiBmYWxzZSB9IGFzIE5ndEVxdUNvbmZpZztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5ndFN0b3JlIGV4dGVuZHMgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+IHtcbiAgICByZWFkb25seSAjcGFyZW50U3RvcmUgPSBpbmplY3QoTmd0U3RvcmUsIHsgb3B0aW9uYWw6IHRydWUsIHNraXBTZWxmOiB0cnVlIH0pO1xuICAgIHJlYWRvbmx5ICN3aW5kb3cgPSBpbmplY3QoRE9DVU1FTlQpLmRlZmF1bHRWaWV3O1xuICAgIHJlYWRvbmx5ICNpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgICBpc0luaXQgPSBmYWxzZTtcblxuICAgIGluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0luaXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUYXJnZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgICAgICAgICAgY29uc3QgdGVtcFRhcmdldCA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGdldEN1cnJlbnRWaWV3cG9ydCA9IChcbiAgICAgICAgICAgICAgICBjYW1lcmEgPSB0aGlzLmdldCgnY2FtZXJhJyksXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgUGFyYW1ldGVyczxUSFJFRS5WZWN0b3IzWydzZXQnXT4gPSBkZWZhdWx0VGFyZ2V0LFxuICAgICAgICAgICAgICAgIHNpemUgPSB0aGlzLmdldCgnc2l6ZScpXG4gICAgICAgICAgICApOiBPbWl0PE5ndFZpZXdwb3J0LCAnZHByJyB8ICdpbml0aWFsRHByJz4gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBzaXplO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUSFJFRS5WZWN0b3IzKSB0ZW1wVGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRlbXBUYXJnZXQuc2V0KC4uLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGNhbWVyYS5nZXRXb3JsZFBvc2l0aW9uKHBvc2l0aW9uKS5kaXN0YW5jZVRvKHRlbXBUYXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggLyBjYW1lcmEuem9vbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0IC8gY2FtZXJhLnpvb20sXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3QsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZm92ID0gKGNhbWVyYS5mb3YgKiBNYXRoLlBJKSAvIDE4MDsgLy8gY29udmVydCB2ZXJ0aWNhbCBmb3YgdG8gcmFkaWFuc1xuICAgICAgICAgICAgICAgIGNvbnN0IGggPSAyICogTWF0aC50YW4oZm92IC8gMikgKiBkaXN0YW5jZTsgLy8gdmlzaWJsZSBoZWlnaHRcbiAgICAgICAgICAgICAgICBjb25zdCB3ID0gaCAqIGFzcGVjdDtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogdywgaGVpZ2h0OiBoLCB0b3AsIGxlZnQsIGZhY3Rvcjogd2lkdGggLyB3LCBkaXN0YW5jZSwgYXNwZWN0IH07XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcGVyZm9ybWFuY2VUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICAgICAgICAgIGNvbnN0IHNldFBlcmZvcm1hbmNlQ3VycmVudCA9IChjdXJyZW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7IHBlcmZvcm1hbmNlOiB7IC4uLnN0YXRlLnBlcmZvcm1hbmNlLCBjdXJyZW50IH0gfSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5zZXQoe1xuICAgICAgICAgICAgICAgIGdldDogdGhpcy5nZXQuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBzZXQ6IHRoaXMuc2V0LmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgcmVhZHk6IGZhbHNlLFxuXG4gICAgICAgICAgICAgICAgZXZlbnRzOiB7IHByaW9yaXR5OiAxLCBlbmFibGVkOiB0cnVlLCBjb25uZWN0ZWQ6IGZhbHNlIH0sXG5cbiAgICAgICAgICAgICAgICBpbnZhbGlkYXRlOiAoZnJhbWVzID0gMSkgPT4gaW52YWxpZGF0ZSh0aGlzLCBmcmFtZXMpLFxuICAgICAgICAgICAgICAgIGFkdmFuY2U6ICh0aW1lc3RhbXA6IG51bWJlciwgcnVuR2xvYmFsRWZmZWN0cz86IGJvb2xlYW4pID0+IGFkdmFuY2UodGltZXN0YW1wLCBydW5HbG9iYWxFZmZlY3RzLCB0aGlzKSxcblxuICAgICAgICAgICAgICAgIGxlZ2FjeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGluZWFyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmbGF0OiBmYWxzZSxcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xzOiBudWxsLFxuICAgICAgICAgICAgICAgIGNsb2NrOiBuZXcgVEhSRUUuQ2xvY2soKSxcbiAgICAgICAgICAgICAgICBwb2ludGVyOiBuZXcgVEhSRUUuVmVjdG9yMigpLFxuXG4gICAgICAgICAgICAgICAgZnJhbWVsb29wOiAnYWx3YXlzJyxcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZToge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50OiAxLFxuICAgICAgICAgICAgICAgICAgICBtaW46IDAuNSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZTogMjAwLFxuICAgICAgICAgICAgICAgICAgICByZWdyZXNzOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aW1lb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyZm9ybWFuY2VUaW1lb3V0KSBjbGVhclRpbWVvdXQocGVyZm9ybWFuY2VUaW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBsb3dlciBib3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLnBlcmZvcm1hbmNlLmN1cnJlbnQgIT09IHN0YXRlLnBlcmZvcm1hbmNlLm1pbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQZXJmb3JtYW5jZUN1cnJlbnQoc3RhdGUucGVyZm9ybWFuY2UubWluKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIGJhY2sgdG8gdXBwZXIgYm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBlcmZvcm1hbmNlQ3VycmVudCh0aGlzLmdldCgncGVyZm9ybWFuY2UnLCAnbWF4JykgfHwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBzdGF0ZS5wZXJmb3JtYW5jZS5kZWJvdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAsIHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxEcHI6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRwcjogMCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICBhc3BlY3Q6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlOiAwLFxuICAgICAgICAgICAgICAgICAgICBmYWN0b3I6IDAsXG4gICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRWaWV3cG9ydCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByZXZpb3VzU3RvcmU6IHRoaXMuI3BhcmVudFN0b3JlIGFzIE5ndFN0b3JlLFxuICAgICAgICAgICAgICAgIGludGVybmFsOiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiAwLFxuICAgICAgICAgICAgICAgICAgICBmcmFtZXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RFdmVudDogbmV3IEVsZW1lbnRSZWYobnVsbCksXG4gICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgaG92ZXJlZDogbmV3IE1hcCgpLFxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyczogW10sXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxDbGljazogWzAsIDBdLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsSGl0czogW10sXG4gICAgICAgICAgICAgICAgICAgIGNhcHR1cmVkTWFwOiBuZXcgTWFwKCksXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZTogKGNhbGxiYWNrOiBOZ3RCZWZvcmVSZW5kZXJSZWNvcmRbJ2NhbGxiYWNrJ10sIHByaW9yaXR5ID0gMCwgc3RvcmUgPSB0aGlzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbCA9IHRoaXMuZ2V0KCdpbnRlcm5hbCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBzdWJzY3JpcHRpb24gd2FzIGdpdmVuIGEgcHJpb3JpdHksIGl0IHRha2VzIHJlbmRlcmluZyBpbnRvIGl0cyBvd24gaGFuZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciB0aGF0IHJlYXNvbiB3ZSBzd2l0Y2ggb2ZmIGF1dG9tYXRpYyByZW5kZXJpbmcgYW5kIGluY3JlYXNlIHRoZSBtYW51YWwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGZsYWcgaXMgcG9zaXRpdmUgdGhlcmUgY2FuIGJlIG5vIGludGVybmFsIHJlbmRlcmluZyBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgcmVuZGVyIHN1YnNjcmlwdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgKyAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuc3Vic2NyaWJlcnMucHVzaCh7IHByaW9yaXR5LCBzdG9yZSwgY2FsbGJhY2sgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBzdWJzY3JpYmVyIGFuZCBzb3J0IGxheWVycyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0LCBtZWFuaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGlnaGVzdCBwcmlvcml0eSByZW5kZXJzIGxhc3QgKG9uIHRvcCBvZiB0aGUgb3RoZXIgZnJhbWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuc3Vic2NyaWJlcnMuc29ydCgoYSwgYikgPT4gKGEucHJpb3JpdHkgfHwgMCkgLSAoYi5wcmlvcml0eSB8fCAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJuYWwgPSB0aGlzLmdldCgnaW50ZXJuYWwnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJuYWw/LnN1YnNjcmliZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY3JlYXNlIG1hbnVhbCBmbGFnIGlmIHRoaXMgc3Vic2NyaXB0aW9uIGhhZCBhIHByaW9yaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLnByaW9yaXR5ID0gaW50ZXJuYWwucHJpb3JpdHkgLSAocHJpb3JpdHkgPiAwID8gMSA6IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3Vic2NyaWJlciBmcm9tIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwuc3Vic2NyaWJlcnMgPSBpbnRlcm5hbC5zdWJzY3JpYmVycy5maWx0ZXIoKHMpID0+IHMuY2FsbGJhY2sgIT09IGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2V0RXZlbnRzOiAoZXZlbnRzOiBQYXJ0aWFsPE5ndEV2ZW50TWFuYWdlcjxhbnk+PikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7IGV2ZW50czogeyAuLi5zdGF0ZS5ldmVudHMsIC4uLmV2ZW50cyB9IH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFNpemU6ICh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgdG9wPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuZ2V0KCdjYW1lcmEnKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IHsgd2lkdGgsIGhlaWdodCwgdG9wOiB0b3AgfHwgMCwgbGVmdDogbGVmdCB8fCAwIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoKHN0YXRlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0OiB7IC4uLnN0YXRlLnZpZXdwb3J0LCAuLi5nZXRDdXJyZW50Vmlld3BvcnQoY2FtZXJhLCBkZWZhdWx0VGFyZ2V0LCBzaXplKSB9LFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXREcHI6IChkcHI6IE5ndERwcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IG1ha2VEcHIoZHByLCB0aGlzLiN3aW5kb3cgYXMgV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLnZpZXdwb3J0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwcjogcmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbERwcjogc3RhdGUudmlld3BvcnQuaW5pdGlhbERwciB8fCByZXNvbHZlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldEZyYW1lbG9vcDogKGZyYW1lbG9vcDogJ2Fsd2F5cycgfCAnZGVtYW5kJyB8ICduZXZlcicgPSAnYWx3YXlzJykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbG9jayA9IHRoaXMuZ2V0KCdjbG9jaycpO1xuICAgICAgICAgICAgICAgICAgICBjbG9jay5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsb2NrLmVsYXBzZWRUaW1lID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVsb29wICE9PSAnbmV2ZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9jay5zdGFydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2suZWxhcHNlZFRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoeyBmcmFtZWxvb3AgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiNyZXNpemUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZ3VyZShpbnB1dHM6IE5ndENhbnZhc0lucHV0cywgY2FudmFzRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZ2w6IGdsT3B0aW9ucyxcbiAgICAgICAgICAgIHNpemU6IHNpemVPcHRpb25zLFxuICAgICAgICAgICAgY2FtZXJhOiBjYW1lcmFPcHRpb25zLFxuICAgICAgICAgICAgcmF5Y2FzdGVyOiByYXljYXN0ZXJPcHRpb25zLFxuICAgICAgICAgICAgc2NlbmU6IHNjZW5lT3B0aW9ucyxcbiAgICAgICAgICAgIGV2ZW50cyxcbiAgICAgICAgICAgIG9ydGhvZ3JhcGhpYyxcbiAgICAgICAgICAgIGxvb2tBdCxcbiAgICAgICAgICAgIHNoYWRvd3MsXG4gICAgICAgICAgICBsaW5lYXIsXG4gICAgICAgICAgICBsZWdhY3ksXG4gICAgICAgICAgICBmbGF0LFxuICAgICAgICAgICAgZHByLFxuICAgICAgICAgICAgZnJhbWVsb29wLFxuICAgICAgICAgICAgcGVyZm9ybWFuY2UsXG4gICAgICAgIH0gPSBpbnB1dHM7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldCgpO1xuICAgICAgICBjb25zdCBzdGF0ZVRvVXBkYXRlOiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHt9O1xuXG4gICAgICAgIC8vIHNldHVwIHJlbmRlcmVyXG4gICAgICAgIGxldCBnbCA9IHN0YXRlLmdsO1xuICAgICAgICBpZiAoIXN0YXRlLmdsKSBzdGF0ZVRvVXBkYXRlLmdsID0gZ2wgPSBtYWtlRGVmYXVsdFJlbmRlcmVyKGdsT3B0aW9ucywgY2FudmFzRWxlbWVudCk7XG5cbiAgICAgICAgLy8gc2V0dXAgcmF5Y2FzdGVyXG4gICAgICAgIGxldCByYXljYXN0ZXIgPSBzdGF0ZS5yYXljYXN0ZXI7XG4gICAgICAgIGlmICghcmF5Y2FzdGVyKSBzdGF0ZVRvVXBkYXRlLnJheWNhc3RlciA9IHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcblxuICAgICAgICAvLyBzZXQgcmF5Y2FzdGVyIG9wdGlvbnNcbiAgICAgICAgY29uc3QgeyBwYXJhbXMsIC4uLm9wdGlvbnMgfSA9IHJheWNhc3Rlck9wdGlvbnMgfHwge307XG4gICAgICAgIGlmICghaXMuZXF1KG9wdGlvbnMsIHJheWNhc3Rlciwgc2hhbGxvd0xvb3NlKSkgYXBwbHlQcm9wcyhyYXljYXN0ZXIsIHsgLi4ub3B0aW9ucyB9KTtcbiAgICAgICAgaWYgKCFpcy5lcXUocGFyYW1zLCByYXljYXN0ZXIucGFyYW1zLCBzaGFsbG93TG9vc2UpKSB7XG4gICAgICAgICAgICBhcHBseVByb3BzKHJheWNhc3RlciwgeyBwYXJhbXM6IHsgLi4ucmF5Y2FzdGVyLnBhcmFtcywgLi4uKHBhcmFtcyB8fCB7fSkgfSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBkZWZhdWx0IGNhbWVyYVxuICAgICAgICBpZiAoIXN0YXRlLmNhbWVyYSkge1xuICAgICAgICAgICAgY29uc3QgaXNDYW1lcmEgPSBpcy5jYW1lcmEoY2FtZXJhT3B0aW9ucyk7XG4gICAgICAgICAgICBsZXQgY2FtZXJhID0gaXNDYW1lcmEgPyBjYW1lcmFPcHRpb25zIDogbWFrZURlZmF1bHRDYW1lcmEob3J0aG9ncmFwaGljIHx8IGZhbHNlLCBzdGF0ZS5zaXplKTtcblxuICAgICAgICAgICAgaWYgKCFpc0NhbWVyYSkge1xuICAgICAgICAgICAgICAgIGlmIChjYW1lcmFPcHRpb25zKSBhcHBseVByb3BzKGNhbWVyYSwgY2FtZXJhT3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvLyBzZXQgcG9zaXRpb24uelxuICAgICAgICAgICAgICAgIGlmICghY2FtZXJhT3B0aW9ucz8ucG9zaXRpb24pIGNhbWVyYS5wb3NpdGlvbi56ID0gNTtcblxuICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBsb29rIGF0IGNlbnRlciBvciBwYXNzZWQtaW4gbG9va0F0IGJ5IGRlZmF1bHRcbiAgICAgICAgICAgICAgICBpZiAoIWNhbWVyYU9wdGlvbnM/LnJvdGF0aW9uICYmICFjYW1lcmFPcHRpb25zPy5xdWF0ZXJuaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxvb2tBdCkpIGNhbWVyYS5sb29rQXQobG9va0F0WzBdLCBsb29rQXRbMV0sIGxvb2tBdFsyXSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvb2tBdCBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIGNhbWVyYS5sb29rQXQobG9va0F0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjYW1lcmEubG9va0F0KDAsIDAsIDApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBhZnRlciBhcHBseXByb3BzXG4gICAgICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXg/LigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWlzLmluc3RhbmNlKGNhbWVyYSkpIGNhbWVyYSA9IHByZXBhcmUoY2FtZXJhLCB7IHN0b3JlOiB0aGlzIH0pO1xuXG4gICAgICAgICAgICBzdGF0ZVRvVXBkYXRlLmNhbWVyYSA9IGNhbWVyYTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgc2NlbmUgKG9uZSB0aW1lIG9ubHkhKVxuICAgICAgICBpZiAoIXN0YXRlLnNjZW5lKSB7XG4gICAgICAgICAgICBsZXQgc2NlbmU6IFRIUkVFLlNjZW5lO1xuXG4gICAgICAgICAgICBpZiAoc2NlbmVPcHRpb25zIGluc3RhbmNlb2YgVEhSRUUuU2NlbmUpIHtcbiAgICAgICAgICAgICAgICBzY2VuZSA9IHByZXBhcmUoc2NlbmVPcHRpb25zLCB7IHN0b3JlOiB0aGlzIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2VuZSA9IHByZXBhcmUobmV3IFRIUkVFLlNjZW5lKCksIHsgc3RvcmU6IHRoaXMgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHNjZW5lT3B0aW9ucykgYXBwbHlQcm9wcyhzY2VuZSwgc2NlbmVPcHRpb25zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RhdGVUb1VwZGF0ZS5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHVwIFhSIChvbmUgdGltZSBvbmx5ISlcbiAgICAgICAgaWYgKCFzdGF0ZS54cikge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGZyYW1lIGJlaGF2aW9yIGluIFdlYlhSXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVYUkZyYW1lOiBYUkZyYW1lUmVxdWVzdENhbGxiYWNrID0gKHRpbWVzdGFtcDogbnVtYmVyLCBmcmFtZT86IFhSRnJhbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZyYW1lbG9vcCA9PT0gJ25ldmVyJykgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGFkdmFuY2UodGltZXN0YW1wLCB0cnVlLCB0aGlzLCBmcmFtZSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBUb2dnbGUgcmVuZGVyIHN3aXRjaGluZyBvbiBzZXNzaW9uXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVTZXNzaW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5nbC54ci5lbmFibGVkID0gc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nO1xuXG4gICAgICAgICAgICAgICAgc3RhdGUuZ2wueHIuc2V0QW5pbWF0aW9uTG9vcChzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmcgPyBoYW5kbGVYUkZyYW1lIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmcpIHN0YXRlLmludmFsaWRhdGUoKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIFdlYlhSIHNlc3Npb24gbWFuYWdlclxuICAgICAgICAgICAgY29uc3QgeHIgPSB7XG4gICAgICAgICAgICAgICAgY29ubmVjdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wueHIuYWRkRXZlbnRMaXN0ZW5lcignc2Vzc2lvbmVuZCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzY29ubmVjdDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wueHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vzc2lvbmVuZCcsIGhhbmRsZVNlc3Npb25DaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gV2ViWFIgc2Vzc2lvbiBldmVudHNcbiAgICAgICAgICAgIGlmIChnbC54cikgeHIuY29ubmVjdCgpO1xuICAgICAgICAgICAgc3RhdGVUb1VwZGF0ZS54ciA9IHhyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHNoYWRvd21hcFxuICAgICAgICBpZiAoZ2wuc2hhZG93TWFwKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRFbmFibGVkID0gZ2wuc2hhZG93TWFwLmVuYWJsZWQ7XG4gICAgICAgICAgICBjb25zdCBvbGRUeXBlID0gZ2wuc2hhZG93TWFwLnR5cGU7XG4gICAgICAgICAgICBnbC5zaGFkb3dNYXAuZW5hYmxlZCA9ICEhc2hhZG93cztcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzaGFkb3dzID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICBnbC5zaGFkb3dNYXAudHlwZSA9IFRIUkVFLlBDRlNvZnRTaGFkb3dNYXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzaGFkb3dzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVzID0ge1xuICAgICAgICAgICAgICAgICAgICBiYXNpYzogVEhSRUUuQmFzaWNTaGFkb3dNYXAsXG4gICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2U6IFRIUkVFLlBDRlNoYWRvd01hcCxcbiAgICAgICAgICAgICAgICAgICAgc29mdDogVEhSRUUuUENGU29mdFNoYWRvd01hcCxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFuY2U6IFRIUkVFLlZTTVNoYWRvd01hcCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGdsLnNoYWRvd01hcC50eXBlID0gdHlwZXNbc2hhZG93c10gPz8gVEhSRUUuUENGU29mdFNoYWRvd01hcDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXMub2JqKHNoYWRvd3MpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihnbC5zaGFkb3dNYXAsIHNoYWRvd3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob2xkRW5hYmxlZCAhPT0gZ2wuc2hhZG93TWFwLmVuYWJsZWQgfHwgb2xkVHlwZSAhPT0gZ2wuc2hhZG93TWFwLnR5cGUpIGNoZWNrTmVlZHNVcGRhdGUoZ2wuc2hhZG93TWFwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNhZmVseSBzZXQgY29sb3IgbWFuYWdlbWVudCBpZiBhdmFpbGFibGUuXG4gICAgICAgIC8vIEF2b2lkIGFjY2Vzc2luZyBUSFJFRS5Db2xvck1hbmFnZW1lbnQgdG8gcGxheSBuaWNlIHdpdGggb2xkZXIgdmVyc2lvbnNcbiAgICAgICAgaWYgKFRIUkVFLkNvbG9yTWFuYWdlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgQ29sb3JNYW5hZ2VtZW50ID0gVEhSRUUuQ29sb3JNYW5hZ2VtZW50IGFzIE5ndEFueVJlY29yZDtcbiAgICAgICAgICAgIGlmICgnZW5hYmxlZCcgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2VuYWJsZWQnXSA9ICFsZWdhY3kgPz8gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmICgnbGVnYWN5TW9kZScgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2xlZ2FjeU1vZGUnXSA9IGxlZ2FjeSA/PyB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0IGNvbG9yIHNwYWNlIGFuZCB0b25lbWFwcGluZyBwcmVmZXJlbmNlc1xuICAgICAgICBjb25zdCBMaW5lYXJFbmNvZGluZyA9IDMwMDA7XG4gICAgICAgIGNvbnN0IHNSR0JFbmNvZGluZyA9IDMwMDE7XG4gICAgICAgIGFwcGx5UHJvcHMoZ2wsIHtcbiAgICAgICAgICAgIG91dHB1dEVuY29kaW5nOiBsaW5lYXIgPyBMaW5lYXJFbmNvZGluZyA6IHNSR0JFbmNvZGluZyxcbiAgICAgICAgICAgIHRvbmVNYXBwaW5nOiBmbGF0ID8gVEhSRUUuTm9Ub25lTWFwcGluZyA6IFRIUkVFLkFDRVNGaWxtaWNUb25lTWFwcGluZyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIGNvbG9yIG1hbmFnZW1lbnQgc3RhdGVcbiAgICAgICAgaWYgKHN0YXRlLmxlZ2FjeSAhPT0gbGVnYWN5KSBzdGF0ZVRvVXBkYXRlLmxlZ2FjeSA9IGxlZ2FjeTtcbiAgICAgICAgaWYgKHN0YXRlLmxpbmVhciAhPT0gbGluZWFyKSBzdGF0ZVRvVXBkYXRlLmxpbmVhciA9IGxpbmVhcjtcbiAgICAgICAgaWYgKHN0YXRlLmZsYXQgIT09IGZsYXQpIHN0YXRlVG9VcGRhdGUuZmxhdCA9IGZsYXQ7XG5cbiAgICAgICAgLy8gU2V0IGdsIHByb3BzXG4gICAgICAgIGdsLnNldENsZWFyQWxwaGEoMCk7XG4gICAgICAgIGdsLnNldFBpeGVsUmF0aW8obWFrZURwcihzdGF0ZS52aWV3cG9ydC5kcHIpKTtcbiAgICAgICAgZ2wuc2V0U2l6ZShzdGF0ZS5zaXplLndpZHRoLCBzdGF0ZS5zaXplLmhlaWdodCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXMub2JqKGdsT3B0aW9ucykgJiZcbiAgICAgICAgICAgICEodHlwZW9mIGdsT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICFpcy5yZW5kZXJlcihnbE9wdGlvbnMpICYmXG4gICAgICAgICAgICAhaXMuZXF1KGdsT3B0aW9ucywgZ2wsIHNoYWxsb3dMb29zZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhcHBseVByb3BzKGdsLCBnbE9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RvcmUgZXZlbnRzIGludGVybmFsbHlcbiAgICAgICAgaWYgKGV2ZW50cyAmJiAhc3RhdGUuZXZlbnRzLmhhbmRsZXJzKSBzdGF0ZVRvVXBkYXRlLmV2ZW50cyA9IGV2ZW50cyh0aGlzKTtcblxuICAgICAgICAvLyBDaGVjayBwZXJmb3JtYW5jZVxuICAgICAgICBpZiAocGVyZm9ybWFuY2UgJiYgIWlzLmVxdShwZXJmb3JtYW5jZSwgc3RhdGUucGVyZm9ybWFuY2UsIHNoYWxsb3dMb29zZSkpIHtcbiAgICAgICAgICAgIHN0YXRlVG9VcGRhdGUucGVyZm9ybWFuY2UgPSB7IC4uLnN0YXRlLnBlcmZvcm1hbmNlLCAuLi5wZXJmb3JtYW5jZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXQoc3RhdGVUb1VwZGF0ZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGl4ZWxyYXRpb1xuICAgICAgICBpZiAoZHByICYmIHN0YXRlLnZpZXdwb3J0LmRwciAhPT0gbWFrZURwcihkcHIpKSBzdGF0ZS5zZXREcHIoZHByKTtcbiAgICAgICAgLy8gQ2hlY2sgc2l6ZSwgYWxsb3cgaXQgdG8gdGFrZSBvbiBjb250YWluZXIgYm91bmRzIGluaXRpYWxseVxuICAgICAgICBjb25zdCBzaXplID0gY29tcHV0ZUluaXRpYWxTaXplKGNhbnZhc0VsZW1lbnQsIHNpemVPcHRpb25zKTtcbiAgICAgICAgaWYgKCFpcy5lcXUoc2l6ZSwgc3RhdGUuc2l6ZSwgc2hhbGxvd0xvb3NlKSkgc3RhdGUuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCwgc2l6ZS50b3AsIHNpemUubGVmdCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZnJhbWVsb29wXG4gICAgICAgIGlmIChzdGF0ZS5mcmFtZWxvb3AgIT09IGZyYW1lbG9vcCkgc3RhdGUuc2V0RnJhbWVsb29wKGZyYW1lbG9vcCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdldCgncmVhZHknKSkgdGhpcy5zZXQoeyByZWFkeTogdHJ1ZSB9KTtcblxuICAgICAgICB0aGlzLiNpbnZhbGlkYXRlKCk7XG4gICAgfVxuXG4gICAgZGVzdHJveShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0KChzdGF0ZSkgPT4gKHsgaW50ZXJuYWw6IHsgLi4uc3RhdGUuaW50ZXJuYWwsIGFjdGl2ZTogZmFsc2UgfSB9KSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGdsLCB4ciwgZXZlbnRzIH0gPSB0aGlzLmdldCgpO1xuICAgICAgICAgICAgaWYgKGdsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5kaXNjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZ2wucmVuZGVyTGlzdHMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIGdsLmZvcmNlQ29udGV4dExvc3MoKTtcblxuICAgICAgICAgICAgICAgIGlmIChnbC54ciAmJiBnbC54ci5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLnhyLnNldEFuaW1hdGlvbkxvb3AobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIHhyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXNwb3NlKHRoaXMuZ2V0KCkpO1xuXG4gICAgICAgICAgICAgICAgcm9vdFN0YXRlTWFwLmRlbGV0ZShjYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgICNyZXNpemUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICAgICAgbGV0IG9sZFNpemUgPSBzdGF0ZS5zaXplO1xuICAgICAgICBsZXQgb2xkRHByID0gc3RhdGUudmlld3BvcnQuZHByO1xuICAgICAgICBsZXQgb2xkQ2FtZXJhID0gc3RhdGUuY2FtZXJhO1xuXG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuc2VsZWN0KCdjYW1lcmEnKTtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2VsZWN0KCdzaXplJyk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5zZWxlY3QoJ3ZpZXdwb3J0Jyk7XG5cbiAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSBjb21wdXRlZCgoKSA9PiAoeyBjYW1lcmE6IGNhbWVyYSgpLCBzaXplOiBzaXplKCksIHZpZXdwb3J0OiB2aWV3cG9ydCgpLCBnbDogdGhpcy5nZXQoJ2dsJykgfSkpO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNhbWVyYSwgc2l6ZSwgdmlld3BvcnQsIGdsIH0gPSB0cmlnZ2VycygpO1xuICAgICAgICAgICAgICAgIC8vIHJlc2l6ZSBjYW1lcmEgYW5kIHJlbmRlcmVyIG9uIGNoYW5nZXMgdG8gc2l6ZSBhbmQgZHByXG4gICAgICAgICAgICAgICAgaWYgKHNpemUgIT09IG9sZFNpemUgfHwgdmlld3BvcnQuZHByICE9PSBvbGREcHIpIHtcbiAgICAgICAgICAgICAgICAgICAgb2xkU2l6ZSA9IHNpemU7XG4gICAgICAgICAgICAgICAgICAgIG9sZERwciA9IHZpZXdwb3J0LmRwcjtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhbWVyYVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDYW1lcmEoY2FtZXJhLCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgZ2wuc2V0UGl4ZWxSYXRpbyh2aWV3cG9ydC5kcHIpO1xuICAgICAgICAgICAgICAgICAgICBnbC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdmlld3BvcnQgd2hlbiBjYW1lcmEgY2hhbmdlc1xuICAgICAgICAgICAgICAgIGlmIChjYW1lcmEgIT09IG9sZENhbWVyYSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDYW1lcmEgPSBjYW1lcmE7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhbWVyYShjYW1lcmEsIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgoc3RhdGUpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydDogeyAuLi5zdGF0ZS52aWV3cG9ydCwgLi4uc3RhdGUudmlld3BvcnQuZ2V0Q3VycmVudFZpZXdwb3J0KGNhbWVyYSkgfSxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLiNpbmplY3RvciwgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgICNpbnZhbGlkYXRlKCkge1xuICAgICAgICBlZmZlY3QoKCkgPT4gdm9pZCB0aGlzLnN0YXRlKCkuaW52YWxpZGF0ZSgpLCB7IGluamVjdG9yOiB0aGlzLiNpbmplY3RvciB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVJbml0aWFsU2l6ZShjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgVEhSRUUuT2Zmc2NyZWVuQ2FudmFzLCBkZWZhdWx0U2l6ZT86IE5ndFNpemUpOiBOZ3RTaXplIHtcbiAgICBpZiAoZGVmYXVsdFNpemUpIHJldHVybiBkZWZhdWx0U2l6ZTtcblxuICAgIGlmIChjYW52YXMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCAmJiBjYW52YXMucGFyZW50RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gY2FudmFzLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgd2lkdGg6IDAsIGhlaWdodDogMCwgdG9wOiAwLCBsZWZ0OiAwIH07XG59XG5cbi8vIERpc3Bvc2VzIGFuIG9iamVjdCBhbmQgYWxsIGl0cyBwcm9wZXJ0aWVzXG5mdW5jdGlvbiBkaXNwb3NlPFRPYmogZXh0ZW5kcyB7IGRpc3Bvc2U/OiAoKSA9PiB2b2lkOyB0eXBlPzogc3RyaW5nOyBba2V5OiBzdHJpbmddOiBhbnkgfT4ob2JqOiBUT2JqKSB7XG4gICAgaWYgKG9iai5kaXNwb3NlICYmICFpcy5zY2VuZShvYmopKSBvYmouZGlzcG9zZSgpO1xuICAgIGZvciAoY29uc3QgcCBpbiBvYmopIHtcbiAgICAgICAgKHAgYXMgYW55KS5kaXNwb3NlPy4oKTtcbiAgICAgICAgZGVsZXRlIG9ialtwXTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Injector, assertInInjectionContext, inject } from '@angular/core';
|
|
2
|
-
export function assertInjectionContext(fn, injector) {
|
|
3
|
-
try {
|
|
4
|
-
if (!injector) {
|
|
5
|
-
return inject(Injector);
|
|
6
|
-
}
|
|
7
|
-
return injector;
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
!injector && assertInInjectionContext(fn);
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0LWluLWluamVjdGlvbi1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvdXRpbHMvYXNzZXJ0LWluLWluamVjdGlvbi1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxFQUFZLEVBQUUsUUFBbUI7SUFDcEUsSUFBSTtRQUNBLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDWCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sUUFBUSxDQUFDO0tBQ25CO0lBQUMsTUFBTTtRQUNKLENBQUMsUUFBUSxJQUFJLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sSUFBSyxDQUFDO0tBQ2hCO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yLCBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0SW5qZWN0aW9uQ29udGV4dChmbjogRnVuY3Rpb24sIGluamVjdG9yPzogSW5qZWN0b3IpOiBJbmplY3RvciB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpbmplY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGluamVjdChJbmplY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluamVjdG9yO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICAhaW5qZWN0b3IgJiYgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KGZuKTtcbiAgICAgICAgcmV0dXJuIG51bGwhO1xuICAgIH1cbn1cbiJdfQ==
|