@smarterplan/ngx-smarterplan-core 1.4.13 → 1.4.15

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.
@@ -26,14 +26,40 @@ export function applyRigidTransformToPoint(p, t) {
26
26
  z: t.refTarget.z + (dx * sin + dz * cos)
27
27
  };
28
28
  }
29
- /** Applies the Y rotation (in degrees) to an orientation angle (a pose's yRotation). */
29
+ /**
30
+ * Applies the Y rotation (in degrees) to an orientation angle (a pose's yRotation).
31
+ * A null/undefined/non-numeric angle is returned untouched: "no orientation stored"
32
+ * must stay "no orientation stored", not become the raw rotation delta.
33
+ */
30
34
  export function applyRigidTransformToYRotationDeg(yRotationDeg, t) {
35
+ if (yRotationDeg === null || yRotationDeg === undefined || Number.isNaN(Number(yRotationDeg))) {
36
+ return yRotationDeg;
37
+ }
31
38
  const deltaDeg = t.rotationYRad * (180 / Math.PI);
32
- return yRotationDeg + deltaDeg;
39
+ return Number(yRotationDeg) + deltaDeg;
33
40
  }
34
41
  /** Euclidean distance between two points, useful to validate landmark quality. */
35
42
  export function distance(a, b) {
36
43
  const dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z;
37
44
  return Math.sqrt(dx * dx + dy * dy + dz * dz);
38
45
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvdXRpbHMvbWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFVL0I7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxPQUFhLEVBQUUsT0FBYSxFQUM1QixPQUFhLEVBQUUsT0FBYTtJQUU1QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU87UUFDSCxZQUFZLEVBQUUsV0FBVyxHQUFHLFdBQVc7UUFDdkMsU0FBUyxFQUFFLE9BQU87UUFDbEIsU0FBUyxFQUFFLE9BQU87S0FDckIsQ0FBQztBQUNOLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLDBCQUEwQixDQUFDLENBQU8sRUFBRSxDQUFpQjtJQUNqRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckMsT0FBTztRQUNILENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN4QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsK0JBQStCO1FBQ3pFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUMzQyxDQUFDO0FBQ04sQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsaUNBQWlDLENBQUMsWUFBb0IsRUFBRSxDQUFpQjtJQUNyRixNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsRCxPQUFPLFlBQVksR0FBRyxRQUFRLENBQUM7QUFDbkMsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixNQUFNLFVBQVUsUUFBUSxDQUFDLENBQU8sRUFBRSxDQUFPO0lBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG1hdHRlcnBvcnQtdHJhbnNmb3JtLnV0aWwudHNcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmVjMyB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmlnaWRUcmFuc2Zvcm0ge1xyXG4gICAgcm90YXRpb25ZUmFkOiBudW1iZXI7ICAgLy8gcm90YXRpb24gYXJvdW5kIHRoZSB2ZXJ0aWNhbCAoWSkgYXhpcywgaW4gcmFkaWFuc1xyXG4gICAgcmVmU291cmNlOiBWZWMzOyAgICAgICAgLy8gbGFuZG1hcmsgQSBwb3NpdGlvbiwgaW4gU09VUkNFIG1vZGVsIGNvb3JkaW5hdGVzXHJcbiAgICByZWZUYXJnZXQ6IFZlYzM7ICAgICAgICAvLyBsYW5kbWFyayBBIHBvc2l0aW9uLCBpbiBUQVJHRVQgbW9kZWwgY29vcmRpbmF0ZXNcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSByaWdpZCB0cmFuc2Zvcm0gKFktYXhpcyByb3RhdGlvbiArIHRyYW5zbGF0aW9uKSBiZXR3ZWVuIHR3b1xyXG4gKiBjb29yZGluYXRlIGZyYW1lcywgZnJvbSAyIHBhaXJzIG9mIHBvaW50cyByZXByZXNlbnRpbmcgdGhlIHNhbWUgcGh5c2ljYWwgc3BvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmlnaWRUcmFuc2Zvcm0oXHJcbiAgICBzb3VyY2VBOiBWZWMzLCB0YXJnZXRBOiBWZWMzLFxyXG4gICAgc291cmNlQjogVmVjMywgdGFyZ2V0QjogVmVjM1xyXG4pOiBSaWdpZFRyYW5zZm9ybSB7XHJcbiAgICBjb25zdCB2U291cmNlID0geyB4OiBzb3VyY2VCLnggLSBzb3VyY2VBLngsIHo6IHNvdXJjZUIueiAtIHNvdXJjZUEueiB9O1xyXG4gICAgY29uc3QgdlRhcmdldCA9IHsgeDogdGFyZ2V0Qi54IC0gdGFyZ2V0QS54LCB6OiB0YXJnZXRCLnogLSB0YXJnZXRBLnogfTtcclxuXHJcbiAgICBjb25zdCBhbmdsZVNvdXJjZSA9IE1hdGguYXRhbjIodlNvdXJjZS56LCB2U291cmNlLngpO1xyXG4gICAgY29uc3QgYW5nbGVUYXJnZXQgPSBNYXRoLmF0YW4yKHZUYXJnZXQueiwgdlRhcmdldC54KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJvdGF0aW9uWVJhZDogYW5nbGVUYXJnZXQgLSBhbmdsZVNvdXJjZSxcclxuICAgICAgICByZWZTb3VyY2U6IHNvdXJjZUEsXHJcbiAgICAgICAgcmVmVGFyZ2V0OiB0YXJnZXRBXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQXBwbGllcyB0aGUgcmlnaWQgdHJhbnNmb3JtIHRvIGEgM0QgcG9zaXRpb24gKHgsIHksIHopLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSaWdpZFRyYW5zZm9ybVRvUG9pbnQocDogVmVjMywgdDogUmlnaWRUcmFuc2Zvcm0pOiBWZWMzIHtcclxuICAgIGNvbnN0IGR4ID0gcC54IC0gdC5yZWZTb3VyY2UueDtcclxuICAgIGNvbnN0IGR6ID0gcC56IC0gdC5yZWZTb3VyY2UuejtcclxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKHQucm90YXRpb25ZUmFkKTtcclxuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHQucm90YXRpb25ZUmFkKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHQucmVmVGFyZ2V0LnggKyAoZHggKiBjb3MgLSBkeiAqIHNpbiksXHJcbiAgICAgICAgeTogdC5yZWZUYXJnZXQueSArIChwLnkgLSB0LnJlZlNvdXJjZS55KSwgLy8gdmVydGljYWwgYXhpcyBpcyBub3Qgcm90YXRlZFxyXG4gICAgICAgIHo6IHQucmVmVGFyZ2V0LnogKyAoZHggKiBzaW4gKyBkeiAqIGNvcylcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKiBBcHBsaWVzIHRoZSBZIHJvdGF0aW9uIChpbiBkZWdyZWVzKSB0byBhbiBvcmllbnRhdGlvbiBhbmdsZSAoYSBwb3NlJ3MgeVJvdGF0aW9uKS4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmlnaWRUcmFuc2Zvcm1Ub1lSb3RhdGlvbkRlZyh5Um90YXRpb25EZWc6IG51bWJlciwgdDogUmlnaWRUcmFuc2Zvcm0pOiBudW1iZXIge1xyXG4gICAgY29uc3QgZGVsdGFEZWcgPSB0LnJvdGF0aW9uWVJhZCAqICgxODAgLyBNYXRoLlBJKTtcclxuICAgIHJldHVybiB5Um90YXRpb25EZWcgKyBkZWx0YURlZztcclxufVxyXG5cclxuLyoqIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMsIHVzZWZ1bCB0byB2YWxpZGF0ZSBsYW5kbWFyayBxdWFsaXR5LiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2UoYTogVmVjMywgYjogVmVjMyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBkeCA9IGEueCAtIGIueCwgZHkgPSBhLnkgLSBiLnksIGR6ID0gYS56IC0gYi56O1xyXG4gICAgcmV0dXJuIE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHopO1xyXG59Il19
46
+ /**
47
+ * Applies ONLY the rotation part of the transform to a direction vector
48
+ * (a normal, a stem vector, ...).
49
+ *
50
+ * A direction has no origin, so the translation must NOT be applied to it —
51
+ * doing so would turn a unit normal into a point somewhere in the target model.
52
+ * Used for a POI's `metadata.normal`, which drives the orientation of the tag's
53
+ * stem: without this rotation, a pastille copied into a space whose model is
54
+ * rotated relative to the source ends up pointing into the wall it is stuck on.
55
+ */
56
+ export function applyRigidTransformToDirection(v, t) {
57
+ const cos = Math.cos(t.rotationYRad);
58
+ const sin = Math.sin(t.rotationYRad);
59
+ return {
60
+ x: v.x * cos - v.z * sin,
61
+ y: v.y, // vertical axis is not rotated
62
+ z: v.x * sin + v.z * cos
63
+ };
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvdXRpbHMvbWF0dGVycG9ydC10cmFuc2Zvcm0udXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQkFBK0I7QUFVL0I7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxPQUFhLEVBQUUsT0FBYSxFQUM1QixPQUFhLEVBQUUsT0FBYTtJQUU1QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFdkUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJELE9BQU87UUFDSCxZQUFZLEVBQUUsV0FBVyxHQUFHLFdBQVc7UUFDdkMsU0FBUyxFQUFFLE9BQU87UUFDbEIsU0FBUyxFQUFFLE9BQU87S0FDckIsQ0FBQztBQUNOLENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLDBCQUEwQixDQUFDLENBQU8sRUFBRSxDQUFpQjtJQUNqRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFckMsT0FBTztRQUNILENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztRQUN4QyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsK0JBQStCO1FBQ3pFLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztLQUMzQyxDQUFDO0FBQ04sQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsWUFBb0IsRUFBRSxDQUFpQjtJQUNyRixJQUFJLFlBQVksS0FBSyxJQUFJLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDNUYsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLFFBQVEsQ0FBQztBQUMzQyxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxRQUFRLENBQUMsQ0FBTyxFQUFFLENBQU87SUFDckMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBQ0Q7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLENBQU8sRUFBRSxDQUFpQjtJQUNyRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVyQyxPQUFPO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztRQUN4QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSwrQkFBK0I7UUFDdkMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRztLQUMzQixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG1hdHRlcnBvcnQtdHJhbnNmb3JtLnV0aWwudHNcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmVjMyB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXI7IH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmlnaWRUcmFuc2Zvcm0ge1xyXG4gICAgcm90YXRpb25ZUmFkOiBudW1iZXI7ICAgLy8gcm90YXRpb24gYXJvdW5kIHRoZSB2ZXJ0aWNhbCAoWSkgYXhpcywgaW4gcmFkaWFuc1xyXG4gICAgcmVmU291cmNlOiBWZWMzOyAgICAgICAgLy8gbGFuZG1hcmsgQSBwb3NpdGlvbiwgaW4gU09VUkNFIG1vZGVsIGNvb3JkaW5hdGVzXHJcbiAgICByZWZUYXJnZXQ6IFZlYzM7ICAgICAgICAvLyBsYW5kbWFyayBBIHBvc2l0aW9uLCBpbiBUQVJHRVQgbW9kZWwgY29vcmRpbmF0ZXNcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXB1dGVzIHRoZSByaWdpZCB0cmFuc2Zvcm0gKFktYXhpcyByb3RhdGlvbiArIHRyYW5zbGF0aW9uKSBiZXR3ZWVuIHR3b1xyXG4gKiBjb29yZGluYXRlIGZyYW1lcywgZnJvbSAyIHBhaXJzIG9mIHBvaW50cyByZXByZXNlbnRpbmcgdGhlIHNhbWUgcGh5c2ljYWwgc3BvdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUmlnaWRUcmFuc2Zvcm0oXHJcbiAgICBzb3VyY2VBOiBWZWMzLCB0YXJnZXRBOiBWZWMzLFxyXG4gICAgc291cmNlQjogVmVjMywgdGFyZ2V0QjogVmVjM1xyXG4pOiBSaWdpZFRyYW5zZm9ybSB7XHJcbiAgICBjb25zdCB2U291cmNlID0geyB4OiBzb3VyY2VCLnggLSBzb3VyY2VBLngsIHo6IHNvdXJjZUIueiAtIHNvdXJjZUEueiB9O1xyXG4gICAgY29uc3QgdlRhcmdldCA9IHsgeDogdGFyZ2V0Qi54IC0gdGFyZ2V0QS54LCB6OiB0YXJnZXRCLnogLSB0YXJnZXRBLnogfTtcclxuXHJcbiAgICBjb25zdCBhbmdsZVNvdXJjZSA9IE1hdGguYXRhbjIodlNvdXJjZS56LCB2U291cmNlLngpO1xyXG4gICAgY29uc3QgYW5nbGVUYXJnZXQgPSBNYXRoLmF0YW4yKHZUYXJnZXQueiwgdlRhcmdldC54KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHJvdGF0aW9uWVJhZDogYW5nbGVUYXJnZXQgLSBhbmdsZVNvdXJjZSxcclxuICAgICAgICByZWZTb3VyY2U6IHNvdXJjZUEsXHJcbiAgICAgICAgcmVmVGFyZ2V0OiB0YXJnZXRBXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQXBwbGllcyB0aGUgcmlnaWQgdHJhbnNmb3JtIHRvIGEgM0QgcG9zaXRpb24gKHgsIHksIHopLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSaWdpZFRyYW5zZm9ybVRvUG9pbnQocDogVmVjMywgdDogUmlnaWRUcmFuc2Zvcm0pOiBWZWMzIHtcclxuICAgIGNvbnN0IGR4ID0gcC54IC0gdC5yZWZTb3VyY2UueDtcclxuICAgIGNvbnN0IGR6ID0gcC56IC0gdC5yZWZTb3VyY2UuejtcclxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKHQucm90YXRpb25ZUmFkKTtcclxuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKHQucm90YXRpb25ZUmFkKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHg6IHQucmVmVGFyZ2V0LnggKyAoZHggKiBjb3MgLSBkeiAqIHNpbiksXHJcbiAgICAgICAgeTogdC5yZWZUYXJnZXQueSArIChwLnkgLSB0LnJlZlNvdXJjZS55KSwgLy8gdmVydGljYWwgYXhpcyBpcyBub3Qgcm90YXRlZFxyXG4gICAgICAgIHo6IHQucmVmVGFyZ2V0LnogKyAoZHggKiBzaW4gKyBkeiAqIGNvcylcclxuICAgIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIHRoZSBZIHJvdGF0aW9uIChpbiBkZWdyZWVzKSB0byBhbiBvcmllbnRhdGlvbiBhbmdsZSAoYSBwb3NlJ3MgeVJvdGF0aW9uKS5cclxuICogQSBudWxsL3VuZGVmaW5lZC9ub24tbnVtZXJpYyBhbmdsZSBpcyByZXR1cm5lZCB1bnRvdWNoZWQ6IFwibm8gb3JpZW50YXRpb24gc3RvcmVkXCJcclxuICogbXVzdCBzdGF5IFwibm8gb3JpZW50YXRpb24gc3RvcmVkXCIsIG5vdCBiZWNvbWUgdGhlIHJhdyByb3RhdGlvbiBkZWx0YS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJpZ2lkVHJhbnNmb3JtVG9ZUm90YXRpb25EZWcoeVJvdGF0aW9uRGVnOiBudW1iZXIsIHQ6IFJpZ2lkVHJhbnNmb3JtKTogbnVtYmVyIHtcclxuICAgIGlmICh5Um90YXRpb25EZWcgPT09IG51bGwgfHwgeVJvdGF0aW9uRGVnID09PSB1bmRlZmluZWQgfHwgTnVtYmVyLmlzTmFOKE51bWJlcih5Um90YXRpb25EZWcpKSkge1xyXG4gICAgICAgIHJldHVybiB5Um90YXRpb25EZWc7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZWx0YURlZyA9IHQucm90YXRpb25ZUmFkICogKDE4MCAvIE1hdGguUEkpO1xyXG4gICAgcmV0dXJuIE51bWJlcih5Um90YXRpb25EZWcpICsgZGVsdGFEZWc7XHJcbn1cclxuXHJcbi8qKiBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzLCB1c2VmdWwgdG8gdmFsaWRhdGUgbGFuZG1hcmsgcXVhbGl0eS4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlKGE6IFZlYzMsIGI6IFZlYzMpOiBudW1iZXIge1xyXG4gICAgY29uc3QgZHggPSBhLnggLSBiLngsIGR5ID0gYS55IC0gYi55LCBkeiA9IGEueiAtIGIuejtcclxuICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6KTtcclxufVxyXG4vKipcclxuICogQXBwbGllcyBPTkxZIHRoZSByb3RhdGlvbiBwYXJ0IG9mIHRoZSB0cmFuc2Zvcm0gdG8gYSBkaXJlY3Rpb24gdmVjdG9yXHJcbiAqIChhIG5vcm1hbCwgYSBzdGVtIHZlY3RvciwgLi4uKS5cclxuICpcclxuICogQSBkaXJlY3Rpb24gaGFzIG5vIG9yaWdpbiwgc28gdGhlIHRyYW5zbGF0aW9uIG11c3QgTk9UIGJlIGFwcGxpZWQgdG8gaXQg4oCUXHJcbiAqIGRvaW5nIHNvIHdvdWxkIHR1cm4gYSB1bml0IG5vcm1hbCBpbnRvIGEgcG9pbnQgc29tZXdoZXJlIGluIHRoZSB0YXJnZXQgbW9kZWwuXHJcbiAqIFVzZWQgZm9yIGEgUE9JJ3MgYG1ldGFkYXRhLm5vcm1hbGAsIHdoaWNoIGRyaXZlcyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHRhZydzXHJcbiAqIHN0ZW06IHdpdGhvdXQgdGhpcyByb3RhdGlvbiwgYSBwYXN0aWxsZSBjb3BpZWQgaW50byBhIHNwYWNlIHdob3NlIG1vZGVsIGlzXHJcbiAqIHJvdGF0ZWQgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBlbmRzIHVwIHBvaW50aW5nIGludG8gdGhlIHdhbGwgaXQgaXMgc3R1Y2sgb24uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSaWdpZFRyYW5zZm9ybVRvRGlyZWN0aW9uKHY6IFZlYzMsIHQ6IFJpZ2lkVHJhbnNmb3JtKTogVmVjMyB7XHJcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyh0LnJvdGF0aW9uWVJhZCk7XHJcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbih0LnJvdGF0aW9uWVJhZCk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB4OiB2LnggKiBjb3MgLSB2LnogKiBzaW4sXHJcbiAgICAgICAgeTogdi55LCAvLyB2ZXJ0aWNhbCBheGlzIGlzIG5vdCByb3RhdGVkXHJcbiAgICAgICAgejogdi54ICogc2luICsgdi56ICogY29zXHJcbiAgICB9O1xyXG59XHJcbiJdfQ==