@smarterplan/ngx-smarterplan-core 1.2.45 → 1.2.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -59
- package/esm2020/lib/components/loader/loader.component.mjs +23 -23
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +80 -80
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +99 -99
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +384 -384
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +147 -147
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +40 -40
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -63
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +66 -66
- package/esm2020/lib/config.mjs +4 -4
- package/esm2020/lib/helpers.service.mjs +470 -470
- package/esm2020/lib/matterport-extensions/hsl-loader/HlsLoader.mjs +69 -69
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +51 -51
- package/esm2020/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +61 -61
- package/esm2020/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +158 -158
- package/esm2020/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +85 -85
- package/esm2020/lib/matterport-extensions/scene-component/SceneComponent.mjs +128 -128
- package/esm2020/lib/matterport-extensions/security-camera/SecurityCamera.mjs +249 -249
- package/esm2020/lib/matterport-extensions/tv-player/TvPlayer.mjs +98 -98
- package/esm2020/lib/matterport-extensions/video-renderer/VideoRenderer.mjs +64 -64
- package/esm2020/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +221 -221
- package/esm2020/lib/mattertagData.mjs +165 -165
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +122 -122
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -14
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -66
- package/esm2020/lib/pipes/format-date-number-to-digits.pipe.mjs +30 -30
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -26
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -20
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -104
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -29
- package/esm2020/lib/services/amplify-cache.service.mjs +72 -72
- package/esm2020/lib/services/base-tab.service.mjs +24 -24
- package/esm2020/lib/services/baseVisibility.service.mjs +18 -18
- package/esm2020/lib/services/content.service.mjs +135 -135
- package/esm2020/lib/services/filter.service.mjs +599 -599
- package/esm2020/lib/services/intervention.service.mjs +236 -236
- package/esm2020/lib/services/locale.service.mjs +45 -45
- package/esm2020/lib/services/matterport-import.service.mjs +340 -340
- package/esm2020/lib/services/matterport.service.mjs +1587 -1587
- package/esm2020/lib/services/models/affectation.service.mjs +60 -60
- package/esm2020/lib/services/models/base-object.service.mjs +70 -70
- package/esm2020/lib/services/models/capture.service.mjs +34 -34
- package/esm2020/lib/services/models/comment.service.mjs +98 -98
- package/esm2020/lib/services/models/domain.service.mjs +78 -78
- package/esm2020/lib/services/models/equipment.service.mjs +683 -683
- package/esm2020/lib/services/models/event.service.mjs +128 -128
- package/esm2020/lib/services/models/feature.service.mjs +380 -380
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -38
- package/esm2020/lib/services/models/layer.service.mjs +33 -33
- package/esm2020/lib/services/models/measurement.service.mjs +199 -199
- package/esm2020/lib/services/models/mission.service.mjs +206 -206
- package/esm2020/lib/services/models/navigation.service.mjs +92 -92
- package/esm2020/lib/services/models/node.service.mjs +31 -31
- package/esm2020/lib/services/models/object3D.service.mjs +364 -364
- package/esm2020/lib/services/models/operation.service.mjs +59 -59
- package/esm2020/lib/services/models/organisation.service.mjs +73 -73
- package/esm2020/lib/services/models/plan.service.mjs +799 -799
- package/esm2020/lib/services/models/poi.service.mjs +103 -103
- package/esm2020/lib/services/models/profile.service.mjs +58 -58
- package/esm2020/lib/services/models/property.service.mjs +44 -44
- package/esm2020/lib/services/models/space.service.mjs +204 -204
- package/esm2020/lib/services/models/template.service.mjs +41 -41
- package/esm2020/lib/services/models/ticket.service.mjs +526 -526
- package/esm2020/lib/services/models/visit.service.mjs +130 -130
- package/esm2020/lib/services/models/zone.service.mjs +225 -225
- package/esm2020/lib/services/navigator.service.mjs +212 -212
- package/esm2020/lib/services/s3.service.mjs +137 -137
- package/esm2020/lib/services/search.service.mjs +124 -124
- package/esm2020/lib/services/support.service.mjs +42 -42
- package/esm2020/lib/services/tag.service.mjs +111 -111
- package/esm2020/lib/services/user.service.mjs +501 -501
- package/esm2020/lib/services/validators.service.mjs +50 -50
- package/esm2020/lib/services/viewer.service.mjs +389 -389
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -76
- package/esm2020/lib/services/zoneChange.service.mjs +30 -30
- package/esm2020/lib/types.service.mjs +311 -311
- package/esm2020/lib/validators/email.directive.mjs +7 -7
- package/esm2020/lib/validators/no-empty.directive.mjs +12 -12
- package/esm2020/lib/validators/number.directive.mjs +12 -12
- package/esm2020/lib/validators/text.directive.mjs +12 -12
- package/esm2020/public-api.mjs +72 -72
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +13014 -13014
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +12263 -12263
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/components/csv-export/csv-export.component.d.ts +18 -18
- package/lib/components/loader/loader.component.d.ts +10 -10
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +21 -21
- package/lib/components/menu-bar/menu-bar.component.d.ts +38 -38
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +73 -73
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +35 -35
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -22
- package/lib/components/search-bar/search-bar.component.d.ts +16 -16
- package/lib/components/support-modal/support-modal.component.d.ts +26 -26
- package/lib/config.d.ts +22 -22
- package/lib/helpers.service.d.ts +79 -79
- package/lib/matterport-extensions/hsl-loader/HlsLoader.d.ts +26 -26
- package/lib/matterport-extensions/nest-thermostat/CanvasImage.d.ts +31 -31
- package/lib/matterport-extensions/nest-thermostat/CanvasRenderer.d.ts +37 -37
- package/lib/matterport-extensions/nest-thermostat/NestThermostat.d.ts +42 -42
- package/lib/matterport-extensions/nest-thermostat/PlaneRenderer.d.ts +46 -46
- package/lib/matterport-extensions/scene-component/SceneComponent.d.ts +388 -388
- package/lib/matterport-extensions/security-camera/SecurityCamera.d.ts +47 -47
- package/lib/matterport-extensions/tv-player/TvPlayer.d.ts +26 -26
- package/lib/matterport-extensions/video-renderer/VideoRenderer.d.ts +26 -26
- package/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.d.ts +43 -43
- package/lib/mattertagData.d.ts +70 -70
- package/lib/ngx-smarterplan-core.module.d.ts +29 -29
- package/lib/ngx-smarterplan-core.service.d.ts +6 -6
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -12
- package/lib/pipes/format-date-number-to-digits.pipe.d.ts +10 -10
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -10
- package/lib/pipes/safe-url.pipe.d.ts +10 -10
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -16
- package/lib/pipes/username-from-id.pipe.d.ts +11 -11
- package/lib/services/amplify-cache.service.d.ts +37 -37
- package/lib/services/base-tab.service.d.ts +10 -10
- package/lib/services/baseVisibility.service.d.ts +9 -9
- package/lib/services/content.service.d.ts +28 -28
- package/lib/services/filter.service.d.ts +60 -60
- package/lib/services/intervention.service.d.ts +25 -25
- package/lib/services/locale.service.d.ts +23 -23
- package/lib/services/matterport-import.service.d.ts +53 -53
- package/lib/services/matterport.service.d.ts +336 -336
- package/lib/services/models/affectation.service.d.ts +14 -14
- package/lib/services/models/base-object.service.d.ts +20 -20
- package/lib/services/models/capture.service.d.ts +13 -13
- package/lib/services/models/comment.service.d.ts +26 -26
- package/lib/services/models/domain.service.d.ts +19 -19
- package/lib/services/models/equipment.service.d.ts +93 -93
- package/lib/services/models/event.service.d.ts +43 -43
- package/lib/services/models/feature.service.d.ts +75 -75
- package/lib/services/models/hashtag.service.d.ts +13 -13
- package/lib/services/models/layer.service.d.ts +11 -11
- package/lib/services/models/measurement.service.d.ts +51 -51
- package/lib/services/models/mission.service.d.ts +39 -39
- package/lib/services/models/navigation.service.d.ts +29 -29
- package/lib/services/models/node.service.d.ts +12 -12
- package/lib/services/models/object3D.service.d.ts +57 -57
- package/lib/services/models/operation.service.d.ts +15 -15
- package/lib/services/models/organisation.service.d.ts +19 -19
- package/lib/services/models/plan.service.d.ts +133 -133
- package/lib/services/models/poi.service.d.ts +25 -25
- package/lib/services/models/profile.service.d.ts +16 -16
- package/lib/services/models/property.service.d.ts +13 -13
- package/lib/services/models/space.service.d.ts +46 -46
- package/lib/services/models/template.service.d.ts +15 -15
- package/lib/services/models/ticket.service.d.ts +93 -93
- package/lib/services/models/visit.service.d.ts +24 -24
- package/lib/services/models/zone.service.d.ts +50 -50
- package/lib/services/navigator.service.d.ts +61 -61
- package/lib/services/s3.service.d.ts +14 -14
- package/lib/services/search.service.d.ts +20 -20
- package/lib/services/support.service.d.ts +17 -17
- package/lib/services/tag.service.d.ts +29 -29
- package/lib/services/user.service.d.ts +118 -118
- package/lib/services/validators.service.d.ts +18 -18
- package/lib/services/viewer.service.d.ts +110 -110
- package/lib/services/zone-drawer.service.d.ts +7 -7
- package/lib/services/zoneChange.service.d.ts +17 -17
- package/lib/types.service.d.ts +842 -842
- package/lib/validators/email.directive.d.ts +2 -2
- package/lib/validators/no-empty.directive.d.ts +2 -2
- package/lib/validators/number.directive.d.ts +2 -2
- package/lib/validators/text.directive.d.ts +2 -2
- package/package.json +2 -2
- package/public-api.d.ts +64 -64
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -5
|
@@ -1,221 +1,221 @@
|
|
|
1
|
-
import { Object3D, Mesh, PerspectiveCamera, ShaderMaterial, MeshBasicMaterial, BoxGeometry, EdgesGeometry, Color, Matrix4, Vector3, Euler, CylinderBufferGeometry, BackSide, NormalBlending, AdditiveBlending, } from 'three';
|
|
2
|
-
import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
3
|
-
import { SceneComponent } from '../scene-component/SceneComponent';
|
|
4
|
-
/**
|
|
5
|
-
* This class is the extracted View Frustum Mesh from
|
|
6
|
-
* SecurityCamera example
|
|
7
|
-
*/
|
|
8
|
-
export class ViewFrustumMesh extends SceneComponent {
|
|
9
|
-
constructor() {
|
|
10
|
-
super(...arguments);
|
|
11
|
-
this.root = null;
|
|
12
|
-
this.pivot = null;
|
|
13
|
-
this.box = null;
|
|
14
|
-
this.edges = null;
|
|
15
|
-
this.inputs = {
|
|
16
|
-
"nearPlane": 0.1,
|
|
17
|
-
"farPlane": 10,
|
|
18
|
-
"horizontalFOV": 52,
|
|
19
|
-
"aspect": 1.7777777777777777,
|
|
20
|
-
"localPosition": {
|
|
21
|
-
"x": 0,
|
|
22
|
-
"y": 0.18,
|
|
23
|
-
"z": -0.3
|
|
24
|
-
},
|
|
25
|
-
"localRotation": {
|
|
26
|
-
"x": -15,
|
|
27
|
-
"y": 0,
|
|
28
|
-
"z": 0
|
|
29
|
-
},
|
|
30
|
-
"color": 65280,
|
|
31
|
-
"panPeriod": 5,
|
|
32
|
-
"panAngle": -45
|
|
33
|
-
};
|
|
34
|
-
this.highlight = null;
|
|
35
|
-
this.highlightUniforms = {
|
|
36
|
-
color: { value: new Color() },
|
|
37
|
-
projPosition: { value: new Vector3() },
|
|
38
|
-
lightMatrix: { value: new Matrix4() },
|
|
39
|
-
};
|
|
40
|
-
this.outputs = {};
|
|
41
|
-
}
|
|
42
|
-
onInit() {
|
|
43
|
-
this.root = new Object3D();
|
|
44
|
-
this.pivot = new Object3D();
|
|
45
|
-
this.root.add(this.pivot);
|
|
46
|
-
this.outputs.objectRoot = this.root;
|
|
47
|
-
const euler = new Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
|
|
48
|
-
this.pivot.quaternion.setFromEuler(euler);
|
|
49
|
-
this.makeFrustumVisuals();
|
|
50
|
-
this.pivot.add(this.box);
|
|
51
|
-
this.pivot.add(this.edges);
|
|
52
|
-
const aspect = this.inputs.aspect;
|
|
53
|
-
const DEG2RAD = Math.PI / 180;
|
|
54
|
-
const RAD2DEG = 1 / DEG2RAD;
|
|
55
|
-
const verticalFOV = 2 * Math.atan(1 / aspect * Math.tan(0.5 * this.inputs.horizontalFOV * DEG2RAD)) * RAD2DEG;
|
|
56
|
-
this.projector = new PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
|
|
57
|
-
this.pivot.add(this.projector);
|
|
58
|
-
this.makeHighlight();
|
|
59
|
-
this.context.scene.add(this.highlight);
|
|
60
|
-
}
|
|
61
|
-
onTickModified(delta, quaternion) {
|
|
62
|
-
this.pivot.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
|
|
63
|
-
updateHighlightUniforms(this.projector, this.highlightUniforms);
|
|
64
|
-
}
|
|
65
|
-
makeFrustumVisuals() {
|
|
66
|
-
if (this.box) {
|
|
67
|
-
this.root.remove(this.box);
|
|
68
|
-
this.box.material.dispose();
|
|
69
|
-
this.box.geometry.dispose();
|
|
70
|
-
this.box = null;
|
|
71
|
-
}
|
|
72
|
-
if (this.edges) {
|
|
73
|
-
this.root.remove(this.edges);
|
|
74
|
-
this.edges.material.dispose();
|
|
75
|
-
this.edges.geometry.dispose();
|
|
76
|
-
this.edges = null;
|
|
77
|
-
}
|
|
78
|
-
function edgesToCylinders(edgesGeometry, thickness) {
|
|
79
|
-
const { position } = edgesGeometry.attributes;
|
|
80
|
-
const { array, count } = position;
|
|
81
|
-
const r = thickness / 2;
|
|
82
|
-
const geoms = [];
|
|
83
|
-
for (let i = 0; i < count * 3 - 1; i += 6) {
|
|
84
|
-
const a = new Vector3(array[i], array[i + 1], array[i + 2]);
|
|
85
|
-
const b = new Vector3(array[i + 3], array[i + 4], array[i + 5]);
|
|
86
|
-
const vec = new Vector3().subVectors(b, a);
|
|
87
|
-
const len = vec.length();
|
|
88
|
-
const geom = new CylinderBufferGeometry(r, r, len, 8);
|
|
89
|
-
geom.translate(0, len / 2, 0);
|
|
90
|
-
geom.rotateX(Math.PI / 2);
|
|
91
|
-
geom.lookAt(vec);
|
|
92
|
-
geom.translate(a.x, a.y, a.z);
|
|
93
|
-
geoms.push(geom);
|
|
94
|
-
}
|
|
95
|
-
// API to be updated in bundle - JSSDK-1222
|
|
96
|
-
return BufferGeometryUtils.mergeBufferGeometries(geoms);
|
|
97
|
-
}
|
|
98
|
-
const frustumLength = this.inputs.farPlane - this.inputs.nearPlane;
|
|
99
|
-
const boxGeometry = new BoxGeometry(2, 2, frustumLength);
|
|
100
|
-
const halfHAngle = this.inputs.horizontalFOV * 0.5 * Math.PI / 180;
|
|
101
|
-
const nearHalfWidth = Math.tan(halfHAngle) * this.inputs.nearPlane;
|
|
102
|
-
const farHalfWidth = Math.tan(halfHAngle) * this.inputs.farPlane;
|
|
103
|
-
const nearHalfHeight = nearHalfWidth / this.inputs.aspect;
|
|
104
|
-
const farHalfHeight = farHalfWidth / this.inputs.aspect;
|
|
105
|
-
const positions = boxGeometry.getAttribute('position');
|
|
106
|
-
for (let i = 0; i < positions.count; i++) {
|
|
107
|
-
const vertexZ = positions.getZ(i);
|
|
108
|
-
const vertexX = positions.getX(i);
|
|
109
|
-
const vertexY = positions.getY(i);
|
|
110
|
-
if (vertexZ > 0) {
|
|
111
|
-
// back of the camera
|
|
112
|
-
positions.setX(i, vertexX * nearHalfWidth);
|
|
113
|
-
positions.setY(i, vertexY * nearHalfHeight);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// front of the camera
|
|
117
|
-
positions.setX(i, vertexX * farHalfWidth);
|
|
118
|
-
positions.setY(i, vertexY * farHalfHeight);
|
|
119
|
-
}
|
|
120
|
-
positions.setZ(i, vertexZ - 0.5 * frustumLength - this.inputs.nearPlane);
|
|
121
|
-
}
|
|
122
|
-
const boxMaterial = new MeshBasicMaterial({
|
|
123
|
-
color: this.inputs.color,
|
|
124
|
-
opacity: 0.35,
|
|
125
|
-
transparent: true,
|
|
126
|
-
side: BackSide,
|
|
127
|
-
blending: NormalBlending,
|
|
128
|
-
depthWrite: false,
|
|
129
|
-
});
|
|
130
|
-
this.box = new Mesh(boxGeometry, boxMaterial);
|
|
131
|
-
const edgesGeometry = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.015);
|
|
132
|
-
this.edges = new Mesh(edgesGeometry, new MeshBasicMaterial({
|
|
133
|
-
color: 0xffffff,
|
|
134
|
-
opacity: 0.25,
|
|
135
|
-
transparent: true,
|
|
136
|
-
blending: AdditiveBlending,
|
|
137
|
-
depthWrite: false,
|
|
138
|
-
}));
|
|
139
|
-
const edgesGeometry2 = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.06);
|
|
140
|
-
const edges2 = new Mesh(edgesGeometry2, new MeshBasicMaterial({
|
|
141
|
-
color: this.inputs.color,
|
|
142
|
-
opacity: 0.35,
|
|
143
|
-
transparent: true,
|
|
144
|
-
blending: AdditiveBlending,
|
|
145
|
-
depthWrite: false,
|
|
146
|
-
}));
|
|
147
|
-
this.pivot.add(edges2);
|
|
148
|
-
}
|
|
149
|
-
makeHighlight() {
|
|
150
|
-
let floorMesh = null;
|
|
151
|
-
floorMesh = this.context.scene.getObjectByName('FloorMesh:0');
|
|
152
|
-
const roomMesh = floorMesh.children[5];
|
|
153
|
-
updateHighlightUniforms(this.projector, this.highlightUniforms);
|
|
154
|
-
this.highlightUniforms.color.value.setHex(this.inputs.color);
|
|
155
|
-
const shader = new ShaderMaterial({
|
|
156
|
-
polygonOffset: true,
|
|
157
|
-
polygonOffsetUnits: -0.1,
|
|
158
|
-
transparent: true,
|
|
159
|
-
uniforms: this.highlightUniforms,
|
|
160
|
-
vertexShader: vertexShader(),
|
|
161
|
-
fragmentShader: fragmentShader(),
|
|
162
|
-
});
|
|
163
|
-
// a mesh to represent the "highlight"
|
|
164
|
-
this.highlight = new Mesh(roomMesh.geometry, shader);
|
|
165
|
-
}
|
|
166
|
-
onDestroy() {
|
|
167
|
-
if (this.highlight && this.highlight.parent) {
|
|
168
|
-
this.highlight.parent.remove(this.highlight);
|
|
169
|
-
this.highlight.material.dispose();
|
|
170
|
-
}
|
|
171
|
-
if (this.edges) {
|
|
172
|
-
this.edges.geometry.dispose();
|
|
173
|
-
this.edges.material.dispose();
|
|
174
|
-
}
|
|
175
|
-
if (this.box) {
|
|
176
|
-
this.box.geometry.dispose();
|
|
177
|
-
this.box.material.dispose();
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
function vertexShader() {
|
|
182
|
-
return `
|
|
183
|
-
uniform mat4 lightMatrix;
|
|
184
|
-
|
|
185
|
-
varying vec4 vLightCoords;
|
|
186
|
-
|
|
187
|
-
void main() {
|
|
188
|
-
// create a UV region [0,1] x [0,1] to represent what the lightMatrix "sees"
|
|
189
|
-
vLightCoords = lightMatrix * modelMatrix * vec4(position, 1.0);
|
|
190
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
191
|
-
}
|
|
192
|
-
`;
|
|
193
|
-
}
|
|
194
|
-
function fragmentShader() {
|
|
195
|
-
return `
|
|
196
|
-
uniform vec3 color;
|
|
197
|
-
|
|
198
|
-
varying vec4 vLightCoords;
|
|
199
|
-
|
|
200
|
-
void main() {
|
|
201
|
-
vec2 lightUV = vLightCoords.xy / vLightCoords.w;
|
|
202
|
-
float inView = float(max(lightUV.x, lightUV.y) <= 1.0 && min(lightUV.x, lightUV.y) >= 0.0 && vLightCoords.z > 0.0);
|
|
203
|
-
|
|
204
|
-
gl_FragColor = vec4(color, min(inView, 0.2));
|
|
205
|
-
}
|
|
206
|
-
`;
|
|
207
|
-
}
|
|
208
|
-
function updateHighlightUniforms(projector, uniforms) {
|
|
209
|
-
projector.getWorldPosition(uniforms.projPosition.value);
|
|
210
|
-
// similar to a shadow matrix, but we're using it as a "rectangular" spotlight
|
|
211
|
-
// [lightBias] * [projection] * [viewMatrix]
|
|
212
|
-
uniforms.lightMatrix.value.makeScale(0.5, 0.5, 0.5);
|
|
213
|
-
uniforms.lightMatrix.value.setPosition(new Vector3(0.5, 0.5, 0.5));
|
|
214
|
-
uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.projectionMatrix);
|
|
215
|
-
uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.matrixWorldInverse);
|
|
216
|
-
}
|
|
217
|
-
export const ViewFrustumMeshType = 'mp.ViewFrustumMesh';
|
|
218
|
-
export const makeViewFrustumMesh = function () {
|
|
219
|
-
return new ViewFrustumMesh();
|
|
220
|
-
};
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld0ZydXN0dW1NZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxhQUFhLEVBQ2IsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxpREFBaUQsQ0FBQTtBQUN0RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFvQmpFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGNBQWM7SUFBbkQ7O1FBRVUsU0FBSSxHQUFvQixJQUFJLENBQUM7UUFDN0IsVUFBSyxHQUFvQixJQUFJLENBQUM7UUFDOUIsUUFBRyxHQUFnQixJQUFJLENBQUM7UUFDeEIsVUFBSyxHQUFnQixJQUFJLENBQUM7UUFJekIsV0FBTSxHQUFXO1lBQ3hCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLENBQUMsR0FBRzthQUNWO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04s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QUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBPYmplY3QzRCxcbiAgTWVzaCxcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXG4gIFNoYWRlck1hdGVyaWFsLFxuICBNZXNoQmFzaWNNYXRlcmlhbCxcbiAgQm94R2VvbWV0cnksXG4gIExpbmVCYXNpY01hdGVyaWFsLFxuICBFZGdlc0dlb21ldHJ5LFxuICBDb2xvcixcbiAgTWF0cml4NCxcbiAgVmVjdG9yMyxcbiAgRXVsZXIsXG4gIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG4gIEJhY2tTaWRlLFxuICBOb3JtYWxCbGVuZGluZyxcbiAgQWRkaXRpdmVCbGVuZGluZyxcbn0gZnJvbSAndGhyZWUnO1xuaW1wb3J0ICogYXMgQnVmZmVyR2VvbWV0cnlVdGlscyBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vdXRpbHMvQnVmZmVyR2VvbWV0cnlVdGlscy5qcydcbmltcG9ydCB7U2NlbmVDb21wb25lbnR9IGZyb20gJy4uL3NjZW5lLWNvbXBvbmVudC9TY2VuZUNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnB1dHMge1xuICBuZWFyUGxhbmU6IG51bWJlcjtcbiAgZmFyUGxhbmU6IG51bWJlcixcbiAgaG9yaXpvbnRhbEZPVjogbnVtYmVyLFxuICBhc3BlY3Q6IG51bWJlcixcbiAgbG9jYWxQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyOyB9O1xuICBsb2NhbFJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XG4gIGNvbG9yOiBudW1iZXI7XG4gIHBhblBlcmlvZDogbnVtYmVyO1xuICBwYW5BbmdsZTogbnVtYmVyO1xufVxuXG50eXBlIEhpZ2hsaWdodFVuaWZvcm1zID0ge1xuICBjb2xvcjogeyB2YWx1ZTogQ29sb3IgfSxcbiAgcHJvalBvc2l0aW9uOiB7IHZhbHVlOiBWZWN0b3IzIH07XG4gIGxpZ2h0TWF0cml4OiB7IHZhbHVlOiBNYXRyaXg0IH07XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0aGUgZXh0cmFjdGVkIFZpZXcgRnJ1c3R1bSBNZXNoIGZyb21cbiAqIFNlY3VyaXR5Q2FtZXJhIGV4YW1wbGVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZXdGcnVzdHVtTWVzaCBleHRlbmRzIFNjZW5lQ29tcG9uZW50IHtcblxuICBwcml2YXRlIHJvb3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGl2b3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm94OiBNZXNoIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZWRnZXM6IE1lc2ggfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHByb2plY3RvcjogUGVyc3BlY3RpdmVDYW1lcmE7XG5cbiAgb3ZlcnJpZGUgaW5wdXRzOiBJbnB1dHMgPSB7XG4gICAgXCJuZWFyUGxhbmVcIjogMC4xLFxuICAgIFwiZmFyUGxhbmVcIjogMTAsXG4gICAgXCJob3Jpem9udGFsRk9WXCI6IDUyLFxuICAgIFwiYXNwZWN0XCI6IDEuNzc3Nzc3Nzc3Nzc3Nzc3NyxcbiAgICBcImxvY2FsUG9zaXRpb25cIjoge1xuICAgICAgXCJ4XCI6IDAsXG4gICAgICBcInlcIjogMC4xOCxcbiAgICAgIFwielwiOiAtMC4zXG4gICAgfSxcbiAgICBcImxvY2FsUm90YXRpb25cIjoge1xuICAgICAgXCJ4XCI6IC0xNSxcbiAgICAgIFwieVwiOiAwLFxuICAgICAgXCJ6XCI6IDBcbiAgICB9LFxuICAgIFwiY29sb3JcIjogNjUyODAsXG4gICAgXCJwYW5QZXJpb2RcIjogNSxcbiAgICBcInBhbkFuZ2xlXCI6IC00NVxuICB9O1xuXG4gIHByaXZhdGUgaGlnaGxpZ2h0OiBNZXNoIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBoaWdobGlnaHRVbmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMgPSB7XG4gICAgY29sb3I6IHt2YWx1ZTogbmV3IENvbG9yKCl9LFxuICAgIHByb2pQb3NpdGlvbjoge3ZhbHVlOiBuZXcgVmVjdG9yMygpfSxcbiAgICBsaWdodE1hdHJpeDoge3ZhbHVlOiBuZXcgTWF0cml4NCgpfSxcbiAgfVxuICBvdmVycmlkZSBvdXRwdXRzOiBhbnkgPSB7fTtcblxuICBvdmVycmlkZSBvbkluaXQoKSB7XG5cbiAgICB0aGlzLnJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICB0aGlzLnBpdm90ID0gbmV3IE9iamVjdDNEKCk7XG4gICAgdGhpcy5yb290LmFkZCh0aGlzLnBpdm90KTtcbiAgICB0aGlzLm91dHB1dHMub2JqZWN0Um9vdCA9IHRoaXMucm9vdDtcblxuICAgIGNvbnN0IGV1bGVyID0gbmV3IEV1bGVyKHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueCAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueSAqIE1hdGguUEkgLyAxODAsIHRoaXMuaW5wdXRzLmxvY2FsUm90YXRpb24ueiAqIE1hdGguUEkgLyAxODAsICdZWFonKTtcbiAgICB0aGlzLnBpdm90LnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKGV1bGVyKTtcblxuICAgIHRoaXMubWFrZUZydXN0dW1WaXN1YWxzKCk7XG5cbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmJveCk7XG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5lZGdlcyk7XG5cbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLmlucHV0cy5hc3BlY3Q7XG4gICAgY29uc3QgREVHMlJBRCA9IE1hdGguUEkgLyAxODA7XG4gICAgY29uc3QgUkFEMkRFRyA9IDEgLyBERUcyUkFEO1xuICAgIGNvbnN0IHZlcnRpY2FsRk9WID0gMiAqIE1hdGguYXRhbigxIC8gYXNwZWN0ICogTWF0aC50YW4oMC41ICogdGhpcy5pbnB1dHMuaG9yaXpvbnRhbEZPViAqIERFRzJSQUQpKSAqIFJBRDJERUc7XG4gICAgdGhpcy5wcm9qZWN0b3IgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEodmVydGljYWxGT1YsIGFzcGVjdCwgdGhpcy5pbnB1dHMubmVhclBsYW5lLCB0aGlzLmlucHV0cy5mYXJQbGFuZSk7XG4gICAgdGhpcy5waXZvdC5hZGQodGhpcy5wcm9qZWN0b3IpO1xuXG4gICAgdGhpcy5tYWtlSGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5jb250ZXh0LnNjZW5lLmFkZCh0aGlzLmhpZ2hsaWdodCk7XG5cbiAgfVxuXG5cbiAgb25UaWNrTW9kaWZpZWQoZGVsdGE6IG51bWJlciwgcXVhdGVybmlvbjogYW55KSB7XG4gICAgdGhpcy5waXZvdC5xdWF0ZXJuaW9uLnNldChxdWF0ZXJuaW9uLngscXVhdGVybmlvbi55LHF1YXRlcm5pb24ueixxdWF0ZXJuaW9uLncpO1xuICAgIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHRoaXMucHJvamVjdG9yLCB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUZydXN0dW1WaXN1YWxzKCkge1xuICAgIGlmICh0aGlzLmJveCkge1xuICAgICAgdGhpcy5yb290LnJlbW92ZSh0aGlzLmJveCk7XG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICAgICh0aGlzLmJveC5nZW9tZXRyeSBhcyBCb3hHZW9tZXRyeSkuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5ib3ggPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5lZGdlcykge1xuICAgICAgdGhpcy5yb290LnJlbW92ZSh0aGlzLmVkZ2VzKTtcbiAgICAgICh0aGlzLmVkZ2VzLm1hdGVyaWFsIGFzIExpbmVCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XG4gICAgICAodGhpcy5lZGdlcy5nZW9tZXRyeSBhcyBFZGdlc0dlb21ldHJ5KS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmVkZ2VzID0gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlZGdlc1RvQ3lsaW5kZXJzKGVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksIHRoaWNrbmVzczogbnVtYmVyKSB7XG4gICAgICBjb25zdCB7cG9zaXRpb259ID0gZWRnZXNHZW9tZXRyeS5hdHRyaWJ1dGVzO1xuICAgICAgY29uc3Qge2FycmF5LCBjb3VudH0gPSBwb3NpdGlvbjtcbiAgICAgIGNvbnN0IHIgPSB0aGlja25lc3MgLyAyO1xuICAgICAgY29uc3QgZ2VvbXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQgKiAzIC0gMTsgaSArPSA2KSB7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgVmVjdG9yMyhhcnJheVtpXSwgYXJyYXlbaSArIDFdLCBhcnJheVtpICsgMl0pO1xuICAgICAgICBjb25zdCBiID0gbmV3IFZlY3RvcjMoYXJyYXlbaSArIDNdLCBhcnJheVtpICsgNF0sIGFycmF5W2kgKyA1XSk7XG5cbiAgICAgICAgY29uc3QgdmVjID0gbmV3IFZlY3RvcjMoKS5zdWJWZWN0b3JzKGIsIGEpO1xuICAgICAgICBjb25zdCBsZW4gPSB2ZWMubGVuZ3RoKCk7XG4gICAgICAgIGNvbnN0IGdlb20gPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeShyLCByLCBsZW4sIDgpO1xuICAgICAgICBnZW9tLnRyYW5zbGF0ZSgwLCBsZW4gLyAyLCAwKTtcbiAgICAgICAgZ2VvbS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcbiAgICAgICAgZ2VvbS5sb29rQXQodmVjKTtcbiAgICAgICAgZ2VvbS50cmFuc2xhdGUoYS54LCBhLnksIGEueik7XG4gICAgICAgIGdlb21zLnB1c2goZ2VvbSk7XG4gICAgICB9XG4gICAgICAvLyBBUEkgdG8gYmUgdXBkYXRlZCBpbiBidW5kbGUgLSBKU1NESy0xMjIyXG4gICAgICByZXR1cm4gQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoZ2VvbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZydXN0dW1MZW5ndGggPSB0aGlzLmlucHV0cy5mYXJQbGFuZSAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBib3hHZW9tZXRyeTogQm94R2VvbWV0cnkgPSBuZXcgQm94R2VvbWV0cnkoMiwgMiwgZnJ1c3R1bUxlbmd0aCk7XG4gICAgY29uc3QgaGFsZkhBbmdsZSA9IHRoaXMuaW5wdXRzLmhvcml6b250YWxGT1YgKiAwLjUgKiBNYXRoLlBJIC8gMTgwO1xuICAgIGNvbnN0IG5lYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcbiAgICBjb25zdCBmYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLmZhclBsYW5lO1xuICAgIGNvbnN0IG5lYXJIYWxmSGVpZ2h0ID0gbmVhckhhbGZXaWR0aCAvIHRoaXMuaW5wdXRzLmFzcGVjdDtcbiAgICBjb25zdCBmYXJIYWxmSGVpZ2h0ID0gZmFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0gYm94R2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdwb3NpdGlvbicpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb3NpdGlvbnMuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdmVydGV4WiA9IHBvc2l0aW9ucy5nZXRaKGkpO1xuICAgICAgY29uc3QgdmVydGV4WCA9IHBvc2l0aW9ucy5nZXRYKGkpO1xuICAgICAgY29uc3QgdmVydGV4WSA9IHBvc2l0aW9ucy5nZXRZKGkpO1xuICAgICAgaWYgKHZlcnRleFogPiAwKSB7XG4gICAgICAgIC8vIGJhY2sgb2YgdGhlIGNhbWVyYVxuICAgICAgICBwb3NpdGlvbnMuc2V0WChpLCB2ZXJ0ZXhYICogbmVhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIG5lYXJIYWxmSGVpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZyb250IG9mIHRoZSBjYW1lcmFcbiAgICAgICAgcG9zaXRpb25zLnNldFgoaSwgdmVydGV4WCAqIGZhckhhbGZXaWR0aClcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIGZhckhhbGZIZWlnaHQpO1xuICAgICAgfVxuICAgICAgcG9zaXRpb25zLnNldFooaSwgdmVydGV4WiAtIDAuNSAqIGZydXN0dW1MZW5ndGggLSB0aGlzLmlucHV0cy5uZWFyUGxhbmUpO1xuICAgIH1cblxuICAgIGNvbnN0IGJveE1hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjM1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBzaWRlOiBCYWNrU2lkZSxcbiAgICAgIGJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pO1xuICAgIHRoaXMuYm94ID0gbmV3IE1lc2goYm94R2VvbWV0cnksIGJveE1hdGVyaWFsKTtcbiAgICBjb25zdCBlZGdlc0dlb21ldHJ5ID0gZWRnZXNUb0N5bGluZGVycyhuZXcgRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDE1KTtcbiAgICB0aGlzLmVkZ2VzID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICAgIG9wYWNpdHk6IDAuMjUsXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeTIgPSBlZGdlc1RvQ3lsaW5kZXJzKG5ldyBFZGdlc0dlb21ldHJ5KGJveEdlb21ldHJ5KSwgMC4wNik7XG4gICAgY29uc3QgZWRnZXMyID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXG4gICAgICBvcGFjaXR5OiAwLjM1LFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBibGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pKTtcbiAgICB0aGlzLnBpdm90LmFkZChlZGdlczIpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlSGlnaGxpZ2h0KCkge1xuXG4gICAgbGV0IGZsb29yTWVzaCA9IG51bGw7XG4gICAgZmxvb3JNZXNoID0gdGhpcy5jb250ZXh0LnNjZW5lLmdldE9iamVjdEJ5TmFtZSgnRmxvb3JNZXNoOjAnKTtcbiAgICBjb25zdCByb29tTWVzaCA9IGZsb29yTWVzaC5jaGlsZHJlbls1XSBhcyBNZXNoO1xuXG4gICAgdXBkYXRlSGlnaGxpZ2h0VW5pZm9ybXModGhpcy5wcm9qZWN0b3IsIHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMpO1xuICAgIHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMuY29sb3IudmFsdWUuc2V0SGV4KHRoaXMuaW5wdXRzLmNvbG9yKTtcblxuICAgIGNvbnN0IHNoYWRlciA9IG5ldyBTaGFkZXJNYXRlcmlhbCh7XG4gICAgICBwb2x5Z29uT2Zmc2V0OiB0cnVlLFxuICAgICAgcG9seWdvbk9mZnNldFVuaXRzOiAtMC4xLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICB1bmlmb3JtczogdGhpcy5oaWdobGlnaHRVbmlmb3JtcyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyKCksXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnRTaGFkZXIoKSxcbiAgICB9KTtcblxuICAgIC8vIGEgbWVzaCB0byByZXByZXNlbnQgdGhlIFwiaGlnaGxpZ2h0XCJcbiAgICB0aGlzLmhpZ2hsaWdodCA9IG5ldyBNZXNoKHJvb21NZXNoLmdlb21ldHJ5LCBzaGFkZXIpO1xuXG4gIH1cblxuICBvdmVycmlkZSBvbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuaGlnaGxpZ2h0ICYmIHRoaXMuaGlnaGxpZ2h0LnBhcmVudCkge1xuICAgICAgdGhpcy5oaWdobGlnaHQucGFyZW50LnJlbW92ZSh0aGlzLmhpZ2hsaWdodCk7XG4gICAgICAodGhpcy5oaWdobGlnaHQubWF0ZXJpYWwgYXMgU2hhZGVyTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZWRnZXMpIHtcbiAgICAgIHRoaXMuZWRnZXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuICAgICAgKHRoaXMuZWRnZXMubWF0ZXJpYWwgYXMgTGluZUJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm94KSB7XG4gICAgICB0aGlzLmJveC5nZW9tZXRyeS5kaXNwb3NlKCk7XG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmVydGV4U2hhZGVyKCk6IHN0cmluZyB7XG4gIHJldHVybiBgXG4gICAgdW5pZm9ybSBtYXQ0IGxpZ2h0TWF0cml4O1xuXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIFVWIHJlZ2lvbiBbMCwxXSB4IFswLDFdIHRvIHJlcHJlc2VudCB3aGF0IHRoZSBsaWdodE1hdHJpeCBcInNlZXNcIlxuICAgICAgdkxpZ2h0Q29vcmRzID0gbGlnaHRNYXRyaXggKiAgbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGZyYWdtZW50U2hhZGVyKCkge1xuICByZXR1cm4gYFxuICAgIHVuaWZvcm0gdmVjMyBjb2xvcjtcblxuICAgIHZhcnlpbmcgdmVjNCB2TGlnaHRDb29yZHM7XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICB2ZWMyIGxpZ2h0VVYgPSB2TGlnaHRDb29yZHMueHkgLyB2TGlnaHRDb29yZHMudztcbiAgICAgIGZsb2F0IGluVmlldyA9IGZsb2F0KG1heChsaWdodFVWLngsIGxpZ2h0VVYueSkgPD0gMS4wICYmIG1pbihsaWdodFVWLngsIGxpZ2h0VVYueSkgPj0gMC4wICYmIHZMaWdodENvb3Jkcy56ID4gMC4wKTtcblxuICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgbWluKGluVmlldywgMC4yKSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyhwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLCB1bmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMpIHtcbiAgcHJvamVjdG9yLmdldFdvcmxkUG9zaXRpb24odW5pZm9ybXMucHJvalBvc2l0aW9uLnZhbHVlKTtcblxuICAvLyBzaW1pbGFyIHRvIGEgc2hhZG93IG1hdHJpeCwgYnV0IHdlJ3JlIHVzaW5nIGl0IGFzIGEgXCJyZWN0YW5ndWxhclwiIHNwb3RsaWdodFxuICAvLyBbbGlnaHRCaWFzXSAqIFtwcm9qZWN0aW9uXSAqIFt2aWV3TWF0cml4XVxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tYWtlU2NhbGUoMC41LCAwLjUsIDAuNSk7XG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpKVxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tdWx0aXBseU1hdHJpY2VzKHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLCBwcm9qZWN0b3IucHJvamVjdGlvbk1hdHJpeCk7XG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5tYXRyaXhXb3JsZEludmVyc2UpO1xufVxuXG5leHBvcnQgY29uc3QgVmlld0ZydXN0dW1NZXNoVHlwZSA9ICdtcC5WaWV3RnJ1c3R1bU1lc2gnO1xuZXhwb3J0IGNvbnN0IG1ha2VWaWV3RnJ1c3R1bU1lc2ggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgVmlld0ZydXN0dW1NZXNoKCk7XG59XG4iXX0=
|
|
1
|
+
import { Object3D, Mesh, PerspectiveCamera, ShaderMaterial, MeshBasicMaterial, BoxGeometry, EdgesGeometry, Color, Matrix4, Vector3, Euler, CylinderBufferGeometry, BackSide, NormalBlending, AdditiveBlending, } from 'three';
|
|
2
|
+
import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
3
|
+
import { SceneComponent } from '../scene-component/SceneComponent';
|
|
4
|
+
/**
|
|
5
|
+
* This class is the extracted View Frustum Mesh from
|
|
6
|
+
* SecurityCamera example
|
|
7
|
+
*/
|
|
8
|
+
export class ViewFrustumMesh extends SceneComponent {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.root = null;
|
|
12
|
+
this.pivot = null;
|
|
13
|
+
this.box = null;
|
|
14
|
+
this.edges = null;
|
|
15
|
+
this.inputs = {
|
|
16
|
+
"nearPlane": 0.1,
|
|
17
|
+
"farPlane": 10,
|
|
18
|
+
"horizontalFOV": 52,
|
|
19
|
+
"aspect": 1.7777777777777777,
|
|
20
|
+
"localPosition": {
|
|
21
|
+
"x": 0,
|
|
22
|
+
"y": 0.18,
|
|
23
|
+
"z": -0.3
|
|
24
|
+
},
|
|
25
|
+
"localRotation": {
|
|
26
|
+
"x": -15,
|
|
27
|
+
"y": 0,
|
|
28
|
+
"z": 0
|
|
29
|
+
},
|
|
30
|
+
"color": 65280,
|
|
31
|
+
"panPeriod": 5,
|
|
32
|
+
"panAngle": -45
|
|
33
|
+
};
|
|
34
|
+
this.highlight = null;
|
|
35
|
+
this.highlightUniforms = {
|
|
36
|
+
color: { value: new Color() },
|
|
37
|
+
projPosition: { value: new Vector3() },
|
|
38
|
+
lightMatrix: { value: new Matrix4() },
|
|
39
|
+
};
|
|
40
|
+
this.outputs = {};
|
|
41
|
+
}
|
|
42
|
+
onInit() {
|
|
43
|
+
this.root = new Object3D();
|
|
44
|
+
this.pivot = new Object3D();
|
|
45
|
+
this.root.add(this.pivot);
|
|
46
|
+
this.outputs.objectRoot = this.root;
|
|
47
|
+
const euler = new Euler(this.inputs.localRotation.x * Math.PI / 180, this.inputs.localRotation.y * Math.PI / 180, this.inputs.localRotation.z * Math.PI / 180, 'YXZ');
|
|
48
|
+
this.pivot.quaternion.setFromEuler(euler);
|
|
49
|
+
this.makeFrustumVisuals();
|
|
50
|
+
this.pivot.add(this.box);
|
|
51
|
+
this.pivot.add(this.edges);
|
|
52
|
+
const aspect = this.inputs.aspect;
|
|
53
|
+
const DEG2RAD = Math.PI / 180;
|
|
54
|
+
const RAD2DEG = 1 / DEG2RAD;
|
|
55
|
+
const verticalFOV = 2 * Math.atan(1 / aspect * Math.tan(0.5 * this.inputs.horizontalFOV * DEG2RAD)) * RAD2DEG;
|
|
56
|
+
this.projector = new PerspectiveCamera(verticalFOV, aspect, this.inputs.nearPlane, this.inputs.farPlane);
|
|
57
|
+
this.pivot.add(this.projector);
|
|
58
|
+
this.makeHighlight();
|
|
59
|
+
this.context.scene.add(this.highlight);
|
|
60
|
+
}
|
|
61
|
+
onTickModified(delta, quaternion) {
|
|
62
|
+
this.pivot.quaternion.set(quaternion.x, quaternion.y, quaternion.z, quaternion.w);
|
|
63
|
+
updateHighlightUniforms(this.projector, this.highlightUniforms);
|
|
64
|
+
}
|
|
65
|
+
makeFrustumVisuals() {
|
|
66
|
+
if (this.box) {
|
|
67
|
+
this.root.remove(this.box);
|
|
68
|
+
this.box.material.dispose();
|
|
69
|
+
this.box.geometry.dispose();
|
|
70
|
+
this.box = null;
|
|
71
|
+
}
|
|
72
|
+
if (this.edges) {
|
|
73
|
+
this.root.remove(this.edges);
|
|
74
|
+
this.edges.material.dispose();
|
|
75
|
+
this.edges.geometry.dispose();
|
|
76
|
+
this.edges = null;
|
|
77
|
+
}
|
|
78
|
+
function edgesToCylinders(edgesGeometry, thickness) {
|
|
79
|
+
const { position } = edgesGeometry.attributes;
|
|
80
|
+
const { array, count } = position;
|
|
81
|
+
const r = thickness / 2;
|
|
82
|
+
const geoms = [];
|
|
83
|
+
for (let i = 0; i < count * 3 - 1; i += 6) {
|
|
84
|
+
const a = new Vector3(array[i], array[i + 1], array[i + 2]);
|
|
85
|
+
const b = new Vector3(array[i + 3], array[i + 4], array[i + 5]);
|
|
86
|
+
const vec = new Vector3().subVectors(b, a);
|
|
87
|
+
const len = vec.length();
|
|
88
|
+
const geom = new CylinderBufferGeometry(r, r, len, 8);
|
|
89
|
+
geom.translate(0, len / 2, 0);
|
|
90
|
+
geom.rotateX(Math.PI / 2);
|
|
91
|
+
geom.lookAt(vec);
|
|
92
|
+
geom.translate(a.x, a.y, a.z);
|
|
93
|
+
geoms.push(geom);
|
|
94
|
+
}
|
|
95
|
+
// API to be updated in bundle - JSSDK-1222
|
|
96
|
+
return BufferGeometryUtils.mergeBufferGeometries(geoms);
|
|
97
|
+
}
|
|
98
|
+
const frustumLength = this.inputs.farPlane - this.inputs.nearPlane;
|
|
99
|
+
const boxGeometry = new BoxGeometry(2, 2, frustumLength);
|
|
100
|
+
const halfHAngle = this.inputs.horizontalFOV * 0.5 * Math.PI / 180;
|
|
101
|
+
const nearHalfWidth = Math.tan(halfHAngle) * this.inputs.nearPlane;
|
|
102
|
+
const farHalfWidth = Math.tan(halfHAngle) * this.inputs.farPlane;
|
|
103
|
+
const nearHalfHeight = nearHalfWidth / this.inputs.aspect;
|
|
104
|
+
const farHalfHeight = farHalfWidth / this.inputs.aspect;
|
|
105
|
+
const positions = boxGeometry.getAttribute('position');
|
|
106
|
+
for (let i = 0; i < positions.count; i++) {
|
|
107
|
+
const vertexZ = positions.getZ(i);
|
|
108
|
+
const vertexX = positions.getX(i);
|
|
109
|
+
const vertexY = positions.getY(i);
|
|
110
|
+
if (vertexZ > 0) {
|
|
111
|
+
// back of the camera
|
|
112
|
+
positions.setX(i, vertexX * nearHalfWidth);
|
|
113
|
+
positions.setY(i, vertexY * nearHalfHeight);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
// front of the camera
|
|
117
|
+
positions.setX(i, vertexX * farHalfWidth);
|
|
118
|
+
positions.setY(i, vertexY * farHalfHeight);
|
|
119
|
+
}
|
|
120
|
+
positions.setZ(i, vertexZ - 0.5 * frustumLength - this.inputs.nearPlane);
|
|
121
|
+
}
|
|
122
|
+
const boxMaterial = new MeshBasicMaterial({
|
|
123
|
+
color: this.inputs.color,
|
|
124
|
+
opacity: 0.35,
|
|
125
|
+
transparent: true,
|
|
126
|
+
side: BackSide,
|
|
127
|
+
blending: NormalBlending,
|
|
128
|
+
depthWrite: false,
|
|
129
|
+
});
|
|
130
|
+
this.box = new Mesh(boxGeometry, boxMaterial);
|
|
131
|
+
const edgesGeometry = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.015);
|
|
132
|
+
this.edges = new Mesh(edgesGeometry, new MeshBasicMaterial({
|
|
133
|
+
color: 0xffffff,
|
|
134
|
+
opacity: 0.25,
|
|
135
|
+
transparent: true,
|
|
136
|
+
blending: AdditiveBlending,
|
|
137
|
+
depthWrite: false,
|
|
138
|
+
}));
|
|
139
|
+
const edgesGeometry2 = edgesToCylinders(new EdgesGeometry(boxGeometry), 0.06);
|
|
140
|
+
const edges2 = new Mesh(edgesGeometry2, new MeshBasicMaterial({
|
|
141
|
+
color: this.inputs.color,
|
|
142
|
+
opacity: 0.35,
|
|
143
|
+
transparent: true,
|
|
144
|
+
blending: AdditiveBlending,
|
|
145
|
+
depthWrite: false,
|
|
146
|
+
}));
|
|
147
|
+
this.pivot.add(edges2);
|
|
148
|
+
}
|
|
149
|
+
makeHighlight() {
|
|
150
|
+
let floorMesh = null;
|
|
151
|
+
floorMesh = this.context.scene.getObjectByName('FloorMesh:0');
|
|
152
|
+
const roomMesh = floorMesh.children[5];
|
|
153
|
+
updateHighlightUniforms(this.projector, this.highlightUniforms);
|
|
154
|
+
this.highlightUniforms.color.value.setHex(this.inputs.color);
|
|
155
|
+
const shader = new ShaderMaterial({
|
|
156
|
+
polygonOffset: true,
|
|
157
|
+
polygonOffsetUnits: -0.1,
|
|
158
|
+
transparent: true,
|
|
159
|
+
uniforms: this.highlightUniforms,
|
|
160
|
+
vertexShader: vertexShader(),
|
|
161
|
+
fragmentShader: fragmentShader(),
|
|
162
|
+
});
|
|
163
|
+
// a mesh to represent the "highlight"
|
|
164
|
+
this.highlight = new Mesh(roomMesh.geometry, shader);
|
|
165
|
+
}
|
|
166
|
+
onDestroy() {
|
|
167
|
+
if (this.highlight && this.highlight.parent) {
|
|
168
|
+
this.highlight.parent.remove(this.highlight);
|
|
169
|
+
this.highlight.material.dispose();
|
|
170
|
+
}
|
|
171
|
+
if (this.edges) {
|
|
172
|
+
this.edges.geometry.dispose();
|
|
173
|
+
this.edges.material.dispose();
|
|
174
|
+
}
|
|
175
|
+
if (this.box) {
|
|
176
|
+
this.box.geometry.dispose();
|
|
177
|
+
this.box.material.dispose();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function vertexShader() {
|
|
182
|
+
return `
|
|
183
|
+
uniform mat4 lightMatrix;
|
|
184
|
+
|
|
185
|
+
varying vec4 vLightCoords;
|
|
186
|
+
|
|
187
|
+
void main() {
|
|
188
|
+
// create a UV region [0,1] x [0,1] to represent what the lightMatrix "sees"
|
|
189
|
+
vLightCoords = lightMatrix * modelMatrix * vec4(position, 1.0);
|
|
190
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
191
|
+
}
|
|
192
|
+
`;
|
|
193
|
+
}
|
|
194
|
+
function fragmentShader() {
|
|
195
|
+
return `
|
|
196
|
+
uniform vec3 color;
|
|
197
|
+
|
|
198
|
+
varying vec4 vLightCoords;
|
|
199
|
+
|
|
200
|
+
void main() {
|
|
201
|
+
vec2 lightUV = vLightCoords.xy / vLightCoords.w;
|
|
202
|
+
float inView = float(max(lightUV.x, lightUV.y) <= 1.0 && min(lightUV.x, lightUV.y) >= 0.0 && vLightCoords.z > 0.0);
|
|
203
|
+
|
|
204
|
+
gl_FragColor = vec4(color, min(inView, 0.2));
|
|
205
|
+
}
|
|
206
|
+
`;
|
|
207
|
+
}
|
|
208
|
+
function updateHighlightUniforms(projector, uniforms) {
|
|
209
|
+
projector.getWorldPosition(uniforms.projPosition.value);
|
|
210
|
+
// similar to a shadow matrix, but we're using it as a "rectangular" spotlight
|
|
211
|
+
// [lightBias] * [projection] * [viewMatrix]
|
|
212
|
+
uniforms.lightMatrix.value.makeScale(0.5, 0.5, 0.5);
|
|
213
|
+
uniforms.lightMatrix.value.setPosition(new Vector3(0.5, 0.5, 0.5));
|
|
214
|
+
uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.projectionMatrix);
|
|
215
|
+
uniforms.lightMatrix.value.multiplyMatrices(uniforms.lightMatrix.value, projector.matrixWorldInverse);
|
|
216
|
+
}
|
|
217
|
+
export const ViewFrustumMeshType = 'mp.ViewFrustumMesh';
|
|
218
|
+
export const makeViewFrustumMesh = function () {
|
|
219
|
+
return new ViewFrustumMesh();
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmlld0ZydXN0dW1NZXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGlCQUFpQixFQUNqQixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLFdBQVcsRUFFWCxhQUFhLEVBQ2IsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLHNCQUFzQixFQUN0QixRQUFRLEVBQ1IsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxpREFBaUQsQ0FBQTtBQUN0RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFvQmpFOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGNBQWM7SUFBbkQ7O1FBRVUsU0FBSSxHQUFvQixJQUFJLENBQUM7UUFDN0IsVUFBSyxHQUFvQixJQUFJLENBQUM7UUFDOUIsUUFBRyxHQUFnQixJQUFJLENBQUM7UUFDeEIsVUFBSyxHQUFnQixJQUFJLENBQUM7UUFJekIsV0FBTSxHQUFXO1lBQ3hCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZUFBZSxFQUFFLEVBQUU7WUFDbkIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxFQUFFLElBQUk7Z0JBQ1QsR0FBRyxFQUFFLENBQUMsR0FBRzthQUNWO1lBQ0QsZUFBZSxFQUFFO2dCQUNmLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLENBQUM7Z0JBQ04s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QUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDbEUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDcEcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDeEcsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLE9BQU8sSUFBSSxlQUFlLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIE9iamVjdDNELFxyXG4gIE1lc2gsXHJcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgU2hhZGVyTWF0ZXJpYWwsXHJcbiAgTWVzaEJhc2ljTWF0ZXJpYWwsXHJcbiAgQm94R2VvbWV0cnksXHJcbiAgTGluZUJhc2ljTWF0ZXJpYWwsXHJcbiAgRWRnZXNHZW9tZXRyeSxcclxuICBDb2xvcixcclxuICBNYXRyaXg0LFxyXG4gIFZlY3RvcjMsXHJcbiAgRXVsZXIsXHJcbiAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSxcclxuICBCYWNrU2lkZSxcclxuICBOb3JtYWxCbGVuZGluZyxcclxuICBBZGRpdGl2ZUJsZW5kaW5nLFxyXG59IGZyb20gJ3RocmVlJztcclxuaW1wb3J0ICogYXMgQnVmZmVyR2VvbWV0cnlVdGlscyBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vdXRpbHMvQnVmZmVyR2VvbWV0cnlVdGlscy5qcydcclxuaW1wb3J0IHtTY2VuZUNvbXBvbmVudH0gZnJvbSAnLi4vc2NlbmUtY29tcG9uZW50L1NjZW5lQ29tcG9uZW50JztcclxuXHJcbmludGVyZmFjZSBJbnB1dHMge1xyXG4gIG5lYXJQbGFuZTogbnVtYmVyO1xyXG4gIGZhclBsYW5lOiBudW1iZXIsXHJcbiAgaG9yaXpvbnRhbEZPVjogbnVtYmVyLFxyXG4gIGFzcGVjdDogbnVtYmVyLFxyXG4gIGxvY2FsUG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlcjsgfTtcclxuICBsb2NhbFJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH07XHJcbiAgY29sb3I6IG51bWJlcjtcclxuICBwYW5QZXJpb2Q6IG51bWJlcjtcclxuICBwYW5BbmdsZTogbnVtYmVyO1xyXG59XHJcblxyXG50eXBlIEhpZ2hsaWdodFVuaWZvcm1zID0ge1xyXG4gIGNvbG9yOiB7IHZhbHVlOiBDb2xvciB9LFxyXG4gIHByb2pQb3NpdGlvbjogeyB2YWx1ZTogVmVjdG9yMyB9O1xyXG4gIGxpZ2h0TWF0cml4OiB7IHZhbHVlOiBNYXRyaXg0IH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGlzIHRoZSBleHRyYWN0ZWQgVmlldyBGcnVzdHVtIE1lc2ggZnJvbVxyXG4gKiBTZWN1cml0eUNhbWVyYSBleGFtcGxlXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmlld0ZydXN0dW1NZXNoIGV4dGVuZHMgU2NlbmVDb21wb25lbnQge1xyXG5cclxuICBwcml2YXRlIHJvb3Q6IE9iamVjdDNEIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBwaXZvdDogT2JqZWN0M0QgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGJveDogTWVzaCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZWRnZXM6IE1lc2ggfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBvdmVycmlkZSBpbnB1dHM6IElucHV0cyA9IHtcclxuICAgIFwibmVhclBsYW5lXCI6IDAuMSxcclxuICAgIFwiZmFyUGxhbmVcIjogMTAsXHJcbiAgICBcImhvcml6b250YWxGT1ZcIjogNTIsXHJcbiAgICBcImFzcGVjdFwiOiAxLjc3Nzc3Nzc3Nzc3Nzc3NzcsXHJcbiAgICBcImxvY2FsUG9zaXRpb25cIjoge1xyXG4gICAgICBcInhcIjogMCxcclxuICAgICAgXCJ5XCI6IDAuMTgsXHJcbiAgICAgIFwielwiOiAtMC4zXHJcbiAgICB9LFxyXG4gICAgXCJsb2NhbFJvdGF0aW9uXCI6IHtcclxuICAgICAgXCJ4XCI6IC0xNSxcclxuICAgICAgXCJ5XCI6IDAsXHJcbiAgICAgIFwielwiOiAwXHJcbiAgICB9LFxyXG4gICAgXCJjb2xvclwiOiA2NTI4MCxcclxuICAgIFwicGFuUGVyaW9kXCI6IDUsXHJcbiAgICBcInBhbkFuZ2xlXCI6IC00NVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgaGlnaGxpZ2h0OiBNZXNoIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgaGlnaGxpZ2h0VW5pZm9ybXM6IEhpZ2hsaWdodFVuaWZvcm1zID0ge1xyXG4gICAgY29sb3I6IHt2YWx1ZTogbmV3IENvbG9yKCl9LFxyXG4gICAgcHJvalBvc2l0aW9uOiB7dmFsdWU6IG5ldyBWZWN0b3IzKCl9LFxyXG4gICAgbGlnaHRNYXRyaXg6IHt2YWx1ZTogbmV3IE1hdHJpeDQoKX0sXHJcbiAgfVxyXG4gIG92ZXJyaWRlIG91dHB1dHM6IGFueSA9IHt9O1xyXG5cclxuICBvdmVycmlkZSBvbkluaXQoKSB7XHJcblxyXG4gICAgdGhpcy5yb290ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnBpdm90ID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICB0aGlzLnJvb3QuYWRkKHRoaXMucGl2b3QpO1xyXG4gICAgdGhpcy5vdXRwdXRzLm9iamVjdFJvb3QgPSB0aGlzLnJvb3Q7XHJcblxyXG4gICAgY29uc3QgZXVsZXIgPSBuZXcgRXVsZXIodGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi54ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi55ICogTWF0aC5QSSAvIDE4MCwgdGhpcy5pbnB1dHMubG9jYWxSb3RhdGlvbi56ICogTWF0aC5QSSAvIDE4MCwgJ1lYWicpO1xyXG4gICAgdGhpcy5waXZvdC5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihldWxlcik7XHJcblxyXG4gICAgdGhpcy5tYWtlRnJ1c3R1bVZpc3VhbHMoKTtcclxuXHJcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmJveCk7XHJcbiAgICB0aGlzLnBpdm90LmFkZCh0aGlzLmVkZ2VzKTtcclxuXHJcbiAgICBjb25zdCBhc3BlY3QgPSB0aGlzLmlucHV0cy5hc3BlY3Q7XHJcbiAgICBjb25zdCBERUcyUkFEID0gTWF0aC5QSSAvIDE4MDtcclxuICAgIGNvbnN0IFJBRDJERUcgPSAxIC8gREVHMlJBRDtcclxuICAgIGNvbnN0IHZlcnRpY2FsRk9WID0gMiAqIE1hdGguYXRhbigxIC8gYXNwZWN0ICogTWF0aC50YW4oMC41ICogdGhpcy5pbnB1dHMuaG9yaXpvbnRhbEZPViAqIERFRzJSQUQpKSAqIFJBRDJERUc7XHJcbiAgICB0aGlzLnByb2plY3RvciA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh2ZXJ0aWNhbEZPViwgYXNwZWN0LCB0aGlzLmlucHV0cy5uZWFyUGxhbmUsIHRoaXMuaW5wdXRzLmZhclBsYW5lKTtcclxuICAgIHRoaXMucGl2b3QuYWRkKHRoaXMucHJvamVjdG9yKTtcclxuXHJcbiAgICB0aGlzLm1ha2VIaWdobGlnaHQoKTtcclxuICAgIHRoaXMuY29udGV4dC5zY2VuZS5hZGQodGhpcy5oaWdobGlnaHQpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvblRpY2tNb2RpZmllZChkZWx0YTogbnVtYmVyLCBxdWF0ZXJuaW9uOiBhbnkpIHtcclxuICAgIHRoaXMucGl2b3QucXVhdGVybmlvbi5zZXQocXVhdGVybmlvbi54LHF1YXRlcm5pb24ueSxxdWF0ZXJuaW9uLnoscXVhdGVybmlvbi53KTtcclxuICAgIHVwZGF0ZUhpZ2hsaWdodFVuaWZvcm1zKHRoaXMucHJvamVjdG9yLCB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWFrZUZydXN0dW1WaXN1YWxzKCkge1xyXG4gICAgaWYgKHRoaXMuYm94KSB7XHJcbiAgICAgIHRoaXMucm9vdC5yZW1vdmUodGhpcy5ib3gpO1xyXG4gICAgICAodGhpcy5ib3gubWF0ZXJpYWwgYXMgTWVzaEJhc2ljTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcclxuICAgICAgKHRoaXMuYm94Lmdlb21ldHJ5IGFzIEJveEdlb21ldHJ5KS5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuYm94ID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XHJcbiAgICAgIHRoaXMucm9vdC5yZW1vdmUodGhpcy5lZGdlcyk7XHJcbiAgICAgICh0aGlzLmVkZ2VzLm1hdGVyaWFsIGFzIExpbmVCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XHJcbiAgICAgICh0aGlzLmVkZ2VzLmdlb21ldHJ5IGFzIEVkZ2VzR2VvbWV0cnkpLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5lZGdlcyA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZWRnZXNUb0N5bGluZGVycyhlZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LCB0aGlja25lc3M6IG51bWJlcikge1xyXG4gICAgICBjb25zdCB7cG9zaXRpb259ID0gZWRnZXNHZW9tZXRyeS5hdHRyaWJ1dGVzO1xyXG4gICAgICBjb25zdCB7YXJyYXksIGNvdW50fSA9IHBvc2l0aW9uO1xyXG4gICAgICBjb25zdCByID0gdGhpY2tuZXNzIC8gMjtcclxuICAgICAgY29uc3QgZ2VvbXMgPSBbXTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudCAqIDMgLSAxOyBpICs9IDYpIHtcclxuICAgICAgICBjb25zdCBhID0gbmV3IFZlY3RvcjMoYXJyYXlbaV0sIGFycmF5W2kgKyAxXSwgYXJyYXlbaSArIDJdKTtcclxuICAgICAgICBjb25zdCBiID0gbmV3IFZlY3RvcjMoYXJyYXlbaSArIDNdLCBhcnJheVtpICsgNF0sIGFycmF5W2kgKyA1XSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHZlYyA9IG5ldyBWZWN0b3IzKCkuc3ViVmVjdG9ycyhiLCBhKTtcclxuICAgICAgICBjb25zdCBsZW4gPSB2ZWMubGVuZ3RoKCk7XHJcbiAgICAgICAgY29uc3QgZ2VvbSA9IG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KHIsIHIsIGxlbiwgOCk7XHJcbiAgICAgICAgZ2VvbS50cmFuc2xhdGUoMCwgbGVuIC8gMiwgMCk7XHJcbiAgICAgICAgZ2VvbS5yb3RhdGVYKE1hdGguUEkgLyAyKTtcclxuICAgICAgICBnZW9tLmxvb2tBdCh2ZWMpO1xyXG4gICAgICAgIGdlb20udHJhbnNsYXRlKGEueCwgYS55LCBhLnopO1xyXG4gICAgICAgIGdlb21zLnB1c2goZ2VvbSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gQVBJIHRvIGJlIHVwZGF0ZWQgaW4gYnVuZGxlIC0gSlNTREstMTIyMlxyXG4gICAgICByZXR1cm4gQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoZ2VvbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZydXN0dW1MZW5ndGggPSB0aGlzLmlucHV0cy5mYXJQbGFuZSAtIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcclxuICAgIGNvbnN0IGJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSA9IG5ldyBCb3hHZW9tZXRyeSgyLCAyLCBmcnVzdHVtTGVuZ3RoKTtcclxuICAgIGNvbnN0IGhhbGZIQW5nbGUgPSB0aGlzLmlucHV0cy5ob3Jpem9udGFsRk9WICogMC41ICogTWF0aC5QSSAvIDE4MDtcclxuICAgIGNvbnN0IG5lYXJIYWxmV2lkdGggPSBNYXRoLnRhbihoYWxmSEFuZ2xlKSAqIHRoaXMuaW5wdXRzLm5lYXJQbGFuZTtcclxuICAgIGNvbnN0IGZhckhhbGZXaWR0aCA9IE1hdGgudGFuKGhhbGZIQW5nbGUpICogdGhpcy5pbnB1dHMuZmFyUGxhbmU7XHJcbiAgICBjb25zdCBuZWFySGFsZkhlaWdodCA9IG5lYXJIYWxmV2lkdGggLyB0aGlzLmlucHV0cy5hc3BlY3Q7XHJcbiAgICBjb25zdCBmYXJIYWxmSGVpZ2h0ID0gZmFySGFsZldpZHRoIC8gdGhpcy5pbnB1dHMuYXNwZWN0O1xyXG5cclxuICAgIGNvbnN0IHBvc2l0aW9ucyA9IGJveEdlb21ldHJ5LmdldEF0dHJpYnV0ZSgncG9zaXRpb24nKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc2l0aW9ucy5jb3VudDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHZlcnRleFogPSBwb3NpdGlvbnMuZ2V0WihpKTtcclxuICAgICAgY29uc3QgdmVydGV4WCA9IHBvc2l0aW9ucy5nZXRYKGkpO1xyXG4gICAgICBjb25zdCB2ZXJ0ZXhZID0gcG9zaXRpb25zLmdldFkoaSk7XHJcbiAgICAgIGlmICh2ZXJ0ZXhaID4gMCkge1xyXG4gICAgICAgIC8vIGJhY2sgb2YgdGhlIGNhbWVyYVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRYKGksIHZlcnRleFggKiBuZWFySGFsZldpZHRoKVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRZKGksIHZlcnRleFkgKiBuZWFySGFsZkhlaWdodCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gZnJvbnQgb2YgdGhlIGNhbWVyYVxyXG4gICAgICAgIHBvc2l0aW9ucy5zZXRYKGksIHZlcnRleFggKiBmYXJIYWxmV2lkdGgpXHJcbiAgICAgICAgcG9zaXRpb25zLnNldFkoaSwgdmVydGV4WSAqIGZhckhhbGZIZWlnaHQpO1xyXG4gICAgICB9XHJcbiAgICAgIHBvc2l0aW9ucy5zZXRaKGksIHZlcnRleFogLSAwLjUgKiBmcnVzdHVtTGVuZ3RoIC0gdGhpcy5pbnB1dHMubmVhclBsYW5lKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBib3hNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe1xyXG4gICAgICBjb2xvcjogdGhpcy5pbnB1dHMuY29sb3IsXHJcbiAgICAgIG9wYWNpdHk6IDAuMzUsXHJcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICBzaWRlOiBCYWNrU2lkZSxcclxuICAgICAgYmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxyXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5ib3ggPSBuZXcgTWVzaChib3hHZW9tZXRyeSwgYm94TWF0ZXJpYWwpO1xyXG4gICAgY29uc3QgZWRnZXNHZW9tZXRyeSA9IGVkZ2VzVG9DeWxpbmRlcnMobmV3IEVkZ2VzR2VvbWV0cnkoYm94R2VvbWV0cnkpLCAwLjAxNSk7XHJcbiAgICB0aGlzLmVkZ2VzID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcclxuICAgICAgY29sb3I6IDB4ZmZmZmZmLFxyXG4gICAgICBvcGFjaXR5OiAwLjI1LFxyXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgYmxlbmRpbmc6IEFkZGl0aXZlQmxlbmRpbmcsXHJcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IGVkZ2VzR2VvbWV0cnkyID0gZWRnZXNUb0N5bGluZGVycyhuZXcgRWRnZXNHZW9tZXRyeShib3hHZW9tZXRyeSksIDAuMDYpO1xyXG4gICAgY29uc3QgZWRnZXMyID0gbmV3IE1lc2goZWRnZXNHZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XHJcbiAgICAgIGNvbG9yOiB0aGlzLmlucHV0cy5jb2xvcixcclxuICAgICAgb3BhY2l0eTogMC4zNSxcclxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgIGJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLFxyXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcclxuICAgIH0pKTtcclxuICAgIHRoaXMucGl2b3QuYWRkKGVkZ2VzMik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1ha2VIaWdobGlnaHQoKSB7XHJcblxyXG4gICAgbGV0IGZsb29yTWVzaCA9IG51bGw7XHJcbiAgICBmbG9vck1lc2ggPSB0aGlzLmNvbnRleHQuc2NlbmUuZ2V0T2JqZWN0QnlOYW1lKCdGbG9vck1lc2g6MCcpO1xyXG4gICAgY29uc3Qgcm9vbU1lc2ggPSBmbG9vck1lc2guY2hpbGRyZW5bNV0gYXMgTWVzaDtcclxuXHJcbiAgICB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyh0aGlzLnByb2plY3RvciwgdGhpcy5oaWdobGlnaHRVbmlmb3Jtcyk7XHJcbiAgICB0aGlzLmhpZ2hsaWdodFVuaWZvcm1zLmNvbG9yLnZhbHVlLnNldEhleCh0aGlzLmlucHV0cy5jb2xvcik7XHJcblxyXG4gICAgY29uc3Qgc2hhZGVyID0gbmV3IFNoYWRlck1hdGVyaWFsKHtcclxuICAgICAgcG9seWdvbk9mZnNldDogdHJ1ZSxcclxuICAgICAgcG9seWdvbk9mZnNldFVuaXRzOiAtMC4xLFxyXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgdW5pZm9ybXM6IHRoaXMuaGlnaGxpZ2h0VW5pZm9ybXMsXHJcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4U2hhZGVyKCksXHJcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudFNoYWRlcigpLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gYSBtZXNoIHRvIHJlcHJlc2VudCB0aGUgXCJoaWdobGlnaHRcIlxyXG4gICAgdGhpcy5oaWdobGlnaHQgPSBuZXcgTWVzaChyb29tTWVzaC5nZW9tZXRyeSwgc2hhZGVyKTtcclxuXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBvbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5oaWdobGlnaHQgJiYgdGhpcy5oaWdobGlnaHQucGFyZW50KSB7XHJcbiAgICAgIHRoaXMuaGlnaGxpZ2h0LnBhcmVudC5yZW1vdmUodGhpcy5oaWdobGlnaHQpO1xyXG4gICAgICAodGhpcy5oaWdobGlnaHQubWF0ZXJpYWwgYXMgU2hhZGVyTWF0ZXJpYWwpLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVkZ2VzKSB7XHJcbiAgICAgIHRoaXMuZWRnZXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xyXG4gICAgICAodGhpcy5lZGdlcy5tYXRlcmlhbCBhcyBMaW5lQmFzaWNNYXRlcmlhbCkuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYm94KSB7XHJcbiAgICAgIHRoaXMuYm94Lmdlb21ldHJ5LmRpc3Bvc2UoKTtcclxuICAgICAgKHRoaXMuYm94Lm1hdGVyaWFsIGFzIE1lc2hCYXNpY01hdGVyaWFsKS5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB2ZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcclxuICByZXR1cm4gYFxyXG4gICAgdW5pZm9ybSBtYXQ0IGxpZ2h0TWF0cml4O1xyXG5cclxuICAgIHZhcnlpbmcgdmVjNCB2TGlnaHRDb29yZHM7XHJcblxyXG4gICAgdm9pZCBtYWluKCkge1xyXG4gICAgICAvLyBjcmVhdGUgYSBVViByZWdpb24gWzAsMV0geCBbMCwxXSB0byByZXByZXNlbnQgd2hhdCB0aGUgbGlnaHRNYXRyaXggXCJzZWVzXCJcclxuICAgICAgdkxpZ2h0Q29vcmRzID0gbGlnaHRNYXRyaXggKiAgbW9kZWxNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xyXG4gICAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xyXG4gICAgfVxyXG4gIGA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGZyYWdtZW50U2hhZGVyKCkge1xyXG4gIHJldHVybiBgXHJcbiAgICB1bmlmb3JtIHZlYzMgY29sb3I7XHJcblxyXG4gICAgdmFyeWluZyB2ZWM0IHZMaWdodENvb3JkcztcclxuXHJcbiAgICB2b2lkIG1haW4oKSB7XHJcbiAgICAgIHZlYzIgbGlnaHRVViA9IHZMaWdodENvb3Jkcy54eSAvIHZMaWdodENvb3Jkcy53O1xyXG4gICAgICBmbG9hdCBpblZpZXcgPSBmbG9hdChtYXgobGlnaHRVVi54LCBsaWdodFVWLnkpIDw9IDEuMCAmJiBtaW4obGlnaHRVVi54LCBsaWdodFVWLnkpID49IDAuMCAmJiB2TGlnaHRDb29yZHMueiA+IDAuMCk7XHJcblxyXG4gICAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCBtaW4oaW5WaWV3LCAwLjIpKTtcclxuICAgIH1cclxuICBgO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVIaWdobGlnaHRVbmlmb3Jtcyhwcm9qZWN0b3I6IFBlcnNwZWN0aXZlQ2FtZXJhLCB1bmlmb3JtczogSGlnaGxpZ2h0VW5pZm9ybXMpIHtcclxuICBwcm9qZWN0b3IuZ2V0V29ybGRQb3NpdGlvbih1bmlmb3Jtcy5wcm9qUG9zaXRpb24udmFsdWUpO1xyXG5cclxuICAvLyBzaW1pbGFyIHRvIGEgc2hhZG93IG1hdHJpeCwgYnV0IHdlJ3JlIHVzaW5nIGl0IGFzIGEgXCJyZWN0YW5ndWxhclwiIHNwb3RsaWdodFxyXG4gIC8vIFtsaWdodEJpYXNdICogW3Byb2plY3Rpb25dICogW3ZpZXdNYXRyaXhdXHJcbiAgdW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUubWFrZVNjYWxlKDAuNSwgMC41LCAwLjUpO1xyXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLnNldFBvc2l0aW9uKG5ldyBWZWN0b3IzKDAuNSwgMC41LCAwLjUpKVxyXG4gIHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLm11bHRpcGx5TWF0cmljZXModW5pZm9ybXMubGlnaHRNYXRyaXgudmFsdWUsIHByb2plY3Rvci5wcm9qZWN0aW9uTWF0cml4KTtcclxuICB1bmlmb3Jtcy5saWdodE1hdHJpeC52YWx1ZS5tdWx0aXBseU1hdHJpY2VzKHVuaWZvcm1zLmxpZ2h0TWF0cml4LnZhbHVlLCBwcm9qZWN0b3IubWF0cml4V29ybGRJbnZlcnNlKTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFZpZXdGcnVzdHVtTWVzaFR5cGUgPSAnbXAuVmlld0ZydXN0dW1NZXNoJztcclxuZXhwb3J0IGNvbnN0IG1ha2VWaWV3RnJ1c3R1bU1lc2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgcmV0dXJuIG5ldyBWaWV3RnJ1c3R1bU1lc2goKTtcclxufVxyXG4iXX0=
|