angular-three 0.0.0-replace

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.
Files changed (89) hide show
  1. package/README.md +7 -0
  2. package/esm2022/angular-three.mjs +5 -0
  3. package/esm2022/index.mjs +20 -0
  4. package/esm2022/lib/canvas.mjs +187 -0
  5. package/esm2022/lib/directives/args.mjs +35 -0
  6. package/esm2022/lib/directives/common.mjs +42 -0
  7. package/esm2022/lib/directives/parent.mjs +35 -0
  8. package/esm2022/lib/dom/events.mjs +73 -0
  9. package/esm2022/lib/events.mjs +362 -0
  10. package/esm2022/lib/instance.mjs +70 -0
  11. package/esm2022/lib/loader.mjs +64 -0
  12. package/esm2022/lib/loop.mjs +153 -0
  13. package/esm2022/lib/portal.mjs +208 -0
  14. package/esm2022/lib/ref.mjs +46 -0
  15. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  16. package/esm2022/lib/renderer/constants.mjs +21 -0
  17. package/esm2022/lib/renderer/index.mjs +432 -0
  18. package/esm2022/lib/renderer/store.mjs +423 -0
  19. package/esm2022/lib/renderer/utils.mjs +201 -0
  20. package/esm2022/lib/roots.mjs +261 -0
  21. package/esm2022/lib/routed-scene.mjs +33 -0
  22. package/esm2022/lib/store.mjs +181 -0
  23. package/esm2022/lib/three-types.mjs +2 -0
  24. package/esm2022/lib/types.mjs +2 -0
  25. package/esm2022/lib/utils/apply-props.mjs +123 -0
  26. package/esm2022/lib/utils/attach.mjs +32 -0
  27. package/esm2022/lib/utils/before-render.mjs +12 -0
  28. package/esm2022/lib/utils/create-api-token.mjs +13 -0
  29. package/esm2022/lib/utils/inputs.mjs +18 -0
  30. package/esm2022/lib/utils/is.mjs +52 -0
  31. package/esm2022/lib/utils/make.mjs +53 -0
  32. package/esm2022/lib/utils/signal-store.mjs +101 -0
  33. package/esm2022/lib/utils/update.mjs +34 -0
  34. package/fesm2022/angular-three.mjs +3167 -0
  35. package/fesm2022/angular-three.mjs.map +1 -0
  36. package/index.d.ts +22 -0
  37. package/lib/canvas.d.ts +1170 -0
  38. package/lib/directives/args.d.ts +11 -0
  39. package/lib/directives/common.d.ts +26 -0
  40. package/lib/directives/parent.d.ts +13 -0
  41. package/lib/dom/events.d.ts +5 -0
  42. package/lib/events.d.ts +83 -0
  43. package/lib/instance.d.ts +46 -0
  44. package/lib/loader.d.ts +32 -0
  45. package/lib/loop.d.ts +68 -0
  46. package/lib/portal.d.ts +58 -0
  47. package/lib/ref.d.ts +7 -0
  48. package/lib/renderer/catalogue.d.ts +13 -0
  49. package/lib/renderer/constants.d.ts +20 -0
  50. package/lib/renderer/index.d.ts +56 -0
  51. package/lib/renderer/store.d.ts +64 -0
  52. package/lib/renderer/utils.d.ts +31 -0
  53. package/lib/roots.d.ts +12 -0
  54. package/lib/routed-scene.d.ts +10 -0
  55. package/lib/store.d.ts +141 -0
  56. package/lib/three-types.d.ts +302 -0
  57. package/lib/types.d.ts +12 -0
  58. package/lib/utils/apply-props.d.ts +3 -0
  59. package/lib/utils/attach.d.ts +11 -0
  60. package/lib/utils/before-render.d.ts +6 -0
  61. package/lib/utils/create-api-token.d.ts +23 -0
  62. package/lib/utils/inputs.d.ts +5 -0
  63. package/lib/utils/is.d.ts +23 -0
  64. package/lib/utils/make.d.ts +19 -0
  65. package/lib/utils/signal-store.d.ts +30 -0
  66. package/lib/utils/update.d.ts +4 -0
  67. package/metadata.json +1 -0
  68. package/package.json +73 -0
  69. package/plugin/README.md +11 -0
  70. package/plugin/generators.json +17 -0
  71. package/plugin/src/generators/init/compat.d.ts +2 -0
  72. package/plugin/src/generators/init/compat.js +6 -0
  73. package/plugin/src/generators/init/compat.js.map +1 -0
  74. package/plugin/src/generators/init/files/experience/experience.component.html__tmpl__ +4 -0
  75. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +18 -0
  76. package/plugin/src/generators/init/generator.d.ts +3 -0
  77. package/plugin/src/generators/init/generator.js +143 -0
  78. package/plugin/src/generators/init/generator.js.map +1 -0
  79. package/plugin/src/generators/init/schema.json +6 -0
  80. package/plugin/src/generators/utils.d.ts +2 -0
  81. package/plugin/src/generators/utils.js +34 -0
  82. package/plugin/src/generators/utils.js.map +1 -0
  83. package/plugin/src/generators/version.d.ts +14 -0
  84. package/plugin/src/generators/version.js +18 -0
  85. package/plugin/src/generators/version.js.map +1 -0
  86. package/plugin/src/index.d.ts +0 -0
  87. package/plugin/src/index.js +1 -0
  88. package/plugin/src/index.js.map +1 -0
  89. package/web-types.json +1 -0
@@ -0,0 +1,201 @@
1
+ import { untracked } from '@angular/core';
2
+ import { ReplaySubject } from 'rxjs';
3
+ import { removeInteractivity } from '../events';
4
+ import { getLocalState, invalidateInstance } from '../instance';
5
+ import { attach, detach } from '../utils/attach';
6
+ import { is } from '../utils/is';
7
+ import { SPECIAL_EVENTS } from './constants';
8
+ // @internal
9
+ export var NgtRendererClassId;
10
+ (function (NgtRendererClassId) {
11
+ NgtRendererClassId[NgtRendererClassId["type"] = 0] = "type";
12
+ NgtRendererClassId[NgtRendererClassId["parent"] = 1] = "parent";
13
+ NgtRendererClassId[NgtRendererClassId["injectedParent"] = 2] = "injectedParent";
14
+ NgtRendererClassId[NgtRendererClassId["children"] = 3] = "children";
15
+ NgtRendererClassId[NgtRendererClassId["destroyed"] = 4] = "destroyed";
16
+ NgtRendererClassId[NgtRendererClassId["compound"] = 5] = "compound";
17
+ NgtRendererClassId[NgtRendererClassId["compoundParent"] = 6] = "compoundParent";
18
+ NgtRendererClassId[NgtRendererClassId["compounded"] = 7] = "compounded";
19
+ NgtRendererClassId[NgtRendererClassId["queueOps"] = 8] = "queueOps";
20
+ NgtRendererClassId[NgtRendererClassId["attributes"] = 9] = "attributes";
21
+ NgtRendererClassId[NgtRendererClassId["properties"] = 10] = "properties";
22
+ NgtRendererClassId[NgtRendererClassId["rawValue"] = 11] = "rawValue";
23
+ NgtRendererClassId[NgtRendererClassId["ref"] = 12] = "ref";
24
+ NgtRendererClassId[NgtRendererClassId["portalContainer"] = 13] = "portalContainer";
25
+ NgtRendererClassId[NgtRendererClassId["injectorFactory"] = 14] = "injectorFactory";
26
+ })(NgtRendererClassId || (NgtRendererClassId = {}));
27
+ // @internal
28
+ export var NgtCompoundClassId;
29
+ (function (NgtCompoundClassId) {
30
+ NgtCompoundClassId[NgtCompoundClassId["applyFirst"] = 0] = "applyFirst";
31
+ NgtCompoundClassId[NgtCompoundClassId["props"] = 1] = "props";
32
+ })(NgtCompoundClassId || (NgtCompoundClassId = {}));
33
+ // @internal
34
+ export var NgtQueueOpClassId;
35
+ (function (NgtQueueOpClassId) {
36
+ NgtQueueOpClassId[NgtQueueOpClassId["type"] = 0] = "type";
37
+ NgtQueueOpClassId[NgtQueueOpClassId["op"] = 1] = "op";
38
+ NgtQueueOpClassId[NgtQueueOpClassId["done"] = 2] = "done";
39
+ })(NgtQueueOpClassId || (NgtQueueOpClassId = {}));
40
+ export function kebabToPascal(str) {
41
+ // split the string at each hyphen
42
+ const parts = str.split('-');
43
+ // map over the parts, capitalizing the first letter of each part
44
+ const pascalParts = parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1));
45
+ // join the parts together to create the final PascalCase string
46
+ return pascalParts.join('');
47
+ }
48
+ export function attachThreeChild(parent, child) {
49
+ const pLS = getLocalState(parent);
50
+ const cLS = getLocalState(child);
51
+ if (!pLS || !cLS) {
52
+ throw new Error(`[NGT] THREE instances need to be prepared with local state.`);
53
+ }
54
+ // whether the child is added to the parent with parent.add()
55
+ let added = false;
56
+ // assign store on child if not already exist
57
+ // or child store is the parent of parent store
58
+ if (!cLS.store || cLS.store === pLS.store.get('previousRoot')) {
59
+ cLS.store = pLS.store;
60
+ }
61
+ if (cLS.attach) {
62
+ const attachProp = cLS.attach;
63
+ if (typeof attachProp === 'function') {
64
+ const attachCleanUp = attachProp(parent, child, cLS.store);
65
+ if (attachCleanUp)
66
+ cLS.previousAttach = attachCleanUp;
67
+ }
68
+ else {
69
+ // we skip attach none if set explicitly
70
+ if (attachProp[0] === 'none') {
71
+ invalidateInstance(child);
72
+ return;
73
+ }
74
+ // handle material array
75
+ if (attachProp[0] === 'material' &&
76
+ attachProp[1] &&
77
+ typeof Number(attachProp[1]) === 'number' &&
78
+ is.material(child) &&
79
+ !Array.isArray(parent['material'])) {
80
+ parent['material'] = [];
81
+ }
82
+ // attach
83
+ if (cLS.isRaw) {
84
+ if (cLS.instanceStore.get('parent') !== parent) {
85
+ cLS.setParent(parent);
86
+ }
87
+ // at this point we don't have rawValue yet, so we bail and wait until the Renderer recalls attach
88
+ if (child.__ngt_renderer__[NgtRendererClassId.rawValue] === undefined)
89
+ return;
90
+ attach(parent, child.__ngt_renderer__[NgtRendererClassId.rawValue], attachProp);
91
+ }
92
+ else {
93
+ attach(parent, child, attachProp);
94
+ }
95
+ // save value
96
+ cLS.previousAttach = attachProp.reduce((value, property) => value[property], parent);
97
+ }
98
+ }
99
+ else if (is.object3D(parent) && is.object3D(child)) {
100
+ parent.add(child);
101
+ added = true;
102
+ }
103
+ pLS.add(child, added ? 'objects' : 'nonObjects');
104
+ if (cLS.instanceStore.get('parent') !== parent) {
105
+ cLS.setParent(parent);
106
+ }
107
+ if (cLS.afterAttach)
108
+ cLS.afterAttach.next({ parent, node: child });
109
+ invalidateInstance(child);
110
+ invalidateInstance(parent);
111
+ }
112
+ export function removeThreeChild(parent, child, dispose) {
113
+ const pLS = getLocalState(parent);
114
+ const cLS = getLocalState(child);
115
+ // clear parent ref
116
+ cLS?.setParent(null);
117
+ // remove child from parent
118
+ pLS?.remove(child, 'objects');
119
+ pLS?.remove(child, 'nonObjects');
120
+ if (cLS?.attach) {
121
+ detach(parent, child, cLS.attach);
122
+ }
123
+ else if (is.object3D(parent) && is.object3D(child)) {
124
+ parent.remove(child);
125
+ const store = cLS?.store || pLS?.store;
126
+ if (store)
127
+ removeInteractivity(store, child);
128
+ }
129
+ const isPrimitive = cLS?.primitive;
130
+ if (!isPrimitive) {
131
+ removeThreeRecursive(cLS?.instanceStore.get('objects') || [], child, !!dispose);
132
+ removeThreeRecursive(child.children, child, !!dispose);
133
+ }
134
+ // dispose
135
+ if (!isPrimitive && child['dispose'] && !is.scene(child)) {
136
+ queueMicrotask(() => child['dispose']());
137
+ }
138
+ invalidateInstance(parent);
139
+ }
140
+ function removeThreeRecursive(array, parent, dispose) {
141
+ if (array)
142
+ [...array].forEach((child) => removeThreeChild(parent, child, dispose));
143
+ }
144
+ export function processThreeEvent(instance, priority, eventName, callback) {
145
+ const lS = getLocalState(instance);
146
+ if (!lS) {
147
+ console.warn('[NGT] instance has not been prepared yet.');
148
+ return () => { };
149
+ }
150
+ if (eventName === SPECIAL_EVENTS.BEFORE_RENDER) {
151
+ return lS.store
152
+ .get('internal')
153
+ .subscribe((state) => callback({ state, object: instance }), priority || lS.priority || 0);
154
+ }
155
+ if (eventName === SPECIAL_EVENTS.AFTER_UPDATE || eventName === SPECIAL_EVENTS.AFTER_ATTACH) {
156
+ let emitter = lS[eventName];
157
+ if (!emitter)
158
+ emitter = lS[eventName] = new ReplaySubject(1);
159
+ const sub = emitter.subscribe(callback);
160
+ // NOTE: for afterAttach event, if the instance already has a parent,
161
+ // then we'll emit the event immediately
162
+ if (eventName === SPECIAL_EVENTS.AFTER_ATTACH && untracked(lS.parent)) {
163
+ emitter.next({ parent: untracked(lS.parent), node: instance });
164
+ }
165
+ return () => {
166
+ sub.unsubscribe();
167
+ if (emitter && !emitter.observed) {
168
+ emitter.complete();
169
+ }
170
+ };
171
+ }
172
+ if (!lS.handlers)
173
+ lS.handlers = {};
174
+ // try to get the previous handler. compound might have one, the THREE object might also have one with the same name
175
+ const previousHandler = lS.handlers[eventName];
176
+ // readjust the callback
177
+ const updatedCallback = (event) => {
178
+ if (previousHandler)
179
+ previousHandler(event);
180
+ callback(event);
181
+ };
182
+ Object.assign(lS.handlers, { [eventName]: updatedCallback });
183
+ // increment the count everytime
184
+ lS.eventCount += 1;
185
+ // but only add the instance (target) to the interaction array (so that it is handled by the EventManager with Raycast)
186
+ // the first time eventCount is incremented
187
+ if (lS.eventCount === 1 && instance['raycast'])
188
+ lS.store.get('internal', 'interaction').push(instance);
189
+ // clean up the event listener by removing the target from the interaction array
190
+ return () => {
191
+ const lS = getLocalState(instance);
192
+ if (lS) {
193
+ lS.eventCount -= 1;
194
+ const interactions = lS.store.get('internal', 'interaction') || [];
195
+ const index = interactions.findIndex((obj) => obj.uuid === instance.uuid);
196
+ if (index >= 0)
197
+ interactions.splice(index, 1);
198
+ }
199
+ };
200
+ }
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yZW5kZXJlci91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQXdCLE1BQU0sYUFBYSxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTdDLFlBQVk7QUFDWixNQUFNLENBQU4sSUFBa0Isa0JBZ0JqQjtBQWhCRCxXQUFrQixrQkFBa0I7SUFDbkMsMkRBQUksQ0FBQTtJQUNKLCtEQUFNLENBQUE7SUFDTiwrRUFBYyxDQUFBO0lBQ2QsbUVBQVEsQ0FBQTtJQUNSLHFFQUFTLENBQUE7SUFDVCxtRUFBUSxDQUFBO0lBQ1IsK0VBQWMsQ0FBQTtJQUNkLHVFQUFVLENBQUE7SUFDVixtRUFBUSxDQUFBO0lBQ1IsdUVBQVUsQ0FBQTtJQUNWLHdFQUFVLENBQUE7SUFDVixvRUFBUSxDQUFBO0lBQ1IsMERBQUcsQ0FBQTtJQUNILGtGQUFlLENBQUE7SUFDZixrRkFBZSxDQUFBO0FBQ2hCLENBQUMsRUFoQmlCLGtCQUFrQixLQUFsQixrQkFBa0IsUUFnQm5DO0FBRUQsWUFBWTtBQUNaLE1BQU0sQ0FBTixJQUFrQixrQkFHakI7QUFIRCxXQUFrQixrQkFBa0I7SUFDbkMsdUVBQVUsQ0FBQTtJQUNWLDZEQUFLLENBQUE7QUFDTixDQUFDLEVBSGlC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Q0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNGLENBQUMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlbW92ZUludGVyYWN0aXZpdHkgfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSwgaW52YWxpZGF0ZUluc3RhbmNlLCB0eXBlIE5ndEluc3RhbmNlTm9kZSB9IGZyb20gJy4uL2luc3RhbmNlJztcbmltcG9ydCB7IGF0dGFjaCwgZGV0YWNoIH0gZnJvbSAnLi4vdXRpbHMvYXR0YWNoJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgU1BFQ0lBTF9FVkVOVFMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGVudW0gTmd0UmVuZGVyZXJDbGFzc0lkIHtcblx0dHlwZSxcblx0cGFyZW50LFxuXHRpbmplY3RlZFBhcmVudCxcblx0Y2hpbGRyZW4sXG5cdGRlc3Ryb3llZCxcblx0Y29tcG91bmQsXG5cdGNvbXBvdW5kUGFyZW50LFxuXHRjb21wb3VuZGVkLFxuXHRxdWV1ZU9wcyxcblx0YXR0cmlidXRlcyxcblx0cHJvcGVydGllcyxcblx0cmF3VmFsdWUsXG5cdHJlZixcblx0cG9ydGFsQ29udGFpbmVyLFxuXHRpbmplY3RvckZhY3RvcnksXG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGVudW0gTmd0Q29tcG91bmRDbGFzc0lkIHtcblx0YXBwbHlGaXJzdCxcblx0cHJvcHMsXG59XG5cbi8vIEBpbnRlcm5hbFxuZXhwb3J0IGNvbnN0IGVudW0gTmd0UXVldWVPcENsYXNzSWQge1xuXHR0eXBlLFxuXHRvcCxcblx0ZG9uZSxcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtlYmFiVG9QYXNjYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvLyBzcGxpdCB0aGUgc3RyaW5nIGF0IGVhY2ggaHlwaGVuXG5cdGNvbnN0IHBhcnRzID0gc3RyLnNwbGl0KCctJyk7XG5cblx0Ly8gbWFwIG92ZXIgdGhlIHBhcnRzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHBhcnRcblx0Y29uc3QgcGFzY2FsUGFydHMgPSBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwYXJ0LnNsaWNlKDEpKTtcblxuXHQvLyBqb2luIHRoZSBwYXJ0cyB0b2dldGhlciB0byBjcmVhdGUgdGhlIGZpbmFsIFBhc2NhbENhc2Ugc3RyaW5nXG5cdHJldHVybiBwYXNjYWxQYXJ0cy5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50OiBOZ3RJbnN0YW5jZU5vZGUsIGNoaWxkOiBOZ3RJbnN0YW5jZU5vZGUpIHtcblx0Y29uc3QgcExTID0gZ2V0TG9jYWxTdGF0ZShwYXJlbnQpO1xuXHRjb25zdCBjTFMgPSBnZXRMb2NhbFN0YXRlKGNoaWxkKTtcblxuXHRpZiAoIXBMUyB8fCAhY0xTKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBbTkdUXSBUSFJFRSBpbnN0YW5jZXMgbmVlZCB0byBiZSBwcmVwYXJlZCB3aXRoIGxvY2FsIHN0YXRlLmApO1xuXHR9XG5cblx0Ly8gd2hldGhlciB0aGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIHBhcmVudCB3aXRoIHBhcmVudC5hZGQoKVxuXHRsZXQgYWRkZWQgPSBmYWxzZTtcblxuXHQvLyBhc3NpZ24gc3RvcmUgb24gY2hpbGQgaWYgbm90IGFscmVhZHkgZXhpc3Rcblx0Ly8gb3IgY2hpbGQgc3RvcmUgaXMgdGhlIHBhcmVudCBvZiBwYXJlbnQgc3RvcmVcblx0aWYgKCFjTFMuc3RvcmUgfHwgY0xTLnN0b3JlID09PSBwTFMuc3RvcmUuZ2V0KCdwcmV2aW91c1Jvb3QnKSkge1xuXHRcdGNMUy5zdG9yZSA9IHBMUy5zdG9yZTtcblx0fVxuXG5cdGlmIChjTFMuYXR0YWNoKSB7XG5cdFx0Y29uc3QgYXR0YWNoUHJvcCA9IGNMUy5hdHRhY2g7XG5cblx0XHRpZiAodHlwZW9mIGF0dGFjaFByb3AgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGNvbnN0IGF0dGFjaENsZWFuVXAgPSBhdHRhY2hQcm9wKHBhcmVudCwgY2hpbGQsIGNMUy5zdG9yZSk7XG5cdFx0XHRpZiAoYXR0YWNoQ2xlYW5VcCkgY0xTLnByZXZpb3VzQXR0YWNoID0gYXR0YWNoQ2xlYW5VcDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gd2Ugc2tpcCBhdHRhY2ggbm9uZSBpZiBzZXQgZXhwbGljaXRseVxuXHRcdFx0aWYgKGF0dGFjaFByb3BbMF0gPT09ICdub25lJykge1xuXHRcdFx0XHRpbnZhbGlkYXRlSW5zdGFuY2UoY2hpbGQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIGhhbmRsZSBtYXRlcmlhbCBhcnJheVxuXHRcdFx0aWYgKFxuXHRcdFx0XHRhdHRhY2hQcm9wWzBdID09PSAnbWF0ZXJpYWwnICYmXG5cdFx0XHRcdGF0dGFjaFByb3BbMV0gJiZcblx0XHRcdFx0dHlwZW9mIE51bWJlcihhdHRhY2hQcm9wWzFdKSA9PT0gJ251bWJlcicgJiZcblx0XHRcdFx0aXMubWF0ZXJpYWwoY2hpbGQpICYmXG5cdFx0XHRcdCFBcnJheS5pc0FycmF5KHBhcmVudFsnbWF0ZXJpYWwnXSlcblx0XHRcdCkge1xuXHRcdFx0XHRwYXJlbnRbJ21hdGVyaWFsJ10gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYXR0YWNoXG5cdFx0XHRpZiAoY0xTLmlzUmF3KSB7XG5cdFx0XHRcdGlmIChjTFMuaW5zdGFuY2VTdG9yZS5nZXQoJ3BhcmVudCcpICE9PSBwYXJlbnQpIHtcblx0XHRcdFx0XHRjTFMuc2V0UGFyZW50KHBhcmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gYXQgdGhpcyBwb2ludCB3ZSBkb24ndCBoYXZlIHJhd1ZhbHVlIHlldCwgc28gd2UgYmFpbCBhbmQgd2FpdCB1bnRpbCB0aGUgUmVuZGVyZXIgcmVjYWxscyBhdHRhY2hcblx0XHRcdFx0aWYgKGNoaWxkLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cdFx0XHRcdGF0dGFjaChwYXJlbnQsIGNoaWxkLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSwgYXR0YWNoUHJvcCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRhdHRhY2gocGFyZW50LCBjaGlsZCwgYXR0YWNoUHJvcCk7XG5cdFx0XHR9XG5cdFx0XHQvLyBzYXZlIHZhbHVlXG5cdFx0XHRjTFMucHJldmlvdXNBdHRhY2ggPSBhdHRhY2hQcm9wLnJlZHVjZSgodmFsdWUsIHByb3BlcnR5KSA9PiB2YWx1ZVtwcm9wZXJ0eV0sIHBhcmVudCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGlzLm9iamVjdDNEKHBhcmVudCkgJiYgaXMub2JqZWN0M0QoY2hpbGQpKSB7XG5cdFx0cGFyZW50LmFkZChjaGlsZCk7XG5cdFx0YWRkZWQgPSB0cnVlO1xuXHR9XG5cblx0cExTLmFkZChjaGlsZCwgYWRkZWQgPyAnb2JqZWN0cycgOiAnbm9uT2JqZWN0cycpO1xuXG5cdGlmIChjTFMuaW5zdGFuY2VTdG9yZS5nZXQoJ3BhcmVudCcpICE9PSBwYXJlbnQpIHtcblx0XHRjTFMuc2V0UGFyZW50KHBhcmVudCk7XG5cdH1cblxuXHRpZiAoY0xTLmFmdGVyQXR0YWNoKSBjTFMuYWZ0ZXJBdHRhY2gubmV4dCh7IHBhcmVudCwgbm9kZTogY2hpbGQgfSk7XG5cblx0aW52YWxpZGF0ZUluc3RhbmNlKGNoaWxkKTtcblx0aW52YWxpZGF0ZUluc3RhbmNlKHBhcmVudCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVUaHJlZUNoaWxkKHBhcmVudDogTmd0SW5zdGFuY2VOb2RlLCBjaGlsZDogTmd0SW5zdGFuY2VOb2RlLCBkaXNwb3NlPzogYm9vbGVhbikge1xuXHRjb25zdCBwTFMgPSBnZXRMb2NhbFN0YXRlKHBhcmVudCk7XG5cdGNvbnN0IGNMUyA9IGdldExvY2FsU3RhdGUoY2hpbGQpO1xuXG5cdC8vIGNsZWFyIHBhcmVudCByZWZcblx0Y0xTPy5zZXRQYXJlbnQobnVsbCk7XG5cblx0Ly8gcmVtb3ZlIGNoaWxkIGZyb20gcGFyZW50XG5cdHBMUz8ucmVtb3ZlKGNoaWxkLCAnb2JqZWN0cycpO1xuXHRwTFM/LnJlbW92ZShjaGlsZCwgJ25vbk9iamVjdHMnKTtcblxuXHRpZiAoY0xTPy5hdHRhY2gpIHtcblx0XHRkZXRhY2gocGFyZW50LCBjaGlsZCwgY0xTLmF0dGFjaCk7XG5cdH0gZWxzZSBpZiAoaXMub2JqZWN0M0QocGFyZW50KSAmJiBpcy5vYmplY3QzRChjaGlsZCkpIHtcblx0XHRwYXJlbnQucmVtb3ZlKGNoaWxkKTtcblx0XHRjb25zdCBzdG9yZSA9IGNMUz8uc3RvcmUgfHwgcExTPy5zdG9yZTtcblx0XHRpZiAoc3RvcmUpIHJlbW92ZUludGVyYWN0aXZpdHkoc3RvcmUsIGNoaWxkKTtcblx0fVxuXG5cdGNvbnN0IGlzUHJpbWl0aXZlID0gY0xTPy5wcmltaXRpdmU7XG5cdGlmICghaXNQcmltaXRpdmUpIHtcblx0XHRyZW1vdmVUaHJlZVJlY3Vyc2l2ZShjTFM/Lmluc3RhbmNlU3RvcmUuZ2V0KCdvYmplY3RzJykgfHwgW10sIGNoaWxkLCAhIWRpc3Bvc2UpO1xuXHRcdHJlbW92ZVRocmVlUmVjdXJzaXZlKGNoaWxkLmNoaWxkcmVuLCBjaGlsZCwgISFkaXNwb3NlKTtcblx0fVxuXG5cdC8vIGRpc3Bvc2Vcblx0aWYgKCFpc1ByaW1pdGl2ZSAmJiBjaGlsZFsnZGlzcG9zZSddICYmICFpcy5zY2VuZShjaGlsZCkpIHtcblx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiBjaGlsZFsnZGlzcG9zZSddKCkpO1xuXHR9XG5cblx0aW52YWxpZGF0ZUluc3RhbmNlKHBhcmVudCk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVRocmVlUmVjdXJzaXZlKGFycmF5OiBOZ3RJbnN0YW5jZU5vZGVbXSwgcGFyZW50OiBOZ3RJbnN0YW5jZU5vZGUsIGRpc3Bvc2U6IGJvb2xlYW4pIHtcblx0aWYgKGFycmF5KSBbLi4uYXJyYXldLmZvckVhY2goKGNoaWxkKSA9PiByZW1vdmVUaHJlZUNoaWxkKHBhcmVudCwgY2hpbGQsIGRpc3Bvc2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NUaHJlZUV2ZW50KFxuXHRpbnN0YW5jZTogTmd0SW5zdGFuY2VOb2RlLFxuXHRwcmlvcml0eTogbnVtYmVyLFxuXHRldmVudE5hbWU6IHN0cmluZyxcblx0Y2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkLFxuKTogKCkgPT4gdm9pZCB7XG5cdGNvbnN0IGxTID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdGlmICghbFMpIHtcblx0XHRjb25zb2xlLndhcm4oJ1tOR1RdIGluc3RhbmNlIGhhcyBub3QgYmVlbiBwcmVwYXJlZCB5ZXQuJyk7XG5cdFx0cmV0dXJuICgpID0+IHt9O1xuXHR9XG5cblx0aWYgKGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQkVGT1JFX1JFTkRFUikge1xuXHRcdHJldHVybiBsUy5zdG9yZVxuXHRcdFx0LmdldCgnaW50ZXJuYWwnKVxuXHRcdFx0LnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHsgc3RhdGUsIG9iamVjdDogaW5zdGFuY2UgfSksIHByaW9yaXR5IHx8IGxTLnByaW9yaXR5IHx8IDApO1xuXHR9XG5cblx0aWYgKGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQUZURVJfVVBEQVRFIHx8IGV2ZW50TmFtZSA9PT0gU1BFQ0lBTF9FVkVOVFMuQUZURVJfQVRUQUNIKSB7XG5cdFx0bGV0IGVtaXR0ZXIgPSBsU1tldmVudE5hbWVdO1xuXHRcdGlmICghZW1pdHRlcikgZW1pdHRlciA9IGxTW2V2ZW50TmFtZV0gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcblx0XHRjb25zdCBzdWIgPSBlbWl0dGVyLnN1YnNjcmliZShjYWxsYmFjayk7XG5cblx0XHQvLyBOT1RFOiBmb3IgYWZ0ZXJBdHRhY2ggZXZlbnQsIGlmIHRoZSBpbnN0YW5jZSBhbHJlYWR5IGhhcyBhIHBhcmVudCxcblx0XHQvLyAgdGhlbiB3ZSdsbCBlbWl0IHRoZSBldmVudCBpbW1lZGlhdGVseVxuXHRcdGlmIChldmVudE5hbWUgPT09IFNQRUNJQUxfRVZFTlRTLkFGVEVSX0FUVEFDSCAmJiB1bnRyYWNrZWQobFMucGFyZW50KSkge1xuXHRcdFx0ZW1pdHRlci5uZXh0KHsgcGFyZW50OiB1bnRyYWNrZWQobFMucGFyZW50KSwgbm9kZTogaW5zdGFuY2UgfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHN1Yi51bnN1YnNjcmliZSgpO1xuXHRcdFx0aWYgKGVtaXR0ZXIgJiYgIWVtaXR0ZXIub2JzZXJ2ZWQpIHtcblx0XHRcdFx0ZW1pdHRlci5jb21wbGV0ZSgpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRpZiAoIWxTLmhhbmRsZXJzKSBsUy5oYW5kbGVycyA9IHt9O1xuXG5cdC8vIHRyeSB0byBnZXQgdGhlIHByZXZpb3VzIGhhbmRsZXIuIGNvbXBvdW5kIG1pZ2h0IGhhdmUgb25lLCB0aGUgVEhSRUUgb2JqZWN0IG1pZ2h0IGFsc28gaGF2ZSBvbmUgd2l0aCB0aGUgc2FtZSBuYW1lXG5cdGNvbnN0IHByZXZpb3VzSGFuZGxlciA9IGxTLmhhbmRsZXJzW2V2ZW50TmFtZSBhcyBrZXlvZiB0eXBlb2YgbFMuaGFuZGxlcnNdO1xuXHQvLyByZWFkanVzdCB0aGUgY2FsbGJhY2tcblx0Y29uc3QgdXBkYXRlZENhbGxiYWNrOiB0eXBlb2YgY2FsbGJhY2sgPSAoZXZlbnQpID0+IHtcblx0XHRpZiAocHJldmlvdXNIYW5kbGVyKSBwcmV2aW91c0hhbmRsZXIoZXZlbnQpO1xuXHRcdGNhbGxiYWNrKGV2ZW50KTtcblx0fTtcblxuXHRPYmplY3QuYXNzaWduKGxTLmhhbmRsZXJzLCB7IFtldmVudE5hbWVdOiB1cGRhdGVkQ2FsbGJhY2sgfSk7XG5cblx0Ly8gaW5jcmVtZW50IHRoZSBjb3VudCBldmVyeXRpbWVcblx0bFMuZXZlbnRDb3VudCArPSAxO1xuXHQvLyBidXQgb25seSBhZGQgdGhlIGluc3RhbmNlICh0YXJnZXQpIHRvIHRoZSBpbnRlcmFjdGlvbiBhcnJheSAoc28gdGhhdCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBFdmVudE1hbmFnZXIgd2l0aCBSYXljYXN0KVxuXHQvLyB0aGUgZmlyc3QgdGltZSBldmVudENvdW50IGlzIGluY3JlbWVudGVkXG5cdGlmIChsUy5ldmVudENvdW50ID09PSAxICYmIGluc3RhbmNlWydyYXljYXN0J10pIGxTLnN0b3JlLmdldCgnaW50ZXJuYWwnLCAnaW50ZXJhY3Rpb24nKS5wdXNoKGluc3RhbmNlKTtcblxuXHQvLyBjbGVhbiB1cCB0aGUgZXZlbnQgbGlzdGVuZXIgYnkgcmVtb3ZpbmcgdGhlIHRhcmdldCBmcm9tIHRoZSBpbnRlcmFjdGlvbiBhcnJheVxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGNvbnN0IGxTID0gZ2V0TG9jYWxTdGF0ZShpbnN0YW5jZSk7XG5cdFx0aWYgKGxTKSB7XG5cdFx0XHRsUy5ldmVudENvdW50IC09IDE7XG5cdFx0XHRjb25zdCBpbnRlcmFjdGlvbnMgPSBsUy5zdG9yZS5nZXQoJ2ludGVybmFsJywgJ2ludGVyYWN0aW9uJykgfHwgW107XG5cdFx0XHRjb25zdCBpbmRleCA9IGludGVyYWN0aW9ucy5maW5kSW5kZXgoKG9iaikgPT4gb2JqLnV1aWQgPT09IGluc3RhbmNlLnV1aWQpO1xuXHRcdFx0aWYgKGluZGV4ID49IDApIGludGVyYWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblx0fTtcbn1cbiJdfQ==
@@ -0,0 +1,261 @@
1
+ import { Injector } from '@angular/core';
2
+ import { assertInjector } from 'ngxtension/assert-injector';
3
+ import * as THREE from 'three';
4
+ import { prepare } from './instance';
5
+ import { injectNgtLoop } from './loop';
6
+ import { injectNgtStore } from './store';
7
+ import { applyProps } from './utils/apply-props';
8
+ import { is } from './utils/is';
9
+ import { makeCameraInstance, makeDpr, makeRendererInstance } from './utils/make';
10
+ import { checkNeedsUpdate } from './utils/update';
11
+ const shallowLoose = { objects: 'shallow', strict: false };
12
+ export const roots = new Map();
13
+ export function injectCanvasRootInitializer(injector) {
14
+ return assertInjector(injectCanvasRootInitializer, injector, () => {
15
+ const injectedStore = injectNgtStore();
16
+ const loop = injectNgtLoop();
17
+ return (canvas) => {
18
+ const exist = roots.has(canvas);
19
+ let store = roots.get(canvas);
20
+ if (store) {
21
+ console.warn('[NGT] Same canvas root is being created twice');
22
+ }
23
+ store ||= injectedStore;
24
+ if (!store) {
25
+ throw new Error('[NGT] No store initialized');
26
+ }
27
+ if (!exist) {
28
+ roots.set(canvas, store);
29
+ }
30
+ let isConfigured = false;
31
+ let lastCamera;
32
+ return {
33
+ isConfigured,
34
+ destroy: (timeout = 500) => {
35
+ const root = roots.get(canvas);
36
+ if (root) {
37
+ root.update((state) => ({ internal: { ...state.internal, active: false } }));
38
+ setTimeout(() => {
39
+ try {
40
+ const state = root.get();
41
+ state.events.disconnect?.();
42
+ state.gl?.renderLists?.dispose?.();
43
+ state.gl?.forceContextLoss?.();
44
+ if (state.gl?.xr)
45
+ state.xr.disconnect();
46
+ dispose(state);
47
+ roots.delete(canvas);
48
+ }
49
+ catch (e) {
50
+ console.error('[NGT] Unexpected error while destroying Canvas Root', e);
51
+ }
52
+ }, timeout);
53
+ }
54
+ },
55
+ configure: (inputs) => {
56
+ const { shadows = false, linear = false, flat = false, legacy = false, orthographic = false, frameloop = 'always', dpr = [1, 2], gl: glOptions, size: sizeOptions, camera: cameraOptions, raycaster: raycasterOptions, scene: sceneOptions, events, lookAt, performance, } = inputs;
57
+ const state = store.snapshot;
58
+ const stateToUpdate = {};
59
+ // setup renderer
60
+ let gl = state.gl;
61
+ if (!state.gl)
62
+ stateToUpdate.gl = gl = makeRendererInstance(glOptions, canvas);
63
+ // setup raycaster
64
+ let raycaster = state.raycaster;
65
+ if (!raycaster)
66
+ stateToUpdate.raycaster = raycaster = new THREE.Raycaster();
67
+ // set raycaster options
68
+ const { params, ...options } = raycasterOptions || {};
69
+ if (!is.equ(options, raycaster, shallowLoose))
70
+ applyProps(raycaster, options);
71
+ if (!is.equ(params, raycaster.params, shallowLoose)) {
72
+ applyProps(raycaster, { params: { ...raycaster.params, ...(params || {}) } });
73
+ }
74
+ // Create default camera, don't overwrite any user-set state
75
+ if (!state.camera || (state.camera === lastCamera && !is.equ(lastCamera, cameraOptions, shallowLoose))) {
76
+ lastCamera = cameraOptions;
77
+ const isCamera = is.camera(cameraOptions);
78
+ let camera = isCamera ? cameraOptions : makeCameraInstance(orthographic, state.size);
79
+ if (!isCamera) {
80
+ camera.position.z = 5;
81
+ if (cameraOptions) {
82
+ applyProps(camera, cameraOptions);
83
+ if ('aspect' in cameraOptions ||
84
+ 'left' in cameraOptions ||
85
+ 'right' in cameraOptions ||
86
+ 'top' in cameraOptions ||
87
+ 'bottom' in cameraOptions) {
88
+ Object.assign(camera, { manual: true });
89
+ camera?.updateProjectionMatrix();
90
+ }
91
+ }
92
+ // always look at center or passed-in lookAt by default
93
+ if (!state.camera && !cameraOptions?.rotation && !cameraOptions?.quaternion) {
94
+ if (Array.isArray(lookAt))
95
+ camera.lookAt(lookAt[0], lookAt[1], lookAt[2]);
96
+ else if (lookAt instanceof THREE.Vector3)
97
+ camera.lookAt(lookAt);
98
+ else
99
+ camera.lookAt(0, 0, 0);
100
+ }
101
+ // update projection matrix after applyprops
102
+ camera.updateProjectionMatrix?.();
103
+ }
104
+ if (!is.instance(camera))
105
+ camera = prepare(camera, { store });
106
+ stateToUpdate.camera = camera;
107
+ // Configure raycaster
108
+ // https://github.com/pmndrs/react-xr/issues/300
109
+ raycaster.camera = camera;
110
+ }
111
+ // Set up scene (one time only!)
112
+ if (!state.scene) {
113
+ let scene;
114
+ if (sceneOptions instanceof THREE.Scene) {
115
+ scene = sceneOptions;
116
+ }
117
+ else {
118
+ scene = new THREE.Scene();
119
+ if (sceneOptions)
120
+ applyProps(scene, sceneOptions);
121
+ }
122
+ stateToUpdate.scene = prepare(scene, { store });
123
+ }
124
+ // Set up XR (one time only!)
125
+ if (!state.xr) {
126
+ // Handle frame behavior in WebXR
127
+ const handleXRFrame = (timestamp, frame) => {
128
+ const state = store.snapshot;
129
+ if (state.frameloop === 'never')
130
+ return;
131
+ loop.advance(timestamp, true, store, frame);
132
+ };
133
+ // Toggle render switching on session
134
+ const handleSessionChange = () => {
135
+ const state = store.snapshot;
136
+ state.gl.xr.enabled = state.gl.xr.isPresenting;
137
+ state.gl.xr.setAnimationLoop(state.gl.xr.isPresenting ? handleXRFrame : null);
138
+ if (!state.gl.xr.isPresenting)
139
+ loop.invalidate(store);
140
+ };
141
+ // WebXR session manager
142
+ const xr = {
143
+ connect: () => {
144
+ gl.xr.addEventListener('sessionstart', handleSessionChange);
145
+ gl.xr.addEventListener('sessionend', handleSessionChange);
146
+ },
147
+ disconnect: () => {
148
+ gl.xr.removeEventListener('sessionstart', handleSessionChange);
149
+ gl.xr.removeEventListener('sessionend', handleSessionChange);
150
+ },
151
+ };
152
+ // Subscribe to WebXR session events
153
+ if (gl.xr && typeof gl.xr.addEventListener === 'function')
154
+ xr.connect();
155
+ stateToUpdate.xr = xr;
156
+ }
157
+ // Set shadowmap
158
+ if (gl.shadowMap) {
159
+ const oldEnabled = gl.shadowMap.enabled;
160
+ const oldType = gl.shadowMap.type;
161
+ gl.shadowMap.enabled = !!shadows;
162
+ if (typeof shadows === 'boolean') {
163
+ gl.shadowMap.type = THREE.PCFSoftShadowMap;
164
+ }
165
+ else if (typeof shadows === 'string') {
166
+ const types = {
167
+ basic: THREE.BasicShadowMap,
168
+ percentage: THREE.PCFShadowMap,
169
+ soft: THREE.PCFSoftShadowMap,
170
+ variance: THREE.VSMShadowMap,
171
+ };
172
+ gl.shadowMap.type = types[shadows] ?? THREE.PCFSoftShadowMap;
173
+ }
174
+ else if (is.obj(shadows)) {
175
+ Object.assign(gl.shadowMap, shadows);
176
+ }
177
+ if (oldEnabled !== gl.shadowMap.enabled || oldType !== gl.shadowMap.type)
178
+ checkNeedsUpdate(gl.shadowMap);
179
+ }
180
+ // Safely set color management if available.
181
+ // Avoid accessing THREE.ColorManagement to play nice with older versions
182
+ if (THREE.ColorManagement) {
183
+ const ColorManagement = THREE.ColorManagement;
184
+ if ('enabled' in ColorManagement)
185
+ ColorManagement['enabled'] = !legacy || false;
186
+ else if ('legacyMode' in ColorManagement)
187
+ ColorManagement['legacyMode'] = legacy || true;
188
+ }
189
+ if (!isConfigured) {
190
+ // set color space and tonemapping preferences once
191
+ const LinearEncoding = 3000;
192
+ const sRGBEncoding = 3001;
193
+ applyProps(gl, {
194
+ outputEncoding: linear ? LinearEncoding : sRGBEncoding,
195
+ toneMapping: flat ? THREE.NoToneMapping : THREE.ACESFilmicToneMapping,
196
+ });
197
+ }
198
+ // Update color management state
199
+ if (state.legacy !== legacy)
200
+ stateToUpdate.legacy = legacy;
201
+ if (state.linear !== linear)
202
+ stateToUpdate.linear = linear;
203
+ if (state.flat !== flat)
204
+ stateToUpdate.flat = flat;
205
+ // Set gl props
206
+ gl.setClearAlpha(0);
207
+ gl.setPixelRatio(makeDpr(state.viewport.dpr));
208
+ gl.setSize(state.size.width, state.size.height);
209
+ if (is.obj(glOptions) &&
210
+ !(typeof glOptions === 'function') &&
211
+ !is.renderer(glOptions) &&
212
+ !is.equ(glOptions, gl, shallowLoose)) {
213
+ applyProps(gl, glOptions);
214
+ }
215
+ // Store events internally
216
+ if (events && !state.events.handlers)
217
+ stateToUpdate.events = events(store);
218
+ // Check performance
219
+ if (performance && !is.equ(performance, state.performance, shallowLoose)) {
220
+ stateToUpdate.performance = { ...state.performance, ...performance };
221
+ }
222
+ store.update(stateToUpdate);
223
+ // Check size, allow it to take on container bounds initially
224
+ const size = computeInitialSize(canvas, sizeOptions);
225
+ if (!is.equ(size, state.size, shallowLoose)) {
226
+ state.setSize(size.width, size.height, size.top, size.left);
227
+ }
228
+ // Check pixelratio
229
+ if (dpr && state.viewport.dpr !== makeDpr(dpr))
230
+ state.setDpr(dpr);
231
+ // Check frameloop
232
+ if (state.frameloop !== frameloop)
233
+ state.setFrameloop(frameloop);
234
+ isConfigured = true;
235
+ },
236
+ };
237
+ };
238
+ });
239
+ }
240
+ function computeInitialSize(canvas, defaultSize) {
241
+ if (defaultSize) {
242
+ return defaultSize;
243
+ }
244
+ if (typeof HTMLCanvasElement !== 'undefined' && canvas instanceof HTMLCanvasElement && canvas.parentElement) {
245
+ return canvas.parentElement.getBoundingClientRect();
246
+ }
247
+ if (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {
248
+ return { width: canvas.width, height: canvas.height, top: 0, left: 0 };
249
+ }
250
+ return { width: 0, height: 0, top: 0, left: 0 };
251
+ }
252
+ // Disposes an object and all its properties
253
+ function dispose(obj) {
254
+ if (obj.dispose && obj.type !== 'Scene')
255
+ obj.dispose();
256
+ for (const p in obj) {
257
+ p.dispose?.();
258
+ delete obj[p];
259
+ }
260
+ }
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9yb290cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUvQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBK0IsTUFBTSxTQUFTLENBQUM7QUFFdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlsRCxNQUFNLFlBQVksR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0IsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQThDLENBQUM7QUFFM0UsTUFBTSxVQUFVLDJCQUEyQixDQUFDLFFBQW1CO0lBQzlELE9BQU8sY0FBYyxDQUFDLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDakUsTUFBTSxhQUFhLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsYUFBYSxFQUFFLENBQUM7UUFFN0IsT0FBTyxDQUFDLE1BQXdCLEVBQUUsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxL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RUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRCw0Q0FBNEM7QUFDNUMsU0FBUyxPQUFPLENBQTJFLEdBQVM7SUFDbkcsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTztRQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2RCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLENBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXNzZXJ0SW5qZWN0b3IgfSBmcm9tICduZ3h0ZW5zaW9uL2Fzc2VydC1pbmplY3Rvcic7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgdHlwZSB7IE5ndENhbnZhc0lucHV0cyB9IGZyb20gJy4vY2FudmFzJztcbmltcG9ydCB7IHByZXBhcmUgfSBmcm9tICcuL2luc3RhbmNlJztcbmltcG9ydCB7IGluamVjdE5ndExvb3AgfSBmcm9tICcuL2xvb3AnO1xuaW1wb3J0IHsgaW5qZWN0Tmd0U3RvcmUsIHR5cGUgTmd0U2l6ZSwgdHlwZSBOZ3RTdGF0ZSB9IGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQsIE5ndEVxdUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlQcm9wcyB9IGZyb20gJy4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgaXMgfSBmcm9tICcuL3V0aWxzL2lzJztcbmltcG9ydCB7IG1ha2VDYW1lcmFJbnN0YW5jZSwgbWFrZURwciwgbWFrZVJlbmRlcmVySW5zdGFuY2UgfSBmcm9tICcuL3V0aWxzL21ha2UnO1xuaW1wb3J0IHR5cGUgeyBOZ3RTaWduYWxTdG9yZSB9IGZyb20gJy4vdXRpbHMvc2lnbmFsLXN0b3JlJztcbmltcG9ydCB7IGNoZWNrTmVlZHNVcGRhdGUgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZSc7XG5cbmV4cG9ydCB0eXBlIE5ndENhbnZhc0VsZW1lbnQgPSBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcblxuY29uc3Qgc2hhbGxvd0xvb3NlID0geyBvYmplY3RzOiAnc2hhbGxvdycsIHN0cmljdDogZmFsc2UgfSBhcyBOZ3RFcXVDb25maWc7XG5cbmV4cG9ydCBjb25zdCByb290cyA9IG5ldyBNYXA8Tmd0Q2FudmFzRWxlbWVudCwgTmd0U2lnbmFsU3RvcmU8Tmd0U3RhdGU+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q2FudmFzUm9vdEluaXRpYWxpemVyKGluamVjdG9yPzogSW5qZWN0b3IpIHtcblx0cmV0dXJuIGFzc2VydEluamVjdG9yKGluamVjdENhbnZhc1Jvb3RJbml0aWFsaXplciwgaW5qZWN0b3IsICgpID0+IHtcblx0XHRjb25zdCBpbmplY3RlZFN0b3JlID0gaW5qZWN0Tmd0U3RvcmUoKTtcblx0XHRjb25zdCBsb29wID0gaW5qZWN0Tmd0TG9vcCgpO1xuXG5cdFx0cmV0dXJuIChjYW52YXM6IE5ndENhbnZhc0VsZW1lbnQpID0+IHtcblx0XHRcdGNvbnN0IGV4aXN0ID0gcm9vdHMuaGFzKGNhbnZhcyk7XG5cdFx0XHRsZXQgc3RvcmUgPSByb290cy5nZXQoY2FudmFzKSBhcyBOZ3RTaWduYWxTdG9yZTxOZ3RTdGF0ZT47XG5cblx0XHRcdGlmIChzdG9yZSkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ1tOR1RdIFNhbWUgY2FudmFzIHJvb3QgaXMgYmVpbmcgY3JlYXRlZCB0d2ljZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRzdG9yZSB8fD0gaW5qZWN0ZWRTdG9yZTtcblxuXHRcdFx0aWYgKCFzdG9yZSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1tOR1RdIE5vIHN0b3JlIGluaXRpYWxpemVkJyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghZXhpc3QpIHtcblx0XHRcdFx0cm9vdHMuc2V0KGNhbnZhcywgc3RvcmUpO1xuXHRcdFx0fVxuXG5cdFx0XHRsZXQgaXNDb25maWd1cmVkID0gZmFsc2U7XG5cdFx0XHRsZXQgbGFzdENhbWVyYTogTmd0Q2FudmFzSW5wdXRzWydjYW1lcmEnXTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNDb25maWd1cmVkLFxuXHRcdFx0XHRkZXN0cm95OiAodGltZW91dCA9IDUwMCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvb3QgPSByb290cy5nZXQoY2FudmFzKTtcblx0XHRcdFx0XHRpZiAocm9vdCkge1xuXHRcdFx0XHRcdFx0cm9vdC51cGRhdGUoKHN0YXRlKSA9PiAoeyBpbnRlcm5hbDogeyAuLi5zdGF0ZS5pbnRlcm5hbCwgYWN0aXZlOiBmYWxzZSB9IH0pKTtcblx0XHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gcm9vdC5nZXQoKTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5ldmVudHMuZGlzY29ubmVjdD8uKCk7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUuZ2w/LnJlbmRlckxpc3RzPy5kaXNwb3NlPy4oKTtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5nbD8uZm9yY2VDb250ZXh0TG9zcz8uKCk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXRlLmdsPy54cikgc3RhdGUueHIuZGlzY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0XHRcdGRpc3Bvc2Uoc3RhdGUpO1xuXHRcdFx0XHRcdFx0XHRcdHJvb3RzLmRlbGV0ZShjYW52YXMpO1xuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcignW05HVF0gVW5leHBlY3RlZCBlcnJvciB3aGlsZSBkZXN0cm95aW5nIENhbnZhcyBSb290JywgZSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sIHRpbWVvdXQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Y29uZmlndXJlOiAoaW5wdXRzOiBOZ3RDYW52YXNJbnB1dHMpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7XG5cdFx0XHRcdFx0XHRzaGFkb3dzID0gZmFsc2UsXG5cdFx0XHRcdFx0XHRsaW5lYXIgPSBmYWxzZSxcblx0XHRcdFx0XHRcdGZsYXQgPSBmYWxzZSxcblx0XHRcdFx0XHRcdGxlZ2FjeSA9IGZhbHNlLFxuXHRcdFx0XHRcdFx0b3J0aG9ncmFwaGljID0gZmFsc2UsXG5cdFx0XHRcdFx0XHRmcmFtZWxvb3AgPSAnYWx3YXlzJyxcblx0XHRcdFx0XHRcdGRwciA9IFsxLCAyXSxcblx0XHRcdFx0XHRcdGdsOiBnbE9wdGlvbnMsXG5cdFx0XHRcdFx0XHRzaXplOiBzaXplT3B0aW9ucyxcblx0XHRcdFx0XHRcdGNhbWVyYTogY2FtZXJhT3B0aW9ucyxcblx0XHRcdFx0XHRcdHJheWNhc3RlcjogcmF5Y2FzdGVyT3B0aW9ucyxcblx0XHRcdFx0XHRcdHNjZW5lOiBzY2VuZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRldmVudHMsXG5cdFx0XHRcdFx0XHRsb29rQXQsXG5cdFx0XHRcdFx0XHRwZXJmb3JtYW5jZSxcblx0XHRcdFx0XHR9ID0gaW5wdXRzO1xuXG5cdFx0XHRcdFx0Y29uc3Qgc3RhdGUgPSBzdG9yZS5zbmFwc2hvdDtcblx0XHRcdFx0XHRjb25zdCBzdGF0ZVRvVXBkYXRlOiBQYXJ0aWFsPE5ndFN0YXRlPiA9IHt9O1xuXG5cdFx0XHRcdFx0Ly8gc2V0dXAgcmVuZGVyZXJcblx0XHRcdFx0XHRsZXQgZ2wgPSBzdGF0ZS5nbDtcblx0XHRcdFx0XHRpZiAoIXN0YXRlLmdsKSBzdGF0ZVRvVXBkYXRlLmdsID0gZ2wgPSBtYWtlUmVuZGVyZXJJbnN0YW5jZShnbE9wdGlvbnMsIGNhbnZhcyk7XG5cblx0XHRcdFx0XHQvLyBzZXR1cCByYXljYXN0ZXJcblx0XHRcdFx0XHRsZXQgcmF5Y2FzdGVyID0gc3RhdGUucmF5Y2FzdGVyO1xuXHRcdFx0XHRcdGlmICghcmF5Y2FzdGVyKSBzdGF0ZVRvVXBkYXRlLnJheWNhc3RlciA9IHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcblxuXHRcdFx0XHRcdC8vIHNldCByYXljYXN0ZXIgb3B0aW9uc1xuXHRcdFx0XHRcdGNvbnN0IHsgcGFyYW1zLCAuLi5vcHRpb25zIH0gPSByYXljYXN0ZXJPcHRpb25zIHx8IHt9O1xuXHRcdFx0XHRcdGlmICghaXMuZXF1KG9wdGlvbnMsIHJheWNhc3Rlciwgc2hhbGxvd0xvb3NlKSkgYXBwbHlQcm9wcyhyYXljYXN0ZXIsIG9wdGlvbnMpO1xuXHRcdFx0XHRcdGlmICghaXMuZXF1KHBhcmFtcywgcmF5Y2FzdGVyLnBhcmFtcywgc2hhbGxvd0xvb3NlKSkge1xuXHRcdFx0XHRcdFx0YXBwbHlQcm9wcyhyYXljYXN0ZXIsIHsgcGFyYW1zOiB7IC4uLnJheWNhc3Rlci5wYXJhbXMsIC4uLihwYXJhbXMgfHwge30pIH0gfSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ3JlYXRlIGRlZmF1bHQgY2FtZXJhLCBkb24ndCBvdmVyd3JpdGUgYW55IHVzZXItc2V0IHN0YXRlXG5cdFx0XHRcdFx0aWYgKCFzdGF0ZS5jYW1lcmEgfHwgKHN0YXRlLmNhbWVyYSA9PT0gbGFzdENhbWVyYSAmJiAhaXMuZXF1KGxhc3RDYW1lcmEsIGNhbWVyYU9wdGlvbnMsIHNoYWxsb3dMb29zZSkpKSB7XG5cdFx0XHRcdFx0XHRsYXN0Q2FtZXJhID0gY2FtZXJhT3B0aW9ucztcblx0XHRcdFx0XHRcdGNvbnN0IGlzQ2FtZXJhID0gaXMuY2FtZXJhKGNhbWVyYU9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0bGV0IGNhbWVyYSA9IGlzQ2FtZXJhID8gY2FtZXJhT3B0aW9ucyA6IG1ha2VDYW1lcmFJbnN0YW5jZShvcnRob2dyYXBoaWMsIHN0YXRlLnNpemUpO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWlzQ2FtZXJhKSB7XG5cdFx0XHRcdFx0XHRcdGNhbWVyYS5wb3NpdGlvbi56ID0gNTtcblx0XHRcdFx0XHRcdFx0aWYgKGNhbWVyYU9wdGlvbnMpIHtcblx0XHRcdFx0XHRcdFx0XHRhcHBseVByb3BzKGNhbWVyYSwgY2FtZXJhT3B0aW9ucyk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRcdFx0J2FzcGVjdCcgaW4gY2FtZXJhT3B0aW9ucyB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0J2xlZnQnIGluIGNhbWVyYU9wdGlvbnMgfHxcblx0XHRcdFx0XHRcdFx0XHRcdCdyaWdodCcgaW4gY2FtZXJhT3B0aW9ucyB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0J3RvcCcgaW4gY2FtZXJhT3B0aW9ucyB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0J2JvdHRvbScgaW4gY2FtZXJhT3B0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihjYW1lcmEsIHsgbWFudWFsOiB0cnVlIH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y2FtZXJhPy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gYWx3YXlzIGxvb2sgYXQgY2VudGVyIG9yIHBhc3NlZC1pbiBsb29rQXQgYnkgZGVmYXVsdFxuXHRcdFx0XHRcdFx0XHRpZiAoIXN0YXRlLmNhbWVyYSAmJiAhY2FtZXJhT3B0aW9ucz8ucm90YXRpb24gJiYgIWNhbWVyYU9wdGlvbnM/LnF1YXRlcm5pb24pIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShsb29rQXQpKSBjYW1lcmEubG9va0F0KGxvb2tBdFswXSwgbG9va0F0WzFdLCBsb29rQXRbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdGVsc2UgaWYgKGxvb2tBdCBpbnN0YW5jZW9mIFRIUkVFLlZlY3RvcjMpIGNhbWVyYS5sb29rQXQobG9va0F0KTtcblx0XHRcdFx0XHRcdFx0XHRlbHNlIGNhbWVyYS5sb29rQXQoMCwgMCwgMCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB1cGRhdGUgcHJvamVjdGlvbiBtYXRyaXggYWZ0ZXIgYXBwbHlwcm9wc1xuXHRcdFx0XHRcdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeD8uKCk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICghaXMuaW5zdGFuY2UoY2FtZXJhKSkgY2FtZXJhID0gcHJlcGFyZShjYW1lcmEsIHsgc3RvcmUgfSk7XG5cblx0XHRcdFx0XHRcdHN0YXRlVG9VcGRhdGUuY2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0XHRcdFx0XHQvLyBDb25maWd1cmUgcmF5Y2FzdGVyXG5cdFx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vcG1uZHJzL3JlYWN0LXhyL2lzc3Vlcy8zMDBcblx0XHRcdFx0XHRcdHJheWNhc3Rlci5jYW1lcmEgPSBjYW1lcmE7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2V0IHVwIHNjZW5lIChvbmUgdGltZSBvbmx5ISlcblx0XHRcdFx0XHRpZiAoIXN0YXRlLnNjZW5lKSB7XG5cdFx0XHRcdFx0XHRsZXQgc2NlbmU6IFRIUkVFLlNjZW5lO1xuXG5cdFx0XHRcdFx0XHRpZiAoc2NlbmVPcHRpb25zIGluc3RhbmNlb2YgVEhSRUUuU2NlbmUpIHtcblx0XHRcdFx0XHRcdFx0c2NlbmUgPSBzY2VuZU9wdGlvbnM7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NlbmVPcHRpb25zKSBhcHBseVByb3BzKHNjZW5lLCBzY2VuZU9wdGlvbnMpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGF0ZVRvVXBkYXRlLnNjZW5lID0gcHJlcGFyZShzY2VuZSwgeyBzdG9yZSB9KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTZXQgdXAgWFIgKG9uZSB0aW1lIG9ubHkhKVxuXHRcdFx0XHRcdGlmICghc3RhdGUueHIpIHtcblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmcmFtZSBiZWhhdmlvciBpbiBXZWJYUlxuXHRcdFx0XHRcdFx0Y29uc3QgaGFuZGxlWFJGcmFtZTogWFJGcmFtZVJlcXVlc3RDYWxsYmFjayA9ICh0aW1lc3RhbXA6IG51bWJlciwgZnJhbWU/OiBYUkZyYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdFx0XHRcdGlmIChzdGF0ZS5mcmFtZWxvb3AgPT09ICduZXZlcicpIHJldHVybjtcblx0XHRcdFx0XHRcdFx0bG9vcC5hZHZhbmNlKHRpbWVzdGFtcCwgdHJ1ZSwgc3RvcmUsIGZyYW1lKTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFRvZ2dsZSByZW5kZXIgc3dpdGNoaW5nIG9uIHNlc3Npb25cblx0XHRcdFx0XHRcdGNvbnN0IGhhbmRsZVNlc3Npb25DaGFuZ2UgPSAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHN0YXRlID0gc3RvcmUuc25hcHNob3Q7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmdsLnhyLmVuYWJsZWQgPSBzdGF0ZS5nbC54ci5pc1ByZXNlbnRpbmc7XG5cdFx0XHRcdFx0XHRcdHN0YXRlLmdsLnhyLnNldEFuaW1hdGlvbkxvb3Aoc3RhdGUuZ2wueHIuaXNQcmVzZW50aW5nID8gaGFuZGxlWFJGcmFtZSA6IG51bGwpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIXN0YXRlLmdsLnhyLmlzUHJlc2VudGluZykgbG9vcC5pbnZhbGlkYXRlKHN0b3JlKTtcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdC8vIFdlYlhSIHNlc3Npb24gbWFuYWdlclxuXHRcdFx0XHRcdFx0Y29uc3QgeHIgPSB7XG5cdFx0XHRcdFx0XHRcdGNvbm5lY3Q6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5hZGRFdmVudExpc3RlbmVyKCdzZXNzaW9uZW5kJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdGRpc2Nvbm5lY3Q6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uc3RhcnQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKTtcblx0XHRcdFx0XHRcdFx0XHRnbC54ci5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXNzaW9uZW5kJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBTdWJzY3JpYmUgdG8gV2ViWFIgc2Vzc2lvbiBldmVudHNcblx0XHRcdFx0XHRcdGlmIChnbC54ciAmJiB0eXBlb2YgZ2wueHIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgeHIuY29ubmVjdCgpO1xuXHRcdFx0XHRcdFx0c3RhdGVUb1VwZGF0ZS54ciA9IHhyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFNldCBzaGFkb3dtYXBcblx0XHRcdFx0XHRpZiAoZ2wuc2hhZG93TWFwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvbGRFbmFibGVkID0gZ2wuc2hhZG93TWFwLmVuYWJsZWQ7XG5cdFx0XHRcdFx0XHRjb25zdCBvbGRUeXBlID0gZ2wuc2hhZG93TWFwLnR5cGU7XG5cdFx0XHRcdFx0XHRnbC5zaGFkb3dNYXAuZW5hYmxlZCA9ICEhc2hhZG93cztcblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBzaGFkb3dzID09PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHRcdFx0Z2wuc2hhZG93TWFwLnR5cGUgPSBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygc2hhZG93cyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdHlwZXMgPSB7XG5cdFx0XHRcdFx0XHRcdFx0YmFzaWM6IFRIUkVFLkJhc2ljU2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHBlcmNlbnRhZ2U6IFRIUkVFLlBDRlNoYWRvd01hcCxcblx0XHRcdFx0XHRcdFx0XHRzb2Z0OiBUSFJFRS5QQ0ZTb2Z0U2hhZG93TWFwLFxuXHRcdFx0XHRcdFx0XHRcdHZhcmlhbmNlOiBUSFJFRS5WU01TaGFkb3dNYXAsXG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdGdsLnNoYWRvd01hcC50eXBlID0gdHlwZXNbc2hhZG93c10gPz8gVEhSRUUuUENGU29mdFNoYWRvd01hcDtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoaXMub2JqKHNoYWRvd3MpKSB7XG5cdFx0XHRcdFx0XHRcdE9iamVjdC5hc3NpZ24oZ2wuc2hhZG93TWFwLCBzaGFkb3dzKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKG9sZEVuYWJsZWQgIT09IGdsLnNoYWRvd01hcC5lbmFibGVkIHx8IG9sZFR5cGUgIT09IGdsLnNoYWRvd01hcC50eXBlKSBjaGVja05lZWRzVXBkYXRlKGdsLnNoYWRvd01hcCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU2FmZWx5IHNldCBjb2xvciBtYW5hZ2VtZW50IGlmIGF2YWlsYWJsZS5cblx0XHRcdFx0XHQvLyBBdm9pZCBhY2Nlc3NpbmcgVEhSRUUuQ29sb3JNYW5hZ2VtZW50IHRvIHBsYXkgbmljZSB3aXRoIG9sZGVyIHZlcnNpb25zXG5cdFx0XHRcdFx0aWYgKFRIUkVFLkNvbG9yTWFuYWdlbWVudCkge1xuXHRcdFx0XHRcdFx0Y29uc3QgQ29sb3JNYW5hZ2VtZW50ID0gVEhSRUUuQ29sb3JNYW5hZ2VtZW50IGFzIE5ndEFueVJlY29yZDtcblx0XHRcdFx0XHRcdGlmICgnZW5hYmxlZCcgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2VuYWJsZWQnXSA9ICFsZWdhY3kgfHwgZmFsc2U7XG5cdFx0XHRcdFx0XHRlbHNlIGlmICgnbGVnYWN5TW9kZScgaW4gQ29sb3JNYW5hZ2VtZW50KSBDb2xvck1hbmFnZW1lbnRbJ2xlZ2FjeU1vZGUnXSA9IGxlZ2FjeSB8fCB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICghaXNDb25maWd1cmVkKSB7XG5cdFx0XHRcdFx0XHQvLyBzZXQgY29sb3Igc3BhY2UgYW5kIHRvbmVtYXBwaW5nIHByZWZlcmVuY2VzIG9uY2Vcblx0XHRcdFx0XHRcdGNvbnN0IExpbmVhckVuY29kaW5nID0gMzAwMDtcblx0XHRcdFx0XHRcdGNvbnN0IHNSR0JFbmNvZGluZyA9IDMwMDE7XG5cdFx0XHRcdFx0XHRhcHBseVByb3BzKGdsLCB7XG5cdFx0XHRcdFx0XHRcdG91dHB1dEVuY29kaW5nOiBsaW5lYXIgPyBMaW5lYXJFbmNvZGluZyA6IHNSR0JFbmNvZGluZyxcblx0XHRcdFx0XHRcdFx0dG9uZU1hcHBpbmc6IGZsYXQgPyBUSFJFRS5Ob1RvbmVNYXBwaW5nIDogVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVXBkYXRlIGNvbG9yIG1hbmFnZW1lbnQgc3RhdGVcblx0XHRcdFx0XHRpZiAoc3RhdGUubGVnYWN5ICE9PSBsZWdhY3kpIHN0YXRlVG9VcGRhdGUubGVnYWN5ID0gbGVnYWN5O1xuXHRcdFx0XHRcdGlmIChzdGF0ZS5saW5lYXIgIT09IGxpbmVhcikgc3RhdGVUb1VwZGF0ZS5saW5lYXIgPSBsaW5lYXI7XG5cdFx0XHRcdFx0aWYgKHN0YXRlLmZsYXQgIT09IGZsYXQpIHN0YXRlVG9VcGRhdGUuZmxhdCA9IGZsYXQ7XG5cblx0XHRcdFx0XHQvLyBTZXQgZ2wgcHJvcHNcblx0XHRcdFx0XHRnbC5zZXRDbGVhckFscGhhKDApO1xuXHRcdFx0XHRcdGdsLnNldFBpeGVsUmF0aW8obWFrZURwcihzdGF0ZS52aWV3cG9ydC5kcHIpKTtcblx0XHRcdFx0XHRnbC5zZXRTaXplKHN0YXRlLnNpemUud2lkdGgsIHN0YXRlLnNpemUuaGVpZ2h0KTtcblxuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdGlzLm9iaihnbE9wdGlvbnMpICYmXG5cdFx0XHRcdFx0XHQhKHR5cGVvZiBnbE9wdGlvbnMgPT09ICdmdW5jdGlvbicpICYmXG5cdFx0XHRcdFx0XHQhaXMucmVuZGVyZXIoZ2xPcHRpb25zKSAmJlxuXHRcdFx0XHRcdFx0IWlzLmVxdShnbE9wdGlvbnMsIGdsLCBzaGFsbG93TG9vc2UpXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRhcHBseVByb3BzKGdsLCBnbE9wdGlvbnMpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN0b3JlIGV2ZW50cyBpbnRlcm5hbGx5XG5cdFx0XHRcdFx0aWYgKGV2ZW50cyAmJiAhc3RhdGUuZXZlbnRzLmhhbmRsZXJzKSBzdGF0ZVRvVXBkYXRlLmV2ZW50cyA9IGV2ZW50cyhzdG9yZSk7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBwZXJmb3JtYW5jZVxuXHRcdFx0XHRcdGlmIChwZXJmb3JtYW5jZSAmJiAhaXMuZXF1KHBlcmZvcm1hbmNlLCBzdGF0ZS5wZXJmb3JtYW5jZSwgc2hhbGxvd0xvb3NlKSkge1xuXHRcdFx0XHRcdFx0c3RhdGVUb1VwZGF0ZS5wZXJmb3JtYW5jZSA9IHsgLi4uc3RhdGUucGVyZm9ybWFuY2UsIC4uLnBlcmZvcm1hbmNlIH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c3RvcmUudXBkYXRlKHN0YXRlVG9VcGRhdGUpO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgc2l6ZSwgYWxsb3cgaXQgdG8gdGFrZSBvbiBjb250YWluZXIgYm91bmRzIGluaXRpYWxseVxuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSBjb21wdXRlSW5pdGlhbFNpemUoY2FudmFzLCBzaXplT3B0aW9ucyk7XG5cdFx0XHRcdFx0aWYgKCFpcy5lcXUoc2l6ZSwgc3RhdGUuc2l6ZSwgc2hhbGxvd0xvb3NlKSkge1xuXHRcdFx0XHRcdFx0c3RhdGUuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCwgc2l6ZS50b3AsIHNpemUubGVmdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgcGl4ZWxyYXRpb1xuXHRcdFx0XHRcdGlmIChkcHIgJiYgc3RhdGUudmlld3BvcnQuZHByICE9PSBtYWtlRHByKGRwcikpIHN0YXRlLnNldERwcihkcHIpO1xuXHRcdFx0XHRcdC8vIENoZWNrIGZyYW1lbG9vcFxuXHRcdFx0XHRcdGlmIChzdGF0ZS5mcmFtZWxvb3AgIT09IGZyYW1lbG9vcCkgc3RhdGUuc2V0RnJhbWVsb29wKGZyYW1lbG9vcCk7XG5cblx0XHRcdFx0XHRpc0NvbmZpZ3VyZWQgPSB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblx0XHR9O1xuXHR9KTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0Q2FudmFzQ29uZmlndXJhdG9yID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBpbmplY3RDYW52YXNSb290SW5pdGlhbGl6ZXI+PjtcblxuZnVuY3Rpb24gY29tcHV0ZUluaXRpYWxTaXplKGNhbnZhczogTmd0Q2FudmFzRWxlbWVudCwgZGVmYXVsdFNpemU/OiBOZ3RTaXplKTogTmd0U2l6ZSB7XG5cdGlmIChkZWZhdWx0U2l6ZSkge1xuXHRcdHJldHVybiBkZWZhdWx0U2l6ZTtcblx0fVxuXG5cdGlmICh0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGNhbnZhcyBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICYmIGNhbnZhcy5wYXJlbnRFbGVtZW50KSB7XG5cdFx0cmV0dXJuIGNhbnZhcy5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIGNhbnZhcyBpbnN0YW5jZW9mIE9mZnNjcmVlbkNhbnZhcykge1xuXHRcdHJldHVybiB7IHdpZHRoOiBjYW52YXMud2lkdGgsIGhlaWdodDogY2FudmFzLmhlaWdodCwgdG9wOiAwLCBsZWZ0OiAwIH07XG5cdH1cblxuXHRyZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwLCB0b3A6IDAsIGxlZnQ6IDAgfTtcbn1cblxuLy8gRGlzcG9zZXMgYW4gb2JqZWN0IGFuZCBhbGwgaXRzIHByb3BlcnRpZXNcbmZ1bmN0aW9uIGRpc3Bvc2U8VE9iaiBleHRlbmRzIHsgZGlzcG9zZT86ICgpID0+IHZvaWQ7IHR5cGU/OiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IGFueSB9PihvYmo6IFRPYmopIHtcblx0aWYgKG9iai5kaXNwb3NlICYmIG9iai50eXBlICE9PSAnU2NlbmUnKSBvYmouZGlzcG9zZSgpO1xuXHRmb3IgKGNvbnN0IHAgaW4gb2JqKSB7XG5cdFx0KHAgYXMgYW55KS5kaXNwb3NlPy4oKTtcblx0XHRkZWxldGUgb2JqW3BdO1xuXHR9XG59XG4iXX0=
@@ -0,0 +1,33 @@
1
+ var _a;
2
+ import { ChangeDetectorRef, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { ActivationEnd, Router, RouterOutlet } from '@angular/router';
5
+ import { filter } from 'rxjs';
6
+ import { ROUTED_SCENE } from './renderer/constants';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/router";
9
+ export class NgtRoutedScene {
10
+ static { _a = ROUTED_SCENE; }
11
+ static { this[_a] = true; }
12
+ constructor(router, cdr) {
13
+ router.events
14
+ .pipe(filter((event) => event instanceof ActivationEnd), takeUntilDestroyed())
15
+ .subscribe(cdr.detectChanges.bind(cdr));
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtRoutedScene, deps: [{ token: i1.Router }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.0", type: NgtRoutedScene, isStandalone: true, selector: "ngt-routed-scene", ngImport: i0, template: `
19
+ <router-outlet />
20
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
21
+ }
22
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.0", ngImport: i0, type: NgtRoutedScene, decorators: [{
23
+ type: Component,
24
+ args: [{
25
+ standalone: true,
26
+ selector: 'ngt-routed-scene',
27
+ template: `
28
+ <router-outlet />
29
+ `,
30
+ imports: [RouterOutlet],
31
+ }]
32
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i0.ChangeDetectorRef }] });
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVkLXNjZW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcm91dGVkLXNjZW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFVcEQsTUFBTSxPQUFPLGNBQWM7a0JBQ2xCLFlBQVk7YUFBYixRQUFjLEdBQUcsSUFBSSxBQUFQLENBQVE7SUFFN0IsWUFBWSxNQUFjLEVBQUUsR0FBc0I7UUFDakQsTUFBTSxDQUFDLE1BQU07YUFDWCxJQUFJLENBQ0osTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLFlBQVksYUFBYSxDQUFDLEVBQ2pELGtCQUFrQixFQUFFLENBQ3BCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQzs4R0FWVyxjQUFjO2tHQUFkLGNBQWMsNEVBTGhCOztFQUVULDREQUNTLFlBQVk7OzJGQUVWLGNBQWM7a0JBUjFCLFNBQVM7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBST1VURURfU0NFTkUgfSBmcm9tICcuL3JlbmRlcmVyL2NvbnN0YW50cyc7XG5cbkBDb21wb25lbnQoe1xuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHRzZWxlY3RvcjogJ25ndC1yb3V0ZWQtc2NlbmUnLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxyb3V0ZXItb3V0bGV0IC8+XG5cdGAsXG5cdGltcG9ydHM6IFtSb3V0ZXJPdXRsZXRdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RSb3V0ZWRTY2VuZSB7XG5cdHN0YXRpYyBbUk9VVEVEX1NDRU5FXSA9IHRydWU7XG5cblx0Y29uc3RydWN0b3Iocm91dGVyOiBSb3V0ZXIsIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcblx0XHRyb3V0ZXIuZXZlbnRzXG5cdFx0XHQucGlwZShcblx0XHRcdFx0ZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uRW5kKSxcblx0XHRcdFx0dGFrZVVudGlsRGVzdHJveWVkKCksXG5cdFx0XHQpXG5cdFx0XHQuc3Vic2NyaWJlKGNkci5kZXRlY3RDaGFuZ2VzLmJpbmQoY2RyKSk7XG5cdH1cbn1cbiJdfQ==