@aura3d/engine 4.2.0 → 4.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +1 -1
  2. package/dist/aura3d-cli/cli-help.d.ts.map +1 -1
  3. package/dist/aura3d-cli/cli-help.js +4 -2
  4. package/dist/aura3d-cli/cli-help.js.map +1 -1
  5. package/dist/aura3d-cli/cli.js +85 -2
  6. package/dist/aura3d-cli/cli.js.map +1 -1
  7. package/dist/aura3d-cli/commands/assets/index.js +2 -2
  8. package/dist/aura3d-cli/commands/assets/index.js.map +1 -1
  9. package/dist/aura3d-cli/commands/meshyLedger.d.ts +125 -14
  10. package/dist/aura3d-cli/commands/meshyLedger.d.ts.map +1 -1
  11. package/dist/aura3d-cli/commands/meshyLedger.js +262 -35
  12. package/dist/aura3d-cli/commands/meshyLedger.js.map +1 -1
  13. package/dist/aura3d-cli/commands/prd13/run.js +19 -16
  14. package/dist/aura3d-cli/commands/prd13/run.js.map +1 -1
  15. package/dist/aura3d-cli/index.d.ts +10 -0
  16. package/dist/aura3d-cli/index.d.ts.map +1 -1
  17. package/dist/aura3d-cli/index.js +13 -0
  18. package/dist/aura3d-cli/index.js.map +1 -1
  19. package/dist/aura3d-cli/skin/analysis.d.ts +137 -0
  20. package/dist/aura3d-cli/skin/analysis.d.ts.map +1 -0
  21. package/dist/aura3d-cli/skin/analysis.js +382 -0
  22. package/dist/aura3d-cli/skin/analysis.js.map +1 -0
  23. package/dist/aura3d-cli/skin/command.d.ts +75 -0
  24. package/dist/aura3d-cli/skin/command.d.ts.map +1 -0
  25. package/dist/aura3d-cli/skin/command.js +208 -0
  26. package/dist/aura3d-cli/skin/command.js.map +1 -0
  27. package/dist/aura3d-cli/skin/glbEdit.d.ts +14 -0
  28. package/dist/aura3d-cli/skin/glbEdit.d.ts.map +1 -0
  29. package/dist/aura3d-cli/skin/glbEdit.js +152 -0
  30. package/dist/aura3d-cli/skin/glbEdit.js.map +1 -0
  31. package/dist/aura3d-cli/skin/gltf.d.ts +159 -0
  32. package/dist/aura3d-cli/skin/gltf.d.ts.map +1 -0
  33. package/dist/aura3d-cli/skin/gltf.js +379 -0
  34. package/dist/aura3d-cli/skin/gltf.js.map +1 -0
  35. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts +31 -0
  36. package/dist/aura3d-cli/skin/rebuildLimbs.d.ts.map +1 -0
  37. package/dist/aura3d-cli/skin/rebuildLimbs.js +326 -0
  38. package/dist/aura3d-cli/skin/rebuildLimbs.js.map +1 -0
  39. package/dist/aura3d-cli/skin/refitSkeleton.d.ts +23 -0
  40. package/dist/aura3d-cli/skin/refitSkeleton.d.ts.map +1 -0
  41. package/dist/aura3d-cli/skin/refitSkeleton.js +288 -0
  42. package/dist/aura3d-cli/skin/refitSkeleton.js.map +1 -0
  43. package/dist/aura3d-cli/skin/repair.d.ts +45 -0
  44. package/dist/aura3d-cli/skin/repair.d.ts.map +1 -0
  45. package/dist/aura3d-cli/skin/repair.js +192 -0
  46. package/dist/aura3d-cli/skin/repair.js.map +1 -0
  47. package/dist/create-aura3d/index.js +1 -1
  48. package/dist/engine/agent-api/camera/layers.d.ts.map +1 -1
  49. package/dist/engine/agent-api/camera/layers.js +6 -1
  50. package/dist/engine/agent-api/camera/layers.js.map +1 -1
  51. package/dist/engine/agent-api/compiler/customMaterial.d.ts.map +1 -1
  52. package/dist/engine/agent-api/compiler/customMaterial.js +12 -1
  53. package/dist/engine/agent-api/compiler/customMaterial.js.map +1 -1
  54. package/dist/engine/agent-api/compiler/lines.d.ts.map +1 -1
  55. package/dist/engine/agent-api/compiler/lines.js +8 -6
  56. package/dist/engine/agent-api/compiler/lines.js.map +1 -1
  57. package/dist/engine/agent-api/nodes/types.d.ts +6 -0
  58. package/dist/engine/agent-api/nodes/types.d.ts.map +1 -1
  59. package/dist/engine/agent-api/vfx/effects-api.d.ts.map +1 -1
  60. package/dist/engine/agent-api/vfx/effects-api.js +12 -3
  61. package/dist/engine/agent-api/vfx/effects-api.js.map +1 -1
  62. package/dist/engine/agent-api/vfx/gameEffects.d.ts.map +1 -1
  63. package/dist/engine/agent-api/vfx/gameEffects.js +20 -3
  64. package/dist/engine/agent-api/vfx/gameEffects.js.map +1 -1
  65. package/dist/engine/contracts/camera.d.ts +1 -0
  66. package/dist/engine/contracts/camera.d.ts.map +1 -1
  67. package/dist/engine/contracts/effects.d.ts +4 -2
  68. package/dist/engine/contracts/effects.d.ts.map +1 -1
  69. package/dist/engine/contracts/effects.js.map +1 -1
  70. package/dist/game/index.d.ts +2 -2
  71. package/dist/game/index.d.ts.map +1 -1
  72. package/dist/game/index.js +1 -1
  73. package/dist/game/index.js.map +1 -1
  74. package/dist/game/motion/facing.d.ts +30 -0
  75. package/dist/game/motion/facing.d.ts.map +1 -0
  76. package/dist/game/motion/facing.js +50 -0
  77. package/dist/game/motion/facing.js.map +1 -0
  78. package/dist/game/motion/handBounce.d.ts +251 -0
  79. package/dist/game/motion/handBounce.d.ts.map +1 -0
  80. package/dist/game/motion/handBounce.js +315 -0
  81. package/dist/game/motion/handBounce.js.map +1 -0
  82. package/dist/game/motion/index.d.ts +6 -0
  83. package/dist/game/motion/index.d.ts.map +1 -1
  84. package/dist/game/motion/index.js +3 -0
  85. package/dist/game/motion/index.js.map +1 -1
  86. package/dist/game/motion/twoHandGrip.d.ts +229 -0
  87. package/dist/game/motion/twoHandGrip.d.ts.map +1 -0
  88. package/dist/game/motion/twoHandGrip.js +413 -0
  89. package/dist/game/motion/twoHandGrip.js.map +1 -0
  90. package/dist/game/session/warmPrograms.d.ts +17 -0
  91. package/dist/game/session/warmPrograms.d.ts.map +1 -1
  92. package/dist/game/session/warmPrograms.js +18 -1
  93. package/dist/game/session/warmPrograms.js.map +1 -1
  94. package/dist/physics/ensure.d.ts +2 -0
  95. package/dist/physics/ensure.d.ts.map +1 -0
  96. package/dist/physics/ensure.js +4 -0
  97. package/dist/physics/ensure.js.map +1 -0
  98. package/dist/physics/index.d.ts +1 -0
  99. package/dist/physics/index.d.ts.map +1 -1
  100. package/dist/physics/index.js +1 -0
  101. package/dist/physics/index.js.map +1 -1
  102. package/dist/physics/world.d.ts +1 -0
  103. package/dist/physics/world.d.ts.map +1 -1
  104. package/dist/physics/world.js +1 -0
  105. package/dist/physics/world.js.map +1 -1
  106. package/dist/physics-rapier/index.d.ts +2 -0
  107. package/dist/physics-rapier/index.d.ts.map +1 -1
  108. package/dist/physics-rapier/index.js +12 -10
  109. package/dist/physics-rapier/index.js.map +1 -1
  110. package/dist/physics-rapier/rapierInit.d.ts +6 -0
  111. package/dist/physics-rapier/rapierInit.d.ts.map +1 -0
  112. package/dist/physics-rapier/rapierInit.js +12 -0
  113. package/dist/physics-rapier/rapierInit.js.map +1 -0
  114. package/dist/physics-rapier/rapierInit.lazy.d.ts +6 -0
  115. package/dist/physics-rapier/rapierInit.lazy.d.ts.map +1 -0
  116. package/dist/physics-rapier/rapierInit.lazy.js +19 -0
  117. package/dist/physics-rapier/rapierInit.lazy.js.map +1 -0
  118. package/dist/rendering/DepthPass.d.ts.map +1 -1
  119. package/dist/rendering/DepthPass.js +30 -8
  120. package/dist/rendering/DepthPass.js.map +1 -1
  121. package/dist/rendering/ForwardPass.d.ts.map +1 -1
  122. package/dist/rendering/ForwardPass.js +7 -0
  123. package/dist/rendering/ForwardPass.js.map +1 -1
  124. package/dist/rendering/Renderer.d.ts +0 -2
  125. package/dist/rendering/Renderer.d.ts.map +1 -1
  126. package/dist/rendering/Renderer.js +6 -16
  127. package/dist/rendering/Renderer.js.map +1 -1
  128. package/dist/rendering/contracts/output.d.ts +9 -1
  129. package/dist/rendering/contracts/output.d.ts.map +1 -1
  130. package/dist/rendering/contracts/output.js.map +1 -1
  131. package/dist/rendering/output/OutputPass.d.ts +2 -0
  132. package/dist/rendering/output/OutputPass.d.ts.map +1 -1
  133. package/dist/rendering/output/OutputPass.js +26 -3
  134. package/dist/rendering/output/OutputPass.js.map +1 -1
  135. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts +3 -1
  136. package/dist/rendering/output/ToneMappingOperators.glsl.d.ts.map +1 -1
  137. package/dist/rendering/output/ToneMappingOperators.glsl.js +19 -1
  138. package/dist/rendering/output/ToneMappingOperators.glsl.js.map +1 -1
  139. package/dist/rendering/post/v2Stages.d.ts +2 -7
  140. package/dist/rendering/post/v2Stages.d.ts.map +1 -1
  141. package/dist/rendering/post/v2Stages.js +2 -17
  142. package/dist/rendering/post/v2Stages.js.map +1 -1
  143. package/dist/rendering/post/vignetteColor.d.ts +8 -0
  144. package/dist/rendering/post/vignetteColor.d.ts.map +1 -0
  145. package/dist/rendering/post/vignetteColor.js +18 -0
  146. package/dist/rendering/post/vignetteColor.js.map +1 -0
  147. package/dist/rendering/renderer/PostprocessExecution.d.ts +10 -0
  148. package/dist/rendering/renderer/PostprocessExecution.d.ts.map +1 -1
  149. package/dist/rendering/renderer/PostprocessExecution.js +38 -38
  150. package/dist/rendering/renderer/PostprocessExecution.js.map +1 -1
  151. package/dist/rendering/renderer/coreOutputPostRoute.d.ts +25 -17
  152. package/dist/rendering/renderer/coreOutputPostRoute.d.ts.map +1 -1
  153. package/dist/rendering/renderer/coreOutputPostRoute.js +27 -18
  154. package/dist/rendering/renderer/coreOutputPostRoute.js.map +1 -1
  155. package/dist/rendering/renderer/qrSubFlags.d.ts +1 -1
  156. package/dist/rendering/renderer/qrSubFlags.d.ts.map +1 -1
  157. package/dist/rendering/renderer/qrSubFlags.js +2 -8
  158. package/dist/rendering/renderer/qrSubFlags.js.map +1 -1
  159. package/dist/rendering/shaders/chunks/author/index.d.ts.map +1 -1
  160. package/dist/rendering/shaders/chunks/author/index.js +7 -0
  161. package/dist/rendering/shaders/chunks/author/index.js.map +1 -1
  162. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts +11 -0
  163. package/dist/rendering/shaders/chunks/author/shadow.glsl.d.ts.map +1 -0
  164. package/dist/rendering/shaders/chunks/author/shadow.glsl.js +57 -0
  165. package/dist/rendering/shaders/chunks/author/shadow.glsl.js.map +1 -0
  166. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts +20 -0
  167. package/dist/rendering/shadows/DirectionalCascadeFitter.d.ts.map +1 -1
  168. package/dist/rendering/shadows/DirectionalCascadeFitter.js +80 -7
  169. package/dist/rendering/shadows/DirectionalCascadeFitter.js.map +1 -1
  170. package/dist/rendering/shadows/Prd02DepthShaderLibrary.d.ts.map +1 -1
  171. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js +9 -1
  172. package/dist/rendering/shadows/Prd02DepthShaderLibrary.js.map +1 -1
  173. package/dist/rendering/shadows/ShadowSystem.d.ts.map +1 -1
  174. package/dist/rendering/shadows/ShadowSystem.js +7 -2
  175. package/dist/rendering/shadows/ShadowSystem.js.map +1 -1
  176. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts +2 -0
  177. package/dist/rendering/webgl2/LdrPostprocessShader.d.ts.map +1 -1
  178. package/dist/rendering/webgl2/LdrPostprocessShader.js +25 -3
  179. package/dist/rendering/webgl2/LdrPostprocessShader.js.map +1 -1
  180. package/dist/rendering/webgl2/LegacyPost.d.ts +11 -2
  181. package/dist/rendering/webgl2/LegacyPost.d.ts.map +1 -1
  182. package/dist/rendering/webgl2/LegacyPost.js +191 -16
  183. package/dist/rendering/webgl2/LegacyPost.js.map +1 -1
  184. package/package.json +33 -26
  185. package/templates/cinematic-scene/package.json +2 -2
  186. package/templates/mini-game/package.json +2 -2
  187. package/templates/product-viewer/package.json +2 -2
  188. package/templates/production-asset-inspector/package.json +1 -1
  189. package/templates/production-material-studio/package.json +1 -1
  190. package/templates/production-product-configurator/package.json +1 -1
  191. package/templates/production-product-viewer/package.json +1 -1
@@ -0,0 +1,137 @@
1
+ /**
2
+ * `assets validate --skin`: poses a rigged GLB through the clips it ships and reports the defects that tore the Aura FC athletes:
3
+ * stretched triangles (the "sails" at the hips), thin long flaps, bad or distant skin weights, limb meshes that are not in the
4
+ * pose the skeleton assumes (modelled mid-stride and bound to a straight skeleton) and joint ranges no limb can reach.
5
+ */
6
+ import { type GlbData, type GltfAnimation, type Hierarchy, type SkinInfo, type SkinnedPrimitive, type WorldPose } from "./gltf.js";
7
+ export declare const SKIN_STRETCH = "SKIN_STRETCH";
8
+ export declare const SKIN_FLAP = "SKIN_FLAP";
9
+ export declare const SKIN_WEIGHT_SUM = "SKIN_WEIGHT_SUM";
10
+ export declare const SKIN_WEIGHT_DISTANT = "SKIN_WEIGHT_DISTANT";
11
+ export declare const SKIN_BIND_MISMATCH = "SKIN_BIND_MISMATCH";
12
+ export declare const SKIN_JOINT_RANGE = "SKIN_JOINT_RANGE";
13
+ export declare const SKIN_NO_SKIN = "SKIN_NO_SKIN";
14
+ export type SkinCode = typeof SKIN_STRETCH | typeof SKIN_FLAP | typeof SKIN_WEIGHT_SUM | typeof SKIN_WEIGHT_DISTANT | typeof SKIN_BIND_MISMATCH | typeof SKIN_JOINT_RANGE | typeof SKIN_NO_SKIN;
15
+ export interface SkinThresholds {
16
+ /** A triangle whose worst edge grows past this multiple of its rest length is counted (default 1.6). */
17
+ readonly stretchLimit: number;
18
+ /** A single triangle past this multiple always fails (default 2.5); between the two limits up to `stretchAllowTriangles` (or 0.1% of the triangles) only warn. */
19
+ readonly stretchHardLimit: number;
20
+ readonly stretchAllowTriangles: number;
21
+ /** Longest-edge floor of a flap, as a fraction of the model height (default 0.14). */
22
+ readonly flapEdgeFraction: number;
23
+ /** Area / longest-edge^2 below which a triangle is "thin" (equilateral is 0.43; default 0.08). */
24
+ readonly flapThin: number;
25
+ /** A limb bone whose vertices sit this far off its axis, as a fraction of the bone length, is a bind mismatch (default 0.34). */
26
+ readonly bindOffsetRatio: number;
27
+ /** Vertices with total weight outside 1 +- this fail (default 0.02). */
28
+ readonly weightSumTolerance: number;
29
+ /** An influence >= `distantMinWeight` on a bone farther than this fraction of the model height is "distant" (default 0.5). */
30
+ readonly distantFraction: number;
31
+ readonly distantMinWeight: number;
32
+ /** Humanoid joint ranges in degrees. */
33
+ readonly hipFlexMin: number;
34
+ readonly hipFlexMax: number;
35
+ readonly hipAbductionMax: number;
36
+ readonly kneeMax: number;
37
+ readonly thighTwistMax: number;
38
+ }
39
+ export declare const DEFAULT_SKIN_THRESHOLDS: SkinThresholds;
40
+ export interface SkinAnalysisOptions {
41
+ /** Clip names to pose (default: every animation in the file). */
42
+ readonly clips?: readonly string[];
43
+ /** Poses sampled per clip (default 10). */
44
+ readonly samples?: number;
45
+ readonly thresholds?: Partial<SkinThresholds>;
46
+ /** Codes reported as warnings instead of failures (default: SKIN_BIND_MISMATCH and SKIN_WEIGHT_DISTANT; their effect shows up as SKIN_STRETCH). */
47
+ readonly warnOnly?: readonly SkinCode[];
48
+ /** Report every code as a failure. */
49
+ readonly strict?: boolean;
50
+ /** Skip the check for materials matching this pattern (e.g. a rigid prop sharing the skin). */
51
+ readonly ignoreMaterials?: RegExp;
52
+ }
53
+ export interface SkinFinding {
54
+ readonly code: SkinCode;
55
+ readonly severity: "error" | "warning";
56
+ readonly message: string;
57
+ readonly primitive?: string;
58
+ readonly detail?: Record<string, unknown>;
59
+ }
60
+ export interface SkinPrimitiveReport {
61
+ readonly mesh: number;
62
+ readonly primitive: number;
63
+ readonly material: string;
64
+ readonly vertices: number;
65
+ readonly triangles: number;
66
+ readonly maxStretch: number;
67
+ readonly trianglesOverLimit: number;
68
+ readonly flaps: number;
69
+ readonly maxFlapEdge: number;
70
+ readonly weightSumBad: number;
71
+ readonly weightDistant: number;
72
+ }
73
+ export interface SkinMaterialReport {
74
+ readonly triangles: number;
75
+ readonly maxStretch: number;
76
+ readonly trianglesOverLimit: number;
77
+ readonly flaps: number;
78
+ }
79
+ export interface BindMismatchBone {
80
+ readonly bone: string;
81
+ readonly vertices: number;
82
+ readonly offset: number;
83
+ readonly boneLength: number;
84
+ readonly ratio: number;
85
+ }
86
+ export interface JointRangeRow {
87
+ readonly hipFlexMin: number;
88
+ readonly hipFlexMax: number;
89
+ readonly hipAbductionMax: number;
90
+ readonly kneeMax: number;
91
+ readonly kneeForwardFrames: number;
92
+ readonly thighTwistMax: number;
93
+ }
94
+ export interface SkinReport {
95
+ readonly ok: boolean;
96
+ readonly skinned: boolean;
97
+ readonly modelHeight: number;
98
+ readonly clips: readonly string[];
99
+ readonly samplesPerClip: number;
100
+ readonly thresholds: SkinThresholds;
101
+ readonly skins: readonly {
102
+ readonly index: number;
103
+ readonly jointCount: number;
104
+ readonly primitives: readonly SkinPrimitiveReport[];
105
+ }[];
106
+ readonly materials: Readonly<Record<string, SkinMaterialReport>>;
107
+ readonly bindMismatch: readonly BindMismatchBone[];
108
+ readonly jointRanges: Readonly<Record<string, JointRangeRow>> | null;
109
+ readonly findings: readonly SkinFinding[];
110
+ readonly failures: readonly string[];
111
+ readonly warnings: readonly string[];
112
+ readonly reasonCodes: readonly SkinCode[];
113
+ readonly messages: readonly string[];
114
+ }
115
+ /** Worst posed/rest edge stretch of every triangle over the sampled poses, per primitive, plus thin-flap data. */
116
+ export declare function samplePoses(glb: GlbData, hierarchy: Hierarchy, clips: readonly GltfAnimation[], samples: number): {
117
+ poses: WorldPose[];
118
+ clipOfPose: string[];
119
+ };
120
+ export declare function triangleStretch(skin: SkinInfo, prim: SkinnedPrimitive, poses: readonly WorldPose[], flapEdge: number, flapThin: number, flapOutlier?: number): {
121
+ worst: Float32Array;
122
+ flap: Uint8Array;
123
+ flapEdgeMax: number;
124
+ };
125
+ export interface HumanoidLegs {
126
+ readonly up: number;
127
+ readonly knee: number;
128
+ readonly foot: number;
129
+ }
130
+ /** Recognises Meshy/Mixamo/VRM-style leg bone names; returns null when the rig is not a recognised humanoid. */
131
+ export declare function findHumanoidLegs(hierarchy: Hierarchy): HumanoidLegs[] | null;
132
+ /** Hip/knee/twist ranges of the humanoid legs per clip (degrees); null when the rig is not a recognised humanoid. */
133
+ export declare function jointRanges(glb: GlbData, hierarchy: Hierarchy, clips: readonly GltfAnimation[], samples?: number): Record<string, JointRangeRow> | null;
134
+ /** Per bone: how far the centroid of the vertices it dominates sits from the bone's axis, relative to the bone length (bind pose). */
135
+ export declare function bindMismatch(skins: readonly SkinInfo[], hierarchy: Hierarchy, height: number, ratioLimit: number): BindMismatchBone[];
136
+ export declare function analyzeSkin(glb: GlbData, options?: SkinAnalysisOptions): SkinReport;
137
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,382 @@
1
+ /**
2
+ * `assets validate --skin`: poses a rigged GLB through the clips it ships and reports the defects that tore the Aura FC athletes:
3
+ * stretched triangles (the "sails" at the hips), thin long flaps, bad or distant skin weights, limb meshes that are not in the
4
+ * pose the skeleton assumes (modelled mid-stride and bound to a straight skeleton) and joint ranges no limb can reach.
5
+ */
6
+ import { buildHierarchy, clipDuration, forward, jointBindPositions, localPose, loadSkins, qconj, qmul, skinnedPositions, vdist, vdot, vlen, vsub } from "./gltf.js";
7
+ export const SKIN_STRETCH = "SKIN_STRETCH";
8
+ export const SKIN_FLAP = "SKIN_FLAP";
9
+ export const SKIN_WEIGHT_SUM = "SKIN_WEIGHT_SUM";
10
+ export const SKIN_WEIGHT_DISTANT = "SKIN_WEIGHT_DISTANT";
11
+ export const SKIN_BIND_MISMATCH = "SKIN_BIND_MISMATCH";
12
+ export const SKIN_JOINT_RANGE = "SKIN_JOINT_RANGE";
13
+ export const SKIN_NO_SKIN = "SKIN_NO_SKIN";
14
+ export const DEFAULT_SKIN_THRESHOLDS = {
15
+ stretchLimit: 1.6,
16
+ stretchHardLimit: 2.5,
17
+ stretchAllowTriangles: 2,
18
+ flapEdgeFraction: 0.14,
19
+ flapThin: 0.08,
20
+ bindOffsetRatio: 0.34,
21
+ weightSumTolerance: 0.02,
22
+ distantFraction: 0.5,
23
+ distantMinWeight: 0.15,
24
+ hipFlexMin: -70,
25
+ hipFlexMax: 120,
26
+ hipAbductionMax: 75,
27
+ kneeMax: 155,
28
+ thighTwistMax: 60
29
+ };
30
+ const DEG = 180 / Math.PI;
31
+ /** Trunk and root bones: their vertex cloud is wide and not a limb, so the axis-offset test does not apply. */
32
+ const TRUNK_BONE = /spine|chest|hips|pelvis|neck|head|shoulder|clavicle|root|armature|jaw|eye|tongue|hair|breast|skirt|cape|tail/i;
33
+ const round = (n, d = 3) => Math.round(n * 10 ** d) / 10 ** d;
34
+ function triArea(a, b, c) {
35
+ const u = vsub(b, a), v = vsub(c, a);
36
+ return 0.5 * Math.hypot(u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0]);
37
+ }
38
+ /** Worst posed/rest edge stretch of every triangle over the sampled poses, per primitive, plus thin-flap data. */
39
+ export function samplePoses(glb, hierarchy, clips, samples) {
40
+ const poses = [];
41
+ const clipOfPose = [];
42
+ for (const anim of clips) {
43
+ const dur = clipDuration(glb, anim);
44
+ for (let s = 0; s < samples; s += 1) {
45
+ poses.push(forward(localPose(glb, anim, (dur * s) / samples, hierarchy), hierarchy));
46
+ clipOfPose.push(anim.name ?? "clip");
47
+ }
48
+ }
49
+ return { poses, clipOfPose };
50
+ }
51
+ export function triangleStretch(skin, prim, poses, flapEdge, flapThin, flapOutlier = 2.5) {
52
+ const nTri = Math.floor(prim.indices.length / 3);
53
+ const worst = new Float32Array(nTri);
54
+ const flap = new Uint8Array(nTri);
55
+ let flapEdgeMax = 0;
56
+ const rest = prim.pos;
57
+ const restLen = (a, b) => Math.max(vdist(rest[a], rest[b]), 0.004);
58
+ const restEdges = [];
59
+ for (let t = 0; t < nTri; t += 1) {
60
+ const a = prim.indices[t * 3] ?? 0, b = prim.indices[t * 3 + 1] ?? 0, c = prim.indices[t * 3 + 2] ?? 0;
61
+ restEdges.push([restLen(a, b), restLen(b, c), restLen(c, a)]);
62
+ }
63
+ // A flap is a thin triangle much longer than the mesh's normal triangles (long thin strips that tile a sleeve or trouser leg are not).
64
+ const sortedEdges = restEdges.map((e) => Math.max(...e)).sort((a, b) => a - b);
65
+ const p95 = sortedEdges[Math.floor(sortedEdges.length * 0.95)] ?? 0;
66
+ const flapFloor = Math.max(flapEdge, flapOutlier * p95);
67
+ for (const pose of poses) {
68
+ const out = skinnedPositions(skin, prim, pose);
69
+ for (let t = 0; t < nTri; t += 1) {
70
+ const a = prim.indices[t * 3] ?? 0, b = prim.indices[t * 3 + 1] ?? 0, c = prim.indices[t * 3 + 2] ?? 0;
71
+ const pa = out[a], pb = out[b], pc = out[c];
72
+ const e0 = vdist(pa, pb), e1 = vdist(pb, pc), e2 = vdist(pc, pa);
73
+ const re = restEdges[t];
74
+ const r = Math.max(e0 / re[0], e1 / re[1], e2 / re[2]);
75
+ if (r > worst[t])
76
+ worst[t] = r;
77
+ const longest = Math.max(e0, e1, e2);
78
+ if (longest > flapFloor && triArea(pa, pb, pc) / (longest * longest) < flapThin) {
79
+ flap[t] = 1;
80
+ if (longest > flapEdgeMax)
81
+ flapEdgeMax = longest;
82
+ }
83
+ }
84
+ }
85
+ return { worst, flap, flapEdgeMax };
86
+ }
87
+ function modelHeight(skins) {
88
+ let lo = Infinity, hi = -Infinity;
89
+ for (const skin of skins)
90
+ for (const prim of skin.primitives)
91
+ for (const p of prim.pos) {
92
+ lo = Math.min(lo, p[1]);
93
+ hi = Math.max(hi, p[1]);
94
+ }
95
+ return Number.isFinite(lo) && hi > lo ? hi - lo : 1;
96
+ }
97
+ function dominantJoint(prim, v) {
98
+ let best = 0, joint = 0;
99
+ const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
100
+ for (let k = 0; k < 4; k += 1)
101
+ if ((w[k] ?? 0) > best) {
102
+ best = w[k] ?? 0;
103
+ joint = j[k] ?? 0;
104
+ }
105
+ return { joint, weight: best };
106
+ }
107
+ /** Distance from a point to a segment. */
108
+ function segmentDistance(p, a, b) {
109
+ const ab = vsub(b, a);
110
+ const l2 = vdot(ab, ab);
111
+ if (l2 < 1e-12)
112
+ return vdist(p, a);
113
+ const t = Math.max(0, Math.min(1, vdot(vsub(p, a), ab) / l2));
114
+ return vdist(p, [a[0] + ab[0] * t, a[1] + ab[1] * t, a[2] + ab[2] * t]);
115
+ }
116
+ const LEG_NAMES = [
117
+ { up: /^(mixamorig:?)?left(upper)?(up)?(leg|thigh)$/i, low: /^(mixamorig:?)?left(lower)?(leg|shin|calf)$/i, foot: /^(mixamorig:?)?left(foot|ankle)$/i },
118
+ { up: /^(mixamorig:?)?right(upper)?(up)?(leg|thigh)$/i, low: /^(mixamorig:?)?right(lower)?(leg|shin|calf)$/i, foot: /^(mixamorig:?)?right(foot|ankle)$/i }
119
+ ];
120
+ /** Recognises Meshy/Mixamo/VRM-style leg bone names; returns null when the rig is not a recognised humanoid. */
121
+ export function findHumanoidLegs(hierarchy) {
122
+ const legs = [];
123
+ for (const spec of LEG_NAMES) {
124
+ const names = hierarchy.names;
125
+ const up = names.findIndex((n) => spec.up.test(n) && /up|thigh/i.test(n));
126
+ const foot = names.findIndex((n) => spec.foot.test(n));
127
+ if (up < 0 || foot < 0)
128
+ return null;
129
+ let knee = -1;
130
+ for (let i = 0; i < names.length; i += 1) {
131
+ if (!spec.low.test(names[i]) || i === up)
132
+ continue;
133
+ if (hierarchy.parent[i] === up) {
134
+ knee = i;
135
+ break;
136
+ }
137
+ }
138
+ if (knee < 0)
139
+ return null;
140
+ legs.push({ up, knee, foot });
141
+ }
142
+ return legs;
143
+ }
144
+ function legAngles(pose, rest, leg) {
145
+ const unit = (a) => { const l = vlen(a) || 1; return [a[0] / l, a[1] / l, a[2] / l]; };
146
+ const thigh = unit(vsub(pose.pos[leg.knee], pose.pos[leg.up]));
147
+ const shin = unit(vsub(pose.pos[leg.foot], pose.pos[leg.knee]));
148
+ const rThigh = unit(vsub(rest.pos[leg.knee], rest.pos[leg.up]));
149
+ const flex = (Math.atan2(thigh[2], -thigh[1]) - Math.atan2(rThigh[2], -rThigh[1])) * DEG;
150
+ const abd = (Math.atan2(thigh[0], -thigh[1]) - Math.atan2(rThigh[0], -rThigh[1])) * DEG;
151
+ const knee = Math.acos(Math.max(-1, Math.min(1, vdot(thigh, shin)))) * DEG;
152
+ const shinBack = Math.atan2(shin[2], -shin[1]) - Math.atan2(thigh[2], -thigh[1]);
153
+ const quat = (m) => {
154
+ const sx = Math.hypot(m[0] ?? 0, m[1] ?? 0, m[2] ?? 0) || 1, sy = Math.hypot(m[4] ?? 0, m[5] ?? 0, m[6] ?? 0) || 1, sz = Math.hypot(m[8] ?? 0, m[9] ?? 0, m[10] ?? 0) || 1;
155
+ const r00 = (m[0] ?? 0) / sx, r10 = (m[1] ?? 0) / sx, r20 = (m[2] ?? 0) / sx, r01 = (m[4] ?? 0) / sy, r11 = (m[5] ?? 0) / sy, r21 = (m[6] ?? 0) / sy, r02 = (m[8] ?? 0) / sz, r12 = (m[9] ?? 0) / sz, r22 = (m[10] ?? 0) / sz;
156
+ const tr = r00 + r11 + r22;
157
+ if (tr > 0) {
158
+ const s = Math.sqrt(tr + 1) * 2;
159
+ return [(r21 - r12) / s, (r02 - r20) / s, (r10 - r01) / s, 0.25 * s];
160
+ }
161
+ if (r00 > r11 && r00 > r22) {
162
+ const s = Math.sqrt(1 + r00 - r11 - r22) * 2;
163
+ return [0.25 * s, (r01 + r10) / s, (r02 + r20) / s, (r21 - r12) / s];
164
+ }
165
+ if (r11 > r22) {
166
+ const s = Math.sqrt(1 + r11 - r00 - r22) * 2;
167
+ return [(r01 + r10) / s, 0.25 * s, (r12 + r21) / s, (r02 - r20) / s];
168
+ }
169
+ const s = Math.sqrt(1 + r22 - r00 - r11) * 2;
170
+ return [(r02 + r20) / s, (r12 + r21) / s, 0.25 * s, (r10 - r01) / s];
171
+ };
172
+ const delta = qmul(quat(pose.world[leg.up]), qconj(quat(rest.world[leg.up])));
173
+ const s = vdot([delta[0], delta[1], delta[2]], rThigh);
174
+ let twist = 2 * Math.atan2(s, delta[3]) * DEG;
175
+ if (twist > 180)
176
+ twist -= 360;
177
+ if (twist < -180)
178
+ twist += 360;
179
+ return { flex, abd, knee, kneeForward: shinBack > 1e-3 && knee > 3, twist };
180
+ }
181
+ /** Hip/knee/twist ranges of the humanoid legs per clip (degrees); null when the rig is not a recognised humanoid. */
182
+ export function jointRanges(glb, hierarchy, clips, samples = 24) {
183
+ const legs = findHumanoidLegs(hierarchy);
184
+ if (!legs)
185
+ return null;
186
+ const rest = forward(localPose(glb, null, 0, hierarchy), hierarchy);
187
+ const out = {};
188
+ for (const anim of clips) {
189
+ const dur = clipDuration(glb, anim);
190
+ const acc = { hipFlexMin: Infinity, hipFlexMax: -Infinity, hipAbductionMax: 0, kneeMax: 0, kneeForwardFrames: 0, thighTwistMax: 0 };
191
+ for (let s = 0; s < samples; s += 1) {
192
+ const pose = forward(localPose(glb, anim, (dur * s) / samples, hierarchy), hierarchy);
193
+ for (const leg of legs) {
194
+ const a = legAngles(pose, rest, leg);
195
+ acc.hipFlexMin = Math.min(acc.hipFlexMin, a.flex);
196
+ acc.hipFlexMax = Math.max(acc.hipFlexMax, a.flex);
197
+ acc.hipAbductionMax = Math.max(acc.hipAbductionMax, Math.abs(a.abd));
198
+ acc.kneeMax = Math.max(acc.kneeMax, a.knee);
199
+ if (a.kneeForward)
200
+ acc.kneeForwardFrames += 1;
201
+ acc.thighTwistMax = Math.max(acc.thighTwistMax, Math.abs(a.twist));
202
+ }
203
+ }
204
+ out[anim.name ?? "clip"] = {
205
+ hipFlexMin: round(Number.isFinite(acc.hipFlexMin) ? acc.hipFlexMin : 0, 1), hipFlexMax: round(Number.isFinite(acc.hipFlexMax) ? acc.hipFlexMax : 0, 1),
206
+ hipAbductionMax: round(acc.hipAbductionMax, 1), kneeMax: round(acc.kneeMax, 1), kneeForwardFrames: acc.kneeForwardFrames, thighTwistMax: round(acc.thighTwistMax, 1)
207
+ };
208
+ }
209
+ return out;
210
+ }
211
+ /** Per bone: how far the centroid of the vertices it dominates sits from the bone's axis, relative to the bone length (bind pose). */
212
+ export function bindMismatch(skins, hierarchy, height, ratioLimit) {
213
+ const flagged = [];
214
+ for (const skin of skins) {
215
+ const bindPos = jointBindPositions(skin);
216
+ const sums = new Map();
217
+ for (const prim of skin.primitives) {
218
+ for (let v = 0; v < prim.pos.length; v += 1) {
219
+ const d = dominantJoint(prim, v);
220
+ if (d.weight < 0.6)
221
+ continue;
222
+ const p = prim.pos[v];
223
+ const entry = sums.get(d.joint) ?? { sum: [0, 0, 0], n: 0 };
224
+ entry.sum[0] += p[0];
225
+ entry.sum[1] += p[1];
226
+ entry.sum[2] += p[2];
227
+ entry.n += 1;
228
+ sums.set(d.joint, entry);
229
+ }
230
+ }
231
+ for (const [jointIndex, { sum, n }] of sums) {
232
+ if (n < 25)
233
+ continue;
234
+ const node = skin.joints[jointIndex];
235
+ if (node === undefined)
236
+ continue;
237
+ const childIndex = skin.joints.findIndex((c) => hierarchy.parent[c] === node);
238
+ if (childIndex < 0)
239
+ continue;
240
+ const a = bindPos[jointIndex], b = bindPos[childIndex];
241
+ const length = vdist(a, b);
242
+ if (length < 0.06 * height)
243
+ continue;
244
+ if (TRUNK_BONE.test(hierarchy.names[node] ?? ""))
245
+ continue;
246
+ const centroid = [sum[0] / n, sum[1] / n, sum[2] / n];
247
+ const offset = segmentDistance(centroid, a, b);
248
+ const ratio = offset / length;
249
+ if (ratio > ratioLimit)
250
+ flagged.push({ bone: hierarchy.names[node] ?? `joint${node}`, vertices: n, offset: round(offset), boneLength: round(length), ratio: round(ratio, 2) });
251
+ }
252
+ }
253
+ return flagged;
254
+ }
255
+ export function analyzeSkin(glb, options = {}) {
256
+ const thresholds = { ...DEFAULT_SKIN_THRESHOLDS, ...options.thresholds };
257
+ const hierarchy = buildHierarchy(glb);
258
+ const allSkins = loadSkins(glb, hierarchy);
259
+ const warnOnly = new Set(options.strict ? [] : options.warnOnly ?? [SKIN_BIND_MISMATCH, SKIN_WEIGHT_DISTANT]);
260
+ const findings = [];
261
+ const push = (code, message, primitive, detail) => {
262
+ findings.push({ code, severity: warnOnly.has(code) ? "warning" : "error", message, ...(primitive ? { primitive } : {}), ...(detail ? { detail } : {}) });
263
+ };
264
+ const skins = allSkins.map((s) => ({ ...s, primitives: s.primitives.filter((p) => !(options.ignoreMaterials?.test(p.materialName))) }));
265
+ const animations = glb.json.animations ?? [];
266
+ const clips = options.clips ? animations.filter((a) => options.clips?.includes(a.name ?? "")) : animations;
267
+ const samples = Math.max(2, options.samples ?? 10);
268
+ const base = { thresholds, samplesPerClip: samples };
269
+ if (skins.length === 0 || skins.every((s) => s.primitives.length === 0)) {
270
+ return {
271
+ ok: true, skinned: false, modelHeight: 0, clips: [], ...base, skins: [], materials: {}, bindMismatch: [], jointRanges: null, findings: [], failures: [], warnings: [],
272
+ reasonCodes: [], messages: ["No skinned mesh: skin check not applicable."]
273
+ };
274
+ }
275
+ const height = modelHeight(skins);
276
+ const flapEdge = thresholds.flapEdgeFraction * height;
277
+ const restPose = forward(localPose(glb, null, 0, hierarchy), hierarchy);
278
+ const bindPositions = new Map(skins.map((s) => [s.index, jointBindPositions(s)]));
279
+ const { poses } = samplePoses(glb, hierarchy, clips, samples);
280
+ const evalPoses = poses.length > 0 ? poses : [restPose];
281
+ const skinReports = [];
282
+ const materials = {};
283
+ for (const skin of skins) {
284
+ const primReports = [];
285
+ for (const prim of skin.primitives) {
286
+ const label = `${prim.materialName} (mesh ${prim.meshIndex} prim ${prim.primitiveIndex})`;
287
+ const { worst, flap, flapEdgeMax } = triangleStretch(skin, prim, evalPoses, flapEdge, thresholds.flapThin);
288
+ let maxStretch = 0, over = 0, flaps = 0;
289
+ for (let t = 0; t < worst.length; t += 1) {
290
+ const w = worst[t];
291
+ if (w > maxStretch)
292
+ maxStretch = w;
293
+ if (w > thresholds.stretchLimit)
294
+ over += 1;
295
+ if (flap[t])
296
+ flaps += 1;
297
+ }
298
+ // weights
299
+ let weightSumBad = 0, weightDistant = 0;
300
+ const distantLimit = thresholds.distantFraction * height;
301
+ const jointCount = skin.joints.length;
302
+ for (let v = 0; v < prim.pos.length; v += 1) {
303
+ const w = prim.weights[v] ?? [], j = prim.joints[v] ?? [];
304
+ const sum = w.reduce((a, b) => a + b, 0);
305
+ let badIndex = false;
306
+ for (let k = 0; k < 4; k += 1)
307
+ if ((w[k] ?? 0) > 0 && (j[k] ?? 0) >= jointCount)
308
+ badIndex = true;
309
+ if (!Number.isFinite(sum) || Math.abs(sum - 1) > thresholds.weightSumTolerance || badIndex)
310
+ weightSumBad += 1;
311
+ for (let k = 0; k < 4; k += 1) {
312
+ if ((w[k] ?? 0) < thresholds.distantMinWeight)
313
+ continue;
314
+ const at = (bindPositions.get(skin.index) ?? [])[j[k] ?? 0];
315
+ if (!at)
316
+ continue;
317
+ if (vdist(prim.pos[v], at) > distantLimit) {
318
+ weightDistant += 1;
319
+ break;
320
+ }
321
+ }
322
+ }
323
+ primReports.push({
324
+ mesh: prim.meshIndex, primitive: prim.primitiveIndex, material: prim.materialName, vertices: prim.pos.length, triangles: worst.length,
325
+ maxStretch: round(maxStretch, 2), trianglesOverLimit: over, flaps, maxFlapEdge: round(flapEdgeMax), weightSumBad, weightDistant
326
+ });
327
+ const m = materials[prim.materialName] ?? { triangles: 0, maxStretch: 0, trianglesOverLimit: 0, flaps: 0 };
328
+ m.triangles += worst.length;
329
+ m.maxStretch = Math.max(m.maxStretch, round(maxStretch, 2));
330
+ m.trianglesOverLimit += over;
331
+ m.flaps += flaps;
332
+ materials[prim.materialName] = m;
333
+ const allowed = Math.max(thresholds.stretchAllowTriangles, Math.floor(worst.length * 0.001));
334
+ if (over > 0 && (maxStretch > thresholds.stretchHardLimit || over > allowed))
335
+ push(SKIN_STRETCH, `${label}: ${over} of ${worst.length} triangles stretch past ${thresholds.stretchLimit}x their rest edges (worst ${round(maxStretch, 2)}x) in the played clips (${SKIN_STRETCH}). Bridging triangles between parts that move independently, or a mesh bound in a different pose than its skeleton. Run assets repair-skin.`, label, { triangles: over, worst: round(maxStretch, 2) });
336
+ if (over > 0 && !(maxStretch > thresholds.stretchHardLimit || over > allowed))
337
+ findings.push({ code: SKIN_STRETCH, severity: "warning", message: `${label}: ${over} triangle(s) stretch past ${thresholds.stretchLimit}x (worst ${round(maxStretch, 2)}x), within the allowance of ${allowed} (${SKIN_STRETCH}).`, primitive: label });
338
+ if (flaps > 0)
339
+ push(SKIN_FLAP, `${label}: ${flaps} thin triangle(s) with a posed edge up to ${round(flapEdgeMax)} m (> ${round(flapEdge)} m): they draw as shards or sails once a limb swings (${SKIN_FLAP}).`, label, { flaps, longestEdge: round(flapEdgeMax) });
340
+ if (weightSumBad > 0)
341
+ push(SKIN_WEIGHT_SUM, `${label}: ${weightSumBad} vertices have skin weights that do not sum to 1 (+-${thresholds.weightSumTolerance}) or point past the joint list (${SKIN_WEIGHT_SUM}). assets repair-skin --normalize fixes it.`, label, { vertices: weightSumBad });
342
+ if (weightDistant > 0)
343
+ push(SKIN_WEIGHT_DISTANT, `${label}: ${weightDistant} vertices are influenced (>= ${thresholds.distantMinWeight}) by a bone farther than ${round(distantLimit)} m (${SKIN_WEIGHT_DISTANT}). assets repair-skin --prune-distant removes those influences.`, label, { vertices: weightDistant });
344
+ }
345
+ skinReports.push({ index: skin.index, jointCount: skin.joints.length, primitives: primReports });
346
+ }
347
+ const mismatch = bindMismatch(skins, hierarchy, height, thresholds.bindOffsetRatio);
348
+ if (mismatch.length > 0) {
349
+ push(SKIN_BIND_MISMATCH, `${mismatch.length} bone(s) are not inside the mesh they move: ${mismatch.slice(0, 4).map((b) => `${b.bone} (vertices ${b.offset} m off a ${b.boneLength} m bone)`).join(", ")} (${SKIN_BIND_MISMATCH}). The mesh was modelled in a different pose than the skeleton assumes (typically mid-stride), so every clip rotates the limbs about joints off the limb. Rebuild the limbs in the skeleton's pose (assets repair-skin --rebuild-limbs) or re-rig.`, undefined, { bones: mismatch });
350
+ }
351
+ const ranges = jointRanges(glb, hierarchy, clips);
352
+ if (ranges) {
353
+ for (const [clip, r] of Object.entries(ranges)) {
354
+ const bad = [];
355
+ if (r.hipFlexMin < thresholds.hipFlexMin || r.hipFlexMax > thresholds.hipFlexMax)
356
+ bad.push(`hip flexion ${r.hipFlexMin}..${r.hipFlexMax} deg`);
357
+ if (r.hipAbductionMax > thresholds.hipAbductionMax)
358
+ bad.push(`hip abduction ${r.hipAbductionMax} deg`);
359
+ if (r.kneeMax > thresholds.kneeMax)
360
+ bad.push(`knee flexion ${r.kneeMax} deg`);
361
+ if (r.kneeForwardFrames > 0)
362
+ bad.push(`knee bends forward in ${r.kneeForwardFrames} sampled frames`);
363
+ if (r.thighTwistMax > thresholds.thighTwistMax)
364
+ bad.push(`thigh twist ${r.thighTwistMax} deg`);
365
+ if (bad.length > 0)
366
+ push(SKIN_JOINT_RANGE, `clip "${clip}": ${bad.join("; ")} (${SKIN_JOINT_RANGE}).`, undefined, { clip, ...r });
367
+ }
368
+ }
369
+ const failures = findings.filter((f) => f.severity === "error").map((f) => f.message);
370
+ const warnings = findings.filter((f) => f.severity === "warning").map((f) => f.message);
371
+ const ok = failures.length === 0;
372
+ const worstMaterial = Object.entries(materials).sort((a, b) => b[1].maxStretch - a[1].maxStretch)[0];
373
+ return {
374
+ ok, skinned: true, modelHeight: round(height), clips: clips.map((c) => c.name ?? "clip"), ...base,
375
+ skins: skinReports, materials, bindMismatch: mismatch, jointRanges: ranges, findings, failures, warnings,
376
+ reasonCodes: [...new Set(findings.map((f) => f.code))],
377
+ messages: ok
378
+ ? [`Skin check passed: ${skinReports.reduce((n, s) => n + s.primitives.reduce((m, p) => m + p.triangles, 0), 0)} triangles over ${clips.length} clip(s); worst stretch ${worstMaterial ? `${worstMaterial[1].maxStretch}x (${worstMaterial[0]})` : "n/a"}.`]
379
+ : failures
380
+ };
381
+ }
382
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../../../../../packages/aura3d-cli/src/skin/analysis.ts"],"names":[],"mappings":"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"}