angular-three-soba 2.14.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/abstractions/lib/catmull-rom-line.d.ts +117 -117
- package/abstractions/lib/edges.d.ts +126 -126
- package/abstractions/lib/grid.d.ts +15 -15
- package/abstractions/lib/line.d.ts +1 -1
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +22 -22
- package/abstractions/lib/text.d.ts +1 -1
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +0 -9
- package/controls/lib/camera-controls.d.ts +1 -1
- package/controls/lib/orbit-controls.d.ts +1 -1
- package/fesm2022/angular-three-soba-abstractions.mjs +41 -52
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +12 -15
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +16 -24
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +59 -60
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +27 -35
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +27 -29
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +31 -34
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +91 -105
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -3
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-arrow.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-rotator.d.ts +1 -1
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/gizmos/lib/pivot-controls/plane-slider.d.ts +1 -1
- package/gizmos/lib/pivot-controls/scaling-sphere.d.ts +1 -1
- package/gizmos/lib/transform-controls.d.ts +2 -2
- package/materials/lib/custom-shader-material.d.ts +2 -2
- package/materials/lib/mesh-portal-material.d.ts +9 -9
- package/materials/lib/mesh-refraction-material.d.ts +2 -2
- package/materials/lib/mesh-transmission-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +6 -6
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +2 -2
- package/misc/lib/sampler.d.ts +1 -1
- package/package.json +11 -37
- package/performances/lib/instances/instances.d.ts +5 -5
- package/performances/lib/points/points.d.ts +10 -10
- package/performances/lib/segments/segments.d.ts +4 -4
- package/shaders/lib/mesh-refraction-material.d.ts +2 -2
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/render-texture.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +2 -2
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +0 -5
- package/esm2022/abstractions/index.mjs +0 -14
- package/esm2022/abstractions/lib/billboard.mjs +0 -69
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +0 -76
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +0 -51
- package/esm2022/abstractions/lib/edges.mjs +0 -66
- package/esm2022/abstractions/lib/gradient-texture.mjs +0 -91
- package/esm2022/abstractions/lib/grid.mjs +0 -103
- package/esm2022/abstractions/lib/helper.mjs +0 -74
- package/esm2022/abstractions/lib/line.mjs +0 -123
- package/esm2022/abstractions/lib/prism-geometry.mjs +0 -46
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +0 -73
- package/esm2022/abstractions/lib/rounded-box.mjs +0 -131
- package/esm2022/abstractions/lib/text-3d.mjs +0 -100
- package/esm2022/abstractions/lib/text.mjs +0 -86
- package/esm2022/angular-three-soba.mjs +0 -5
- package/esm2022/cameras/angular-three-soba-cameras.mjs +0 -5
- package/esm2022/cameras/index.mjs +0 -5
- package/esm2022/cameras/lib/camera-content.mjs +0 -14
- package/esm2022/cameras/lib/cube-camera.mjs +0 -102
- package/esm2022/cameras/lib/orthographic-camera.mjs +0 -131
- package/esm2022/cameras/lib/perspective-camera.mjs +0 -105
- package/esm2022/controls/angular-three-soba-controls.mjs +0 -5
- package/esm2022/controls/index.mjs +0 -9
- package/esm2022/controls/lib/camera-controls.mjs +0 -126
- package/esm2022/controls/lib/orbit-controls.mjs +0 -114
- package/esm2022/controls/lib/scroll-controls.mjs +0 -261
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/index.mjs +0 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +0 -191
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +0 -304
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +0 -348
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +0 -265
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +0 -349
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +0 -232
- package/esm2022/gizmos/lib/transform-controls.mjs +0 -177
- package/esm2022/index.mjs +0 -2
- package/esm2022/loaders/angular-three-soba-loaders.mjs +0 -5
- package/esm2022/loaders/index.mjs +0 -7
- package/esm2022/loaders/lib/fbx-loader.mjs +0 -13
- package/esm2022/loaders/lib/font-loader.mjs +0 -49
- package/esm2022/loaders/lib/gltf-loader.mjs +0 -51
- package/esm2022/loaders/lib/loader.mjs +0 -103
- package/esm2022/loaders/lib/progress.mjs +0 -51
- package/esm2022/loaders/lib/texture-loader.mjs +0 -32
- package/esm2022/materials/angular-three-soba-materials.mjs +0 -5
- package/esm2022/materials/index.mjs +0 -9
- package/esm2022/materials/lib/custom-shader-material.mjs +0 -67
- package/esm2022/materials/lib/mesh-distort-material.mjs +0 -43
- package/esm2022/materials/lib/mesh-portal-material.mjs +0 -294
- package/esm2022/materials/lib/mesh-reflector-material.mjs +0 -274
- package/esm2022/materials/lib/mesh-refraction-material.mjs +0 -140
- package/esm2022/materials/lib/mesh-transmission-material.mjs +0 -188
- package/esm2022/materials/lib/mesh-wobble-material.mjs +0 -43
- package/esm2022/materials/lib/point-material.mjs +0 -34
- package/esm2022/misc/angular-three-soba-misc.mjs +0 -5
- package/esm2022/misc/index.mjs +0 -15
- package/esm2022/misc/lib/animations.mjs +0 -71
- package/esm2022/misc/lib/bake-shadows.mjs +0 -24
- package/esm2022/misc/lib/computed-attribute.mjs +0 -51
- package/esm2022/misc/lib/constants.mjs +0 -5
- package/esm2022/misc/lib/decal.mjs +0 -142
- package/esm2022/misc/lib/deprecated.mjs +0 -15
- package/esm2022/misc/lib/depth-buffer.mjs +0 -35
- package/esm2022/misc/lib/fbo.mjs +0 -86
- package/esm2022/misc/lib/html/html-content.mjs +0 -322
- package/esm2022/misc/lib/html/html.mjs +0 -129
- package/esm2022/misc/lib/html/utils.mjs +0 -74
- package/esm2022/misc/lib/intersect.mjs +0 -49
- package/esm2022/misc/lib/preload.mjs +0 -58
- package/esm2022/misc/lib/sampler.mjs +0 -122
- package/esm2022/misc/lib/scale-factor.mjs +0 -29
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -7
- package/esm2022/performances/lib/adaptive-dpr.mjs +0 -46
- package/esm2022/performances/lib/adaptive-events.mjs +0 -24
- package/esm2022/performances/lib/detailed.mjs +0 -53
- package/esm2022/performances/lib/instances/instances.mjs +0 -177
- package/esm2022/performances/lib/instances/position-mesh.mjs +0 -51
- package/esm2022/performances/lib/points/points.mjs +0 -272
- package/esm2022/performances/lib/points/position-point.mjs +0 -53
- package/esm2022/performances/lib/segments/segment-object.mjs +0 -9
- package/esm2022/performances/lib/segments/segments.mjs +0 -126
- package/esm2022/shaders/angular-three-soba-shaders.mjs +0 -5
- package/esm2022/shaders/index.mjs +0 -4
- package/esm2022/shaders/lib/grid-material.mjs +0 -81
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +0 -163
- package/esm2022/shaders/lib/point-material.mjs +0 -24
- package/esm2022/staging/angular-three-soba-staging.mjs +0 -5
- package/esm2022/staging/index.mjs +0 -21
- package/esm2022/staging/lib/accumulative-shadows.mjs +0 -180
- package/esm2022/staging/lib/backdrop.mjs +0 -69
- package/esm2022/staging/lib/bb-anchor.mjs +0 -58
- package/esm2022/staging/lib/bounds.mjs +0 -282
- package/esm2022/staging/lib/camera-shake.mjs +0 -65
- package/esm2022/staging/lib/caustics.mjs +0 -184
- package/esm2022/staging/lib/center.mjs +0 -114
- package/esm2022/staging/lib/contact-shadows.mjs +0 -214
- package/esm2022/staging/lib/environment/environment.mjs +0 -344
- package/esm2022/staging/lib/environment/inject-environment.mjs +0 -184
- package/esm2022/staging/lib/float.mjs +0 -70
- package/esm2022/staging/lib/lightformer.mjs +0 -103
- package/esm2022/staging/lib/mask.mjs +0 -74
- package/esm2022/staging/lib/matcap-texture.mjs +0 -79
- package/esm2022/staging/lib/normal-texture.mjs +0 -79
- package/esm2022/staging/lib/randomized-lights.mjs +0 -100
- package/esm2022/staging/lib/render-texture.mjs +0 -202
- package/esm2022/staging/lib/sky.mjs +0 -86
- package/esm2022/staging/lib/spot-light.mjs +0 -445
- package/esm2022/staging/lib/stage.mjs +0 -232
- package/esm2022/stats/angular-three-soba-stats.mjs +0 -5
- package/esm2022/stats/index.mjs +0 -2
- package/esm2022/stats/lib/stats.mjs +0 -57
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +0 -5
- package/esm2022/vanilla-exports/index.mjs +0 -3
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, Renderer2, untracked, viewChild, } from '@angular/core';
|
|
3
|
-
import { injectBeforeRender, NgtHTML, pick, resolveRef } from 'angular-three';
|
|
4
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
5
|
-
import { Vector3 } from 'three';
|
|
6
|
-
import { NgtsHTML } from './html';
|
|
7
|
-
import { defaultCalculatePosition, epsilon, getCameraCSSMatrix, getObjectCSSMatrix, isObjectBehindCamera, isObjectVisible, objectScale, objectZIndex, } from './utils';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
const defaultHtmlContentOptions = {
|
|
10
|
-
eps: 0.001,
|
|
11
|
-
zIndexRange: [16777271, 0],
|
|
12
|
-
pointerEvents: 'auto',
|
|
13
|
-
calculatePosition: defaultCalculatePosition,
|
|
14
|
-
containerClass: '',
|
|
15
|
-
containerStyle: {},
|
|
16
|
-
center: false,
|
|
17
|
-
prepend: false,
|
|
18
|
-
fullscreen: false,
|
|
19
|
-
sprite: false,
|
|
20
|
-
};
|
|
21
|
-
export class NgtsHTMLContent extends NgtHTML {
|
|
22
|
-
constructor() {
|
|
23
|
-
super();
|
|
24
|
-
this.options = input(defaultHtmlContentOptions, {
|
|
25
|
-
transform: mergeInputs(defaultHtmlContentOptions),
|
|
26
|
-
alias: 'ngtsHTMLContent',
|
|
27
|
-
});
|
|
28
|
-
this.occluded = output();
|
|
29
|
-
this.html = inject(NgtsHTML);
|
|
30
|
-
this.transformOuterRef = viewChild('transformOuter');
|
|
31
|
-
this.transformInnerRef = viewChild('transformInner');
|
|
32
|
-
this.containerRef = viewChild('container');
|
|
33
|
-
this.gl = this.store.select('gl');
|
|
34
|
-
this.events = this.store.select('events');
|
|
35
|
-
this.camera = this.store.select('camera');
|
|
36
|
-
this.scene = this.store.select('scene');
|
|
37
|
-
this.size = this.store.select('size');
|
|
38
|
-
this.parent = pick(this.options, 'parent');
|
|
39
|
-
this.zIndexRange = pick(this.options, 'zIndexRange');
|
|
40
|
-
this.calculatePosition = pick(this.options, 'calculatePosition');
|
|
41
|
-
this.prepend = pick(this.options, 'prepend');
|
|
42
|
-
this.center = pick(this.options, 'center');
|
|
43
|
-
this.fullscreen = pick(this.options, 'fullscreen');
|
|
44
|
-
this.pointerEvents = pick(this.options, 'pointerEvents');
|
|
45
|
-
this.containerClass = pick(this.options, 'containerClass');
|
|
46
|
-
this.containerStyle = pick(this.options, 'containerStyle');
|
|
47
|
-
this.target = computed(() => {
|
|
48
|
-
const parent = resolveRef(this.parent());
|
|
49
|
-
if (parent)
|
|
50
|
-
return parent;
|
|
51
|
-
return (this.events().connected || this.gl().domElement.parentNode);
|
|
52
|
-
});
|
|
53
|
-
const renderer = inject(Renderer2);
|
|
54
|
-
let isMeshSizeSet = false;
|
|
55
|
-
effect(() => {
|
|
56
|
-
const [occlude, canvasEl, zIndexRange] = [
|
|
57
|
-
this.html.occlude(),
|
|
58
|
-
untracked(this.gl).domElement,
|
|
59
|
-
untracked(this.zIndexRange),
|
|
60
|
-
];
|
|
61
|
-
if (occlude && occlude === 'blending') {
|
|
62
|
-
renderer.setStyle(canvasEl, 'z-index', `${Math.floor(zIndexRange[0] / 2)}`);
|
|
63
|
-
renderer.setStyle(canvasEl, 'position', 'absolute');
|
|
64
|
-
renderer.setStyle(canvasEl, 'pointer-events', 'none');
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
renderer.removeStyle(canvasEl, 'z-index');
|
|
68
|
-
renderer.removeStyle(canvasEl, 'position');
|
|
69
|
-
renderer.removeStyle(canvasEl, 'pointer-events');
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
effect((onCleanup) => {
|
|
73
|
-
const [transform, target, hostEl, prepend, scene, calculatePosition, group, size, camera] = [
|
|
74
|
-
this.html.transform(),
|
|
75
|
-
this.target(),
|
|
76
|
-
this.host.nativeElement,
|
|
77
|
-
untracked(this.prepend),
|
|
78
|
-
untracked(this.scene),
|
|
79
|
-
untracked(this.calculatePosition),
|
|
80
|
-
untracked(this.html.groupRef).nativeElement,
|
|
81
|
-
untracked(this.size),
|
|
82
|
-
untracked(this.camera),
|
|
83
|
-
];
|
|
84
|
-
scene.updateMatrixWorld();
|
|
85
|
-
renderer.setStyle(hostEl, 'position', 'absolute');
|
|
86
|
-
renderer.setStyle(hostEl, 'top', '0');
|
|
87
|
-
renderer.setStyle(hostEl, 'left', '0');
|
|
88
|
-
if (transform) {
|
|
89
|
-
renderer.setStyle(hostEl, 'pointer-events', 'none');
|
|
90
|
-
renderer.setStyle(hostEl, 'overflow', 'hidden');
|
|
91
|
-
renderer.removeStyle(hostEl, 'transform');
|
|
92
|
-
renderer.removeStyle(hostEl, 'transform-origin');
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
const vec = calculatePosition(group, camera, size);
|
|
96
|
-
renderer.setStyle(hostEl, 'transform', `translate3d(${vec[0]}px,${vec[1]}px,0)`);
|
|
97
|
-
renderer.setStyle(hostEl, 'transform-origin', '0 0');
|
|
98
|
-
renderer.removeStyle(hostEl, 'pointer-events');
|
|
99
|
-
renderer.removeStyle(hostEl, 'overflow');
|
|
100
|
-
}
|
|
101
|
-
if (prepend)
|
|
102
|
-
target.prepend(hostEl);
|
|
103
|
-
else
|
|
104
|
-
target.appendChild(hostEl);
|
|
105
|
-
onCleanup(() => {
|
|
106
|
-
if (target)
|
|
107
|
-
target.removeChild(hostEl);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
effect(() => {
|
|
111
|
-
const _ = [this.options(), this.html.options()];
|
|
112
|
-
isMeshSizeSet = false;
|
|
113
|
-
});
|
|
114
|
-
let visible = true;
|
|
115
|
-
let oldZoom = 0;
|
|
116
|
-
let oldPosition = [0, 0];
|
|
117
|
-
injectBeforeRender(({ camera: rootCamera }) => {
|
|
118
|
-
const [hostEl, transformOuterEl, transformInnerEl, group, occlusionMesh, occlusionGeometry, isRaycastOcclusion, { camera, size, viewport, raycaster, scene }, { calculatePosition, eps, zIndexRange, sprite, distanceFactor }, { transform, occlude, scale },] = [
|
|
119
|
-
this.host.nativeElement,
|
|
120
|
-
this.transformOuterRef()?.nativeElement,
|
|
121
|
-
this.transformInnerRef()?.nativeElement,
|
|
122
|
-
this.html.groupRef().nativeElement,
|
|
123
|
-
this.html.occlusionMeshRef()?.nativeElement,
|
|
124
|
-
this.html.occlusionGeometryRef()?.nativeElement,
|
|
125
|
-
this.html.isRaycastOcclusion(),
|
|
126
|
-
this.store.snapshot,
|
|
127
|
-
this.options(),
|
|
128
|
-
this.html.options(),
|
|
129
|
-
];
|
|
130
|
-
if (group) {
|
|
131
|
-
camera.updateMatrixWorld();
|
|
132
|
-
group.updateWorldMatrix(true, false);
|
|
133
|
-
const vec = transform ? oldPosition : calculatePosition(group, camera, size);
|
|
134
|
-
if (transform ||
|
|
135
|
-
Math.abs(oldZoom - camera.zoom) > eps ||
|
|
136
|
-
Math.abs(oldPosition[0] - vec[0]) > eps ||
|
|
137
|
-
Math.abs(oldPosition[1] - vec[1]) > eps) {
|
|
138
|
-
const isBehindCamera = isObjectBehindCamera(group, camera);
|
|
139
|
-
let raytraceTarget = false;
|
|
140
|
-
if (isRaycastOcclusion) {
|
|
141
|
-
if (Array.isArray(occlude)) {
|
|
142
|
-
raytraceTarget = occlude.map((item) => resolveRef(item));
|
|
143
|
-
}
|
|
144
|
-
else if (occlude !== 'blending') {
|
|
145
|
-
raytraceTarget = [scene];
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
const previouslyVisible = visible;
|
|
149
|
-
if (raytraceTarget) {
|
|
150
|
-
const isVisible = isObjectVisible(group, camera, raycaster, raytraceTarget);
|
|
151
|
-
visible = isVisible && !isBehindCamera;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
visible = !isBehindCamera;
|
|
155
|
-
}
|
|
156
|
-
if (previouslyVisible !== visible) {
|
|
157
|
-
if (this.occluded['listeners'])
|
|
158
|
-
this.occluded.emit(!visible);
|
|
159
|
-
else
|
|
160
|
-
renderer.setStyle(hostEl, 'display', visible ? 'block' : 'none');
|
|
161
|
-
}
|
|
162
|
-
const halfRange = Math.floor(zIndexRange[0] / 2);
|
|
163
|
-
const zRange = occlude
|
|
164
|
-
? isRaycastOcclusion //
|
|
165
|
-
? [zIndexRange[0], halfRange]
|
|
166
|
-
: [halfRange - 1, 0]
|
|
167
|
-
: zIndexRange;
|
|
168
|
-
renderer.setStyle(hostEl, 'z-index', `${objectZIndex(group, camera, zRange)}`);
|
|
169
|
-
if (transform) {
|
|
170
|
-
const [widthHalf, heightHalf] = [size.width / 2, size.height / 2];
|
|
171
|
-
const fov = camera.projectionMatrix.elements[5] * heightHalf;
|
|
172
|
-
const { isOrthographicCamera, top, left, bottom, right } = camera;
|
|
173
|
-
const cameraMatrix = getCameraCSSMatrix(camera.matrixWorldInverse);
|
|
174
|
-
const cameraTransform = isOrthographicCamera
|
|
175
|
-
? `scale(${fov})translate(${epsilon(-(right + left) / 2)}px,${epsilon((top + bottom) / 2)}px)`
|
|
176
|
-
: `translateZ(${fov}px)`;
|
|
177
|
-
let matrix = group.matrixWorld;
|
|
178
|
-
if (sprite) {
|
|
179
|
-
matrix = camera.matrixWorldInverse.clone().transpose().copyPosition(matrix).scale(group.scale);
|
|
180
|
-
matrix.elements[3] = matrix.elements[7] = matrix.elements[11] = 0;
|
|
181
|
-
matrix.elements[15] = 1;
|
|
182
|
-
}
|
|
183
|
-
renderer.setStyle(hostEl, 'width', size.width + 'px');
|
|
184
|
-
renderer.setStyle(hostEl, 'height', size.height + 'px');
|
|
185
|
-
renderer.setStyle(hostEl, 'perspective', isOrthographicCamera ? '' : `${fov}px`);
|
|
186
|
-
if (transformOuterEl && transformInnerEl) {
|
|
187
|
-
renderer.setStyle(transformOuterEl, 'transform', `${cameraTransform}${cameraMatrix}translate(${widthHalf}px,${heightHalf}px)`);
|
|
188
|
-
renderer.setStyle(transformInnerEl, 'transform', getObjectCSSMatrix(matrix, 1 / ((distanceFactor || 10) / 400)));
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
const scale = distanceFactor === undefined ? 1 : objectScale(group, camera) * distanceFactor;
|
|
193
|
-
renderer.setStyle(hostEl, 'transform', `translate3d(${vec[0]}px,${vec[1]}px,0) scale(${scale})`);
|
|
194
|
-
}
|
|
195
|
-
oldPosition = vec;
|
|
196
|
-
oldZoom = camera.zoom;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (!isRaycastOcclusion && occlusionMesh && !isMeshSizeSet) {
|
|
200
|
-
if (transform) {
|
|
201
|
-
if (transformOuterEl) {
|
|
202
|
-
const el = transformOuterEl.children[0];
|
|
203
|
-
if (el?.clientWidth && el?.clientHeight) {
|
|
204
|
-
const { isOrthographicCamera } = camera;
|
|
205
|
-
if (isOrthographicCamera || occlusionGeometry) {
|
|
206
|
-
if (scale) {
|
|
207
|
-
if (!Array.isArray(scale)) {
|
|
208
|
-
occlusionMesh.scale.setScalar(1 / scale);
|
|
209
|
-
}
|
|
210
|
-
else if (scale instanceof Vector3) {
|
|
211
|
-
occlusionMesh.scale.copy(scale.clone().divideScalar(1));
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
occlusionMesh.scale.set(1 / scale[0], 1 / scale[1], 1 / scale[2]);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
const ratio = (distanceFactor || 10) / 400;
|
|
220
|
-
const w = el.clientWidth * ratio;
|
|
221
|
-
const h = el.clientHeight * ratio;
|
|
222
|
-
occlusionMesh.scale.set(w, h, 1);
|
|
223
|
-
}
|
|
224
|
-
isMeshSizeSet = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
const ele = hostEl.children[0];
|
|
230
|
-
if (ele?.clientWidth && ele?.clientHeight) {
|
|
231
|
-
const ratio = 1 / viewport.factor;
|
|
232
|
-
const w = ele.clientWidth * ratio;
|
|
233
|
-
const h = ele.clientHeight * ratio;
|
|
234
|
-
occlusionMesh.scale.set(w, h, 1);
|
|
235
|
-
isMeshSizeSet = true;
|
|
236
|
-
}
|
|
237
|
-
occlusionMesh.lookAt(rootCamera.position);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsHTMLContent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
243
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtsHTMLContent, isStandalone: true, selector: "[ngtsHTMLContent]", inputs: { options: { classPropertyName: "options", publicName: "ngtsHTMLContent", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { occluded: "occluded" }, host: { attributes: { "data-ngts-html-content": "" } }, viewQueries: [{ propertyName: "transformOuterRef", first: true, predicate: ["transformOuter"], descendants: true, isSignal: true }, { propertyName: "transformInnerRef", first: true, predicate: ["transformInner"], descendants: true, isSignal: true }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
|
|
244
|
-
@if (html.transform()) {
|
|
245
|
-
<div
|
|
246
|
-
#transformOuter
|
|
247
|
-
style="position: absolute; top: 0; left: 0; transform-style: preserve-3d; pointer-events: none;"
|
|
248
|
-
[style.width.px]="size().width"
|
|
249
|
-
[style.height.px]="size().height"
|
|
250
|
-
>
|
|
251
|
-
<div #transformInner style="position: absolute" [style.pointer-events]="pointerEvents()">
|
|
252
|
-
<div #container [class]="containerClass()" [style]="containerStyle()">
|
|
253
|
-
<ng-container [ngTemplateOutlet]="content" />
|
|
254
|
-
</div>
|
|
255
|
-
</div>
|
|
256
|
-
</div>
|
|
257
|
-
} @else {
|
|
258
|
-
<div
|
|
259
|
-
#container
|
|
260
|
-
style="position:absolute"
|
|
261
|
-
[style.transform]="center() ? 'translate3d(-50%,-50%,0)' : 'none'"
|
|
262
|
-
[style.top]="fullscreen() ? -size().height / 2 + 'px' : 'unset'"
|
|
263
|
-
[style.left]="fullscreen() ? -size().width / 2 + 'px' : 'unset'"
|
|
264
|
-
[style.width]="fullscreen() ? size().width : 'unset'"
|
|
265
|
-
[style.height]="fullscreen() ? size().height : 'unset'"
|
|
266
|
-
[class]="containerClass()"
|
|
267
|
-
[style]="containerStyle()"
|
|
268
|
-
>
|
|
269
|
-
<ng-container [ngTemplateOutlet]="content" />
|
|
270
|
-
</div>
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
<ng-template #content>
|
|
274
|
-
<ng-content />
|
|
275
|
-
</ng-template>
|
|
276
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
277
|
-
}
|
|
278
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsHTMLContent, decorators: [{
|
|
279
|
-
type: Component,
|
|
280
|
-
args: [{
|
|
281
|
-
selector: '[ngtsHTMLContent]',
|
|
282
|
-
standalone: true,
|
|
283
|
-
template: `
|
|
284
|
-
@if (html.transform()) {
|
|
285
|
-
<div
|
|
286
|
-
#transformOuter
|
|
287
|
-
style="position: absolute; top: 0; left: 0; transform-style: preserve-3d; pointer-events: none;"
|
|
288
|
-
[style.width.px]="size().width"
|
|
289
|
-
[style.height.px]="size().height"
|
|
290
|
-
>
|
|
291
|
-
<div #transformInner style="position: absolute" [style.pointer-events]="pointerEvents()">
|
|
292
|
-
<div #container [class]="containerClass()" [style]="containerStyle()">
|
|
293
|
-
<ng-container [ngTemplateOutlet]="content" />
|
|
294
|
-
</div>
|
|
295
|
-
</div>
|
|
296
|
-
</div>
|
|
297
|
-
} @else {
|
|
298
|
-
<div
|
|
299
|
-
#container
|
|
300
|
-
style="position:absolute"
|
|
301
|
-
[style.transform]="center() ? 'translate3d(-50%,-50%,0)' : 'none'"
|
|
302
|
-
[style.top]="fullscreen() ? -size().height / 2 + 'px' : 'unset'"
|
|
303
|
-
[style.left]="fullscreen() ? -size().width / 2 + 'px' : 'unset'"
|
|
304
|
-
[style.width]="fullscreen() ? size().width : 'unset'"
|
|
305
|
-
[style.height]="fullscreen() ? size().height : 'unset'"
|
|
306
|
-
[class]="containerClass()"
|
|
307
|
-
[style]="containerStyle()"
|
|
308
|
-
>
|
|
309
|
-
<ng-container [ngTemplateOutlet]="content" />
|
|
310
|
-
</div>
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
<ng-template #content>
|
|
314
|
-
<ng-content />
|
|
315
|
-
</ng-template>
|
|
316
|
-
`,
|
|
317
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
318
|
-
imports: [NgTemplateOutlet],
|
|
319
|
-
host: { 'data-ngts-html-content': '' },
|
|
320
|
-
}]
|
|
321
|
-
}], ctorParameters: () => [] });
|
|
322
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL21pc2Mvc3JjL2xpYi9odG1sL2h0bWwtY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUVOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFnQyxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBRU4sd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsV0FBVyxFQUNYLFlBQVksR0FDWixNQUFNLFNBQVMsQ0FBQzs7QUE4QmpCLE1BQU0seUJBQXlCLEdBQTJCO0lBQ3pELEdBQUcsRUFBRSxLQUFLO0lBQ1YsV0FBVyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMxQixhQUFhLEVBQUUsTUFBTTtJQUNyQixpQkFBaUIsRUFBRSx3QkFBd0I7SUFDM0MsY0FBYyxFQUFFLEVBQUU7SUFDbEIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsTUFBTSxFQUFFLEtBQUs7SUFDYixPQUFPLEVBQUUsS0FBSztJQUNkLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLE1BQU0sRUFBRSxLQUFLO0NBQ2IsQ0FBQztBQTJDRixNQUFNLE9BQU8sZUFBZ0IsU0FBUSxPQUFPO0lBbUMzQztRQUNDLEtBQUssRUFBRSxDQUFDO1FBbkNULFlBQU8sR0FBRyxLQUFLLENBQUMseUJBQXlCLEVBQUU7WUFDMUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQztZQUNqRCxLQUFLLEVBQUUsaUJBQWlCO1NBQ3hCLENBQUMsQ0FBQztRQUNILGFBQVEsR0FBRyxNQUFNLEVBQVcsQ0FBQztRQUU3QixTQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXhCLHNCQUFpQixHQUFHLFNBQVMsQ0FBNkIsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RSxzQkFBaUIsR0FBRyxTQUFTLENBQTZCLGdCQUFnQixDQUFDLENBQUM7UUFDNUUsaUJBQVksR0FBRyxTQUFTLENBQTZCLFdBQVcsQ0FBQyxDQUFDO1FBRTFELE9BQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixXQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JDLFVBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxTQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkMsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDaEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUM1RCxZQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdEMsV0FBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELG1CQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFeEQsV0FBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksTUFBTTtnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBZ0IsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztRQUtGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFMUIsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVO2dCQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQzthQUMzQixDQUFDO1lBRUYsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN2QyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVFLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkQsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUMxQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDM0MsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNwQixNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHO2dCQUMzRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZCLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO2dCQUN2QixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDckIsU0FBUyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztnQkFDakMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYTtnQkFDM0MsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3BCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQ3RCLENBQUM7WUFFRixLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMxQixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDbEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUV2QyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNmLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRCxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUMxQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xELENBQUM7aUJBQU0sQ0FBQztnQkFDUCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakYsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JELFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9DLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFFRCxJQUFJLE9BQU87Z0JBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Z0JBQy9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFaEMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLE1BQU07b0JBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNYLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNoRCxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6QixrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7WUFDN0MsTUFBTSxDQUNMLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFDNUMsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFDL0QsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUM3QixHQUFHO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDdkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsYUFBYTtnQkFDdkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsYUFBYTtnQkFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxhQUFhO2dCQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsYUFBYTtnQkFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLGFBQWE7Z0JBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUTtnQkFDbkIsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTthQUNuQixDQUFDO1lBRUYsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDWCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBRTdFLElBQ0MsU0FBUztvQkFDVCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRztvQkFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztvQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUN0QyxDQUFDO29CQUNGLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxjQUFjLEdBQTRDLEtBQUssQ0FBQztvQkFFcEUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO3dCQUN4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzs0QkFDNUIsY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBZSxDQUFDO3dCQUN4RSxDQUFDOzZCQUFNLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDOzRCQUNuQyxjQUFjLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUIsQ0FBQztvQkFDRixDQUFDO29CQUVELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO29CQUNsQyxJQUFJLGNBQWMsRUFBRSxDQUFDO3dCQUNwQixNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7d0JBQzVFLE9BQU8sR0FBRyxTQUFTLElBQUksQ0FBQyxjQUFjLENBQUM7b0JBQ3hDLENBQUM7eUJBQU0sQ0FBQzt3QkFDUCxPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUM7b0JBQzNCLENBQUM7b0JBRUQsSUFBSSxpQkFBaUIsS0FBSyxPQUFPLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQzs0QkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs0QkFDeEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDdkUsQ0FBQztvQkFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTzt3QkFDckIsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUU7NEJBQ3RCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7NEJBQzdCLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNyQixDQUFDLENBQUMsV0FBVyxDQUFDO29CQUVmLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFL0UsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDZixNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDbEUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7d0JBQzdELE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUE0QixDQUFDO3dCQUN4RixNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQzt3QkFDbkUsTUFBTSxlQUFlLEdBQUcsb0JBQW9COzRCQUMzQyxDQUFDLENBQUMsU0FBUyxHQUFHLGNBQWMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLOzRCQUM5RixDQUFDLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQzt3QkFDMUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQzt3QkFDL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDWixNQUFNLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUMvRixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2xFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6QixDQUFDO3dCQUVELFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO3dCQUN0RCxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQzt3QkFDeEQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQzt3QkFFakYsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDOzRCQUMxQyxRQUFRLENBQUMsUUFBUSxDQUNoQixnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLEdBQUcsZUFBZSxHQUFHLFlBQVksYUFBYSxTQUFTLE1BQU0sVUFBVSxLQUFLLENBQzVFLENBQUM7NEJBQ0YsUUFBUSxDQUFDLFFBQVEsQ0FDaEIsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FDOUQsQ0FBQzt3QkFDSCxDQUFDO29CQUNGLENBQUM7eUJBQU0sQ0FBQzt3QkFDUCxNQUFNLEtBQUssR0FBRyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsY0FBYyxDQUFDO3dCQUM3RixRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxlQUFlLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ2xHLENBQUM7b0JBQ0QsV0FBVyxHQUFHLEdBQUcsQ0FBQztvQkFDbEIsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZCLENBQUM7WUFDRixDQUFDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixJQUFJLGFBQWEsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUNmLElBQUksZ0JBQWdCLEVBQUUsQ0FBQzt3QkFDdEIsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUV4QyxJQUFJLEVBQUUsRUFBRSxXQUFXLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDOzRCQUN6QyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxNQUE0QixDQUFDOzRCQUU5RCxJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixFQUFFLENBQUM7Z0NBQy9DLElBQUksS0FBSyxFQUFFLENBQUM7b0NBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3Q0FDM0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFJLEtBQWdCLENBQUMsQ0FBQztvQ0FDdEQsQ0FBQzt5Q0FBTSxJQUFJLEtBQUssWUFBWSxPQUFPLEVBQUUsQ0FBQzt3Q0FDckMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUN6RCxDQUFDO3lDQUFNLENBQUM7d0NBQ1AsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQ0FDbkUsQ0FBQztnQ0FDRixDQUFDOzRCQUNGLENBQUM7aUNBQU0sQ0FBQztnQ0FDUCxNQUFNLEtBQUssR0FBRyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7Z0NBQzNDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dDQUNqQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQ0FFbEMsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQzs0QkFFRCxhQUFhLEdBQUcsSUFBSSxDQUFDO3dCQUN0QixDQUFDO29CQUNGLENBQUM7Z0JBQ0YsQ0FBQztxQkFBTSxDQUFDO29CQUNQLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRS9CLElBQUksR0FBRyxFQUFFLFdBQVcsSUFBSSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7d0JBQzNDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO3dCQUNsQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzt3QkFDbEMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBRW5DLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRWpDLGFBQWEsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLENBQUM7b0JBRUQsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNDLENBQUM7WUFDRixDQUFDO1FBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDOytHQXZRVyxlQUFlO21HQUFmLGVBQWUsd3JCQXRDakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDVCw0REFFUyxnQkFBZ0I7OzRGQUdkLGVBQWU7a0JBekMzQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7b0JBQzNCLElBQUksRUFBRSxFQUFFLHdCQUF3QixFQUFFLEVBQUUsRUFBRTtpQkFDdEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRlZmZlY3QsXG5cdEVsZW1lbnRSZWYsXG5cdGluamVjdCxcblx0aW5wdXQsXG5cdG91dHB1dCxcblx0UmVuZGVyZXIyLFxuXHR1bnRyYWNrZWQsXG5cdHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RCZWZvcmVSZW5kZXIsIE5ndEhUTUwsIHBpY2ssIHJlc29sdmVSZWYgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IE9iamVjdDNELCBPcnRob2dyYXBoaWNDYW1lcmEsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBOZ3RzSFRNTCB9IGZyb20gJy4vaHRtbCc7XG5pbXBvcnQge1xuXHRDYWxjdWxhdGVQb3NpdGlvbixcblx0ZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uLFxuXHRlcHNpbG9uLFxuXHRnZXRDYW1lcmFDU1NNYXRyaXgsXG5cdGdldE9iamVjdENTU01hdHJpeCxcblx0aXNPYmplY3RCZWhpbmRDYW1lcmEsXG5cdGlzT2JqZWN0VmlzaWJsZSxcblx0b2JqZWN0U2NhbGUsXG5cdG9iamVjdFpJbmRleCxcbn0gZnJvbSAnLi91dGlscyc7XG5cbnR5cGUgUG9pbnRlckV2ZW50c1Byb3BlcnRpZXMgPVxuXHR8ICdhdXRvJ1xuXHR8ICdub25lJ1xuXHR8ICd2aXNpYmxlUGFpbnRlZCdcblx0fCAndmlzaWJsZUZpbGwnXG5cdHwgJ3Zpc2libGVTdHJva2UnXG5cdHwgJ3Zpc2libGUnXG5cdHwgJ3BhaW50ZWQnXG5cdHwgJ2ZpbGwnXG5cdHwgJ3N0cm9rZSdcblx0fCAnYWxsJ1xuXHR8ICdpbmhlcml0JztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzSFRNTENvbnRlbnRPcHRpb25zIHtcblx0ZXBzOiBudW1iZXI7XG5cdHpJbmRleFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuXHRjZW50ZXI6IGJvb2xlYW47XG5cdHByZXBlbmQ6IGJvb2xlYW47XG5cdGZ1bGxzY3JlZW46IGJvb2xlYW47XG5cdGNvbnRhaW5lckNsYXNzOiBzdHJpbmc7XG5cdGNvbnRhaW5lclN0eWxlOiBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+O1xuXHRwb2ludGVyRXZlbnRzOiBQb2ludGVyRXZlbnRzUHJvcGVydGllcztcblx0Y2FsY3VsYXRlUG9zaXRpb246IENhbGN1bGF0ZVBvc2l0aW9uO1xuXHRzcHJpdGU6IGJvb2xlYW47XG5cdGRpc3RhbmNlRmFjdG9yPzogbnVtYmVyO1xuXHRwYXJlbnQ/OiBIVE1MRWxlbWVudCB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xufVxuXG5jb25zdCBkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zOiBOZ3RzSFRNTENvbnRlbnRPcHRpb25zID0ge1xuXHRlcHM6IDAuMDAxLFxuXHR6SW5kZXhSYW5nZTogWzE2Nzc3MjcxLCAwXSxcblx0cG9pbnRlckV2ZW50czogJ2F1dG8nLFxuXHRjYWxjdWxhdGVQb3NpdGlvbjogZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uLFxuXHRjb250YWluZXJDbGFzczogJycsXG5cdGNvbnRhaW5lclN0eWxlOiB7fSxcblx0Y2VudGVyOiBmYWxzZSxcblx0cHJlcGVuZDogZmFsc2UsXG5cdGZ1bGxzY3JlZW46IGZhbHNlLFxuXHRzcHJpdGU6IGZhbHNlLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnW25ndHNIVE1MQ29udGVudF0nLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdEBpZiAoaHRtbC50cmFuc2Zvcm0oKSkge1xuXHRcdFx0PGRpdlxuXHRcdFx0XHQjdHJhbnNmb3JtT3V0ZXJcblx0XHRcdFx0c3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbGVmdDogMDsgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDsgcG9pbnRlci1ldmVudHM6IG5vbmU7XCJcblx0XHRcdFx0W3N0eWxlLndpZHRoLnB4XT1cInNpemUoKS53aWR0aFwiXG5cdFx0XHRcdFtzdHlsZS5oZWlnaHQucHhdPVwic2l6ZSgpLmhlaWdodFwiXG5cdFx0XHQ+XG5cdFx0XHRcdDxkaXYgI3RyYW5zZm9ybUlubmVyIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cInBvaW50ZXJFdmVudHMoKVwiPlxuXHRcdFx0XHRcdDxkaXYgI2NvbnRhaW5lciBbY2xhc3NdPVwiY29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJjb250YWluZXJTdHlsZSgpXCI+XG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRcIiAvPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdH0gQGVsc2Uge1xuXHRcdFx0PGRpdlxuXHRcdFx0XHQjY29udGFpbmVyXG5cdFx0XHRcdHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGVcIlxuXHRcdFx0XHRbc3R5bGUudHJhbnNmb3JtXT1cImNlbnRlcigpID8gJ3RyYW5zbGF0ZTNkKC01MCUsLTUwJSwwKScgOiAnbm9uZSdcIlxuXHRcdFx0XHRbc3R5bGUudG9wXT1cImZ1bGxzY3JlZW4oKSA/IC1zaXplKCkuaGVpZ2h0IC8gMiArICdweCcgOiAndW5zZXQnXCJcblx0XHRcdFx0W3N0eWxlLmxlZnRdPVwiZnVsbHNjcmVlbigpID8gLXNpemUoKS53aWR0aCAvIDIgKyAncHgnIDogJ3Vuc2V0J1wiXG5cdFx0XHRcdFtzdHlsZS53aWR0aF09XCJmdWxsc2NyZWVuKCkgPyBzaXplKCkud2lkdGggOiAndW5zZXQnXCJcblx0XHRcdFx0W3N0eWxlLmhlaWdodF09XCJmdWxsc2NyZWVuKCkgPyBzaXplKCkuaGVpZ2h0IDogJ3Vuc2V0J1wiXG5cdFx0XHRcdFtjbGFzc109XCJjb250YWluZXJDbGFzcygpXCJcblx0XHRcdFx0W3N0eWxlXT1cImNvbnRhaW5lclN0eWxlKClcIlxuXHRcdFx0PlxuXHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRcIiAvPlxuXHRcdFx0PC9kaXY+XG5cdFx0fVxuXG5cdFx0PG5nLXRlbXBsYXRlICNjb250ZW50PlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcblx0aW1wb3J0czogW05nVGVtcGxhdGVPdXRsZXRdLFxuXHRob3N0OiB7ICdkYXRhLW5ndHMtaHRtbC1jb250ZW50JzogJycgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c0hUTUxDb250ZW50IGV4dGVuZHMgTmd0SFRNTCB7XG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zLCB7XG5cdFx0dHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0SHRtbENvbnRlbnRPcHRpb25zKSxcblx0XHRhbGlhczogJ25ndHNIVE1MQ29udGVudCcsXG5cdH0pO1xuXHRvY2NsdWRlZCA9IG91dHB1dDxib29sZWFuPigpO1xuXG5cdGh0bWwgPSBpbmplY3QoTmd0c0hUTUwpO1xuXG5cdHRyYW5zZm9ybU91dGVyUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PigndHJhbnNmb3JtT3V0ZXInKTtcblx0dHJhbnNmb3JtSW5uZXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCd0cmFuc2Zvcm1Jbm5lcicpO1xuXHRjb250YWluZXJSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXInKTtcblxuXHRwcml2YXRlIGdsID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJyk7XG5cdHByaXZhdGUgZXZlbnRzID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2V2ZW50cycpO1xuXHRwcml2YXRlIGNhbWVyYSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdjYW1lcmEnKTtcblx0cHJpdmF0ZSBzY2VuZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzY2VuZScpO1xuXHRwcm90ZWN0ZWQgc2l6ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdzaXplJyk7XG5cblx0cHJpdmF0ZSBwYXJlbnQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3BhcmVudCcpO1xuXHRwcml2YXRlIHpJbmRleFJhbmdlID0gcGljayh0aGlzLm9wdGlvbnMsICd6SW5kZXhSYW5nZScpO1xuXHRwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uID0gcGljayh0aGlzLm9wdGlvbnMsICdjYWxjdWxhdGVQb3NpdGlvbicpO1xuXHRwcml2YXRlIHByZXBlbmQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ3ByZXBlbmQnKTtcblx0cHJvdGVjdGVkIGNlbnRlciA9IHBpY2sodGhpcy5vcHRpb25zLCAnY2VudGVyJyk7XG5cdHByb3RlY3RlZCBmdWxsc2NyZWVuID0gcGljayh0aGlzLm9wdGlvbnMsICdmdWxsc2NyZWVuJyk7XG5cdHByb3RlY3RlZCBwb2ludGVyRXZlbnRzID0gcGljayh0aGlzLm9wdGlvbnMsICdwb2ludGVyRXZlbnRzJyk7XG5cdHByb3RlY3RlZCBjb250YWluZXJDbGFzcyA9IHBpY2sodGhpcy5vcHRpb25zLCAnY29udGFpbmVyQ2xhc3MnKTtcblx0cHJvdGVjdGVkIGNvbnRhaW5lclN0eWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdjb250YWluZXJTdHlsZScpO1xuXG5cdHByaXZhdGUgdGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHJlc29sdmVSZWYodGhpcy5wYXJlbnQoKSk7XG5cdFx0aWYgKHBhcmVudCkgcmV0dXJuIHBhcmVudDtcblx0XHRyZXR1cm4gKHRoaXMuZXZlbnRzKCkuY29ubmVjdGVkIHx8IHRoaXMuZ2woKS5kb21FbGVtZW50LnBhcmVudE5vZGUpIGFzIEhUTUxFbGVtZW50O1xuXHR9KTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuXHRcdGxldCBpc01lc2hTaXplU2V0ID0gZmFsc2U7XG5cblx0XHRlZmZlY3QoKCkgPT4ge1xuXHRcdFx0Y29uc3QgW29jY2x1ZGUsIGNhbnZhc0VsLCB6SW5kZXhSYW5nZV0gPSBbXG5cdFx0XHRcdHRoaXMuaHRtbC5vY2NsdWRlKCksXG5cdFx0XHRcdHVudHJhY2tlZCh0aGlzLmdsKS5kb21FbGVtZW50LFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy56SW5kZXhSYW5nZSksXG5cdFx0XHRdO1xuXG5cdFx0XHRpZiAob2NjbHVkZSAmJiBvY2NsdWRlID09PSAnYmxlbmRpbmcnKSB7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGNhbnZhc0VsLCAnei1pbmRleCcsIGAke01hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKX1gKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoY2FudmFzRWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShjYW52YXNFbCwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGNhbnZhc0VsLCAnei1pbmRleCcpO1xuXHRcdFx0XHRyZW5kZXJlci5yZW1vdmVTdHlsZShjYW52YXNFbCwgJ3Bvc2l0aW9uJyk7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGNhbnZhc0VsLCAncG9pbnRlci1ldmVudHMnKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBbdHJhbnNmb3JtLCB0YXJnZXQsIGhvc3RFbCwgcHJlcGVuZCwgc2NlbmUsIGNhbGN1bGF0ZVBvc2l0aW9uLCBncm91cCwgc2l6ZSwgY2FtZXJhXSA9IFtcblx0XHRcdFx0dGhpcy5odG1sLnRyYW5zZm9ybSgpLFxuXHRcdFx0XHR0aGlzLnRhcmdldCgpLFxuXHRcdFx0XHR0aGlzLmhvc3QubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dW50cmFja2VkKHRoaXMucHJlcGVuZCksXG5cdFx0XHRcdHVudHJhY2tlZCh0aGlzLnNjZW5lKSxcblx0XHRcdFx0dW50cmFja2VkKHRoaXMuY2FsY3VsYXRlUG9zaXRpb24pLFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy5odG1sLmdyb3VwUmVmKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR1bnRyYWNrZWQodGhpcy5zaXplKSxcblx0XHRcdFx0dW50cmFja2VkKHRoaXMuY2FtZXJhKSxcblx0XHRcdF07XG5cblx0XHRcdHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuXHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAndG9wJywgJzAnKTtcblx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ2xlZnQnLCAnMCcpO1xuXG5cdFx0XHRpZiAodHJhbnNmb3JtKSB7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAnb3ZlcmZsb3cnLCAnaGlkZGVuJyk7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybScpO1xuXHRcdFx0XHRyZW5kZXJlci5yZW1vdmVTdHlsZShob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJyk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zdCB2ZWMgPSBjYWxjdWxhdGVQb3NpdGlvbihncm91cCwgY2FtZXJhLCBzaXplKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAndHJhbnNmb3JtJywgYHRyYW5zbGF0ZTNkKCR7dmVjWzBdfXB4LCR7dmVjWzFdfXB4LDApYCk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybS1vcmlnaW4nLCAnMCAwJyk7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ3BvaW50ZXItZXZlbnRzJyk7XG5cdFx0XHRcdHJlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3RFbCwgJ292ZXJmbG93Jyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmVwZW5kKSB0YXJnZXQucHJlcGVuZChob3N0RWwpO1xuXHRcdFx0ZWxzZSB0YXJnZXQuYXBwZW5kQ2hpbGQoaG9zdEVsKTtcblxuXHRcdFx0b25DbGVhbnVwKCgpID0+IHtcblx0XHRcdFx0aWYgKHRhcmdldCkgdGFyZ2V0LnJlbW92ZUNoaWxkKGhvc3RFbCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdGVmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBfID0gW3RoaXMub3B0aW9ucygpLCB0aGlzLmh0bWwub3B0aW9ucygpXTtcblx0XHRcdGlzTWVzaFNpemVTZXQgPSBmYWxzZTtcblx0XHR9KTtcblxuXHRcdGxldCB2aXNpYmxlID0gdHJ1ZTtcblx0XHRsZXQgb2xkWm9vbSA9IDA7XG5cdFx0bGV0IG9sZFBvc2l0aW9uID0gWzAsIDBdO1xuXG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCh7IGNhbWVyYTogcm9vdENhbWVyYSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbXG5cdFx0XHRcdGhvc3RFbCxcblx0XHRcdFx0dHJhbnNmb3JtT3V0ZXJFbCxcblx0XHRcdFx0dHJhbnNmb3JtSW5uZXJFbCxcblx0XHRcdFx0Z3JvdXAsXG5cdFx0XHRcdG9jY2x1c2lvbk1lc2gsXG5cdFx0XHRcdG9jY2x1c2lvbkdlb21ldHJ5LFxuXHRcdFx0XHRpc1JheWNhc3RPY2NsdXNpb24sXG5cdFx0XHRcdHsgY2FtZXJhLCBzaXplLCB2aWV3cG9ydCwgcmF5Y2FzdGVyLCBzY2VuZSB9LFxuXHRcdFx0XHR7IGNhbGN1bGF0ZVBvc2l0aW9uLCBlcHMsIHpJbmRleFJhbmdlLCBzcHJpdGUsIGRpc3RhbmNlRmFjdG9yIH0sXG5cdFx0XHRcdHsgdHJhbnNmb3JtLCBvY2NsdWRlLCBzY2FsZSB9LFxuXHRcdFx0XSA9IFtcblx0XHRcdFx0dGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsXG5cdFx0XHRcdHRoaXMudHJhbnNmb3JtT3V0ZXJSZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy50cmFuc2Zvcm1Jbm5lclJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwuZ3JvdXBSZWYoKS5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwub2NjbHVzaW9uTWVzaFJlZigpPy5uYXRpdmVFbGVtZW50LFxuXHRcdFx0XHR0aGlzLmh0bWwub2NjbHVzaW9uR2VvbWV0cnlSZWYoKT8ubmF0aXZlRWxlbWVudCxcblx0XHRcdFx0dGhpcy5odG1sLmlzUmF5Y2FzdE9jY2x1c2lvbigpLFxuXHRcdFx0XHR0aGlzLnN0b3JlLnNuYXBzaG90LFxuXHRcdFx0XHR0aGlzLm9wdGlvbnMoKSxcblx0XHRcdFx0dGhpcy5odG1sLm9wdGlvbnMoKSxcblx0XHRcdF07XG5cblx0XHRcdGlmIChncm91cCkge1xuXHRcdFx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0Z3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0XHRjb25zdCB2ZWMgPSB0cmFuc2Zvcm0gPyBvbGRQb3NpdGlvbiA6IGNhbGN1bGF0ZVBvc2l0aW9uKGdyb3VwLCBjYW1lcmEsIHNpemUpO1xuXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHR0cmFuc2Zvcm0gfHxcblx0XHRcdFx0XHRNYXRoLmFicyhvbGRab29tIC0gY2FtZXJhLnpvb20pID4gZXBzIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkUG9zaXRpb25bMF0gLSB2ZWNbMF0pID4gZXBzIHx8XG5cdFx0XHRcdFx0TWF0aC5hYnMob2xkUG9zaXRpb25bMV0gLSB2ZWNbMV0pID4gZXBzXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnN0IGlzQmVoaW5kQ2FtZXJhID0gaXNPYmplY3RCZWhpbmRDYW1lcmEoZ3JvdXAsIGNhbWVyYSk7XG5cdFx0XHRcdFx0bGV0IHJheXRyYWNlVGFyZ2V0OiBudWxsIHwgdW5kZWZpbmVkIHwgYm9vbGVhbiB8IE9iamVjdDNEW10gPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmIChpc1JheWNhc3RPY2NsdXNpb24pIHtcblx0XHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KG9jY2x1ZGUpKSB7XG5cdFx0XHRcdFx0XHRcdHJheXRyYWNlVGFyZ2V0ID0gb2NjbHVkZS5tYXAoKGl0ZW0pID0+IHJlc29sdmVSZWYoaXRlbSkpIGFzIE9iamVjdDNEW107XG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKG9jY2x1ZGUgIT09ICdibGVuZGluZycpIHtcblx0XHRcdFx0XHRcdFx0cmF5dHJhY2VUYXJnZXQgPSBbc2NlbmVdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzbHlWaXNpYmxlID0gdmlzaWJsZTtcblx0XHRcdFx0XHRpZiAocmF5dHJhY2VUYXJnZXQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGlzVmlzaWJsZSA9IGlzT2JqZWN0VmlzaWJsZShncm91cCwgY2FtZXJhLCByYXljYXN0ZXIsIHJheXRyYWNlVGFyZ2V0KTtcblx0XHRcdFx0XHRcdHZpc2libGUgPSBpc1Zpc2libGUgJiYgIWlzQmVoaW5kQ2FtZXJhO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2aXNpYmxlID0gIWlzQmVoaW5kQ2FtZXJhO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChwcmV2aW91c2x5VmlzaWJsZSAhPT0gdmlzaWJsZSkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMub2NjbHVkZWRbJ2xpc3RlbmVycyddKSB0aGlzLm9jY2x1ZGVkLmVtaXQoIXZpc2libGUpO1xuXHRcdFx0XHRcdFx0ZWxzZSByZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdkaXNwbGF5JywgdmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZScpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGhhbGZSYW5nZSA9IE1hdGguZmxvb3IoekluZGV4UmFuZ2VbMF0gLyAyKTtcblx0XHRcdFx0XHRjb25zdCB6UmFuZ2UgPSBvY2NsdWRlXG5cdFx0XHRcdFx0XHQ/IGlzUmF5Y2FzdE9jY2x1c2lvbiAvL1xuXHRcdFx0XHRcdFx0XHQ/IFt6SW5kZXhSYW5nZVswXSwgaGFsZlJhbmdlXVxuXHRcdFx0XHRcdFx0XHQ6IFtoYWxmUmFuZ2UgLSAxLCAwXVxuXHRcdFx0XHRcdFx0OiB6SW5kZXhSYW5nZTtcblxuXHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3otaW5kZXgnLCBgJHtvYmplY3RaSW5kZXgoZ3JvdXAsIGNhbWVyYSwgelJhbmdlKX1gKTtcblxuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IFt3aWR0aEhhbGYsIGhlaWdodEhhbGZdID0gW3NpemUud2lkdGggLyAyLCBzaXplLmhlaWdodCAvIDJdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZm92ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0gKiBoZWlnaHRIYWxmO1xuXHRcdFx0XHRcdFx0Y29uc3QgeyBpc09ydGhvZ3JhcGhpY0NhbWVyYSwgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0gPSBjYW1lcmEgYXMgT3J0aG9ncmFwaGljQ2FtZXJhO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhTWF0cml4ID0gZ2V0Q2FtZXJhQ1NTTWF0cml4KGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UpO1xuXHRcdFx0XHRcdFx0Y29uc3QgY2FtZXJhVHJhbnNmb3JtID0gaXNPcnRob2dyYXBoaWNDYW1lcmFcblx0XHRcdFx0XHRcdFx0PyBgc2NhbGUoJHtmb3Z9KXRyYW5zbGF0ZSgke2Vwc2lsb24oLShyaWdodCArIGxlZnQpIC8gMil9cHgsJHtlcHNpbG9uKCh0b3AgKyBib3R0b20pIC8gMil9cHgpYFxuXHRcdFx0XHRcdFx0XHQ6IGB0cmFuc2xhdGVaKCR7Zm92fXB4KWA7XG5cdFx0XHRcdFx0XHRsZXQgbWF0cml4ID0gZ3JvdXAubWF0cml4V29ybGQ7XG5cdFx0XHRcdFx0XHRpZiAoc3ByaXRlKSB7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY2xvbmUoKS50cmFuc3Bvc2UoKS5jb3B5UG9zaXRpb24obWF0cml4KS5zY2FsZShncm91cC5zY2FsZSk7XG5cdFx0XHRcdFx0XHRcdG1hdHJpeC5lbGVtZW50c1szXSA9IG1hdHJpeC5lbGVtZW50c1s3XSA9IG1hdHJpeC5lbGVtZW50c1sxMV0gPSAwO1xuXHRcdFx0XHRcdFx0XHRtYXRyaXguZWxlbWVudHNbMTVdID0gMTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAnd2lkdGgnLCBzaXplLndpZHRoICsgJ3B4Jyk7XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShob3N0RWwsICdoZWlnaHQnLCBzaXplLmhlaWdodCArICdweCcpO1xuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoaG9zdEVsLCAncGVyc3BlY3RpdmUnLCBpc09ydGhvZ3JhcGhpY0NhbWVyYSA/ICcnIDogYCR7Zm92fXB4YCk7XG5cblx0XHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1PdXRlckVsICYmIHRyYW5zZm9ybUlubmVyRWwpIHtcblx0XHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0U3R5bGUoXG5cdFx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtT3V0ZXJFbCxcblx0XHRcdFx0XHRcdFx0XHQndHJhbnNmb3JtJyxcblx0XHRcdFx0XHRcdFx0XHRgJHtjYW1lcmFUcmFuc2Zvcm19JHtjYW1lcmFNYXRyaXh9dHJhbnNsYXRlKCR7d2lkdGhIYWxmfXB4LCR7aGVpZ2h0SGFsZn1weClgLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRTdHlsZShcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1Jbm5lckVsLFxuXHRcdFx0XHRcdFx0XHRcdCd0cmFuc2Zvcm0nLFxuXHRcdFx0XHRcdFx0XHRcdGdldE9iamVjdENTU01hdHJpeChtYXRyaXgsIDEgLyAoKGRpc3RhbmNlRmFjdG9yIHx8IDEwKSAvIDQwMCkpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzY2FsZSA9IGRpc3RhbmNlRmFjdG9yID09PSB1bmRlZmluZWQgPyAxIDogb2JqZWN0U2NhbGUoZ3JvdXAsIGNhbWVyYSkgKiBkaXN0YW5jZUZhY3Rvcjtcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFN0eWxlKGhvc3RFbCwgJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUzZCgke3ZlY1swXX1weCwke3ZlY1sxXX1weCwwKSBzY2FsZSgke3NjYWxlfSlgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0b2xkUG9zaXRpb24gPSB2ZWM7XG5cdFx0XHRcdFx0b2xkWm9vbSA9IGNhbWVyYS56b29tO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXNSYXljYXN0T2NjbHVzaW9uICYmIG9jY2x1c2lvbk1lc2ggJiYgIWlzTWVzaFNpemVTZXQpIHtcblx0XHRcdFx0aWYgKHRyYW5zZm9ybSkge1xuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1PdXRlckVsKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBlbCA9IHRyYW5zZm9ybU91dGVyRWwuY2hpbGRyZW5bMF07XG5cblx0XHRcdFx0XHRcdGlmIChlbD8uY2xpZW50V2lkdGggJiYgZWw/LmNsaWVudEhlaWdodCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB7IGlzT3J0aG9ncmFwaGljQ2FtZXJhIH0gPSBjYW1lcmEgYXMgT3J0aG9ncmFwaGljQ2FtZXJhO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChpc09ydGhvZ3JhcGhpY0NhbWVyYSB8fCBvY2NsdXNpb25HZW9tZXRyeSkge1xuXHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KHNjYWxlKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRvY2NsdXNpb25NZXNoLnNjYWxlLnNldFNjYWxhcigxIC8gKHNjYWxlIGFzIG51bWJlcikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChzY2FsZSBpbnN0YW5jZW9mIFZlY3RvcjMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaC5zY2FsZS5jb3B5KHNjYWxlLmNsb25lKCkuZGl2aWRlU2NhbGFyKDEpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2guc2NhbGUuc2V0KDEgLyBzY2FsZVswXSwgMSAvIHNjYWxlWzFdLCAxIC8gc2NhbGVbMl0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCByYXRpbyA9IChkaXN0YW5jZUZhY3RvciB8fCAxMCkgLyA0MDA7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdyA9IGVsLmNsaWVudFdpZHRoICogcmF0aW87XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgaCA9IGVsLmNsaWVudEhlaWdodCAqIHJhdGlvO1xuXG5cdFx0XHRcdFx0XHRcdFx0b2NjbHVzaW9uTWVzaC5zY2FsZS5zZXQodywgaCwgMSk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3QgZWxlID0gaG9zdEVsLmNoaWxkcmVuWzBdO1xuXG5cdFx0XHRcdFx0aWYgKGVsZT8uY2xpZW50V2lkdGggJiYgZWxlPy5jbGllbnRIZWlnaHQpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHJhdGlvID0gMSAvIHZpZXdwb3J0LmZhY3Rvcjtcblx0XHRcdFx0XHRcdGNvbnN0IHcgPSBlbGUuY2xpZW50V2lkdGggKiByYXRpbztcblx0XHRcdFx0XHRcdGNvbnN0IGggPSBlbGUuY2xpZW50SGVpZ2h0ICogcmF0aW87XG5cblx0XHRcdFx0XHRcdG9jY2x1c2lvbk1lc2guc2NhbGUuc2V0KHcsIGgsIDEpO1xuXG5cdFx0XHRcdFx0XHRpc01lc2hTaXplU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvY2NsdXNpb25NZXNoLmxvb2tBdChyb290Q2FtZXJhLnBvc2l0aW9uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG4iXX0=
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, is, omit, pick } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { DoubleSide, Group, Mesh, PlaneGeometry, ShaderMaterial } from 'three';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const defaultHtmlOptions = {
|
|
7
|
-
occlude: false,
|
|
8
|
-
transform: false,
|
|
9
|
-
castShadow: false,
|
|
10
|
-
receiveShadow: false,
|
|
11
|
-
};
|
|
12
|
-
export class NgtsHTML {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.options = input(defaultHtmlOptions, { transform: mergeInputs(defaultHtmlOptions) });
|
|
15
|
-
this.parameters = omit(this.options, ['occlude', 'castShadow', 'receiveShadow', 'transform']);
|
|
16
|
-
this.groupRef = viewChild.required('group');
|
|
17
|
-
this.occlusionMeshRef = viewChild('occlusionMesh');
|
|
18
|
-
this.occlusionGeometryRef = viewChild('occlusionGeometry');
|
|
19
|
-
this.occlude = pick(this.options, 'occlude');
|
|
20
|
-
this.transform = pick(this.options, 'transform');
|
|
21
|
-
this.castShadow = pick(this.options, 'castShadow');
|
|
22
|
-
this.receiveShadow = pick(this.options, 'receiveShadow');
|
|
23
|
-
this.scale = pick(this.options, 'scale');
|
|
24
|
-
this.isRaycastOcclusion = computed(() => {
|
|
25
|
-
const occlude = this.occlude();
|
|
26
|
-
return (occlude && occlude !== 'blending') || (Array.isArray(occlude) && occlude.length && is.ref(occlude[0]));
|
|
27
|
-
});
|
|
28
|
-
this.shaders = computed(() => {
|
|
29
|
-
const transform = this.transform();
|
|
30
|
-
const vertexShader = !transform
|
|
31
|
-
? /* language=glsl glsl */ `
|
|
32
|
-
/*
|
|
33
|
-
This shader is from the THREE's SpriteMaterial.
|
|
34
|
-
We need to turn the backing plane into a Sprite
|
|
35
|
-
(make it always face the camera) if "transfrom"
|
|
36
|
-
is false.
|
|
37
|
-
*/
|
|
38
|
-
#include <common>
|
|
39
|
-
|
|
40
|
-
void main() {
|
|
41
|
-
vec2 center = vec2(0., 1.);
|
|
42
|
-
float rotation = 0.0;
|
|
43
|
-
|
|
44
|
-
// This is somewhat arbitrary, but it seems to work well
|
|
45
|
-
// Need to figure out how to derive this dynamically if it even matters
|
|
46
|
-
float size = 0.03;
|
|
47
|
-
|
|
48
|
-
vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );
|
|
49
|
-
vec2 scale;
|
|
50
|
-
scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );
|
|
51
|
-
scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );
|
|
52
|
-
|
|
53
|
-
bool isPerspective = isPerspectiveMatrix( projectionMatrix );
|
|
54
|
-
if ( isPerspective ) scale *= - mvPosition.z;
|
|
55
|
-
|
|
56
|
-
vec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale * size;
|
|
57
|
-
vec2 rotatedPosition;
|
|
58
|
-
rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;
|
|
59
|
-
rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;
|
|
60
|
-
mvPosition.xy += rotatedPosition;
|
|
61
|
-
|
|
62
|
-
gl_Position = projectionMatrix * mvPosition;
|
|
63
|
-
}
|
|
64
|
-
`
|
|
65
|
-
: undefined;
|
|
66
|
-
const fragmentShader = /* language=glsl glsl */ `
|
|
67
|
-
void main() {
|
|
68
|
-
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
|
|
69
|
-
}
|
|
70
|
-
`;
|
|
71
|
-
return { vertexShader, fragmentShader };
|
|
72
|
-
});
|
|
73
|
-
this.vertexShader = pick(this.shaders, 'vertexShader');
|
|
74
|
-
this.fragmentShader = pick(this.shaders, 'fragmentShader');
|
|
75
|
-
this.DoubleSide = DoubleSide;
|
|
76
|
-
extend({ Group, Mesh, PlaneGeometry, ShaderMaterial });
|
|
77
|
-
}
|
|
78
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsHTML, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
79
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: NgtsHTML, isStandalone: true, selector: "ngts-html", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }, { propertyName: "occlusionMeshRef", first: true, predicate: ["occlusionMesh"], descendants: true, isSignal: true }, { propertyName: "occlusionGeometryRef", first: true, predicate: ["occlusionGeometry"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
80
|
-
<ngt-group #group [parameters]="parameters()">
|
|
81
|
-
@if (occlude() && !isRaycastOcclusion()) {
|
|
82
|
-
<ngt-mesh #occlusionMesh [castShadow]="castShadow()" [receiveShadow]="receiveShadow()">
|
|
83
|
-
<ng-content select="[data-occlusion-geometry]">
|
|
84
|
-
<ngt-plane-geometry #occlusionGeometry />
|
|
85
|
-
</ng-content>
|
|
86
|
-
<ng-content select="[data-occlusion-material]">
|
|
87
|
-
<ngt-shader-material
|
|
88
|
-
[side]="DoubleSide"
|
|
89
|
-
[vertexShader]="vertexShader()"
|
|
90
|
-
[fragmentShader]="fragmentShader()"
|
|
91
|
-
/>
|
|
92
|
-
</ng-content>
|
|
93
|
-
</ngt-mesh>
|
|
94
|
-
}
|
|
95
|
-
</ngt-group>
|
|
96
|
-
|
|
97
|
-
<ng-content />
|
|
98
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
99
|
-
}
|
|
100
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsHTML, decorators: [{
|
|
101
|
-
type: Component,
|
|
102
|
-
args: [{
|
|
103
|
-
selector: 'ngts-html',
|
|
104
|
-
standalone: true,
|
|
105
|
-
template: `
|
|
106
|
-
<ngt-group #group [parameters]="parameters()">
|
|
107
|
-
@if (occlude() && !isRaycastOcclusion()) {
|
|
108
|
-
<ngt-mesh #occlusionMesh [castShadow]="castShadow()" [receiveShadow]="receiveShadow()">
|
|
109
|
-
<ng-content select="[data-occlusion-geometry]">
|
|
110
|
-
<ngt-plane-geometry #occlusionGeometry />
|
|
111
|
-
</ng-content>
|
|
112
|
-
<ng-content select="[data-occlusion-material]">
|
|
113
|
-
<ngt-shader-material
|
|
114
|
-
[side]="DoubleSide"
|
|
115
|
-
[vertexShader]="vertexShader()"
|
|
116
|
-
[fragmentShader]="fragmentShader()"
|
|
117
|
-
/>
|
|
118
|
-
</ng-content>
|
|
119
|
-
</ngt-mesh>
|
|
120
|
-
}
|
|
121
|
-
</ngt-group>
|
|
122
|
-
|
|
123
|
-
<ng-content />
|
|
124
|
-
`,
|
|
125
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
126
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
127
|
-
}]
|
|
128
|
-
}], ctorParameters: () => [] });
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9taXNjL3NyYy9saWIvaHRtbC9odG1sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixzQkFBc0IsRUFFdEIsS0FBSyxFQUNMLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBWSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQVksYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLE9BQU8sQ0FBQzs7QUFTekYsTUFBTSxrQkFBa0IsR0FBb0I7SUFDM0MsT0FBTyxFQUFFLEtBQUs7SUFDZCxTQUFTLEVBQUUsS0FBSztJQUNoQixVQUFVLEVBQUUsS0FBSztJQUNqQixhQUFhLEVBQUUsS0FBSztDQUNwQixDQUFDO0FBNEJGLE1BQU0sT0FBTyxRQUFRO0lBc0VwQjtRQXJFQSxZQUFPLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRixlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXpGLGFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFvQixPQUFPLENBQUMsQ0FBQztRQUMxRCxxQkFBZ0IsR0FBRyxTQUFTLENBQW1CLGVBQWUsQ0FBQyxDQUFDO1FBQ2hFLHlCQUFvQixHQUFHLFNBQVMsQ0FBNEIsbUJBQW1CLENBQUMsQ0FBQztRQUVqRixZQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEMsY0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzVDLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxrQkFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BELFVBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVwQyx1QkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEgsQ0FBQyxDQUFDLENBQUM7UUFFSyxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUFTO2dCQUM5QixDQUFDLENBQUMsd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWlDdkI7Z0JBQ0osQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUViLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDOzs7O0tBSTdDLENBQUM7WUFFSixPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsaUJBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFNbkMsZUFBVSxHQUFHLFVBQVUsQ0FBQztRQUgxQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7K0dBeEVXLFFBQVE7bUdBQVIsUUFBUSxrakJBdkJWOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBbUJUOzs0RkFJVyxRQUFRO2tCQTFCcEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsV0FBVztvQkFDckIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW1CVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDakMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQy9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdEVsZW1lbnRSZWYsXG5cdGlucHV0LFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpcywgTmd0R3JvdXAsIG9taXQsIHBpY2sgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IERvdWJsZVNpZGUsIEdyb3VwLCBNZXNoLCBPYmplY3QzRCwgUGxhbmVHZW9tZXRyeSwgU2hhZGVyTWF0ZXJpYWwgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c0hUTUxPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RHcm91cD4ge1xuXHRvY2NsdWRlOiBFbGVtZW50UmVmPE9iamVjdDNEPltdIHwgT2JqZWN0M0RbXSB8IGJvb2xlYW4gfCAncmF5Y2FzdCcgfCAnYmxlbmRpbmcnO1xuXHR0cmFuc2Zvcm06IGJvb2xlYW47XG5cdGNhc3RTaGFkb3c6IGJvb2xlYW47XG5cdHJlY2VpdmVTaGFkb3c6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRIdG1sT3B0aW9uczogTmd0c0hUTUxPcHRpb25zID0ge1xuXHRvY2NsdWRlOiBmYWxzZSxcblx0dHJhbnNmb3JtOiBmYWxzZSxcblx0Y2FzdFNoYWRvdzogZmFsc2UsXG5cdHJlY2VpdmVTaGFkb3c6IGZhbHNlLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1odG1sJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmd0LWdyb3VwICNncm91cCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdEBpZiAob2NjbHVkZSgpICYmICFpc1JheWNhc3RPY2NsdXNpb24oKSkge1xuXHRcdFx0XHQ8bmd0LW1lc2ggI29jY2x1c2lvbk1lc2ggW2Nhc3RTaGFkb3ddPVwiY2FzdFNoYWRvdygpXCIgW3JlY2VpdmVTaGFkb3ddPVwicmVjZWl2ZVNoYWRvdygpXCI+XG5cdFx0XHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtb2NjbHVzaW9uLWdlb21ldHJ5XVwiPlxuXHRcdFx0XHRcdFx0PG5ndC1wbGFuZS1nZW9tZXRyeSAjb2NjbHVzaW9uR2VvbWV0cnkgLz5cblx0XHRcdFx0XHQ8L25nLWNvbnRlbnQ+XG5cdFx0XHRcdFx0PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtb2NjbHVzaW9uLW1hdGVyaWFsXVwiPlxuXHRcdFx0XHRcdFx0PG5ndC1zaGFkZXItbWF0ZXJpYWxcblx0XHRcdFx0XHRcdFx0W3NpZGVdPVwiRG91YmxlU2lkZVwiXG5cdFx0XHRcdFx0XHRcdFt2ZXJ0ZXhTaGFkZXJdPVwidmVydGV4U2hhZGVyKClcIlxuXHRcdFx0XHRcdFx0XHRbZnJhZ21lbnRTaGFkZXJdPVwiZnJhZ21lbnRTaGFkZXIoKVwiXG5cdFx0XHRcdFx0XHQvPlxuXHRcdFx0XHRcdDwvbmctY29udGVudD5cblx0XHRcdFx0PC9uZ3QtbWVzaD5cblx0XHRcdH1cblx0XHQ8L25ndC1ncm91cD5cblxuXHRcdDxuZy1jb250ZW50IC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNIVE1MIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRIdG1sT3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRIdG1sT3B0aW9ucykgfSk7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydvY2NsdWRlJywgJ2Nhc3RTaGFkb3cnLCAncmVjZWl2ZVNoYWRvdycsICd0cmFuc2Zvcm0nXSk7XG5cblx0Z3JvdXBSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxHcm91cD4+KCdncm91cCcpO1xuXHRvY2NsdXNpb25NZXNoUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8TWVzaD4+KCdvY2NsdXNpb25NZXNoJyk7XG5cdG9jY2x1c2lvbkdlb21ldHJ5UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8UGxhbmVHZW9tZXRyeT4+KCdvY2NsdXNpb25HZW9tZXRyeScpO1xuXG5cdG9jY2x1ZGUgPSBwaWNrKHRoaXMub3B0aW9ucywgJ29jY2x1ZGUnKTtcblx0dHJhbnNmb3JtID0gcGljayh0aGlzLm9wdGlvbnMsICd0cmFuc2Zvcm0nKTtcblx0Y2FzdFNoYWRvdyA9IHBpY2sodGhpcy5vcHRpb25zLCAnY2FzdFNoYWRvdycpO1xuXHRyZWNlaXZlU2hhZG93ID0gcGljayh0aGlzLm9wdGlvbnMsICdyZWNlaXZlU2hhZG93Jyk7XG5cdHNjYWxlID0gcGljayh0aGlzLm9wdGlvbnMsICdzY2FsZScpO1xuXG5cdGlzUmF5Y2FzdE9jY2x1c2lvbiA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBvY2NsdWRlID0gdGhpcy5vY2NsdWRlKCk7XG5cdFx0cmV0dXJuIChvY2NsdWRlICYmIG9jY2x1ZGUgIT09ICdibGVuZGluZycpIHx8IChBcnJheS5pc0FycmF5KG9jY2x1ZGUpICYmIG9jY2x1ZGUubGVuZ3RoICYmIGlzLnJlZihvY2NsdWRlWzBdKSk7XG5cdH0pO1xuXG5cdHByaXZhdGUgc2hhZGVycyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCB0cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybSgpO1xuXHRcdGNvbnN0IHZlcnRleFNoYWRlciA9ICF0cmFuc2Zvcm1cblx0XHRcdD8gLyogbGFuZ3VhZ2U9Z2xzbCBnbHNsICovIGBcbiAgICAgICAgICAvKlxuICAgICAgICAgICAgVGhpcyBzaGFkZXIgaXMgZnJvbSB0aGUgVEhSRUUncyBTcHJpdGVNYXRlcmlhbC5cbiAgICAgICAgICAgIFdlIG5lZWQgdG8gdHVybiB0aGUgYmFja2luZyBwbGFuZSBpbnRvIGEgU3ByaXRlXG4gICAgICAgICAgICAobWFrZSBpdCBhbHdheXMgZmFjZSB0aGUgY2FtZXJhKSBpZiBcInRyYW5zZnJvbVwiXG4gICAgICAgICAgICBpcyBmYWxzZS5cbiAgICAgICAgICAqL1xuICAgICAgICAgICNpbmNsdWRlIDxjb21tb24+XG5cbiAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICB2ZWMyIGNlbnRlciA9IHZlYzIoMC4sIDEuKTtcbiAgICAgICAgICAgIGZsb2F0IHJvdGF0aW9uID0gMC4wO1xuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgd2VsbFxuICAgICAgICAgICAgLy8gTmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkZXJpdmUgdGhpcyBkeW5hbWljYWxseSBpZiBpdCBldmVuIG1hdHRlcnNcbiAgICAgICAgICAgIGZsb2F0IHNpemUgPSAwLjAzO1xuXG4gICAgICAgICAgICB2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcbiAgICAgICAgICAgIHZlYzIgc2NhbGU7XG4gICAgICAgICAgICBzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTtcbiAgICAgICAgICAgIHNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXG4gICAgICAgICAgICBib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XG4gICAgICAgICAgICBpZiAoIGlzUGVyc3BlY3RpdmUgKSBzY2FsZSAqPSAtIG12UG9zaXRpb24uejtcblxuICAgICAgICAgICAgdmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZSAqIHNpemU7XG4gICAgICAgICAgICB2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcbiAgICAgICAgICAgIHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcbiAgICAgICAgICAgIHJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcbiAgICAgICAgICAgIG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xuXG4gICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgIGBcblx0XHRcdDogdW5kZWZpbmVkO1xuXG5cdFx0Y29uc3QgZnJhZ21lbnRTaGFkZXIgPSAvKiBsYW5ndWFnZT1nbHNsIGdsc2wgKi8gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICB9XG4gICAgYDtcblxuXHRcdHJldHVybiB7IHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXIgfTtcblx0fSk7XG5cblx0dmVydGV4U2hhZGVyID0gcGljayh0aGlzLnNoYWRlcnMsICd2ZXJ0ZXhTaGFkZXInKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSBwaWNrKHRoaXMuc2hhZGVycywgJ2ZyYWdtZW50U2hhZGVyJyk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAsIE1lc2gsIFBsYW5lR2VvbWV0cnksIFNoYWRlck1hdGVyaWFsIH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIHJlYWRvbmx5IERvdWJsZVNpZGUgPSBEb3VibGVTaWRlO1xufVxuIl19
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { OrthographicCamera, PerspectiveCamera, Vector2, Vector3 } from 'three';
|
|
2
|
-
const v1 = new Vector3();
|
|
3
|
-
const v2 = new Vector3();
|
|
4
|
-
const v3 = new Vector3();
|
|
5
|
-
const v4 = new Vector2();
|
|
6
|
-
export function defaultCalculatePosition(el, camera, size) {
|
|
7
|
-
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
8
|
-
objectPos.project(camera);
|
|
9
|
-
const widthHalf = size.width / 2;
|
|
10
|
-
const heightHalf = size.height / 2;
|
|
11
|
-
return [objectPos.x * widthHalf + widthHalf, -(objectPos.y * heightHalf) + heightHalf];
|
|
12
|
-
}
|
|
13
|
-
export function isObjectBehindCamera(el, camera) {
|
|
14
|
-
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
15
|
-
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
16
|
-
const deltaCamObj = objectPos.sub(cameraPos);
|
|
17
|
-
const camDir = camera.getWorldDirection(v3);
|
|
18
|
-
return deltaCamObj.angleTo(camDir) > Math.PI / 2;
|
|
19
|
-
}
|
|
20
|
-
export function isObjectVisible(el, camera, raycaster, occlude) {
|
|
21
|
-
const elPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
22
|
-
const screenPos = elPos.clone();
|
|
23
|
-
screenPos.project(camera);
|
|
24
|
-
v4.set(screenPos.x, screenPos.y);
|
|
25
|
-
raycaster.setFromCamera(v4, camera);
|
|
26
|
-
const intersects = raycaster.intersectObjects(occlude, true);
|
|
27
|
-
if (intersects.length) {
|
|
28
|
-
const intersectionDistance = intersects[0].distance;
|
|
29
|
-
const pointDistance = elPos.distanceTo(raycaster.ray.origin);
|
|
30
|
-
return pointDistance < intersectionDistance;
|
|
31
|
-
}
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
export function objectScale(el, camera) {
|
|
35
|
-
if (camera instanceof OrthographicCamera)
|
|
36
|
-
return camera.zoom;
|
|
37
|
-
if (camera instanceof PerspectiveCamera) {
|
|
38
|
-
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
39
|
-
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
40
|
-
const vFOV = (camera.fov * Math.PI) / 180;
|
|
41
|
-
const dist = objectPos.distanceTo(cameraPos);
|
|
42
|
-
const scaleFOV = 2 * Math.tan(vFOV / 2) * dist;
|
|
43
|
-
return 1 / scaleFOV;
|
|
44
|
-
}
|
|
45
|
-
return 1;
|
|
46
|
-
}
|
|
47
|
-
export function objectZIndex(el, camera, zIndexRange) {
|
|
48
|
-
if (camera instanceof PerspectiveCamera || camera instanceof OrthographicCamera) {
|
|
49
|
-
const objectPos = v1.setFromMatrixPosition(el.matrixWorld);
|
|
50
|
-
const cameraPos = v2.setFromMatrixPosition(camera.matrixWorld);
|
|
51
|
-
const dist = objectPos.distanceTo(cameraPos);
|
|
52
|
-
const A = (zIndexRange[1] - zIndexRange[0]) / (camera.far - camera.near);
|
|
53
|
-
const B = zIndexRange[1] - A * camera.far;
|
|
54
|
-
return Math.round(A * dist + B);
|
|
55
|
-
}
|
|
56
|
-
return undefined;
|
|
57
|
-
}
|
|
58
|
-
export function epsilon(value) {
|
|
59
|
-
return Math.abs(value) < 1e-10 ? 0 : value;
|
|
60
|
-
}
|
|
61
|
-
export function getCSSMatrix(matrix, multipliers, prepend = '') {
|
|
62
|
-
let matrix3d = 'matrix3d(';
|
|
63
|
-
for (let i = 0; i !== 16; i++) {
|
|
64
|
-
matrix3d += epsilon(multipliers[i] * matrix.elements[i]) + (i !== 15 ? ',' : ')');
|
|
65
|
-
}
|
|
66
|
-
return prepend + matrix3d;
|
|
67
|
-
}
|
|
68
|
-
export const getCameraCSSMatrix = ((multipliers) => {
|
|
69
|
-
return (matrix) => getCSSMatrix(matrix, multipliers);
|
|
70
|
-
})([1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1]);
|
|
71
|
-
export const getObjectCSSMatrix = ((scaleMultipliers) => {
|
|
72
|
-
return (matrix, factor) => getCSSMatrix(matrix, scaleMultipliers(factor), 'translate(-50%,-50%)');
|
|
73
|
-
})((f) => [1 / f, 1 / f, 1 / f, 1, -1 / f, -1 / f, -1 / f, -1, 1 / f, 1 / f, 1 / f, 1, 1, 1, 1, 1]);
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvbWlzYy9zcmMvbGliL2h0bWwvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE2QixrQkFBa0IsRUFBRSxpQkFBaUIsRUFBYSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRXRILE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUN6QixNQUFNLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ3pCLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFFekIsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEVBQVksRUFBRSxNQUFjLEVBQUUsSUFBdUM7SUFDN0csTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMzRCxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUlELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxFQUFZLEVBQUUsTUFBYztJQUNoRSxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxH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WUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsZ0JBQXlDLEVBQUUsRUFBRTtJQUNoRixPQUFPLENBQUMsTUFBZSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3BILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVyYSwgTWF0cml4NCwgT2JqZWN0M0QsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgUGVyc3BlY3RpdmVDYW1lcmEsIFJheWNhc3RlciwgVmVjdG9yMiwgVmVjdG9yMyB9IGZyb20gJ3RocmVlJztcblxuY29uc3QgdjEgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjMgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgdjQgPSBuZXcgVmVjdG9yMigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdENhbGN1bGF0ZVBvc2l0aW9uKGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEsIHNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSkge1xuXHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRvYmplY3RQb3MucHJvamVjdChjYW1lcmEpO1xuXHRjb25zdCB3aWR0aEhhbGYgPSBzaXplLndpZHRoIC8gMjtcblx0Y29uc3QgaGVpZ2h0SGFsZiA9IHNpemUuaGVpZ2h0IC8gMjtcblx0cmV0dXJuIFtvYmplY3RQb3MueCAqIHdpZHRoSGFsZiArIHdpZHRoSGFsZiwgLShvYmplY3RQb3MueSAqIGhlaWdodEhhbGYpICsgaGVpZ2h0SGFsZl07XG59XG5cbmV4cG9ydCB0eXBlIENhbGN1bGF0ZVBvc2l0aW9uID0gdHlwZW9mIGRlZmF1bHRDYWxjdWxhdGVQb3NpdGlvbjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0QmVoaW5kQ2FtZXJhKGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEpIHtcblx0Y29uc3Qgb2JqZWN0UG9zID0gdjEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGVsLm1hdHJpeFdvcmxkKTtcblx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdGNvbnN0IGRlbHRhQ2FtT2JqID0gb2JqZWN0UG9zLnN1YihjYW1lcmFQb3MpO1xuXHRjb25zdCBjYW1EaXIgPSBjYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odjMpO1xuXHRyZXR1cm4gZGVsdGFDYW1PYmouYW5nbGVUbyhjYW1EaXIpID4gTWF0aC5QSSAvIDI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdFZpc2libGUoZWw6IE9iamVjdDNELCBjYW1lcmE6IENhbWVyYSwgcmF5Y2FzdGVyOiBSYXljYXN0ZXIsIG9jY2x1ZGU6IE9iamVjdDNEW10pIHtcblx0Y29uc3QgZWxQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRjb25zdCBzY3JlZW5Qb3MgPSBlbFBvcy5jbG9uZSgpO1xuXHRzY3JlZW5Qb3MucHJvamVjdChjYW1lcmEpO1xuXHR2NC5zZXQoc2NyZWVuUG9zLngsIHNjcmVlblBvcy55KTtcblx0cmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodjQsIGNhbWVyYSk7XG5cdGNvbnN0IGludGVyc2VjdHMgPSByYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhvY2NsdWRlLCB0cnVlKTtcblx0aWYgKGludGVyc2VjdHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgaW50ZXJzZWN0aW9uRGlzdGFuY2UgPSBpbnRlcnNlY3RzWzBdLmRpc3RhbmNlO1xuXHRcdGNvbnN0IHBvaW50RGlzdGFuY2UgPSBlbFBvcy5kaXN0YW5jZVRvKHJheWNhc3Rlci5yYXkub3JpZ2luKTtcblx0XHRyZXR1cm4gcG9pbnREaXN0YW5jZSA8IGludGVyc2VjdGlvbkRpc3RhbmNlO1xuXHR9XG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0U2NhbGUoZWw6IE9iamVjdDNELCBjYW1lcmE6IENhbWVyYSkge1xuXHRpZiAoY2FtZXJhIGluc3RhbmNlb2YgT3J0aG9ncmFwaGljQ2FtZXJhKSByZXR1cm4gY2FtZXJhLnpvb207XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuXHRcdGNvbnN0IG9iamVjdFBvcyA9IHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbihlbC5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgY2FtZXJhUG9zID0gdjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNhbWVyYS5tYXRyaXhXb3JsZCk7XG5cdFx0Y29uc3QgdkZPViA9IChjYW1lcmEuZm92ICogTWF0aC5QSSkgLyAxODA7XG5cdFx0Y29uc3QgZGlzdCA9IG9iamVjdFBvcy5kaXN0YW5jZVRvKGNhbWVyYVBvcyk7XG5cdFx0Y29uc3Qgc2NhbGVGT1YgPSAyICogTWF0aC50YW4odkZPViAvIDIpICogZGlzdDtcblx0XHRyZXR1cm4gMSAvIHNjYWxlRk9WO1xuXHR9XG5cdHJldHVybiAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0WkluZGV4KGVsOiBPYmplY3QzRCwgY2FtZXJhOiBDYW1lcmEsIHpJbmRleFJhbmdlOiBBcnJheTxudW1iZXI+KSB7XG5cdGlmIChjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSB8fCBjYW1lcmEgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcblx0XHRjb25zdCBvYmplY3RQb3MgPSB2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWwubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGNhbWVyYVBvcyA9IHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbihjYW1lcmEubWF0cml4V29ybGQpO1xuXHRcdGNvbnN0IGRpc3QgPSBvYmplY3RQb3MuZGlzdGFuY2VUbyhjYW1lcmFQb3MpO1xuXHRcdGNvbnN0IEEgPSAoekluZGV4UmFuZ2VbMV0gLSB6SW5kZXhSYW5nZVswXSkgLyAoY2FtZXJhLmZhciAtIGNhbWVyYS5uZWFyKTtcblx0XHRjb25zdCBCID0gekluZGV4UmFuZ2VbMV0gLSBBICogY2FtZXJhLmZhcjtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZChBICogZGlzdCArIEIpO1xuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcblx0cmV0dXJuIE1hdGguYWJzKHZhbHVlKSA8IDFlLTEwID8gMCA6IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q1NTTWF0cml4KG1hdHJpeDogTWF0cml4NCwgbXVsdGlwbGllcnM6IG51bWJlcltdLCBwcmVwZW5kID0gJycpIHtcblx0bGV0IG1hdHJpeDNkID0gJ21hdHJpeDNkKCc7XG5cdGZvciAobGV0IGkgPSAwOyBpICE9PSAxNjsgaSsrKSB7XG5cdFx0bWF0cml4M2QgKz0gZXBzaWxvbihtdWx0aXBsaWVyc1tpXSAqIG1hdHJpeC5lbGVtZW50c1tpXSkgKyAoaSAhPT0gMTUgPyAnLCcgOiAnKScpO1xuXHR9XG5cdHJldHVybiBwcmVwZW5kICsgbWF0cml4M2Q7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDYW1lcmFDU1NNYXRyaXggPSAoKG11bHRpcGxpZXJzOiBudW1iZXJbXSkgPT4ge1xuXHRyZXR1cm4gKG1hdHJpeDogTWF0cml4NCkgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgbXVsdGlwbGllcnMpO1xufSkoWzEsIC0xLCAxLCAxLCAxLCAtMSwgMSwgMSwgMSwgLTEsIDEsIDEsIDEsIC0xLCAxLCAxXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRPYmplY3RDU1NNYXRyaXggPSAoKHNjYWxlTXVsdGlwbGllcnM6IChuOiBudW1iZXIpID0+IG51bWJlcltdKSA9PiB7XG5cdHJldHVybiAobWF0cml4OiBNYXRyaXg0LCBmYWN0b3I6IG51bWJlcikgPT4gZ2V0Q1NTTWF0cml4KG1hdHJpeCwgc2NhbGVNdWx0aXBsaWVycyhmYWN0b3IpLCAndHJhbnNsYXRlKC01MCUsLTUwJSknKTtcbn0pKChmOiBudW1iZXIpID0+IFsxIC8gZiwgMSAvIGYsIDEgLyBmLCAxLCAtMSAvIGYsIC0xIC8gZiwgLTEgLyBmLCAtMSwgMSAvIGYsIDEgLyBmLCAxIC8gZiwgMSwgMSwgMSwgMSwgMV0pO1xuIl19
|