angular-three 2.0.0-beta.3 → 2.0.0-beta.300

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 (159) hide show
  1. package/README.md +186 -112
  2. package/esm2022/angular-three.mjs +1 -1
  3. package/esm2022/index.mjs +17 -18
  4. package/esm2022/lib/canvas.mjs +155 -252
  5. package/esm2022/lib/directives/args.mjs +49 -21
  6. package/esm2022/lib/directives/selection.mjs +65 -0
  7. package/esm2022/lib/dom/events.mjs +7 -2
  8. package/esm2022/lib/events.mjs +98 -79
  9. package/esm2022/lib/html.mjs +40 -0
  10. package/esm2022/lib/instance.mjs +72 -0
  11. package/esm2022/lib/loader.mjs +77 -57
  12. package/esm2022/lib/loop.mjs +30 -24
  13. package/esm2022/lib/pipes/hexify.mjs +67 -0
  14. package/esm2022/lib/portal.mjs +184 -215
  15. package/esm2022/lib/renderer/catalogue.mjs +7 -0
  16. package/esm2022/lib/renderer/constants.mjs +20 -0
  17. package/esm2022/lib/renderer/index.mjs +557 -0
  18. package/esm2022/lib/renderer/state.mjs +49 -0
  19. package/esm2022/lib/renderer/utils.mjs +85 -74
  20. package/esm2022/lib/roots.mjs +273 -0
  21. package/esm2022/lib/routed-scene.mjs +13 -11
  22. package/esm2022/lib/store.mjs +183 -0
  23. package/esm2022/lib/three-types.mjs +1 -1
  24. package/esm2022/lib/types.mjs +1 -1
  25. package/esm2022/lib/utils/apply-props.mjs +43 -35
  26. package/esm2022/lib/utils/attach.mjs +13 -10
  27. package/esm2022/lib/utils/before-render.mjs +12 -0
  28. package/esm2022/lib/utils/is.mjs +6 -5
  29. package/esm2022/lib/utils/make.mjs +19 -17
  30. package/esm2022/lib/utils/non-nullish.mjs +7 -0
  31. package/esm2022/lib/utils/object-events.mjs +92 -0
  32. package/esm2022/lib/utils/parameters.mjs +70 -0
  33. package/esm2022/lib/utils/resolve-ref.mjs +8 -0
  34. package/esm2022/lib/utils/signal-store.mjs +90 -0
  35. package/esm2022/lib/utils/update.mjs +8 -4
  36. package/esm2022/testing/angular-three-testing.mjs +5 -0
  37. package/esm2022/testing/index.mjs +3 -0
  38. package/esm2022/testing/lib/test-bed.mjs +130 -0
  39. package/esm2022/testing/lib/test-canvas.mjs +45 -0
  40. package/esm2022/testing/lib/utils/mock-canvas.mjs +37 -0
  41. package/esm2022/testing/lib/utils/web-gl-rendering-context.mjs +752 -0
  42. package/fesm2022/angular-three-testing.mjs +966 -0
  43. package/fesm2022/angular-three-testing.mjs.map +1 -0
  44. package/fesm2022/angular-three.mjs +2110 -2057
  45. package/fesm2022/angular-three.mjs.map +1 -1
  46. package/index.d.ts +18 -17
  47. package/lib/canvas.d.ts +373 -33
  48. package/lib/directives/args.d.ts +14 -7
  49. package/lib/directives/selection.d.ts +17 -0
  50. package/lib/dom/events.d.ts +2 -2
  51. package/lib/events.d.ts +4 -4
  52. package/lib/html.d.ts +17 -0
  53. package/lib/instance.d.ts +4 -0
  54. package/lib/loader.d.ts +28 -5
  55. package/lib/loop.d.ts +27 -17
  56. package/lib/pipes/hexify.d.ts +20 -0
  57. package/lib/portal.d.ts +58 -44
  58. package/lib/renderer/catalogue.d.ts +13 -0
  59. package/lib/renderer/constants.d.ts +19 -0
  60. package/lib/renderer/{renderer.d.ts → index.d.ts} +34 -18
  61. package/lib/renderer/state.d.ts +24 -0
  62. package/lib/renderer/utils.d.ts +12 -20
  63. package/lib/roots.d.ts +13 -0
  64. package/lib/routed-scene.d.ts +1 -1
  65. package/lib/store.d.ts +15 -0
  66. package/lib/three-types.d.ts +502 -149
  67. package/lib/types.d.ts +161 -178
  68. package/lib/utils/apply-props.d.ts +2 -2
  69. package/lib/utils/attach.d.ts +4 -4
  70. package/lib/utils/is.d.ts +13 -13
  71. package/lib/utils/make.d.ts +10 -5
  72. package/lib/utils/non-nullish.d.ts +4 -0
  73. package/lib/utils/object-events.d.ts +34 -0
  74. package/lib/utils/parameters.d.ts +20 -0
  75. package/lib/utils/resolve-ref.d.ts +2 -0
  76. package/lib/utils/signal-store.d.ts +26 -0
  77. package/lib/utils/update.d.ts +1 -1
  78. package/metadata.json +1 -1
  79. package/package.json +41 -14
  80. package/plugin/generators.json +34 -16
  81. package/plugin/package.json +3 -6
  82. package/plugin/src/generators/add-soba/compat.d.ts +2 -0
  83. package/plugin/src/generators/add-soba/compat.js +6 -0
  84. package/plugin/src/generators/add-soba/compat.js.map +1 -0
  85. package/plugin/src/generators/add-soba/generator.d.ts +3 -0
  86. package/plugin/src/generators/add-soba/generator.js +78 -0
  87. package/plugin/src/generators/add-soba/generator.js.map +1 -0
  88. package/plugin/src/generators/add-soba/schema.json +4 -0
  89. package/plugin/src/generators/gltf/compat.d.ts +2 -0
  90. package/plugin/src/generators/gltf/compat.js +6 -0
  91. package/plugin/src/generators/gltf/compat.js.map +1 -0
  92. package/plugin/src/generators/gltf/files/__fileName__.ts__tmpl__ +36 -0
  93. package/plugin/src/generators/gltf/generator.d.ts +12 -0
  94. package/plugin/src/generators/gltf/generator.js +125 -0
  95. package/plugin/src/generators/gltf/generator.js.map +1 -0
  96. package/plugin/src/generators/gltf/schema.json +58 -0
  97. package/plugin/src/generators/init/compat.d.ts +1 -1
  98. package/plugin/src/generators/init/compat.js +2 -2
  99. package/plugin/src/generators/init/compat.js.map +1 -1
  100. package/plugin/src/generators/init/files/experience/experience.component.ts__tmpl__ +29 -0
  101. package/plugin/src/generators/init/generator.d.ts +6 -0
  102. package/plugin/src/generators/init/generator.js +154 -0
  103. package/plugin/src/generators/init/generator.js.map +1 -0
  104. package/plugin/src/generators/init/schema.json +11 -4
  105. package/plugin/src/generators/utils.d.ts +2 -0
  106. package/plugin/src/generators/utils.js +35 -0
  107. package/plugin/src/generators/utils.js.map +1 -0
  108. package/plugin/src/generators/version.d.ts +16 -0
  109. package/plugin/src/generators/version.js +20 -0
  110. package/plugin/src/generators/version.js.map +1 -0
  111. package/plugin/src/index.d.ts +0 -1
  112. package/plugin/src/index.js +0 -5
  113. package/plugin/src/index.js.map +1 -1
  114. package/testing/README.md +3 -0
  115. package/testing/index.d.ts +2 -0
  116. package/testing/lib/test-bed.d.ts +38 -0
  117. package/testing/lib/test-canvas.d.ts +11 -0
  118. package/testing/lib/utils/mock-canvas.d.ts +5 -0
  119. package/testing/lib/utils/web-gl-rendering-context.d.ts +16 -0
  120. package/testing/package.json +3 -0
  121. package/web-types.json +1 -1
  122. package/esm2022/lib/di/before-render.mjs +0 -13
  123. package/esm2022/lib/di/catalogue.mjs +0 -7
  124. package/esm2022/lib/di/ref.mjs +0 -49
  125. package/esm2022/lib/directives/common.mjs +0 -39
  126. package/esm2022/lib/directives/parent.mjs +0 -33
  127. package/esm2022/lib/directives/repeat.mjs +0 -18
  128. package/esm2022/lib/renderer/di.mjs +0 -3
  129. package/esm2022/lib/renderer/enums.mjs +0 -2
  130. package/esm2022/lib/renderer/provider.mjs +0 -18
  131. package/esm2022/lib/renderer/renderer.mjs +0 -365
  132. package/esm2022/lib/renderer/store.mjs +0 -372
  133. package/esm2022/lib/stores/signal.store.mjs +0 -81
  134. package/esm2022/lib/stores/store.mjs +0 -423
  135. package/esm2022/lib/utils/assert-in-injection-context.mjs +0 -14
  136. package/esm2022/lib/utils/instance.mjs +0 -63
  137. package/esm2022/lib/utils/safe-detect-changes.mjs +0 -15
  138. package/esm2022/lib/utils/signal.mjs +0 -24
  139. package/esm2022/lib/utils/timing.mjs +0 -21
  140. package/lib/di/catalogue.d.ts +0 -3
  141. package/lib/di/ref.d.ts +0 -7
  142. package/lib/directives/common.d.ts +0 -11
  143. package/lib/directives/parent.d.ts +0 -11
  144. package/lib/directives/repeat.d.ts +0 -7
  145. package/lib/renderer/di.d.ts +0 -2
  146. package/lib/renderer/enums.d.ts +0 -26
  147. package/lib/renderer/provider.d.ts +0 -8
  148. package/lib/renderer/store.d.ts +0 -63
  149. package/lib/stores/signal.store.d.ts +0 -20
  150. package/lib/stores/store.d.ts +0 -13
  151. package/lib/utils/assert-in-injection-context.d.ts +0 -2
  152. package/lib/utils/instance.d.ts +0 -4
  153. package/lib/utils/safe-detect-changes.d.ts +0 -2
  154. package/lib/utils/signal.d.ts +0 -2
  155. package/lib/utils/timing.d.ts +0 -4
  156. package/plugin/src/generators/init/init.d.ts +0 -5
  157. package/plugin/src/generators/init/init.js +0 -56
  158. package/plugin/src/generators/init/init.js.map +0 -1
  159. /package/lib/{di → utils}/before-render.d.ts +0 -0
@@ -1,372 +0,0 @@
1
- import { getDebugNode, untracked } from '@angular/core';
2
- import { NgtArgs } from '../directives/args';
3
- import { NgtParent } from '../directives/parent';
4
- import { NgtStore } from '../stores/store';
5
- import { applyProps } from '../utils/apply-props';
6
- import { getLocalState } from '../utils/instance';
7
- import { is } from '../utils/is';
8
- import { SPECIAL_INTERNAL_ADD_COMMENT, SPECIAL_PROPERTIES, attachThreeChild, removeThreeChild } from './utils';
9
- export class NgtRendererStore {
10
- #comments = [];
11
- constructor(root) {
12
- this.root = root;
13
- }
14
- createNode(type, node) {
15
- const state = [
16
- type,
17
- null,
18
- null,
19
- [],
20
- false,
21
- undefined,
22
- undefined,
23
- undefined,
24
- undefined,
25
- undefined,
26
- undefined,
27
- undefined,
28
- undefined,
29
- undefined,
30
- undefined,
31
- ];
32
- const rendererNode = Object.assign(node, { __ngt_renderer__: state });
33
- // assign ownerDocument to node so we can use HostListener in Component
34
- if (!rendererNode['ownerDocument'])
35
- rendererNode['ownerDocument'] = this.root.document;
36
- // assign injectorFactory on non-three type since
37
- // rendererNode is an instance of DOM Node
38
- if (state[0 /* NgtRendererClassId.type */] !== 'three') {
39
- state[14 /* NgtRendererClassId.injectorFactory */] = () => getDebugNode(rendererNode).injector;
40
- }
41
- if (state[0 /* NgtRendererClassId.type */] === 'comment') {
42
- // we attach an arrow function to the Comment node
43
- // In our directives, we can call this function to then start tracking the RendererNode
44
- // this is done to limit the amount of Nodes we need to process for getCreationState
45
- rendererNode[SPECIAL_INTERNAL_ADD_COMMENT] = (node) => {
46
- if (node && node.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'portal') {
47
- this.portals.push(node);
48
- }
49
- else {
50
- this.#comments.push(rendererNode);
51
- }
52
- };
53
- return rendererNode;
54
- }
55
- if (state[0 /* NgtRendererClassId.type */] === 'compound') {
56
- state[8 /* NgtRendererClassId.queueOps */] = new Set();
57
- state[9 /* NgtRendererClassId.attributes */] = {};
58
- state[10 /* NgtRendererClassId.properties */] = {};
59
- return rendererNode;
60
- }
61
- return rendererNode;
62
- }
63
- setParent(node, parent) {
64
- if (!node.__ngt_renderer__[1 /* NgtRendererClassId.parent */]) {
65
- node.__ngt_renderer__[1 /* NgtRendererClassId.parent */] = parent;
66
- }
67
- }
68
- addChild(node, child) {
69
- if (!node.__ngt_renderer__[3 /* NgtRendererClassId.children */].includes(child)) {
70
- node.__ngt_renderer__[3 /* NgtRendererClassId.children */].push(child);
71
- }
72
- }
73
- removeChild(node, child) {
74
- const index = node.__ngt_renderer__[3 /* NgtRendererClassId.children */].findIndex((c) => child === c);
75
- if (index >= 0) {
76
- node.__ngt_renderer__[3 /* NgtRendererClassId.children */].splice(index, 1);
77
- }
78
- }
79
- setCompound(compound, instance) {
80
- const rS = compound.__ngt_renderer__;
81
- rS[7 /* NgtRendererClassId.compounded */] = instance;
82
- const attributes = Object.keys(rS[9 /* NgtRendererClassId.attributes */]);
83
- const properties = Object.keys(rS[10 /* NgtRendererClassId.properties */]);
84
- for (const key of attributes) {
85
- this.applyAttribute(instance, key, rS[9 /* NgtRendererClassId.attributes */][key]);
86
- }
87
- for (const key of properties) {
88
- this.applyProperty(instance, key, rS[10 /* NgtRendererClassId.properties */][key]);
89
- }
90
- this.executeOperation(compound);
91
- }
92
- queueOperation(node, op) {
93
- node.__ngt_renderer__[8 /* NgtRendererClassId.queueOps */].add(op);
94
- }
95
- executeOperation(node, type = 'op') {
96
- const rS = node.__ngt_renderer__;
97
- if (rS[8 /* NgtRendererClassId.queueOps */]?.size) {
98
- rS[8 /* NgtRendererClassId.queueOps */].forEach((op) => {
99
- if (op[0 /* NgtQueueOpClassId.type */] === type) {
100
- op[1 /* NgtQueueOpClassId.op */]();
101
- rS[8 /* NgtRendererClassId.queueOps */].delete(op);
102
- }
103
- });
104
- }
105
- }
106
- processPortalContainer(portal) {
107
- const injectorFactory = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */];
108
- const injector = injectorFactory?.();
109
- if (!injector)
110
- return;
111
- const portalStore = injector.get(NgtStore, null);
112
- if (!portalStore)
113
- return;
114
- const portalContainer = portalStore.get('scene');
115
- if (!portalContainer)
116
- return;
117
- portal.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */] = this.createNode('three', portalContainer);
118
- }
119
- applyAttribute(node, name, value) {
120
- const rS = node.__ngt_renderer__;
121
- if (rS[4 /* NgtRendererClassId.destroyed */])
122
- return;
123
- if (name === SPECIAL_PROPERTIES.RENDER_PRIORITY) {
124
- // priority needs to be set as an attribute string so that they can be set as early as possible
125
- // we convert that string to a number. if it's invalid, 0
126
- let priority = Number(value);
127
- if (isNaN(priority)) {
128
- priority = 0;
129
- console.warn(`[NGT] "priority" is an invalid number, default to 0`);
130
- }
131
- getLocalState(node).priority = priority;
132
- }
133
- if (name === SPECIAL_PROPERTIES.COMPOUND) {
134
- // we set the compound property on instance node now so we know that this instance is being compounded
135
- rS[5 /* NgtRendererClassId.compound */] = [value === '' || value === 'first', {}];
136
- return;
137
- }
138
- if (name === SPECIAL_PROPERTIES.ATTACH) {
139
- // handle attach as tring
140
- const paths = value.split('.');
141
- if (paths.length)
142
- getLocalState(node).attach = paths;
143
- return;
144
- }
145
- if (name === SPECIAL_PROPERTIES.VALUE) {
146
- // coercion
147
- let maybeCoerced = value;
148
- if (maybeCoerced === '' || maybeCoerced === 'true' || maybeCoerced === 'false') {
149
- maybeCoerced = maybeCoerced === 'true' || maybeCoerced === '';
150
- }
151
- else if (!isNaN(Number(maybeCoerced))) {
152
- maybeCoerced = Number(maybeCoerced);
153
- }
154
- rS[11 /* NgtRendererClassId.rawValue */] = maybeCoerced;
155
- return;
156
- }
157
- applyProps(node, { [name]: value });
158
- }
159
- applyProperty(node, name, value) {
160
- const rS = node.__ngt_renderer__;
161
- if (rS[4 /* NgtRendererClassId.destroyed */])
162
- return;
163
- // [ref]
164
- if (name === SPECIAL_PROPERTIES.REF && is.ref(value)) {
165
- rS[12 /* NgtRendererClassId.ref */] = value;
166
- value.nativeElement = node;
167
- return;
168
- }
169
- const parent = getLocalState(node).parent() || rS[1 /* NgtRendererClassId.parent */];
170
- // [rawValue]
171
- if (getLocalState(node).isRaw && name === SPECIAL_PROPERTIES.VALUE) {
172
- rS[11 /* NgtRendererClassId.rawValue */] = value;
173
- if (parent)
174
- attachThreeChild(parent, node);
175
- return;
176
- }
177
- // [attach]
178
- if (name === SPECIAL_PROPERTIES.ATTACH) {
179
- getLocalState(node).attach = Array.isArray(value) ? value.map((v) => v.toString()) : value;
180
- if (parent)
181
- attachThreeChild(parent, node);
182
- return;
183
- }
184
- const compound = rS[5 /* NgtRendererClassId.compound */];
185
- if (compound?.[1 /* NgtCompoundClassId.props */] &&
186
- name in compound[1 /* NgtCompoundClassId.props */] &&
187
- !compound[0 /* NgtCompoundClassId.applyFirst */]) {
188
- value = compound[1 /* NgtCompoundClassId.props */][name];
189
- }
190
- applyProps(node, { [name]: value });
191
- }
192
- isCompound(name) {
193
- return this.root.compoundPrefixes.some((prefix) => name.startsWith(prefix));
194
- }
195
- isDOM(node) {
196
- const rS = node['__ngt_renderer__'];
197
- return (!rS ||
198
- (rS[0 /* NgtRendererClassId.type */] !== 'compound' &&
199
- (node instanceof Element || node instanceof Document || node instanceof Window)));
200
- }
201
- get rootScene() {
202
- return this.root.store.get('scene');
203
- }
204
- get portals() {
205
- return this.root.portals;
206
- }
207
- getClosestParentWithInstance(node) {
208
- let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
209
- while (parent && parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'three') {
210
- parent = parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
211
- ? parent.__ngt_renderer__[13 /* NgtRendererClassId.portalContainer */]
212
- : parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
213
- }
214
- return parent;
215
- }
216
- getClosestParentWithCompound(node) {
217
- if (node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
218
- return node.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
219
- }
220
- let parent = node.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
221
- if (parent &&
222
- parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'compound' &&
223
- !parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
224
- return parent;
225
- }
226
- while (parent &&
227
- (parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' ||
228
- !parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */] ||
229
- parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] !== 'compound')) {
230
- parent = parent.__ngt_renderer__[1 /* NgtRendererClassId.parent */];
231
- }
232
- if (!parent)
233
- return;
234
- if (parent.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' &&
235
- parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */]) {
236
- return parent.__ngt_renderer__[6 /* NgtRendererClassId.compoundParent */];
237
- }
238
- if (!parent.__ngt_renderer__[7 /* NgtRendererClassId.compounded */]) {
239
- return parent;
240
- }
241
- return null;
242
- }
243
- getCreationState() {
244
- const injectedArgs = this.firstNonInjectedDirective(NgtArgs)?.args || [];
245
- const injectedParent = this.firstNonInjectedDirective(NgtParent)?.parent || null;
246
- const store = this.tryGetPortalStore();
247
- return { injectedArgs, injectedParent, store };
248
- }
249
- destroy(node, parent) {
250
- const rS = node.__ngt_renderer__;
251
- if (rS[4 /* NgtRendererClassId.destroyed */])
252
- return;
253
- if (rS[0 /* NgtRendererClassId.type */] === 'three') {
254
- rS[5 /* NgtRendererClassId.compound */] = undefined;
255
- rS[6 /* NgtRendererClassId.compoundParent */] = undefined;
256
- const localState = getLocalState(node);
257
- if (localState.objects) {
258
- untracked(localState.objects).forEach((obj) => this.destroy(obj, parent));
259
- }
260
- if (localState.nonObjects) {
261
- untracked(localState.nonObjects).forEach((obj) => this.destroy(obj, parent));
262
- }
263
- if (localState.afterUpdate)
264
- localState.afterUpdate.complete();
265
- if (localState.afterAttach)
266
- localState.afterAttach.complete();
267
- delete localState['objects'];
268
- delete localState['nonObjects'];
269
- delete localState['nativeProps'];
270
- delete localState['add'];
271
- delete localState['remove'];
272
- delete localState['afterUpdate'];
273
- delete localState['afterAttach'];
274
- delete localState['store'];
275
- delete localState['handlers'];
276
- if (!localState.primitive) {
277
- delete node['__ngt__'];
278
- }
279
- }
280
- if (rS[0 /* NgtRendererClassId.type */] === 'comment') {
281
- rS[14 /* NgtRendererClassId.injectorFactory */] = null;
282
- delete node[SPECIAL_INTERNAL_ADD_COMMENT];
283
- const index = this.#comments.findIndex((comment) => comment === node);
284
- if (index > -1) {
285
- this.#comments.splice(index, 1);
286
- }
287
- }
288
- if (rS[0 /* NgtRendererClassId.type */] === 'portal') {
289
- rS[14 /* NgtRendererClassId.injectorFactory */] = null;
290
- const index = this.portals.findIndex((portal) => portal === node);
291
- if (index > -1) {
292
- this.portals.splice(index, 1);
293
- }
294
- }
295
- if (rS[0 /* NgtRendererClassId.type */] === 'compound') {
296
- rS[7 /* NgtRendererClassId.compounded */] = undefined;
297
- rS[9 /* NgtRendererClassId.attributes */] = null;
298
- rS[10 /* NgtRendererClassId.properties */] = null;
299
- this.executeOperation(node, 'cleanUp');
300
- rS[8 /* NgtRendererClassId.queueOps */].clear();
301
- rS[8 /* NgtRendererClassId.queueOps */] = null;
302
- }
303
- if (rS[12 /* NgtRendererClassId.ref */]) {
304
- // nullify ref
305
- rS[12 /* NgtRendererClassId.ref */].nativeElement = null;
306
- rS[12 /* NgtRendererClassId.ref */] = undefined;
307
- }
308
- // nullify parent
309
- rS[1 /* NgtRendererClassId.parent */] = null;
310
- for (const renderChild of rS[3 /* NgtRendererClassId.children */] || []) {
311
- if (renderChild.__ngt_renderer__[0 /* NgtRendererClassId.type */] === 'three' && parent) {
312
- removeThreeChild(parent, renderChild, true);
313
- }
314
- this.destroy(renderChild, parent);
315
- }
316
- rS[3 /* NgtRendererClassId.children */] = [];
317
- rS[4 /* NgtRendererClassId.destroyed */] = true;
318
- if (parent) {
319
- this.removeChild(parent, node);
320
- }
321
- }
322
- firstNonInjectedDirective(dir) {
323
- let directive;
324
- let i = this.#comments.length - 1;
325
- while (i >= 0) {
326
- const comment = this.#comments[i];
327
- if (comment.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
328
- i--;
329
- continue;
330
- }
331
- const injector = comment.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
332
- if (!injector) {
333
- i--;
334
- continue;
335
- }
336
- const instance = injector.get(dir, null);
337
- if (instance && instance.validate()) {
338
- directive = instance;
339
- break;
340
- }
341
- i--;
342
- }
343
- return directive;
344
- }
345
- tryGetPortalStore() {
346
- let store;
347
- // we only care about the portal states because NgtStore only differs per Portal
348
- let i = this.portals.length - 1;
349
- while (i >= 0) {
350
- // loop through the portal state backwards to find the closest NgtStore
351
- const portal = this.portals[i];
352
- if (portal.__ngt_renderer__[4 /* NgtRendererClassId.destroyed */]) {
353
- i--;
354
- continue;
355
- }
356
- const injector = portal.__ngt_renderer__[14 /* NgtRendererClassId.injectorFactory */]();
357
- if (!injector) {
358
- i--;
359
- continue;
360
- }
361
- const instance = injector.get(NgtStore, null);
362
- // only the instance with previousStore should pass
363
- if (instance && instance.get('previousStore')) {
364
- store = instance;
365
- break;
366
- }
367
- i--;
368
- }
369
- return store || this.root.store;
370
- }
371
- }
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUvc3JjL2xpYi9yZW5kZXJlci9zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFFbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWlDL0csTUFBTSxPQUFPLGdCQUFnQjtJQUNoQixTQUFTLEdBQUcsRUFBNEIsQ0FBQztJQUVsRCxZQUE2QixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtJQUFHLENBQUM7SUFFM0QsVUFBVSxDQUFDLElBQStDLEVBQUUsSUFBa0I7UUFDMUUsTUFBTSxLQUFLLEdBQUc7WUFDVixJQUFJO1lBQ0osSUFBSTtZQUNKLElBQUk7WUFDSixFQUFFO1lBQ0YsS0FBSztZQUNMLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7WUFDVixTQUFVO1lBQ1YsU0FBVTtZQUNWLFNBQVU7U0FDTyxDQUFDO1FBRXRCLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxF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QUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RGVidWdOb2RlLCB1bnRyYWNrZWQsIHR5cGUgSW5qZWN0b3IsIHR5cGUgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RJbmplY3RlZFJlZiB9IGZyb20gJy4uL2RpL3JlZic7XG5pbXBvcnQgeyBOZ3RBcmdzIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hcmdzJztcbmltcG9ydCB0eXBlIHsgTmd0Q29tbW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jb21tb24nO1xuaW1wb3J0IHsgTmd0UGFyZW50IH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9wYXJlbnQnO1xuaW1wb3J0IHsgTmd0U3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvc3RvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3RBbnlSZWNvcmQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBhcHBseVByb3BzIH0gZnJvbSAnLi4vdXRpbHMvYXBwbHktcHJvcHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxTdGF0ZSB9IGZyb20gJy4uL3V0aWxzL2luc3RhbmNlJztcbmltcG9ydCB7IGlzIH0gZnJvbSAnLi4vdXRpbHMvaXMnO1xuaW1wb3J0IHsgTmd0Q29tcG91bmRDbGFzc0lkLCBOZ3RRdWV1ZU9wQ2xhc3NJZCwgTmd0UmVuZGVyZXJDbGFzc0lkIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgeyBTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5ULCBTUEVDSUFMX1BST1BFUlRJRVMsIGF0dGFjaFRocmVlQ2hpbGQsIHJlbW92ZVRocmVlQ2hpbGQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IHR5cGUgTmd0UmVuZGVyZXJSb290U3RhdGUgPSB7XG4gICAgc3RvcmU6IE5ndFN0b3JlO1xuICAgIGNvbXBvdW5kUHJlZml4ZXM6IHN0cmluZ1tdO1xuICAgIGRvY3VtZW50OiBEb2N1bWVudDtcbiAgICBwb3J0YWxzOiBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xufTtcblxuZXhwb3J0IHR5cGUgTmd0UXVldWVPcCA9IFt0eXBlOiAnb3AnIHwgJ2NsZWFuVXAnLCBvcDogKCkgPT4gdm9pZCwgZG9uZT86IHRydWVdO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlclN0YXRlID0gW1xuICAgIHR5cGU6ICd0aHJlZScgfCAnY29tcG91bmQnIHwgJ3BvcnRhbCcgfCAnY29tbWVudCcgfCAnZG9tJyxcbiAgICBwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwsXG4gICAgaW5qZWN0ZWRQYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSB8IE5ndEluamVjdGVkUmVmPE5ndFJlbmRlcmVyTm9kZT4gfCBudWxsLFxuICAgIGNoaWxkcmVuOiBOZ3RSZW5kZXJlck5vZGVbXSxcbiAgICBkZXN0cm95ZWQ6IGJvb2xlYW4sXG4gICAgY29tcG91bmQ6IFthcHBseUZpcnN0OiBib29sZWFuLCBwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pl0sXG4gICAgY29tcG91bmRQYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSxcbiAgICBjb21wb3VuZGVkOiBOZ3RSZW5kZXJlck5vZGUsXG4gICAgcXVldWVPcHM6IFNldDxOZ3RRdWV1ZU9wPixcbiAgICBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcmF3VmFsdWU6IGFueSxcbiAgICByZWY6IGFueSxcbiAgICBwb3J0YWxDb250YWluZXI6IE5ndFJlbmRlcmVyTm9kZSxcbiAgICBpbmplY3RvckZhY3Rvcnk6ICgpID0+IEluamVjdG9yXG5dO1xuXG5leHBvcnQgdHlwZSBOZ3RSZW5kZXJlck5vZGUgPSB7XG4gICAgX19uZ3RfcmVuZGVyZXJfXzogTmd0UmVuZGVyZXJTdGF0ZTtcbn07XG5cbmV4cG9ydCBjbGFzcyBOZ3RSZW5kZXJlclN0b3JlIHtcbiAgICByZWFkb25seSAjY29tbWVudHMgPSBbXSBhcyBBcnJheTxOZ3RSZW5kZXJlck5vZGU+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSByb290OiBOZ3RSZW5kZXJlclJvb3RTdGF0ZSkge31cblxuICAgIGNyZWF0ZU5vZGUodHlwZTogTmd0UmVuZGVyZXJTdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0sIG5vZGU6IE5ndEFueVJlY29yZCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IFtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICAgICAgdW5kZWZpbmVkISxcbiAgICAgICAgICAgIHVuZGVmaW5lZCEsXG4gICAgICAgICAgICB1bmRlZmluZWQhLFxuICAgICAgICBdIGFzIE5ndFJlbmRlcmVyU3RhdGU7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyZXJOb2RlID0gT2JqZWN0LmFzc2lnbihub2RlLCB7IF9fbmd0X3JlbmRlcmVyX186IHN0YXRlIH0pO1xuXG4gICAgICAgIC8vIGFzc2lnbiBvd25lckRvY3VtZW50IHRvIG5vZGUgc28gd2UgY2FuIHVzZSBIb3N0TGlzdGVuZXIgaW4gQ29tcG9uZW50XG4gICAgICAgIGlmICghcmVuZGVyZXJOb2RlWydvd25lckRvY3VtZW50J10pIHJlbmRlcmVyTm9kZVsnb3duZXJEb2N1bWVudCddID0gdGhpcy5yb290LmRvY3VtZW50O1xuXG4gICAgICAgIC8vIGFzc2lnbiBpbmplY3RvckZhY3Rvcnkgb24gbm9uLXRocmVlIHR5cGUgc2luY2VcbiAgICAgICAgLy8gcmVuZGVyZXJOb2RlIGlzIGFuIGluc3RhbmNlIG9mIERPTSBOb2RlXG4gICAgICAgIGlmIChzdGF0ZVtOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gIT09ICd0aHJlZScpIHtcbiAgICAgICAgICAgIHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gKCkgPT4gZ2V0RGVidWdOb2RlKHJlbmRlcmVyTm9kZSkhLmluamVjdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbW1lbnQnKSB7XG4gICAgICAgICAgICAvLyB3ZSBhdHRhY2ggYW4gYXJyb3cgZnVuY3Rpb24gdG8gdGhlIENvbW1lbnQgbm9kZVxuICAgICAgICAgICAgLy8gSW4gb3VyIGRpcmVjdGl2ZXMsIHdlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gdGhlbiBzdGFydCB0cmFja2luZyB0aGUgUmVuZGVyZXJOb2RlXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGRvbmUgdG8gbGltaXQgdGhlIGFtb3VudCBvZiBOb2RlcyB3ZSBuZWVkIHRvIHByb2Nlc3MgZm9yIGdldENyZWF0aW9uU3RhdGVcbiAgICAgICAgICAgIHJlbmRlcmVyTm9kZVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXSA9IChub2RlPzogTmd0UmVuZGVyZXJOb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3BvcnRhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0YWxzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jY29tbWVudHMucHVzaChyZW5kZXJlck5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXJOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIHN0YXRlW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IHt9O1xuICAgICAgICAgICAgc3RhdGVbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0ge307XG4gICAgICAgICAgICByZXR1cm4gcmVuZGVyZXJOb2RlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyTm9kZTtcbiAgICB9XG5cbiAgICBzZXRQYXJlbnQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBwYXJlbnQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XSkge1xuICAgICAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkQ2hpbGQobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBjaGlsZDogTmd0UmVuZGVyZXJOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uaW5jbHVkZXMoY2hpbGQpKSB7XG4gICAgICAgICAgICBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXS5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZUNoaWxkKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSwgY2hpbGQ6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY2hpbGRyZW5dLmZpbmRJbmRleCgoYykgPT4gY2hpbGQgPT09IGMpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldENvbXBvdW5kKGNvbXBvdW5kOiBOZ3RSZW5kZXJlck5vZGUsIGluc3RhbmNlOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgclMgPSBjb21wb3VuZC5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRlZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhyU1tOZ3RSZW5kZXJlckNsYXNzSWQucHJvcGVydGllc10pO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlBdHRyaWJ1dGUoaW5zdGFuY2UsIGtleSwgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmF0dHJpYnV0ZXNdW2tleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcHJvcGVydGllcykge1xuICAgICAgICAgICAgdGhpcy5hcHBseVByb3BlcnR5KGluc3RhbmNlLCBrZXksIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5wcm9wZXJ0aWVzXVtrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihjb21wb3VuZCk7XG4gICAgfVxuXG4gICAgcXVldWVPcGVyYXRpb24obm9kZTogTmd0UmVuZGVyZXJOb2RlLCBvcDogTmd0UXVldWVPcCkge1xuICAgICAgICBub2RlLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5hZGQob3ApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXhlY3V0ZU9wZXJhdGlvbihub2RlOiBOZ3RSZW5kZXJlck5vZGUsIHR5cGU6IE5ndFF1ZXVlT3BbTmd0UXVldWVPcENsYXNzSWQudHlwZV0gPSAnb3AnKSB7XG4gICAgICAgIGNvbnN0IHJTID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXT8uc2l6ZSkge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5mb3JFYWNoKChvcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC50eXBlXSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBvcFtOZ3RRdWV1ZU9wQ2xhc3NJZC5vcF0oKTtcbiAgICAgICAgICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnF1ZXVlT3BzXS5kZWxldGUob3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc1BvcnRhbENvbnRhaW5lcihwb3J0YWw6IE5ndFJlbmRlcmVyTm9kZSkge1xuICAgICAgICBjb25zdCBpbmplY3RvckZhY3RvcnkgPSBwb3J0YWwuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XTtcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3RvckZhY3Rvcnk/LigpO1xuICAgICAgICBpZiAoIWluamVjdG9yKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcG9ydGFsU3RvcmUgPSBpbmplY3Rvci5nZXQoTmd0U3RvcmUsIG51bGwpO1xuICAgICAgICBpZiAoIXBvcnRhbFN0b3JlKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcG9ydGFsQ29udGFpbmVyID0gcG9ydGFsU3RvcmUuZ2V0KCdzY2VuZScpO1xuICAgICAgICBpZiAoIXBvcnRhbENvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICAgIHBvcnRhbC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdID0gdGhpcy5jcmVhdGVOb2RlKCd0aHJlZScsIHBvcnRhbENvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgYXBwbHlBdHRyaWJ1dGUobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlJFTkRFUl9QUklPUklUWSkge1xuICAgICAgICAgICAgLy8gcHJpb3JpdHkgbmVlZHMgdG8gYmUgc2V0IGFzIGFuIGF0dHJpYnV0ZSBzdHJpbmcgc28gdGhhdCB0aGV5IGNhbiBiZSBzZXQgYXMgZWFybHkgYXMgcG9zc2libGVcbiAgICAgICAgICAgIC8vIHdlIGNvbnZlcnQgdGhhdCBzdHJpbmcgdG8gYSBudW1iZXIuIGlmIGl0J3MgaW52YWxpZCwgMFxuICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc05hTihwcmlvcml0eSkpIHtcbiAgICAgICAgICAgICAgICBwcmlvcml0eSA9IDA7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTkdUXSBcInByaW9yaXR5XCIgaXMgYW4gaW52YWxpZCBudW1iZXIsIGRlZmF1bHQgdG8gMGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2V0TG9jYWxTdGF0ZShub2RlKS5wcmlvcml0eSA9IHByaW9yaXR5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5DT01QT1VORCkge1xuICAgICAgICAgICAgLy8gd2Ugc2V0IHRoZSBjb21wb3VuZCBwcm9wZXJ0eSBvbiBpbnN0YW5jZSBub2RlIG5vdyBzbyB3ZSBrbm93IHRoYXQgdGhpcyBpbnN0YW5jZSBpcyBiZWluZyBjb21wb3VuZGVkXG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gW3ZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJ2ZpcnN0Jywge31dO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBhdHRhY2ggYXMgdHJpbmdcbiAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGlmIChwYXRocy5sZW5ndGgpIGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gcGF0aHM7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmFtZSA9PT0gU1BFQ0lBTF9QUk9QRVJUSUVTLlZBTFVFKSB7XG4gICAgICAgICAgICAvLyBjb2VyY2lvblxuICAgICAgICAgICAgbGV0IG1heWJlQ29lcmNlZDogYW55ID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAobWF5YmVDb2VyY2VkID09PSAnJyB8fCBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICBtYXliZUNvZXJjZWQgPSBtYXliZUNvZXJjZWQgPT09ICd0cnVlJyB8fCBtYXliZUNvZXJjZWQgPT09ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghaXNOYU4oTnVtYmVyKG1heWJlQ29lcmNlZCkpKSB7XG4gICAgICAgICAgICAgICAgbWF5YmVDb2VyY2VkID0gTnVtYmVyKG1heWJlQ29lcmNlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQucmF3VmFsdWVdID0gbWF5YmVDb2VyY2VkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgYXBwbHlQcm9wZXJ0eShub2RlOiBOZ3RSZW5kZXJlck5vZGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCByUyA9IG5vZGUuX19uZ3RfcmVuZGVyZXJfXztcbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5kZXN0cm95ZWRdKSByZXR1cm47XG5cbiAgICAgICAgLy8gW3JlZl1cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5SRUYgJiYgaXMucmVmKHZhbHVlKSkge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHZhbHVlLm5hdGl2ZUVsZW1lbnQgPSBub2RlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50ID0gZ2V0TG9jYWxTdGF0ZShub2RlKS5wYXJlbnQoKSB8fCByU1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcblxuICAgICAgICAvLyBbcmF3VmFsdWVdXG4gICAgICAgIGlmIChnZXRMb2NhbFN0YXRlKG5vZGUpLmlzUmF3ICYmIG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5WQUxVRSkge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJhd1ZhbHVlXSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHBhcmVudCkgYXR0YWNoVGhyZWVDaGlsZChwYXJlbnQsIG5vZGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gW2F0dGFjaF1cbiAgICAgICAgaWYgKG5hbWUgPT09IFNQRUNJQUxfUFJPUEVSVElFUy5BVFRBQ0gpIHtcbiAgICAgICAgICAgIGdldExvY2FsU3RhdGUobm9kZSkuYXR0YWNoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5tYXAoKHYpID0+IHYudG9TdHJpbmcoKSkgOiB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIGF0dGFjaFRocmVlQ2hpbGQocGFyZW50LCBub2RlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbXBvdW5kID0gclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29tcG91bmQ/LltOZ3RDb21wb3VuZENsYXNzSWQucHJvcHNdICYmXG4gICAgICAgICAgICBuYW1lIGluIGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc10gJiZcbiAgICAgICAgICAgICFjb21wb3VuZFtOZ3RDb21wb3VuZENsYXNzSWQuYXBwbHlGaXJzdF1cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGNvbXBvdW5kW05ndENvbXBvdW5kQ2xhc3NJZC5wcm9wc11bbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgYXBwbHlQcm9wcyhub2RlLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgaXNDb21wb3VuZChuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wb3VuZFByZWZpeGVzLnNvbWUoKHByZWZpeCkgPT4gbmFtZS5zdGFydHNXaXRoKHByZWZpeCkpO1xuICAgIH1cblxuICAgIGlzRE9NKG5vZGU6IE5ndEFueVJlY29yZCkge1xuICAgICAgICBjb25zdCByUyA9IG5vZGVbJ19fbmd0X3JlbmRlcmVyX18nXTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICFyUyB8fFxuICAgICAgICAgICAgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJyAmJlxuICAgICAgICAgICAgICAgIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFdpbmRvdykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IHJvb3RTY2VuZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5zdG9yZS5nZXQoJ3NjZW5lJyk7XG4gICAgfVxuXG4gICAgZ2V0IHBvcnRhbHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3QucG9ydGFscztcbiAgICB9XG5cbiAgICBnZXRDbG9zZXN0UGFyZW50V2l0aEluc3RhbmNlKG5vZGU6IE5ndFJlbmRlcmVyTm9kZSk6IE5ndFJlbmRlcmVyTm9kZSB8IG51bGwge1xuICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ3RocmVlJykge1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnBvcnRhbENvbnRhaW5lcl1cbiAgICAgICAgICAgICAgICA/IHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wb3J0YWxDb250YWluZXJdXG4gICAgICAgICAgICAgICAgOiBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgZ2V0Q2xvc2VzdFBhcmVudFdpdGhDb21wb3VuZChub2RlOiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyZW50ID0gbm9kZS5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5wYXJlbnRdO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJlbnQgJiZcbiAgICAgICAgICAgIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJyAmJlxuICAgICAgICAgICAgIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBwYXJlbnQgJiZcbiAgICAgICAgICAgIChwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICd0aHJlZScgfHxcbiAgICAgICAgICAgICAgICAhcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kUGFyZW50XSB8fFxuICAgICAgICAgICAgICAgIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSAhPT0gJ2NvbXBvdW5kJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQucGFyZW50XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFyZW50KSByZXR1cm47XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnICYmXG4gICAgICAgICAgICBwYXJlbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRQYXJlbnRdXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmVudC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZGVkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldENyZWF0aW9uU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGVkQXJncyA9IHRoaXMuZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZShOZ3RBcmdzKT8uYXJncyB8fCBbXTtcbiAgICAgICAgY29uc3QgaW5qZWN0ZWRQYXJlbnQgPSB0aGlzLmZpcnN0Tm9uSW5qZWN0ZWREaXJlY3RpdmUoTmd0UGFyZW50KT8ucGFyZW50IHx8IG51bGw7XG4gICAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy50cnlHZXRQb3J0YWxTdG9yZSgpO1xuICAgICAgICByZXR1cm4geyBpbmplY3RlZEFyZ3MsIGluamVjdGVkUGFyZW50LCBzdG9yZSB9O1xuICAgIH1cblxuICAgIGRlc3Ryb3kobm9kZTogTmd0UmVuZGVyZXJOb2RlLCBwYXJlbnQ/OiBOZ3RSZW5kZXJlck5vZGUpIHtcbiAgICAgICAgY29uc3QgclMgPSBub2RlLl9fbmd0X3JlbmRlcmVyX187XG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSkgcmV0dXJuO1xuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAndGhyZWUnKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuY29tcG91bmRdID0gdW5kZWZpbmVkITtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jb21wb3VuZFBhcmVudF0gPSB1bmRlZmluZWQhO1xuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFN0YXRlID0gZ2V0TG9jYWxTdGF0ZShub2RlKTtcbiAgICAgICAgICAgIGlmIChsb2NhbFN0YXRlLm9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWQobG9jYWxTdGF0ZS5vYmplY3RzKS5mb3JFYWNoKChvYmopID0+IHRoaXMuZGVzdHJveShvYmosIHBhcmVudCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobG9jYWxTdGF0ZS5ub25PYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgdW50cmFja2VkKGxvY2FsU3RhdGUubm9uT2JqZWN0cykuZm9yRWFjaCgob2JqKSA9PiB0aGlzLmRlc3Ryb3kob2JqLCBwYXJlbnQpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUpIGxvY2FsU3RhdGUuYWZ0ZXJVcGRhdGUuY29tcGxldGUoKTtcbiAgICAgICAgICAgIGlmIChsb2NhbFN0YXRlLmFmdGVyQXR0YWNoKSBsb2NhbFN0YXRlLmFmdGVyQXR0YWNoLmNvbXBsZXRlKCk7XG5cbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydvYmplY3RzJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnbm9uT2JqZWN0cyddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ25hdGl2ZVByb3BzJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWRkJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsncmVtb3ZlJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnYWZ0ZXJVcGRhdGUnXTtcbiAgICAgICAgICAgIGRlbGV0ZSAobG9jYWxTdGF0ZSBhcyBOZ3RBbnlSZWNvcmQpWydhZnRlckF0dGFjaCddO1xuICAgICAgICAgICAgZGVsZXRlIChsb2NhbFN0YXRlIGFzIE5ndEFueVJlY29yZClbJ3N0b3JlJ107XG4gICAgICAgICAgICBkZWxldGUgKGxvY2FsU3RhdGUgYXMgTmd0QW55UmVjb3JkKVsnaGFuZGxlcnMnXTtcblxuICAgICAgICAgICAgaWYgKCFsb2NhbFN0YXRlLnByaW1pdGl2ZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSAobm9kZSBhcyBOZ3RBbnlSZWNvcmQpWydfX25ndF9fJ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoclNbTmd0UmVuZGVyZXJDbGFzc0lkLnR5cGVdID09PSAnY29tbWVudCcpIHtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5pbmplY3RvckZhY3RvcnldID0gbnVsbCE7XG4gICAgICAgICAgICBkZWxldGUgKG5vZGUgYXMgTmd0QW55UmVjb3JkKVtTUEVDSUFMX0lOVEVSTkFMX0FERF9DT01NRU5UXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy4jY29tbWVudHMuZmluZEluZGV4KChjb21tZW50KSA9PiBjb21tZW50ID09PSBub2RlKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29tbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQudHlwZV0gPT09ICdwb3J0YWwnKSB7XG4gICAgICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSA9IG51bGwhO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnBvcnRhbHMuZmluZEluZGV4KChwb3J0YWwpID0+IHBvcnRhbCA9PT0gbm9kZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMucG9ydGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJTW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ2NvbXBvdW5kJykge1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNvbXBvdW5kZWRdID0gdW5kZWZpbmVkITtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5hdHRyaWJ1dGVzXSA9IG51bGwhO1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnByb3BlcnRpZXNdID0gbnVsbCE7XG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVPcGVyYXRpb24obm9kZSwgJ2NsZWFuVXAnKTtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10uY2xlYXIoKTtcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5xdWV1ZU9wc10gPSBudWxsITtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyU1tOZ3RSZW5kZXJlckNsYXNzSWQucmVmXSkge1xuICAgICAgICAgICAgLy8gbnVsbGlmeSByZWZcbiAgICAgICAgICAgIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5yZWZdLm5hdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnJlZl0gPSB1bmRlZmluZWQhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbnVsbGlmeSBwYXJlbnRcbiAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLnBhcmVudF0gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbmRlckNoaWxkIG9mIHJTW05ndFJlbmRlcmVyQ2xhc3NJZC5jaGlsZHJlbl0gfHwgW10pIHtcbiAgICAgICAgICAgIGlmIChyZW5kZXJDaGlsZC5fX25ndF9yZW5kZXJlcl9fW05ndFJlbmRlcmVyQ2xhc3NJZC50eXBlXSA9PT0gJ3RocmVlJyAmJiBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVUaHJlZUNoaWxkKHBhcmVudCwgcmVuZGVyQ2hpbGQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kZXN0cm95KHJlbmRlckNoaWxkLCBwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgclNbTmd0UmVuZGVyZXJDbGFzc0lkLmNoaWxkcmVuXSA9IFtdO1xuICAgICAgICByU1tOZ3RSZW5kZXJlckNsYXNzSWQuZGVzdHJveWVkXSA9IHRydWU7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQocGFyZW50LCBub2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZmlyc3ROb25JbmplY3RlZERpcmVjdGl2ZTxUIGV4dGVuZHMgTmd0Q29tbW9uRGlyZWN0aXZlPihkaXI6IFR5cGU8VD4pIHtcbiAgICAgICAgbGV0IGRpcmVjdGl2ZTogVCB8IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgaSA9IHRoaXMuI2NvbW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLiNjb21tZW50c1tpXTtcbiAgICAgICAgICAgIGlmIChjb21tZW50Ll9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbmplY3RvciA9IGNvbW1lbnQuX19uZ3RfcmVuZGVyZXJfX1tOZ3RSZW5kZXJlckNsYXNzSWQuaW5qZWN0b3JGYWN0b3J5XSgpO1xuICAgICAgICAgICAgaWYgKCFpbmplY3Rvcikge1xuICAgICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5qZWN0b3IuZ2V0KGRpciwgbnVsbCk7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UudmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGlyZWN0aXZlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJ5R2V0UG9ydGFsU3RvcmUoKSB7XG4gICAgICAgIGxldCBzdG9yZTogTmd0U3RvcmUgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgcG9ydGFsIHN0YXRlcyBiZWNhdXNlIE5ndFN0b3JlIG9ubHkgZGlmZmVycyBwZXIgUG9ydGFsXG4gICAgICAgIGxldCBpID0gdGhpcy5wb3J0YWxzLmxlbmd0aCAtIDE7XG4gICAgICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgcG9ydGFsIHN0YXRlIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBjbG9zZXN0IE5ndFN0b3JlXG4gICAgICAgICAgICBjb25zdCBwb3J0YWwgPSB0aGlzLnBvcnRhbHNbaV07XG4gICAgICAgICAgICBpZiAocG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmRlc3Ryb3llZF0pIHtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gcG9ydGFsLl9fbmd0X3JlbmRlcmVyX19bTmd0UmVuZGVyZXJDbGFzc0lkLmluamVjdG9yRmFjdG9yeV0oKTtcbiAgICAgICAgICAgIGlmICghaW5qZWN0b3IpIHtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdG9yLmdldChOZ3RTdG9yZSwgbnVsbCk7XG4gICAgICAgICAgICAvLyBvbmx5IHRoZSBpbnN0YW5jZSB3aXRoIHByZXZpb3VzU3RvcmUgc2hvdWxkIHBhc3NcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZS5nZXQoJ3ByZXZpb3VzU3RvcmUnKSkge1xuICAgICAgICAgICAgICAgIHN0b3JlID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JlIHx8IHRoaXMucm9vdCEuc3RvcmU7XG4gICAgfVxufVxuIl19
@@ -1,81 +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
- }
12
- select(...keysAndOptions) {
13
- if (keysAndOptions.length === 0)
14
- return this.#state.asReadonly();
15
- if (keysAndOptions.length === 1 && typeof keysAndOptions[0] === 'object') {
16
- if (!this.#computedCache.has(STORE_COMPUTED_KEY)) {
17
- this.#computedCache.set(STORE_COMPUTED_KEY, computed(() => this.#state(), keysAndOptions));
18
- return this.#computedCache.get(STORE_COMPUTED_KEY);
19
- }
20
- }
21
- const [keys, options] = parseOptions(keysAndOptions);
22
- const joinedKeys = keys.join('-');
23
- if (!this.#computedCache.has(joinedKeys)) {
24
- this.#computedCache.set(joinedKeys, computed(() => {
25
- const state = this.#state();
26
- return keys.reduce((value, key) => value[key], state);
27
- }, options));
28
- }
29
- return this.#computedCache.get(joinedKeys);
30
- }
31
- get(...keys) {
32
- const state = untracked(this.#state);
33
- if (keys.length === 0)
34
- return state;
35
- return keys.reduce((value, key) => value[key], state);
36
- }
37
- set(state) {
38
- const updater = (previous) => {
39
- const partial = typeof state === 'function' ? state(previous) : state;
40
- Object.keys(partial).forEach((key) => {
41
- const partialKey = key;
42
- if (partial[partialKey] === undefined && previous[partialKey] != null) {
43
- partial[partialKey] = previous[partialKey];
44
- }
45
- });
46
- return partial;
47
- };
48
- this.#state.update((previous) => ({ ...previous, ...updater(previous) }));
49
- // this.#state.update(previous => ({...previous, ...(typeof state === 'function' ? state(previous) : state)}))
50
- }
51
- patch(state) {
52
- const updater = (previous) => {
53
- Object.keys(state).forEach((key) => {
54
- const partialKey = key;
55
- if (state[partialKey] === undefined && previous[partialKey] != null) {
56
- state[partialKey] = previous[partialKey];
57
- }
58
- });
59
- return state;
60
- };
61
- this.#state.update((previous) => ({ ...updater(previous), ...previous }));
62
- }
63
- 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 }); }
64
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtSignalStore }); }
65
- }
66
- export { NgtSignalStore };
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtSignalStore, decorators: [{
68
- type: Injectable
69
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
70
- type: Optional
71
- }, {
72
- type: Inject,
73
- args: ['INITIAL_STATE']
74
- }] }]; } });
75
- function parseOptions(keysAndOptions) {
76
- if (typeof keysAndOptions.at(-1) === 'object') {
77
- return [keysAndOptions.slice(0, -1), keysAndOptions.at(-1)];
78
- }
79
- return [keysAndOptions];
80
- }
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlL3NyYy9saWIvc3RvcmVzL3NpZ25hbC5zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLFNBQVMsR0FJWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRS9DLE1BQU0sa0JBQWtCLEdBQUcsd0JBQWlDLENBQUM7QUFFN0QsTUFDYSxjQUFjO0lBQ2QsTUFBTSxDQUF5QjtJQUMvQixjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVwQyxZQUdJLGVBQWdDLEVBQWdDO1FBRWhFLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBVyxDQUFDLENBQUM7SUFDM0csQ0FBQztJQTJCRCxNQUFNLENBQUMsR0FBRyxjQUFxQjtRQUMzQixJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN0RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQ25CLGtCQUFrQixFQUNsQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFB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QUFDLENBQUM7aUJBQzVDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7OEdBaEhRLGNBQWMsa0JBTVgsZUFBZTtrSEFObEIsY0FBYzs7U0FBZCxjQUFjOzJGQUFkLGNBQWM7a0JBRDFCLFVBQVU7OzBCQU1GLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsZUFBZTs7QUE2Ry9CLFNBQVMsWUFBWSxDQUFDLGNBQXFCO0lBQ3ZDLElBQUksT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQzNDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEluamVjdCxcbiAgICBJbmplY3RhYmxlLFxuICAgIE9wdGlvbmFsLFxuICAgIGNvbXB1dGVkLFxuICAgIHVudHJhY2tlZCxcbiAgICB0eXBlIENyZWF0ZUNvbXB1dGVkT3B0aW9ucyxcbiAgICB0eXBlIFNpZ25hbCxcbiAgICB0eXBlIFdyaXRhYmxlU2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgTmd0QW55UmVjb3JkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2lnbmFsIH0gZnJvbSAnLi4vdXRpbHMvc2lnbmFsJztcblxuY29uc3QgU1RPUkVfQ09NUFVURURfS0VZID0gJ19fbmd0X3N0b3JlX2NvbXB1dGVkX18nIGFzIGNvbnN0O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmd0U2lnbmFsU3RvcmU8VFN0YXRlIGV4dGVuZHMgb2JqZWN0PiB7XG4gICAgcmVhZG9ubHkgI3N0YXRlOiBXcml0YWJsZVNpZ25hbDxUU3RhdGU+O1xuICAgIHJlYWRvbmx5ICNjb21wdXRlZENhY2hlID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBJbmplY3QoJ0lOSVRJQUxfU1RBVEUnKVxuICAgICAgICBpbml0aWFsU3RhdGU6IFBhcnRpYWw8VFN0YXRlPiA9IHt9IGFzIHVua25vd24gYXMgUGFydGlhbDxUU3RhdGU+XG4gICAgKSB7XG4gICAgICAgIGluaXRpYWxTdGF0ZSA/Pz0ge307XG4gICAgICAgIHRoaXMuI3N0YXRlID0gY3JlYXRlU2lnbmFsKE9iamVjdC5hc3NpZ24oaW5pdGlhbFN0YXRlLCB7IF9fbmd0X2R1bW15X3N0YXRlX186IERhdGUubm93KCkgfSkgYXMgVFN0YXRlKTtcbiAgICB9XG5cbiAgICBzZWxlY3Q8XG4gICAgICAgIFRLZXkxIGV4dGVuZHMga2V5b2YgVFN0YXRlLFxuICAgICAgICBUS2V5MiBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV0sXG4gICAgICAgIFRLZXkzIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXVtUS2V5Ml0sXG4gICAgICAgIFRLZXk0IGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXVtUS2V5Ml1bVEtleTNdXG4gICAgPihcbiAgICAgICAga2V5MTogVEtleTEsXG4gICAgICAgIGtleTI6IFRLZXkyLFxuICAgICAgICBrZXkzOiBUS2V5MyxcbiAgICAgICAga2V5NDogVEtleTQsXG4gICAgICAgIG9wdGlvbnM/OiBDcmVhdGVDb21wdXRlZE9wdGlvbnM8VFN0YXRlW1RLZXkxXVtUS2V5Ml1bVEtleTNdW1RLZXk0XT5cbiAgICApOiBTaWduYWw8VFN0YXRlW1RLZXkxXVtUS2V5Ml1bVEtleTNdW1RLZXk0XT47XG4gICAgc2VsZWN0PFRLZXkxIGV4dGVuZHMga2V5b2YgVFN0YXRlLCBUS2V5MiBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV0sIFRLZXkzIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXVtUS2V5Ml0+KFxuICAgICAgICBrZXkxOiBUS2V5MSxcbiAgICAgICAga2V5MjogVEtleTIsXG4gICAgICAgIGtleTM6IFRLZXkzLFxuICAgICAgICBvcHRpb25zPzogQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPFRTdGF0ZVtUS2V5MV1bVEtleTJdW1RLZXkzXT5cbiAgICApOiBTaWduYWw8VFN0YXRlW1RLZXkxXVtUS2V5Ml1bVEtleTNdPjtcbiAgICBzZWxlY3Q8VEtleTEgZXh0ZW5kcyBrZXlvZiBUU3RhdGUsIFRLZXkyIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXT4oXG4gICAgICAgIGtleTE6IFRLZXkxLFxuICAgICAgICBrZXkyOiBUS2V5MixcbiAgICAgICAgb3B0aW9ucz86IENyZWF0ZUNvbXB1dGVkT3B0aW9uczxUU3RhdGVbVEtleTFdW1RLZXkyXT5cbiAgICApOiBTaWduYWw8VFN0YXRlW1RLZXkxXVtUS2V5Ml0+O1xuICAgIHNlbGVjdDxUS2V5IGV4dGVuZHMga2V5b2YgVFN0YXRlPihrZXk6IFRLZXksIG9wdGlvbnM/OiBDcmVhdGVDb21wdXRlZE9wdGlvbnM8VFN0YXRlW1RLZXldPik6IFNpZ25hbDxUU3RhdGVbVEtleV0+O1xuICAgIHNlbGVjdChvcHRpb25zPzogQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPFRTdGF0ZT4pOiBTaWduYWw8VFN0YXRlPjtcbiAgICBzZWxlY3QoLi4ua2V5c0FuZE9wdGlvbnM6IGFueVtdKSB7XG4gICAgICAgIGlmIChrZXlzQW5kT3B0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLiNzdGF0ZS5hc1JlYWRvbmx5KCk7XG4gICAgICAgIGlmIChrZXlzQW5kT3B0aW9ucy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGtleXNBbmRPcHRpb25zWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiNjb21wdXRlZENhY2hlLmhhcyhTVE9SRV9DT01QVVRFRF9LRVkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29tcHV0ZWRDYWNoZS5zZXQoXG4gICAgICAgICAgICAgICAgICAgIFNUT1JFX0NPTVBVVEVEX0tFWSxcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQoKCkgPT4gdGhpcy4jc3RhdGUoKSwga2V5c0FuZE9wdGlvbnMgYXMgQ3JlYXRlQ29tcHV0ZWRPcHRpb25zPFRTdGF0ZT4pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4jY29tcHV0ZWRDYWNoZS5nZXQoU1RPUkVfQ09NUFVURURfS0VZKSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW2tleXMsIG9wdGlvbnNdID0gcGFyc2VPcHRpb25zKGtleXNBbmRPcHRpb25zKTtcblxuICAgICAgICBjb25zdCBqb2luZWRLZXlzID0ga2V5cy5qb2luKCctJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLiNjb21wdXRlZENhY2hlLmhhcyhqb2luZWRLZXlzKSkge1xuICAgICAgICAgICAgdGhpcy4jY29tcHV0ZWRDYWNoZS5zZXQoXG4gICAgICAgICAgICAgICAgam9pbmVkS2V5cyxcbiAgICAgICAgICAgICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy4jc3RhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXMucmVkdWNlKCh2YWx1ZSwga2V5KSA9PiAodmFsdWUgYXMgTmd0QW55UmVjb3JkKVtrZXldLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfSwgb3B0aW9ucylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy4jY29tcHV0ZWRDYWNoZS5nZXQoam9pbmVkS2V5cykhO1xuICAgIH1cblxuICAgIGdldDxcbiAgICAgICAgVEtleTEgZXh0ZW5kcyBrZXlvZiBUU3RhdGUsXG4gICAgICAgIFRLZXkyIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXSxcbiAgICAgICAgVEtleTMgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdW1RLZXkyXSxcbiAgICAgICAgVEtleTQgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdW1RLZXkyXVtUS2V5M11cbiAgICA+KGtleTE6IFRLZXkxLCBrZXkyOiBUS2V5Miwga2V5MzogVEtleTMsIGtleTQ6IFRLZXk0KTogVFN0YXRlW1RLZXkxXVtUS2V5Ml1bVEtleTNdW1RLZXk0XTtcbiAgICBnZXQ8VEtleTEgZXh0ZW5kcyBrZXlvZiBUU3RhdGUsIFRLZXkyIGV4dGVuZHMga2V5b2YgVFN0YXRlW1RLZXkxXSwgVEtleTMgZXh0ZW5kcyBrZXlvZiBUU3RhdGVbVEtleTFdW1RLZXkyXT4oXG4gICAgICAgIGtleTE6IFRLZXkxLFxuICAgICAgICBrZXkyOiBUS2V5MixcbiAgICAgICAga2V5MzogVEtleTNcbiAgICApOiBUU3RhdGVbVEtleTFdW1RLZXkyXVtUS2V5M107XG4gICAgZ2V0PFRLZXkxIGV4dGVuZHMga2V5b2YgVFN0YXRlLCBUS2V5MiBleHRlbmRzIGtleW9mIFRTdGF0ZVtUS2V5MV0+KGtleTE6IFRLZXkxLCBrZXkyOiBUS2V5Mik6IFRTdGF0ZVtUS2V5MV1bVEtleTJdO1xuICAgIGdldDxUS2V5IGV4dGVuZHMga2V5b2YgVFN0YXRlPihrZXk6IFRLZXkpOiBUU3RhdGVbVEtleV07XG4gICAgZ2V0KCk6IFRTdGF0ZTtcbiAgICBnZXQoLi4ua2V5czogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB1bnRyYWNrZWQodGhpcy4jc3RhdGUpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHJldHVybiBzdGF0ZTtcbiAgICAgICAgcmV0dXJuIGtleXMucmVkdWNlKCh2YWx1ZSwga2V5KSA9PiAodmFsdWUgYXMgTmd0QW55UmVjb3JkKVtrZXldLCBzdGF0ZSk7XG4gICAgfVxuXG4gICAgc2V0KHN0YXRlOiBQYXJ0aWFsPFRTdGF0ZT4gfCAoKHByZXZpb3VzOiBUU3RhdGUpID0+IFBhcnRpYWw8VFN0YXRlPikpIHtcbiAgICAgICAgY29uc3QgdXBkYXRlciA9IChwcmV2aW91czogVFN0YXRlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0aWFsID0gdHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUocHJldmlvdXMpIDogc3RhdGU7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJ0aWFsKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsS2V5ID0ga2V5IGFzIGtleW9mIFRTdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAocGFydGlhbFtwYXJ0aWFsS2V5XSA9PT0gdW5kZWZpbmVkICYmIHByZXZpb3VzW3BhcnRpYWxLZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFydGlhbFtwYXJ0aWFsS2V5XSA9IHByZXZpb3VzW3BhcnRpYWxLZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRpYWw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3N0YXRlLnVwZGF0ZSgocHJldmlvdXMpID0+ICh7IC4uLnByZXZpb3VzLCAuLi51cGRhdGVyKHByZXZpb3VzKSB9KSk7XG4gICAgICAgIC8vIHRoaXMuI3N0YXRlLnVwZGF0ZShwcmV2aW91cyA9PiAoey4uLnByZXZpb3VzLCAuLi4odHlwZW9mIHN0YXRlID09PSAnZnVuY3Rpb24nID8gc3RhdGUocHJldmlvdXMpIDogc3RhdGUpfSkpXG4gICAgfVxuXG4gICAgcGF0Y2goc3RhdGU6IFBhcnRpYWw8VFN0YXRlPikge1xuICAgICAgICBjb25zdCB1cGRhdGVyID0gKHByZXZpb3VzOiBUU3RhdGUpID0+IHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0aWFsS2V5ID0ga2V5IGFzIGtleW9mIFRTdGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVbcGFydGlhbEtleV0gPT09IHVuZGVmaW5lZCAmJiBwcmV2aW91c1twYXJ0aWFsS2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlW3BhcnRpYWxLZXldID0gcHJldmlvdXNbcGFydGlhbEtleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3N0YXRlLnVwZGF0ZSgocHJldmlvdXMpID0+ICh7IC4uLnVwZGF0ZXIocHJldmlvdXMpLCAuLi5wcmV2aW91cyB9KSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZU9wdGlvbnMoa2V5c0FuZE9wdGlvbnM6IGFueVtdKTogW3N0cmluZ1tdLCBDcmVhdGVDb21wdXRlZE9wdGlvbnM8YW55Pj9dIHtcbiAgICBpZiAodHlwZW9mIGtleXNBbmRPcHRpb25zLmF0KC0xKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIFtrZXlzQW5kT3B0aW9ucy5zbGljZSgwLCAtMSksIGtleXNBbmRPcHRpb25zLmF0KC0xKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtrZXlzQW5kT3B0aW9uc107XG59XG4iXX0=