From 258bce8adcea6e29644535d3082d7ec90cfe5b20 Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Mon, 30 Sep 2024 20:03:28 -0500 Subject: [PATCH] Rename arrayReduce to reduce (#4030) I think when we make reduce work with objects, we'll either keep the same function and make it polymorphic, or we'll have namespaces/modules and use Array.reduce and Object.reduce. Either way this name can be changed. --- docs/kcl/arrayReduce.md | 47 - docs/kcl/index.md | 2 +- docs/kcl/reduce.md | 47 + docs/kcl/std.json | 7722 ++++++++--------- src/wasm-lib/Cargo.lock | 2 +- src/wasm-lib/kcl/src/std/array.rs | 10 +- src/wasm-lib/kcl/src/std/mod.rs | 2 +- ...e0.png => serial_test_example_reduce0.png} | Bin 8 files changed, 3916 insertions(+), 3916 deletions(-) delete mode 100644 docs/kcl/arrayReduce.md create mode 100644 docs/kcl/reduce.md rename src/wasm-lib/kcl/tests/outputs/{serial_test_example_array_reduce0.png => serial_test_example_reduce0.png} (100%) diff --git a/docs/kcl/arrayReduce.md b/docs/kcl/arrayReduce.md deleted file mode 100644 index 1c8796ccc..000000000 --- a/docs/kcl/arrayReduce.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: "arrayReduce" -excerpt: "Take a starting value. Then, for each element of an array, calculate the next value," -layout: manual ---- - -Take a starting value. Then, for each element of an array, calculate the next value, - -using the previous value and the element. - -```js -arrayReduce(array: [u64], start: Sketch, reduce_fn: FunctionParam) -> Sketch -``` - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `array` | `[u64]` | | Yes | -| `start` | [`Sketch`](/docs/kcl/types/Sketch) | A sketch is a collection of paths. | Yes | -| `reduce_fn` | `FunctionParam` | | Yes | - -### Returns - -[`Sketch`](/docs/kcl/types/Sketch) - A sketch is a collection of paths. - - -### Examples - -```js -fn decagon = (radius) => { - let step = 1 / 10 * tau() - let sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius]) - return arrayReduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], sketch001, (i, sg) => { - let x = cos(step * i) * radius - let y = sin(step * i) * radius - return lineTo([x, y], sg) -}) -} -decagon(5.0) - |> close(%) -``` - -![Rendered example of arrayReduce 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABwA0lEQVR4Ae3gAZAkSZIkSRKLqpm7R0REZmZmVlVVVVV3d3d3d/fMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMdHd3d3dXV1VVVVVmZkZGRIS7m5kKz0xmV3d1d3dPz8zMzMxMYn3Qgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVV/w9dc801D36xF3ux1z5z5syDrrnmmge/2Iu92Gtz1f9J//AP//Db//AP//A79913363/8A//8NtcddVVV1111VVX/f+CHvSgB3HVVVddddVVV131f90111zz4Nd+7dd+L4B3eqd3+mye6U//9E9/jKv+z3vFV3zFdwC47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuur/NvSgBz2Iq6666qqrrrrqqv9rrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVz1/95rvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/t6AHPehBXHXVVVddddVVV/1vds011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+aZfvd3f/e7uOqqf8FrvuZrvg/Afffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqqquuuup/N/SgBz2Iq6666qqrrrrqqv9NrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jzT7/7u734XV1317/Sar/ma7wNw33333QrwD//wD7/9D//wD7/zW7/1W9/NVVddddVVV1111f8u6EEPehBXXXXVVVddddVV/5Ndc801D37t137t9wJ4ndd5nfe+5pprHgzwu7/7u9/FVVf9F3nN13zN9wG47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuup/LvSgBz2Iq6666qqrrrrqqv9Jrrnmmge/9mu/9ntdc801D36d13md9+aZfvd3f/e7uOqq/yFe8zVf830A7rvvvlv/4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqquuuuqqq676nwM96EEP4qqrrrrqqquuuuq/0zXXXPPg137t136vF3/xF3/tF3uxF3ttnul3f/d3v4urrvpf4jVf8zXfB+C+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXVVVdd9d8HPehBD+Kqq6666qqrrrrqv8o111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6bZ/rd3/3d7+Kqq/6PeM3XfM33AbjvvvtuBfiHf/iH3/6Hf/iH3/mt3/qt7+aqq6666qqrrrrqvw560IMexFVXXXXVVVddddV/lmuuuebBL/ZiL/baZ86cedCLv/iLv/aLvdiLvTbA7/7u734XV131/8xrvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/OdCDHvQgrrrqqquuuuqqq/6jXHPNNQ9+7dd+7fcCeKd3eqfP5pl+93d/97u46qqrnsNrvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/MdCDHvQgrrrqqquuuuqqq/6trrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVx11VX/Kq/5mq/5PgD33Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVVddddVVV/3boAc96EFcddVVV1111VVXvSiuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPNPv/u7vfhdXXXXVf6jXfM3XfB+A++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddWLBj3oQQ/iqquuuuqqq6666vm55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr80y/+7u/+11cddVV/6Ve8zVf830A7rvvvlsB/uEf/uG3/+Ef/uF3fuu3fuu7ueqqq6666qqrrnr+0IMe9CCuuuqqq6666qqrAK655poHv/Zrv/Z7AbzO67zOe19zzTUPBvjd3/3d7+Kqq676H+k1X/M13wfgvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uuuuqqq6666ipAD3rQg7jqqquuuuqqq/5/uuaaax782q/92u8F8E7v9E6fzTP97u/+7ndx1VVX/a/0mq/5mu8DcPbs2Wf8/d///W/9wz/8w+/cd999t/7DP/zDb3PVVVddddVVV/1/hB70oAdx1VVXXXXVVVf9/3DNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem2f63d/93e/iqquu+j/pNV/zNd8H4L777rv17Nmzz/j7v//73/qHf/iH3/mHf/iH3+aqq6666qqrrvr/AD3oQQ/iqquuuuqqq676v+eaa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/NM/3u7/7ud3HVVVf9v/Sar/ma7wNw33333QrwD//wD7/zW7/1W9/9D//wD7/NVVddddVVV131fxF60IMexFVXXXXVVVdd9b/fNddc8+AXe7EXe+0zZ8486MVf/MVf+8Ve7MVeG+B3f/d3v4urrrrqqhfiNV/zNd8H4L777rv1H/7hH377H/7hH37nH/7hH377vvvuu5Wrrrrqqquuuup/O/SgBz2Iq6666qqrrrrqf59rrrnmwa/92q/9XgDv9E7v9Nk80+/+7u9+F1ddddVV/w6v+Zqv+T4A9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVf/boAc96EFcddVVV1111VX/811zzTUPfu3Xfu33evEXf/HXfrEXe7HX5pl+93d/97u46qqrrvpP9Jqv+ZrvA3Dffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVddddVVV131Px160IMexFVXXXXVVVdd9T/LNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem2f63d/93e/iqquuuuq/0Wu+5mu+D8DZs2efcd999z397//+73/7H/7hH37nH/7hH36bq6666qqrrrrqfxr0oAc9iKuuuuqqq6666r/XNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem2f63d/93e/iqquuuup/sNd8zdd8H4D77rvvVkn6+7//+9/6h3/4h9/5rd/6re/mqquuuuqqq67674Ye9KAHcdVVV1111VVX/de65pprHvzar/3a7wXwOq/zOu99zTXXPBjgd3/3d7+Lq6666qr/A17zNV/zfQDuu+++W//hH/7hd/7hH/7ht++7775b/+Ef/uG3ueqqq6666qqr/iuhBz3oQVx11VVXXXXVVf+5rrnmmge/9mu/9nsBvNM7vdNn80y/+7u/+11cddVVV/0/8Jqv+ZrvA3Dffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVddddVVV131nwk96EEP4qqrrrrqqquu+o91zTXXPPi1X/u13+vFX/zFX/vFXuzFXptn+t3f/d3v4qqrrrrqKl7zNV/zfQDuu+++W8+ePXvr3//93//2P/zDP/zOP/zDP/w2V1111VVXXXXVfyT0oAc9iKuuuuqqq6666j/GNddc8+AP//AP/64zZ848+Jprrnnw7/7u734XV1111VVX/Yte8zVf833Onj37jPvuu+/pX//1X/8+9913361cddVVV1111VX/ESjHjx/nqquuuuqqq67693uxF3ux1/6Kr/iKv7rmmmse/Bd/8Rc/9YxnPOOvueqqq6666kXyjGc846/PnTv39Fd4hVd4m1d8xVd866Ojo0u33nrrX3PVVVddddVVV/17oQc96EFcddVVV1111VX/Pu/4ju/4We/0Tu/02b/7u7/7XVx11VVXXfXv9uhHP/p1fuu3fuu7f/RHf/RzuOqqq6666qqr/j3Qgx70IK666qqrrrrqqn+ba6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV131H+Y1X/M13+fs2bPP+MzP/MzXvu+++27lqquuuuqqq676t6AcP36cq6666qqrrrrqX+/FXuzFXvsrvuIr/uoJT3jCbz3jGc/4a6666qqrrvoP9YxnPOOvz5079/R3eId3+OzNzc3j//AP//A7XHXVVVddddVV/1qU48ePc9VVV1111VVX/eu84zu+42d9xEd8xHf/7u/+7ndx1VVXXXXVf6pz587d+mZv9mYfA/AP//APv8NVV1111VVXXfWvgR70oAdx1VVXXXXVVVe9aK655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111X+Z13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqqhcFetCDHsRVV1111VVXXfUve53XeZ33/vAP//Dv+t3f/d3v4qqrrrrqqv82j3nMY173N3/zN7/rR3/0Rz+Hq6666qqrrrrqX0I5fvw4V1111VVXXXXVC/fhH/7h3/VO7/ROn/27v/u738VVV1111VX/rc6dO/f0N3uzN/sYgH/4h3/4Ha666qqrrrrqqhcGPehBD+Kqq6666qqrrnr+rrnmmgd/zud8zm9dc801D/7d3/3d7+Kqq6666qr/MV7zNV/zfe67775bP+uzPut17rvvvlu56qqrrrrqqqueH/SgBz2Iq6666qqrrrrqeb3jO77jZ73TO73TZ//u7/7ud3HVVVddddX/WI9+9KNf57d/+7e/50d+5Ec+m6uuuuqqq6666rmhBz3oQVx11VVXXXXVVc92zTXXPPjDP/zDv+vFXuzFXvt3f/d3v4urrrrqqqv+x3vN13zN9/mHf/iH3/7Mz/zM1+Gqq6666qqrrnogyvHjx7nqqquuuuqqq654sRd7sdf+iq/4ir+65pprHvy7v/u738VVV1111VX/KzzjGc/461d4hVd4m9d5ndd571tvvfVvzp49eytXXXXVVVdddRUAetCDHsRVV1111VVXXQXv+I7v+Fnv9E7v9Nm/+7u/+11cddVVV131v9ajH/3o1/mt3/qt7/7RH/3Rz+Gqq6666qqrrkIPetCDuOqqq6666qr/z6655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111f96r/mar/k+Z8+efcZnfuZnvvZ99913K1ddddVVV131/xfl+PHjXHXVVVddddX/Vy/2Yi/22l/xFV/xV094whN+6xnPeMZfc9VVV1111f8Jz3jGM/763LlzT3+Hd3iHz97c3Dz+D//wD7/DVVddddVVV/3/RDl+/DhXXXXVVVdd9f/RO77jO37WR3zER3z37/7u734XV1111VVX/Z907ty5W9/szd7sYwD+4R/+4Xe46qqrrrrqqv9/0IMe9CCuuuqqq6666v+Ta6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV131f95rvuZrvs99991362d91me9zn333XcrV1111VVXXfX/B+X48eNcddVVV1111f8XL/ZiL/baX/EVX/FXT3jCE37rGc94xl9z1VVXXXXV/wvPeMYz/vrcuXO3vuM7vuPnbGxsHPuHf/iH3+Gqq6666qqr/n+gHD9+nKuuuuqqq676/+Ad3/EdP+sjPuIjvvt3f/d3v4urrrrqqqv+Xzp37tzT3+zN3uxjAP7hH/7hd7jqqquuuuqq//vQgx70IK666qqrrrrq/7JrrrnmwR/+4R/+XS/2Yi/22r/7u7/7XVx11VVXXfX/3mu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9X8XetCDHsRVV1111VVX/V/1Oq/zOu/94R/+4d/1u7/7u9/FVVddddVVVz2XRz/60a/z27/929/zIz/yI5/NVVddddVVV/3fRDl+/DhXXXXVVVdd9X/R537u5/7Wm7/5m3/07/7u734XV1111VVXXfV8nDt37tY3fdM3/WiAf/iHf/gdrrrqqquuuur/HvSgBz2Iq6666qqrrvq/5Jprrnnw53zO5/zWNddc8+Df/d3f/S6uuuqqq6666l/wmq/5mu9z33333fpZn/VZr3PffffdylVXXXXVVVf934Ee9KAHcdVVV1111VX/V7zjO77jZ73TO73TZ//u7/7ud3HVVVddddVV/0qPfvSjX+e3fuu3vvtHf/RHP4errrrqqquu+r+Bcvz4ca666qqrrrrqf7trrrnmwZ/0SZ/0U6/zOq/z3r/7u7/7XVx11VVXXXXVv8G5c+dufbM3e7OPefEXf/HX/od/+IffOTw83OWqq6666qqr/nejHD9+nKuuuuqqq6763+zFXuzFXvsrvuIr/uqaa6558O/+7u9+F1ddddVVV1317/CMZzzjr1/hFV7hbV7xFV/xrY+Oji7deuutf81VV1111VVX/e+FHvSgB3HVVVddddVV/1u94zu+42e90zu902f/7u/+7ndx1VVXXXXVVf/BHv3oR7/Ob/3Wb333j/7oj34OV1111VVXXfW/E3rQgx7EVVddddVVV/1vc8011zz4wz/8w7/rxV7sxV77d3/3d7+Lq6666qqrrvpP8pqv+Zrvc9999936WZ/1Wa9z33333cpVV1111VVX/e9COX78OFddddVVV131v8mLvdiLvfZXfMVX/NUTnvCE33rGM57x11x11VVXXXXVf6JnPOMZf33u3Llb3/Ed3/FzNjY2jv3DP/zD73DVVVddddVV/3tQjh8/zlVXXXXVVVf9b/GO7/iOn/URH/ER3/27v/u738VVV1111VVX/Rc6d+7c09/szd7sYwD+4R/+4Xe46qqrrrrqqv8d0IMe9CCuuuqqq6666n+6a6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV1111X+T13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqfzb0oAc9iKuuuuqqq676n+x1Xud13vvDP/zDv+t3f/d3v4urrrrqqquu+h/i0Y9+9Ov89m//9vf8yI/8yGdz1VVXXXXVVf9zUY4fP85VV1111VVX/U/14R/+4d/1Tu/0Tp/9u7/7u9/FVVddddVVV/0Pcu7cuVvf9E3f9KMB/uEf/uF3uOqqq6666qr/mdCDHvQgrrrqqquuuup/mmuuuebBn/M5n/Nb11xzzYN/93d/97u46qqrrrrqqv+hXvM1X/N97rvvvls/67M+63Xuu+++W7nqqquuuuqq/1nQgx70IK666qqrrrrqf5J3fMd3/Kx3eqd3+uzf/d3f/S6uuuqqq6666n+JRz/60a/zW7/1W9/9oz/6o5/DVVddddVVV/3PgR70oAdx1VVXXXXVVf8TXHPNNQ/+8A//8O96sRd7sdf+3d/93e/iqquuuuqqq/6Xec3XfM33+Yd/+Iff/szP/MzX4aqrrrrqqqv+Z6AcP36cq6666qqrrvrv9mIv9mKv/RVf8RV/dc011zz4d3/3d7+Lq6666qqrrvpf6BnPeMZfv8IrvMLbvM7rvM5733rrrX9z9uzZW7nqqquuuuqq/17oQQ96EFddddVVV1313+kd3/EdP+ud3umdPvt3f/d3v4urrrrqqquu+j/i0Y9+9Ov81m/91nf/6I/+6Odw1VVXXXXVVf990IMe9CCuuuqqq6666r/DNddc8+AP//AP/64Xe7EXe+3f/d3f/S6uuuqqq6666v+Y13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqvx7l+PHjXHXVVVddddV/tRd7sRd77a/4iq/4qyc84Qm/9YxnPOOvueqqq6666qr/g57xjGf89blz5259x3d8x8/Z2Ng49g//8A+/w1VXXXXVVVf916IcP36cq6666qqrrvqv9I7v+I6f9REf8RHf/bu/+7vfxVVXXXXVVVf9P3Du3Lmnv9mbvdnHAPzDP/zD73DVVVddddVV/3XQgx70IK666qqrrrrqv8I111zz4A//8A//rhd7sRd77d/93d/9Lq666qqrrrrq/5nXfM3XfJ/77rvv1s/6rM96nfvuu+9Wrrrqqquuuuo/H+X48eNcddVVV1111X+2F3uxF3vtr/iKr/irJzzhCb/1jGc846+56qqrrrrqqv+HnvGMZ/z1uXPnbn2Hd3iHz97a2jrxD//wD7/NVVddddVVV/3nohw/fpyrrrrqqquu+s/0ju/4jp/1ER/xEd/9u7/7u9/FVVddddVVV13FuXPnbn3TN33Tjwb4h3/4h9/hqquuuuqqq/7zoAc96EFcddVVV1111X+Ga6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV1111VXP4TVf8zXf57777rv1sz7rs17nvvvuu5Wrrrrqqquu+o+HHvSgB3HVVVddddVV/9Fe53Ve570//MM//Lt+93d/97u46qqrrrrqqqteqEc/+tGv81u/9Vvf/aM/+qOfw1VXXXXVVVf9x6IcP36cq6666qqrrvqP9Lmf+7m/9eZv/uYf/bu/+7vfxVVXXXXVVVdd9S86d+7crW/2Zm/2MZL0D//wD7/NVVddddVVV/3HQQ960IO46qqrrrrqqv8I11xzzYM/53M+57euueaaB//u7/7ud3HVVVddddVVV/2rvOZrvub73Hfffbd+1md91uvcd999t3LVVVddddVV/37oQQ96EFddddVVV1317/WO7/iOn/VO7/ROn/27v/u738VVV1111VVXXfXv8uhHP/p1fuu3fuu7f/RHf/RzuOqqq6666qp/H8rx48e56qqrrrrqqn+ra6655sGf9Emf9FOv8zqv896/+7u/+11cddVVV1111VX/bufOnbv1zd7szT7mxV/8xV/7H/7hH37n8PBwl6uuuuqqq676tyG46qqrrrrqqn+H137t136vF3uxF3vt3/3d3/0urrrqqquuuuqq/zC/+7u/+10v9mIv9tqv8zqv895cddVVV1111b8dwVVXXXXVVVf9O7zTO73TZ//u7/7ud3HVVVddddVVV/2H+93f/d3vep3XeZ33vuaaax7MVVddddVVV/3bULnqqquuuuqqf4f77rvvVq666qqrrrrqqv80Z86cedB99913K1ddddVVV131b0Plqquuuuqqq/4dzp49eytXXXXVVVddddV/mt/6rd/6Hq666qqrrrrq347gqquuuuqqq/4d/v7v//63ueqqq6666qqr/tPcd999T+eqq6666qqr/u0Irrrqqquuuurf4R/+4R9+5zVf8zXfh6uuuuqqq6666j/ca77ma77P2bNnn8FVV1111VVX/dtRueqqq6666qp/h7Nnz97KVVddddVVV131n+Yf/uEffpurrrrqqquu+rejctVVV1111VX/Dvfdd9+tXHXVVVddddVV/2nuu+++W7nqqquuuuqqfzsqV1111VVXXfXv9A//8A+/zVVXXXXVVVdd9R/uH/7hH36bq6666qqrrvr3Ibjqqquuuuqqf6f77rvvVq666qqrrrrqqv9w9913361cddVVV1111b8PwVVXXXXVVVf9O9133323vuZrvub7cNVVV1111VVX/Yd5zdd8zff5h3/4h9/hqquuuuqqq/59qFx11VVXXXXVv9M//MM//A5XXXXVVVddddV/uH/4h3/4ba666qqrrrrq34fKVVddddVVV/07nT179lauuuqqq6666qr/cPfdd9+tXHXVVVddddW/D5Wrrrrqqquu+ne67777bv2Hf/iH3+aqq6666qqrrrrqqquuuuqq/2moXHXVVVddddVVV1111VVXXfU/zm/91m99N1ddddVVV13170dw1VVXXXXVVf8B/v7v//63X/M1X/N9uOqqq6666qqr/t1e8zVf833uu+++W7nqqquuuuqqfz8qV1111VVXXfUf4B/+4R9+h6uuuuqqq6666j/M2bNnn8FVV1111VVX/ftRueqqq6666qr/AGfPnr2Vq6666qqrrrrqP8w//MM//DZXXXXVVVdd9e9H5aqrrrrqqqv+A9x33323ctVVV1111VVX/Ye57777buWqq6666qqr/v2oXHXVVVddddV/kH/4h3/4ba666qqrrrrqqn+33/qt3/purrrqqquuuuo/BsFVV1111VVX/Qf5+7//+9/mqquuuuqqq6666qqrrrrqqv9JCK666qqrrrrqP8jZs2ef8Zqv+Zrvw1VXXXXVVVdd9W/2mq/5mu/zD//wD7/DVVddddVVV/3HoHLVVVddddVV/0Huu+++W7nqqquuuuqqq/7d/uEf/uG3ueqqq6666qr/GFSuuuqqq6666j/I2bNnb+Wqq6666qqrrvp3u++++27lqquuuuqqq/5jULnqqquuuuqq/yD33Xffrf/wD//w21x11VVXXXXVVf9m9913361cddVVV1111X8cKlddddVVV1111VVXXXXVVVf9j/EP//APv81VV1111VVX/cchuOqqq6666qr/QH//93//26/5mq/5Plx11VVXXXXVVf9qr/mar/k+9913361cddVVV1111X8cKlddddVVV131H+gf/uEffoerrrrqqquuuurf7OzZs8/gqquuuuqqq/7jULnqqquuuuqq/0Bnz569lauuuuqqq6666t/sH/7hH36bq6666qqrrvqPQ+Wqq6666qqr/gPdd999t9533323ctVVV1111VVX/Zvcd999t3LVVVddddVV/3GoXHXVVVddddV/sLNnz97KVVddddVVV131r/Zbv/Vb38NVV1111VVX/cciuOqqq6666qr/YH//93//21x11VVXXXXVVVddddVVV131PwHBVVddddVVV/0H+4d/+Iffec3XfM334aqrrrrqqquuepG95mu+5vv8wz/8w29z1VVXXXXVVf+xqFx11VVXXXXVf7CzZ8/eylVXXXXVVVdd9a/2D//wD7/NVVddddVVV/3HonLVVVddddVVV1111VVXXXXV/wj33XffrVx11VVXXXXVfywqV1111VVXXfUf7L777rv1H/7hH36bq6666qqrrrrqRfYP//APv81VV1111VVX/cejctVVV1111VVXXXXVVVddddV/u/vuu+9Wrrrqqquuuuo/HsFVV1111VVX/Sf4+7//+99+zdd8zffhqquuuuqqq676F73ma77m+/zDP/zD73DVVVddddVV//GoXHXVVVddddV/gn/4h3/4Ha666qqrrrrqqquuuuqqq67670blqquuuuqqq/4TnD179lauuuqqq6666qoX2T/8wz/8NlddddVVV131H4/KVVddddVVV/0nuO+++2697777buWqq6666qqrrnqR3Hfffbdy1VVXXXXVVf/xqFx11VVXXXXVf5KzZ8/eylVXXXXVVVdd9S/6rd/6re/mqquuuuqqq/5zEFx11VVXXXXVf5K///u//22uuuqqq6666qqrrrrqqquu+u9EcNVVV1111VX/Sf7hH/7hd17zNV/zfbjqqquuuuqqq16g13zN13yff/iHf/gdrrrqqquuuuo/B5Wrrrrqqquu+k9y9uzZW7nqqquuuuqqq/5F//AP//DbXHXVVVddddV/DipXXXXVVVdd9Z/kvvvuu5WrrrrqqquuuupfdN99993KVVddddVVV/3noHLVVVddddVV/4n+4R/+4be56qqrrrrqqqteoH/4h3/4ba666qqrrrrqPw/BVVddddVVV/0nuu+++27lqquuuuqqq656ge67775bueqqq6666qr/PARXXXXVVVdd9Z/ovvvuu/U1X/M134errrrqqquuuup5vOZrvub7/MM//MPvcNVVV1111VX/eahcddVVV1111X+if/iHf/gdrrrqqquuuuqqF+gf/uEffpurrrrqqquu+s9D5aqrrrrqqqv+E509e/ZWrrrqqquuuuqqq6666qqrrvrvQuWqq6666qqr/hPdd999t9533323ctVVV1111VVXPV/33XffrVx11VVXXXXVfx4qV1111VVXXfWf7OzZs7dy1VVXXXXVVVc9j9/6rd/6bq666qqrrrrqPxfBVVddddVVV/0n+/u///vffs3XfM334aqrrrrqqquuepbXfM3XfJ/77rvvVq666qqrrrrqPxeVq6666qqrrvpP9g//8A+/w1VXXXXVVVdd9TzOnj37DK666qqrrrrqPxeVq6666qqrrvpPdvbs2Vu56qqrrrrqqquexz/8wz/8NlddddVVV131n4vKVVddddVVV/0nu++++27lqquuuuqqq656Hvfdd9+tXHXVVVddddV/LipXXXXVVVdd9V/gH/7hH36bq6666qqrrrrqWf7hH/7hd7jqqquuuuqq/3wEV1111VVXXfVf4O///u9/m6uuuuqqq6666lnuu+++W7nqqquuuuqq/3wEV1111VVXXfVf5DVf8zXfh6uuuuqqq666itd8zdd8n3/4h3/4ba666qqrrrrqPx+Vq6666qqrrvov8A//8A+/w1VXXXXVVVdd9Sz/8A//8NtcddVVV1111X8+KlddddVVV131X+Ds2bO3ctVVV1111VVXPct99913K1ddddVVV131n4/KVVddddVVV/0XuO+++279h3/4h9/mqquuuuqqq67ivvvuu5Wrrrrqqquu+q9B5aqrrrrqqquuuuqqq6666qr/Uv/wD//w21x11VVXXXXVfw2Cq6666qqrrvov8vd///e//Zqv+Zrvw1VXXXXVVVf9P/aar/ma73PffffdylVXXXXVVVf916By1VVXXXXVVf9F/uEf/uF3uOqqq6666qqrOHv27DO46qqrrrrqqv8aVK666qqrrrrqv8jZs2dv5aqrrrrqqquu4h/+4R9+m6uuuuqqq676r0Hlqquuuuqqq/6L3Hfffbdy1VVXXXXVVVdx33333cpVV1111VVX/degctVVV1111VX/hf7hH/7ht7nqqquuuuqq/8d+67d+67u56qqrrrrqqv86BFddddVVV131X+i3fuu3voerrrrqqquu+n/svvvuu5Wrrrrqqquu+q9DcNVVV1111VX/hX7rt37ru1tres3XfM334aqrrrrqqqv+H3nN13zN9zl16tRDfvRHf/RzuOqqq6666qr/OuhBD3oQV1111VVXXfVf7Zprrnnwa7/2a7/XO73TO302wO/+7u9+F1ddddVVV131f8xrvuZrvg/Aj/zIj3z2b//2b3/PfffddytXXXXVVVdd9V8LPehBD+Kqq6666qqr/rtcc801D37t137t93qd13md977mmmse/Lu/+7vfxVVXXXXVVVf9L/ear/ma73Pffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVf990EPetCDuOqqq6666qr/btdcc82DX+zFXuy1X+d1Xue9XuzFXuy1f/d3f/e7uOqqq6666qr/ZV7zNV/zfe67775bf+u3fuu7f/RHf/RzuOqqq6666qr/fuhBD3oQV1111VVXXfU/yTXXXPPgd3zHd/ys13md13lvgN/93d/9Lq666qqrrrrqf6jXfM3XfB+AH/mRH/ns3/7t3/6e++6771auuuqqq6666n8O9KAHPYirrrrqqquu+p/ommuuefBrv/Zrv9frvM7rvPc111zz4N/93d/9Lq666qqrrrrqf4jXfM3XfJ/77rvv1t/6rd/67h/90R/9HK666qqrrrrqfyb0oAc9iKuuuuqqq676n+yaa6558Iu92Iu99uu8zuu814u92Iu99u/+7u9+F1ddddVVV1313+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq676nw096EEP4qqrrrrqqqv+t7jmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV1111VVX/Sd7zdd8zfcB+JEf+ZHP/u3f/u3vue+++27lqquuuuqqq/53QA960IO46qqrrrrqqv9trrnmmge/9mu/9nu90zu902cD/O7v/u53cdVVV1111VX/wV7zNV/zfe67775bf+u3fuu7f/RHf/RzuOqqq6666qr/fdCDHvQgrrrqqquuuup/q2uuuebBL/ZiL/bar/M6r/NeL/ZiL/bav/u7v/tdXHXVVVddddW/02u+5mu+z3333Xfrb/3Wb333j/7oj34OV1111VVXXfW/F3rQgx7EVVddddVVV/1fcM011zz4Hd/xHT/rdV7ndd4b4Hd/93e/i6uuuuqqq656Eb3ma77m+wD81m/91nf/yI/8yGefPXv2GVx11VVXXXXV/37oQQ96EFddddVVV131f8k111zz4Nd+7dd+r3d6p3f6bIDf/d3f/S6uuuqqq6666gV4zdd8zfe57777bv2t3/qt7/7t3/7t77nvvvtu5aqrrrrqqqv+70APetCDuOqqq6666qr/i6655poHv9iLvdhrv87rvM57vdiLvdhr/+7v/u53cdVVV1111VXP9Jqv+Zrvc9999936W7/1W9/9oz/6o5/DVVddddVVV/3fhB70oAdx1VVXXXXVVf/XXXPNNQ9+x3d8x896ndd5nfcG+N3f/d3v4qqrrrrqqv93XvM1X/N9AP7hH/7ht3/rt37re37rt37ru7nqqquuuuqq/9vQgx70IK666qqrrrrq/4trrrnmwa/92q/9Xu/0Tu/02QC/+7u/+11cddVVV131f95rvuZrvs99991362/91m9992//9m9/z3333XcrV1111VVXXfX/A3rQgx7EVVddddVVV/1/c8011zz4xV7sxV77dV7ndd7rxV7sxV77d3/3d7+Lq6666qqr/s95zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/v9BD3rQg7jqqquuuuqq/89e7MVe7LXf6Z3e6bNe7MVe7LUBfvd3f/e7uOqqq6666n+t13zN13wfgPvuu+/WH/3RH/2c3/qt3/purrrqqquuuur/L/SgBz2Iq6666qqrrroKrrnmmge/9mu/9nu90zu902cD/O7v/u53cdVVV1111f8ar/mar/k+9913362/9Vu/9d2//du//T333XffrVx11VVXXXXVVehBD3oQV1111VVXXXXVs11zzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddVV/2O95mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVVz0QetCDHsRVV1111VVXXfX8vc7rvM57v87rvM57vdiLvdhr/+7v/u53cdVVV1111f8Yr/mar/k+9913360/+qM/+jm/9Vu/9d1cddVVV1111VXPD3rQgx7EVVddddVVV131wl1zzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666qr/cq/5mq/5PgA/8iM/8tm//du//T333XffrVx11VVXXXXVVS8MetCDHsRVV1111VVXXfWiueaaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqqv+073ma77m+9x33323/tZv/dZ3/+iP/ujncNVVV1111VVXvajQgx70IK666qqrrrrqqn+da6655sEv9mIv9tqv8zqv814v9mIv9tq/+7u/+11cddVVV131H+41X/M13+e+++679Ud/9Ec/57d+67e+m6uuuuqqq6666l8LPehBD+Kqq6666qqrrvq3u+aaax782q/92u/1Tu/0Tp8N8Lu/+7vfxVVXXXXVVf9mr/mar/k+AD/yIz/y2b/1W7/13WfPnn0GV1111VVXXXXVvxV60IMexFVXXXXVVVdd9e93zTXXPPi1X/u13+t1Xud13vuaa6558O/+7u9+F1ddddVVV73IXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+I6AHPehBXHXVVVddddVV/3GuueaaB7/Yi73Ya73O67zOe7/Yi73Ya//u7/7ud3HVVVddddUL9Jqv+Zrvc9999936W7/1W9/9oz/6o5/DVVddddVVV131Hwk96EEP4qqrrrrqqquu+s9xzTXXPPgd3/EdP+t1Xud13hvgd3/3d7+Lq6666qqreM3XfM33AfiRH/mRz/7t3/7t77nvvvtu5aqrrrrqqquu+s+AHvSgB3HVVVddddVVV/3nuuaaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqv+HXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+s6EHPehBXHXVVVddddVV/zWuueaaB7/Yi73Ya7/O67zOe73Yi73Ya//u7/7ud3HVVVdd9f/Aa77ma77Pfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddV/FfSgBz2Iq6666qqrrrrqv94111zz4Hd8x3f8rNd5ndd5b4Df/d3f/S6uuuqqq/4Pec3XfM33AfiRH/mRz/7t3/7t77nvvvtu5aqrrrrqqquu+q+GHvSgB3HVVVddddVVV/33ueaaax782q/92u/1Tu/0Tp8N8Lu/+7vfxVVXXXXV/2Kv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVf+d0IMe9CCuuuqqq6666qr/ftdcc82DX+zFXuy1X+d1Xue9XuzFXuy1f/d3f/e7uOqqq676X+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666n8C9KAHPYirrrrqqquuuup/lmuuuebB7/iO7/hZr/M6r/PeAL/7u7/7XVx11VVX/Q/0mq/5mu8D8Fu/9Vvf/aM/+qOfc999993KVVddddVVV131Pwl60IMexFVXXXXVVVdd9T/TNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqqv+B3jN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+p8KPehBD+Kqq6666qqrrvqf7cyZMw968Rd/8dd5ndd5nfd6sRd7sdf+3d/93e/iqquuuuq/wWu+5mu+z3333Xfrb/3Wb333j/7oj34OV1111VVXXXXV/3ToQQ96EFddddVVV1111f8e11xzzYPf8R3f8bNe53Ve570Bfvd3f/e7uOqqq676T/Sar/ma7wPwD//wD7/9W7/1W9/zW7/1W9/NVVddddVVV131vwV60IMexFVXXXXVVVdd9b/PmTNnHvQ6r/M67/1O7/ROnw3wu7/7u9/FVVddddV/oNd8zdd8n/vuu+/W3/qt3/ru3/qt3/rus2fPPoOrrrrqqquuuup/G/SgBz2Iq6666qqrrrrqf69rrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVX/Tu85mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1vhh70oAdx1VVXXXXVVVf93/BiL/Zir/U6r/M67/06r/M67w3wu7/7u9/FVVddddWL4DVf8zXfB+C+++679Ud/9Ec/+7d+67e+h6uuuuqqq6666v8C9KAHPYirrrrqqquuuur/lmuuuebBr/3ar/1e7/RO7/TZAL/7u7/7XVx11VVXPR+v+Zqv+T733Xffrb/1W7/13b/927/9Pffdd9+tXHXVVVddddVV/5egBz3oQVx11VVXXXXVVf83XXPNNQ9+7dd+7fd6ndd5nfe+5pprHvy7v/u738VVV111FfCar/ma73Pffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVdd9X8VetCDHsRVV1111VVXXfV/3+u8zuu89+u8zuu814u92Iu99u/+7u9+F1ddddX/S6/5mq/5Pvfdd9+tP/qjP/o5v/Vbv/XdXHXVVVddddVV/9ehBz3oQVx11VVXXXXVVf9/XHPNNQ9+7dd+7fd6p3d6p88G+N3f/d3v4qqrrvo/7TVf8zXfB+BHfuRHPvu3f/u3v+e+++67lauuuuqqq6666v8L9KAHPYirrrrqqquuuur/n2uuuebBr/3ar/1er/M6r/Pe11xzzYN/93d/97u46qqr/k95zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrvr/CD3oQQ/iqquuuuqqq676/+uaa6558Iu92Iu99uu8zuu814u92Iu99u/+7u9+F1ddddX/aq/5mq/5Pvfdd9+tP/qjP/o5v/Vbv/XdXHXVVVddddVV/5+hBz3oQVx11VVXXXXVVVcBXHPNNQ9+7dd+7fd6p3d6p88G+N3f/d3v4qqrrvpf4TVf8zXfB+BHfuRHPvu3f/u3v+e+++67lauuuuqqq6666ipAD3rQg7jqqquuuuqqq656oGuuuebBr/3ar/1er/M6r/Pe11xzzYN/93d/97u46qqr/kd6zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrqOaEHPehBXHXVVVddddVVVz0/Z86cedCLv/iLv87rvM7rvNeLvdiLvfbv/u7vfhdXXXXV/wiv+Zqv+T733XffrT/6oz/6Ob/1W7/13Vx11VVXXXXVVVc9f+hBD3oQV1111VVXXXXVVf+Sa6655sHv+I7v+Fmv8zqv894Av/u7v/tdXHXVVf+lXvM1X/N9AH7kR37ks3/7t3/7e+67775bueqqq6666qqrrnrh0IMe9CCuuuqqq6666qqrXlRnzpx50Ou8zuu89+u8zuu89zXXXPPg3/3d3/0urrrqqv9Ur/mar/k+9913362/9Vu/9d0/+qM/+jlcddVVV1111VVXvejQgx70IK666qqrrrrqqqv+ta655poHv9iLvdhrv87rvM57vdiLvdhr/+7v/u53cdVVV/2Hes3XfM33ue+++279rd/6re/+0R/90c/hqquuuuqqq6666l8PPehBD+Kqq6666qqrrrrq3+PMmTMPeqd3eqfPfp3XeZ33Bvjd3/3d7+Kqq676N3nN13zN9wH4kR/5kc/+rd/6re8+e/bsM7jqqquuuuqqq676t0MPetCDuOqqq6666qqrrvqPcM011zz4tV/7td/rdV7ndd77mmuuefDv/u7vfhdXXXXVi+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666qr/GOhBD3oQV1111VVXXXXVVf+Rrrnmmge/2Iu92Gu9zuu8znu/2Iu92Gv/7u/+7ndx1VVXPV+v+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVVf9x0IPetCDuOqqq6666qqrrvrPcs011zz4Hd/xHT/rdV7ndd4b4Hd/93e/i6uu+n/uNV/zNd8H4Ld+67e++0d/9Ec/57777ruVq6666qqrrrrqqv8c6EEPehBXXXXVVVddddVV/9muueaaB7/2a7/2e73TO73TZ9933323XnPNNQ/mqqv+H7rvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquuuuo/H3rQgx7EVVddddVVV1111X+la6655sE8k21LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25IEcN99993KVVddddVVV1111X8t9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CPics5oVBdOZAAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl/index.md b/docs/kcl/index.md index 4305d6da3..da2243646 100644 --- a/docs/kcl/index.md +++ b/docs/kcl/index.md @@ -19,7 +19,6 @@ layout: manual * [`angledLineToX`](kcl/angledLineToX) * [`angledLineToY`](kcl/angledLineToY) * [`arc`](kcl/arc) -* [`arrayReduce`](kcl/arrayReduce) * [`asin`](kcl/asin) * [`assert`](kcl/assert) * [`assertEqual`](kcl/assertEqual) @@ -79,6 +78,7 @@ layout: manual * [`profileStart`](kcl/profileStart) * [`profileStartX`](kcl/profileStartX) * [`profileStartY`](kcl/profileStartY) +* [`reduce`](kcl/reduce) * [`rem`](kcl/rem) * [`revolve`](kcl/revolve) * [`segAng`](kcl/segAng) diff --git a/docs/kcl/reduce.md b/docs/kcl/reduce.md new file mode 100644 index 000000000..15302e0eb --- /dev/null +++ b/docs/kcl/reduce.md @@ -0,0 +1,47 @@ +--- +title: "reduce" +excerpt: "Take a starting value. Then, for each element of an array, calculate the next value," +layout: manual +--- + +Take a starting value. Then, for each element of an array, calculate the next value, + +using the previous value and the element. + +```js +reduce(array: [u64], start: Sketch, reduce_fn: FunctionParam) -> Sketch +``` + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `array` | `[u64]` | | Yes | +| `start` | [`Sketch`](/docs/kcl/types/Sketch) | A sketch is a collection of paths. | Yes | +| `reduce_fn` | `FunctionParam` | | Yes | + +### Returns + +[`Sketch`](/docs/kcl/types/Sketch) - A sketch is a collection of paths. + + +### Examples + +```js +fn decagon = (radius) => { + let step = 1 / 10 * tau() + let sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius]) + return reduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], sketch001, (i, sg) => { + let x = cos(step * i) * radius + let y = sin(step * i) * radius + return lineTo([x, y], sg) +}) +} +decagon(5.0) + |> close(%) +``` + +![Rendered example of reduce 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABwA0lEQVR4Ae3gAZAkSZIkSRKLqpm7R0REZmZmVlVVVVV3d3d3d/fMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMdHd3d3dXV1VVVVVmZkZGRIS7m5kKz0xmV3d1d3dPz8zMzMxMYn3Qgx7EVVddddVVV1111VVXXXXVVVddddVVV131fxKVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVV/w9dc801D36xF3ux1z5z5syDrrnmmge/2Iu92Gtz1f9J//AP//Db//AP//A79913363/8A//8NtcddVVV1111VVX/f+CHvSgB3HVVVddddVVV131f90111zz4Nd+7dd+L4B3eqd3+mye6U//9E9/jKv+z3vFV3zFdwC47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuur/NvSgBz2Iq6666qqrrrrqqv9rrrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVz1/95rvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/t6AHPehBXHXVVVddddVVV/1vds011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+aZfvd3f/e7uOqqf8FrvuZrvg/Afffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqqquuuup/N/SgBz2Iq6666qqrrrrqqv9NrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jzT7/7u734XV1317/Sar/ma7wNw33333QrwD//wD7/9D//wD7/zW7/1W9/NVVddddVVV1111f8u6EEPehBXXXXVVVddddVV/5Ndc801D37t137t9wJ4ndd5nfe+5pprHgzwu7/7u9/FVVf9F3nN13zN9wG47777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuup/LvSgBz2Iq6666qqrrrrqqv9Jrrnmmge/9mu/9ntdc801D36d13md9+aZfvd3f/e7uOqq/yFe8zVf830A7rvvvlv/4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqquuuuqqq676nwM96EEP4qqrrrrqqquuuuq/0zXXXPPg137t136vF3/xF3/tF3uxF3ttnul3f/d3v4urrvpf4jVf8zXfB+C+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXVVVdd9d8HPehBD+Kqq6666qqrrrrqv8o111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6bZ/rd3/3d7+Kqq/6PeM3XfM33AbjvvvtuBfiHf/iH3/6Hf/iH3/mt3/qt7+aqq6666qqrrrrqvw560IMexFVXXXXVVVddddV/lmuuuebBL/ZiL/baZ86cedCLv/iLv/aLvdiLvTbA7/7u734XV131/8xrvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/OdCDHvQgrrrqqquuuuqqq/6jXHPNNQ9+7dd+7fcCeKd3eqfP5pl+93d/97u46qqrnsNrvuZrvg/Afffdd+s//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VX/MdCDHvQgrrrqqquuuuqqq/6trrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTL/7u7/7XVx11VX/Kq/5mq/5PgD33Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVVddddVVV/3boAc96EFcddVVV1111VVXvSiuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPNPv/u7vfhdXXXXVf6jXfM3XfB+A++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddWLBj3oQQ/iqquuuuqqq6666vm55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr80y/+7u/+11cddVV/6Ve8zVf830A7rvvvlsB/uEf/uG3/+Ef/uF3fuu3fuu7ueqqq6666qqrrnr+0IMe9CCuuuqqq6666qqrAK655poHv/Zrv/Z7AbzO67zOe19zzTUPBvjd3/3d7+Kqq676H+k1X/M13wfgvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uuuuqqq6666ipAD3rQg7jqqquuuuqqq/5/uuaaax782q/92u8F8E7v9E6fzTP97u/+7ndx1VVX/a/0mq/5mu8DcPbs2Wf8/d///W/9wz/8w+/cd999t/7DP/zDb3PVVVddddVVV/1/hB70oAdx1VVXXXXVVVf9/3DNNdc8+LVf+7Xf68Vf/MVf+8Ve7MVem2f63d/93e/iqquu+j/pNV/zNd8H4L777rv17Nmzz/j7v//73/qHf/iH3/mHf/iH3+aqq6666qqrrvr/AD3oQQ/iqquuuuqqq676v+eaa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/NM/3u7/7ud3HVVVf9v/Sar/ma7wNw33333QrwD//wD7/zW7/1W9/9D//wD7/NVVddddVVV131fxF60IMexFVXXXXVVVdd9b/fNddc8+AXe7EXe+0zZ8486MVf/MVf+8Ve7MVeG+B3f/d3v4urrrrqqhfiNV/zNd8H4L777rv1H/7hH377H/7hH37nH/7hH377vvvuu5Wrrrrqqquuuup/O/SgBz2Iq6666qqrrrrqf59rrrnmwa/92q/9XgDv9E7v9Nk80+/+7u9+F1ddddVV/w6v+Zqv+T4A9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVf/boAc96EFcddVVV1111VX/811zzTUPfu3Xfu33evEXf/HXfrEXe7HX5pl+93d/97u46qqrrvpP9Jqv+ZrvA3Dffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVddddVVV131Px160IMexFVXXXXVVVdd9T/LNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem2f63d/93e/iqquuuuq/0Wu+5mu+D8DZs2efcd999z397//+73/7H/7hH37nH/7hH36bq6666qqrrrrqfxr0oAc9iKuuuuqqq6666r/XNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem2f63d/93e/iqquuuup/sNd8zdd8H4D77rvvVkn6+7//+9/6h3/4h9/5rd/6re/mqquuuuqqq67674Ye9KAHcdVVV1111VVX/de65pprHvzar/3a7wXwOq/zOu99zTXXPBjgd3/3d7+Lq6666qr/A17zNV/zfQDuu+++W//hH/7hd/7hH/7ht++7775b/+Ef/uG3ueqqq6666qqr/iuhBz3oQVx11VVXXXXVVf+5rrnmmge/9mu/9nsBvNM7vdNn80y/+7u/+11cddVVV/0/8Jqv+ZrvA3Dffffd+g//8A+//Q//8A+/c9999936D//wD7/NVVddddVVV131nwk96EEP4qqrrrrqqquu+o91zTXXPPi1X/u13+vFX/zFX/vFXuzFXptn+t3f/d3v4qqrrrrqKl7zNV/zfQDuu+++W8+ePXvr3//93//2P/zDP/zOP/zDP/w2V1111VVXXXXVfyT0oAc9iKuuuuqqq6666j/GNddc8+AP//AP/64zZ848+Jprrnnw7/7u734XV1111VVX/Yte8zVf833Onj37jPvuu+/pX//1X/8+9913361cddVVV1111VX/ESjHjx/nqquuuuqqq67693uxF3ux1/6Kr/iKv7rmmmse/Bd/8Rc/9YxnPOOvueqqq6666kXyjGc846/PnTv39Fd4hVd4m1d8xVd866Ojo0u33nrrX3PVVVddddVVV/17oQc96EFcddVVV1111VX/Pu/4ju/4We/0Tu/02b/7u7/7XVx11VVXXfXv9uhHP/p1fuu3fuu7f/RHf/RzuOqqq6666qqr/j3Qgx70IK666qqrrrrqqn+ba6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV131H+Y1X/M13+fs2bPP+MzP/MzXvu+++27lqquuuuqqq676t6AcP36cq6666qqrrrrqX+/FXuzFXvsrvuIr/uoJT3jCbz3jGc/4a6666qqrrvoP9YxnPOOvz5079/R3eId3+OzNzc3j//AP//A7XHXVVVddddVV/1qU48ePc9VVV1111VVX/eu84zu+42d9xEd8xHf/7u/+7ndx1VVXXXXVf6pz587d+mZv9mYfA/AP//APv8NVV1111VVXXfWvgR70oAdx1VVXXXXVVVe9aK655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111X+Z13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqqhcFetCDHsRVV1111VVXXfUve53XeZ33/vAP//Dv+t3f/d3v4qqrrrrqqv82j3nMY173N3/zN7/rR3/0Rz+Hq6666qqrrrrqX0I5fvw4V1111VVXXXXVC/fhH/7h3/VO7/ROn/27v/u738VVV1111VX/rc6dO/f0N3uzN/sYgH/4h3/4Ha666qqrrrrqqhcGPehBD+Kqq6666qqrrnr+rrnmmgd/zud8zm9dc801D/7d3/3d7+Kqq6666qr/MV7zNV/zfe67775bP+uzPut17rvvvlu56qqrrrrqqqueH/SgBz2Iq6666qqrrrrqeb3jO77jZ73TO73TZ//u7/7ud3HVVVddddX/WI9+9KNf57d/+7e/50d+5Ec+m6uuuuqqq6666rmhBz3oQVx11VVXXXXVVc92zTXXPPjDP/zDv+vFXuzFXvt3f/d3v4urrrrqqqv+x3vN13zN9/mHf/iH3/7Mz/zM1+Gqq6666qqrrnogyvHjx7nqqquuuuqqq654sRd7sdf+iq/4ir+65pprHvy7v/u738VVV1111VX/KzzjGc/461d4hVd4m9d5ndd571tvvfVvzp49eytXXXXVVVdddRUAetCDHsRVV1111VVXXQXv+I7v+Fnv9E7v9Nm/+7u/+11cddVVV131v9ajH/3o1/mt3/qt7/7RH/3Rz+Gqq6666qqrrkIPetCDuOqqq6666qr/z6655poHf/iHf/h3vdiLvdhr/+7v/u53cdVVV1111f96r/mar/k+Z8+efcZnfuZnvvZ99913K1ddddVVV131/xfl+PHjXHXVVVddddX/Vy/2Yi/22l/xFV/xV094whN+6xnPeMZfc9VVV1111f8Jz3jGM/763LlzT3+Hd3iHz97c3Dz+D//wD7/DVVddddVVV/3/RDl+/DhXXXXVVVdd9f/RO77jO37WR3zER3z37/7u734XV1111VVX/Z907ty5W9/szd7sYwD+4R/+4Xe46qqrrrrqqv9/0IMe9CCuuuqqq6666v+Ta6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV131f95rvuZrvs99991362d91me9zn333XcrV1111VVXXfX/B+X48eNcddVVV1111f8XL/ZiL/baX/EVX/FXT3jCE37rGc94xl9z1VVXXXXV/wvPeMYz/vrcuXO3vuM7vuPnbGxsHPuHf/iH3+Gqq6666qqr/n+gHD9+nKuuuuqqq676/+Ad3/EdP+sjPuIjvvt3f/d3v4urrrrqqqv+Xzp37tzT3+zN3uxjAP7hH/7hd7jqqquuuuqq//vQgx70IK666qqrrrrq/7JrrrnmwR/+4R/+XS/2Yi/22r/7u7/7XVx11VVXXfX/3mu+5mu+z3333XfrZ33WZ73OfffddytXXXXVVVdd9X8XetCDHsRVV1111VVX/V/1Oq/zOu/94R/+4d/1u7/7u9/FVVddddVVVz2XRz/60a/z27/929/zIz/yI5/NVVddddVVV/3fRDl+/DhXXXXVVVdd9X/R537u5/7Wm7/5m3/07/7u734XV1111VVXXfV8nDt37tY3fdM3/WiAf/iHf/gdrrrqqquuuur/HvSgBz2Iq6666qqrrvq/5Jprrnnw53zO5/zWNddc8+Df/d3f/S6uuuqqq6666l/wmq/5mu9z33333fpZn/VZr3PffffdylVXXXXVVVf934Ee9KAHcdVVV1111VX/V7zjO77jZ73TO73TZ//u7/7ud3HVVVddddVV/0qPfvSjX+e3fuu3vvtHf/RHP4errrrqqquu+r+Bcvz4ca666qqrrrrqf7trrrnmwZ/0SZ/0U6/zOq/z3r/7u7/7XVx11VVXXXXVv8G5c+dufbM3e7OPefEXf/HX/od/+IffOTw83OWqq6666qqr/nejHD9+nKuuuuqqq6763+zFXuzFXvsrvuIr/uqaa6558O/+7u9+F1ddddVVV1317/CMZzzjr1/hFV7hbV7xFV/xrY+Oji7deuutf81VV1111VVX/e+FHvSgB3HVVVddddVV/1u94zu+42e90zu902f/7u/+7ndx1VVXXXXVVf/BHv3oR7/Ob/3Wb333j/7oj34OV1111VVXXfW/E3rQgx7EVVddddVVV/1vc8011zz4wz/8w7/rxV7sxV77d3/3d7+Lq6666qqrrvpP8pqv+Zrvc9999936WZ/1Wa9z33333cpVV1111VVX/e9COX78OFddddVVV131v8mLvdiLvfZXfMVX/NUTnvCE33rGM57x11x11VVXXXXVf6JnPOMZf33u3Llb3/Ed3/FzNjY2jv3DP/zD73DVVVddddVV/3tQjh8/zlVXXXXVVVf9b/GO7/iOn/URH/ER3/27v/u738VVV1111VVX/Rc6d+7c09/szd7sYwD+4R/+4Xe46qqrrrrqqv8d0IMe9CCuuuqqq6666n+6a6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV1111X+T13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqfzb0oAc9iKuuuuqqq676n+x1Xud13vvDP/zDv+t3f/d3v4urrrrqqquu+h/i0Y9+9Ov89m//9vf8yI/8yGdz1VVXXXXVVf9zUY4fP85VV1111VVX/U/14R/+4d/1Tu/0Tp/9u7/7u9/FVVddddVVV/0Pcu7cuVvf9E3f9KMB/uEf/uF3uOqqq6666qr/mdCDHvQgrrrqqquuuup/mmuuuebBn/M5n/Nb11xzzYN/93d/97u46qqrrrrqqv+hXvM1X/N97rvvvls/67M+63Xuu+++W7nqqquuuuqq/1nQgx70IK666qqrrrrqf5J3fMd3/Kx3eqd3+uzf/d3f/S6uuuqqq6666n+JRz/60a/zW7/1W9/9oz/6o5/DVVddddVVV/3PgR70oAdx1VVXXXXVVf8TXHPNNQ/+8A//8O96sRd7sdf+3d/93e/iqquuuuqqq/6Xec3XfM33+Yd/+Iff/szP/MzX4aqrrrrqqqv+Z6AcP36cq6666qqrrvrv9mIv9mKv/RVf8RV/dc011zz4d3/3d7+Lq6666qqrrvpf6BnPeMZfv8IrvMLbvM7rvM5733rrrX9z9uzZW7nqqquuuuqq/17oQQ96EFddddVVV1313+kd3/EdP+ud3umdPvt3f/d3v4urrrrqqquu+j/i0Y9+9Ov81m/91nf/6I/+6Odw1VVXXXXVVf990IMe9CCuuuqqq6666r/DNddc8+AP//AP/64Xe7EXe+3f/d3f/S6uuuqqq6666v+Y13zN13yf++6779bP+qzPep377rvvVq666qqrrrrqvx7l+PHjXHXVVVddddV/tRd7sRd77a/4iq/4qyc84Qm/9YxnPOOvueqqq6666qr/g57xjGf89blz5259x3d8x8/Z2Ng49g//8A+/w1VXXXXVVVf916IcP36cq6666qqrrvqv9I7v+I6f9REf8RHf/bu/+7vfxVVXXXXVVVf9P3Du3Lmnv9mbvdnHAPzDP/zD73DVVVddddVV/3XQgx70IK666qqrrrrqv8I111zz4A//8A//rhd7sRd77d/93d/9Lq666qqrrrrq/5nXfM3XfJ/77rvv1s/6rM96nfvuu+9Wrrrqqquuuuo/H+X48eNcddVVV1111X+2F3uxF3vtr/iKr/irJzzhCb/1jGc846+56qqrrrrqqv+HnvGMZ/z1uXPnbn2Hd3iHz97a2jrxD//wD7/NVVddddVVV/3nohw/fpyrrrrqqquu+s/0ju/4jp/1ER/xEd/9u7/7u9/FVVddddVVV13FuXPnbn3TN33Tjwb4h3/4h9/hqquuuuqqq/7zoAc96EFcddVVV1111X+Ga6655sEf/uEf/l0v9mIv9tq/+7u/+11cddVVV1111VXP4TVf8zXf57777rv1sz7rs17nvvvuu5Wrrrrqqquu+o+HHvSgB3HVVVddddVV/9Fe53Ve570//MM//Lt+93d/97u46qqrrrrqqqteqEc/+tGv81u/9Vvf/aM/+qOfw1VXXXXVVVf9x6IcP36cq6666qqrrvqP9Lmf+7m/9eZv/uYf/bu/+7vfxVVXXXXVVVdd9S86d+7crW/2Zm/2MZL0D//wD7/NVVddddVVV/3HQQ960IO46qqrrrrqqv8I11xzzYM/53M+57euueaaB//u7/7ud3HVVVddddVVV/2rvOZrvub73Hfffbd+1md91uvcd999t3LVVVddddVV/37oQQ96EFddddVVV1317/WO7/iOn/VO7/ROn/27v/u738VVV1111VVXXfXv8uhHP/p1fuu3fuu7f/RHf/RzuOqqq6666qp/H8rx48e56qqrrrrqqn+ra6655sGf9Emf9FOv8zqv896/+7u/+11cddVVV1111VX/bufOnbv1zd7szT7mxV/8xV/7H/7hH37n8PBwl6uuuuqqq676tyG46qqrrrrqqn+H137t136vF3uxF3vt3/3d3/0urrrqqquuuuqq/zC/+7u/+10v9mIv9tqv8zqv895cddVVV1111b8dwVVXXXXVVVf9O7zTO73TZ//u7/7ud3HVVVddddVVV/2H+93f/d3vep3XeZ33vuaaax7MVVddddVVV/3bULnqqquuuuqqf4f77rvvVq666qqrrrrqqv80Z86cedB99913K1ddddVVV131b0Plqquuuuqqq/4dzp49eytXXXXVVVddddV/mt/6rd/6Hq666qqrrrrq347gqquuuuqqq/4d/v7v//63ueqqq6666qqr/tPcd999T+eqq6666qqr/u0Irrrqqquuuurf4R/+4R9+5zVf8zXfh6uuuuqqq6666j/ca77ma77P2bNnn8FVV1111VVX/dtRueqqq6666qp/h7Nnz97KVVddddVVV131n+Yf/uEffpurrrrqqquu+rejctVVV1111VX/Dvfdd9+tXHXVVVddddVV/2nuu+++W7nqqquuuuqqfzsqV1111VVXXfXv9A//8A+/zVVXXXXVVVdd9R/uH/7hH36bq6666qqrrvr3Ibjqqquuuuqqf6f77rvvVq666qqrrrrqqv9w9913361cddVVV1111b8PwVVXXXXVVVf9O9133323vuZrvub7cNVVV1111VVX/Yd5zdd8zff5h3/4h9/hqquuuuqqq/59qFx11VVXXXXVv9M//MM//A5XXXXVVVddddV/uH/4h3/4ba666qqrrrrq34fKVVddddVVV/07nT179lauuuqqq6666qr/cPfdd9+tXHXVVVddddW/D5Wrrrrqqquu+ne67777bv2Hf/iH3+aqq6666qqrrrrqqquuuuqq/2moXHXVVVddddVVV1111VVXXfU/zm/91m99N1ddddVVV13170dw1VVXXXXVVf8B/v7v//63X/M1X/N9uOqqq6666qqr/t1e8zVf833uu+++W7nqqquuuuqqfz8qV1111VVXXfUf4B/+4R9+h6uuuuqqq6666j/M2bNnn8FVV1111VVX/ftRueqqq6666qr/AGfPnr2Vq6666qqrrrrqP8w//MM//DZXXXXVVVdd9e9H5aqrrrrqqqv+A9x33323ctVVV1111VVX/Ye57777buWqq6666qqr/v2oXHXVVVddddV/kH/4h3/4ba666qqrrrrqqn+33/qt3/purrrqqquuuuo/BsFVV1111VVX/Qf5+7//+9/mqquuuuqqq6666qqrrrrqqv9JCK666qqrrrrqP8jZs2ef8Zqv+Zrvw1VXXXXVVVdd9W/2mq/5mu/zD//wD7/DVVddddVVV/3HoHLVVVddddVV/0Huu+++W7nqqquuuuqqq/7d/uEf/uG3ueqqq6666qr/GFSuuuqqq6666j/I2bNnb+Wqq6666qqrrvp3u++++27lqquuuuqqq/5jULnqqquuuuqq/yD33Xffrf/wD//w21x11VVXXXXVVf9m9913361cddVVV1111X8cKlddddVVV1111VVXXXXVVVf9j/EP//APv81VV1111VVX/cchuOqqq6666qr/QH//93//26/5mq/5Plx11VVXXXXVVf9qr/mar/k+9913361cddVVV1111X8cKlddddVVV131H+gf/uEffoerrrrqqquuuurf7OzZs8/gqquuuuqqq/7jULnqqquuuuqq/0Bnz569lauuuuqqq6666t/sH/7hH36bq6666qqrrvqPQ+Wqq6666qqr/gPdd999t9533323ctVVV1111VVX/Zvcd999t3LVVVddddVV/3GoXHXVVVddddV/sLNnz97KVVddddVVV131r/Zbv/Vb38NVV1111VVX/cciuOqqq6666qr/YH//93//21x11VVXXXXVVVddddVVV131PwHBVVddddVVV/0H+4d/+Iffec3XfM334aqrrrrqqquuepG95mu+5vv8wz/8w29z1VVXXXXVVf+xqFx11VVXXXXVf7CzZ8/eylVXXXXVVVdd9a/2D//wD7/NVVddddVVV/3HonLVVVddddVVV1111VVXXXXV/wj33XffrVx11VVXXXXVfywqV1111VVXXfUf7L777rv1H/7hH36bq6666qqrrrrqRfYP//APv81VV1111VVX/cejctVVV1111VVXXXXVVVddddV/u/vuu+9Wrrrqqquuuuo/HsFVV1111VVX/Sf4+7//+99+zdd8zffhqquuuuqqq676F73ma77m+/zDP/zD73DVVVddddVV//GoXHXVVVddddV/gn/4h3/4Ha666qqrrrrqqquuuuqqq67670blqquuuuqqq/4TnD179lauuuqqq6666qoX2T/8wz/8NlddddVVV131H4/KVVddddVVV/0nuO+++2697777buWqq6666qqrrnqR3Hfffbdy1VVXXXXVVf/xqFx11VVXXXXVf5KzZ8/eylVXXXXVVVdd9S/6rd/6re/mqquuuuqqq/5zEFx11VVXXXXVf5K///u//22uuuqqq6666qqrrrrqqquu+u9EcNVVV1111VX/Sf7hH/7hd17zNV/zfbjqqquuuuqqq16g13zN13yff/iHf/gdrrrqqquuuuo/B5Wrrrrqqquu+k9y9uzZW7nqqquuuuqqq/5F//AP//DbXHXVVVddddV/DipXXXXVVVdd9Z/kvvvuu5WrrrrqqquuuupfdN99993KVVddddVVV/3noHLVVVddddVV/4n+4R/+4be56qqrrrrqqqteoH/4h3/4ba666qqrrrrqPw/BVVddddVVV/0nuu+++27lqquuuuqqq656ge67775bueqqq6666qr/PARXXXXVVVdd9Z/ovvvuu/U1X/M134errrrqqquuuup5vOZrvub7/MM//MPvcNVVV1111VX/eahcddVVV1111X+if/iHf/gdrrrqqquuuuqqF+gf/uEffpurrrrqqquu+s9D5aqrrrrqqqv+E509e/ZWrrrqqquuuuqqq6666qqrrvrvQuWqq6666qqr/hPdd999t9533323ctVVV1111VVXPV/33XffrVx11VVXXXXVfx4qV1111VVXXfWf7OzZs7dy1VVXXXXVVVc9j9/6rd/6bq666qqrrrrqPxfBVVddddVVV/0n+/u///vffs3XfM334aqrrrrqqquuepbXfM3XfJ/77rvvVq666qqrrrrqPxeVq6666qqrrvpP9g//8A+/w1VXXXXVVVdd9TzOnj37DK666qqrrrrqPxeVq6666qqrrvpPdvbs2Vu56qqrrrrqqquexz/8wz/8NlddddVVV131n4vKVVddddVVV/0nu++++27lqquuuuqqq656Hvfdd9+tXHXVVVddddV/LipXXXXVVVdd9V/gH/7hH36bq6666qqrrrrqWf7hH/7hd7jqqquuuuqq/3wEV1111VVXXfVf4O///u9/m6uuuuqqq6666lnuu+++W7nqqquuuuqq/3wEV1111VVXXfVf5DVf8zXfh6uuuuqqq666itd8zdd8n3/4h3/4ba666qqrrrrqPx+Vq6666qqrrvov8A//8A+/w1VXXXXVVVdd9Sz/8A//8NtcddVVV1111X8+KlddddVVV131X+Ds2bO3ctVVV1111VVXPct99913K1ddddVVV131n4/KVVddddVVV/0XuO+++279h3/4h9/mqquuuuqqq67ivvvuu5Wrrrrqqquu+q9B5aqrrrrqqquuuuqqq6666qr/Uv/wD//w21x11VVXXXXVfw2Cq6666qqrrvov8vd///e//Zqv+Zrvw1VXXXXVVVf9P/aar/ma73PffffdylVXXXXVVVf916By1VVXXXXVVf9F/uEf/uF3uOqqq6666qqrOHv27DO46qqrrrrqqv8aVK666qqrrrrqv8jZs2dv5aqrrrrqqquu4h/+4R9+m6uuuuqqq676r0Hlqquuuuqqq/6L3Hfffbdy1VVXXXXVVVdx33333cpVV1111VVX/degctVVV1111VX/hf7hH/7ht7nqqquuuuqq/8d+67d+67u56qqrrrrqqv86BFddddVVV131X+i3fuu3voerrrrqqquu+n/svvvuu5Wrrrrqqquu+q9DcNVVV1111VX/hX7rt37ru1tres3XfM334aqrrrrqqqv+H3nN13zN9zl16tRDfvRHf/RzuOqqq6666qr/OuhBD3oQV1111VVXXfVf7Zprrnnwa7/2a7/XO73TO302wO/+7u9+F1ddddVVV131f8xrvuZrvg/Aj/zIj3z2b//2b3/PfffddytXXXXVVVdd9V8LPehBD+Kqq6666qqr/rtcc801D37t137t93qd13md977mmmse/Lu/+7vfxVVXXXXVVVf9L/ear/ma73Pffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVf990EPetCDuOqqq6666qr/btdcc82DX+zFXuy1X+d1Xue9XuzFXuy1f/d3f/e7uOqqq6666qr/ZV7zNV/zfe67775bf+u3fuu7f/RHf/RzuOqqq6666qr/fuhBD3oQV1111VVXXfU/yTXXXPPgd3zHd/ys13md13lvgN/93d/9Lq666qqrrrrqf6jXfM3XfB+AH/mRH/ns3/7t3/6e++6771auuuqqq6666n8O9KAHPYirrrrqqquu+p/ommuuefBrv/Zrv9frvM7rvPc111zz4N/93d/9Lq666qqrrrrqf4jXfM3XfJ/77rvv1t/6rd/67h/90R/9HK666qqrrrrqfyb0oAc9iKuuuuqqq676n+yaa6558Iu92Iu99uu8zuu814u92Iu99u/+7u9+F1ddddVVV1313+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq676nw096EEP4qqrrrrqqqv+t7jmmmse/I7v+I6f9Tqv8zrvDfC7v/u738VVV1111VVX/Sd7zdd8zfcB+JEf+ZHP/u3f/u3vue+++27lqquuuuqqq/53QA960IO46qqrrrrqqv9trrnmmge/9mu/9nu90zu902cD/O7v/u53cdVVV1111VX/wV7zNV/zfe67775bf+u3fuu7f/RHf/RzuOqqq6666qr/fdCDHvQgrrrqqquuuup/q2uuuebBL/ZiL/bar/M6r/NeL/ZiL/bav/u7v/tdXHXVVVddddW/02u+5mu+z3333Xfrb/3Wb333j/7oj34OV1111VVXXfW/F3rQgx7EVVddddVVV/1fcM011zz4Hd/xHT/rdV7ndd4b4Hd/93e/i6uuuuqqq656Eb3ma77m+wD81m/91nf/yI/8yGefPXv2GVx11VVXXXXV/37oQQ96EFddddVVV131f8k111zz4Nd+7dd+r3d6p3f6bIDf/d3f/S6uuuqqq6666gV4zdd8zfe57777bv2t3/qt7/7t3/7t77nvvvtu5aqrrrrqqqv+70APetCDuOqqq6666qr/i6655poHv9iLvdhrv87rvM57vdiLvdhr/+7v/u53cdVVV1111VXP9Jqv+Zrvc9999936W7/1W9/9oz/6o5/DVVddddVVV/3fhB70oAdx1VVXXXXVVf/XXXPNNQ9+x3d8x896ndd5nfcG+N3f/d3v4qqrrrrqqv93XvM1X/N9AP7hH/7ht3/rt37re37rt37ru7nqqquuuuqq/9vQgx70IK666qqrrrrq/4trrrnmwa/92q/9Xu/0Tu/02QC/+7u/+11cddVVV131f95rvuZrvs99991362/91m9992//9m9/z3333XcrV1111VVXXfX/A3rQgx7EVVddddVVV/1/c8011zz4xV7sxV77dV7ndd7rxV7sxV77d3/3d7+Lq6666qqr/s95zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqr/v9BD3rQg7jqqquuuuqq/89e7MVe7LXf6Z3e6bNe7MVe7LUBfvd3f/e7uOqqq6666n+t13zN13wfgPvuu+/WH/3RH/2c3/qt3/purrrqqquuuur/L/SgBz2Iq6666qqrrroKrrnmmge/9mu/9nu90zu902cD/O7v/u53cdVVV1111f8ar/mar/k+9913362/9Vu/9d2//du//T333XffrVx11VVXXXXVVehBD3oQV1111VVXXXXVs11zzTUPfu3Xfu33ep3XeZ33vuaaax78u7/7u9/FVVddddVV/2O95mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVVz0QetCDHsRVV1111VVXXfX8vc7rvM57v87rvM57vdiLvdhr/+7v/u53cdVVV1111f8Yr/mar/k+9913360/+qM/+jm/9Vu/9d1cddVVV1111VXPD3rQgx7EVVddddVVV131wl1zzTUPfu3Xfu33eqd3eqfPBvjd3/3d7+Kqq6666qr/cq/5mq/5PgA/8iM/8tm//du//T333XffrVx11VVXXXXVVS8MetCDHsRVV1111VVXXfWiueaaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqqv+073ma77m+9x33323/tZv/dZ3/+iP/ujncNVVV1111VVXvajQgx70IK666qqrrrrqqn+da6655sEv9mIv9tqv8zqv814v9mIv9tq/+7u/+11cddVVV131H+41X/M13+e+++679Ud/9Ec/57d+67e+m6uuuuqqq6666l8LPehBD+Kqq6666qqrrvq3u+aaax782q/92u/1Tu/0Tp8N8Lu/+7vfxVVXXXXVVf9mr/mar/k+AD/yIz/y2b/1W7/13WfPnn0GV1111VVXXXXVvxV60IMexFVXXXXVVVdd9e93zTXXPPi1X/u13+t1Xud13vuaa6558O/+7u9+F1ddddVVV73IXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+I6AHPehBXHXVVVddddVV/3GuueaaB7/Yi73Ya73O67zOe7/Yi73Ya//u7/7ud3HVVVddddUL9Jqv+Zrvc9999936W7/1W9/9oz/6o5/DVVddddVVV131Hwk96EEP4qqrrrrqqquu+s9xzTXXPPgd3/EdP+t1Xud13hvgd3/3d7+Lq6666qqreM3XfM33AfiRH/mRz/7t3/7t77nvvvtu5aqrrrrqqquu+s+AHvSgB3HVVVddddVVV/3nuuaaax782q/92u/1Oq/zOu99zTXXPPh3f/d3v4urrrrqqv+HXvM1X/N97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqqv+s6EHPehBXHXVVVddddVV/zWuueaaB7/Yi73Ya7/O67zOe73Yi73Ya//u7/7ud3HVVVdd9f/Aa77ma77Pfffdd+tv/dZvffeP/uiPfg5XXXXVVVddddV/FfSgBz2Iq6666qqrrrrqv94111zz4Hd8x3f8rNd5ndd5b4Df/d3f/S6uuuqqq/4Pec3XfM33AfiRH/mRz/7t3/7t77nvvvtu5aqrrrrqqquu+q+GHvSgB3HVVVddddVVV/33ueaaax782q/92u/1Tu/0Tp8N8Lu/+7vfxVVXXXXV/2Kv+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVf+d0IMe9CCuuuqqq6666qr/ftdcc82DX+zFXuy1X+d1Xue9XuzFXuy1f/d3f/e7uOqqq676X+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666n8C9KAHPYirrrrqqquuuup/lmuuuebB7/iO7/hZr/M6r/PeAL/7u7/7XVx11VVX/Q/0mq/5mu8D8Fu/9Vvf/aM/+qOfc999993KVVddddVVV131Pwl60IMexFVXXXXVVVdd9T/TNddc8+DXfu3Xfq93eqd3+myA3/3d3/0urrrqqqv+B3jN13zN97nvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquu+p8KPehBD+Kqq6666qqrrvqf7cyZMw968Rd/8dd5ndd5nfd6sRd7sdf+3d/93e/iqquuuuq/wWu+5mu+z3333Xfrb/3Wb333j/7oj34OV1111VVXXXXV/3ToQQ96EFddddVVV1111f8e11xzzYPf8R3f8bNe53Ve570Bfvd3f/e7uOqqq676T/Sar/ma7wPwD//wD7/9W7/1W9/zW7/1W9/NVVddddVVV131vwV60IMexFVXXXXVVVdd9b/PmTNnHvQ6r/M67/1O7/ROnw3wu7/7u9/FVVddddV/oNd8zdd8n/vuu+/W3/qt3/ru3/qt3/rus2fPPoOrrrrqqquuuup/G/SgBz2Iq6666qqrrrrqf69rrrnmwS/2Yi/22q/zOq/zXi/2Yi/22r/7u7/7XVx11VVX/Tu85mu+5vvcd999t/7Wb/3Wd//oj/7o53DVVVddddVVV/1vhh70oAdx1VVXXXXVVVf93/BiL/Zir/U6r/M67/06r/M67w3wu7/7u9/FVVddddWL4DVf8zXfB+C+++679Ud/9Ec/+7d+67e+h6uuuuqqq6666v8C9KAHPYirrrrqqquuuur/lmuuuebBr/3ar/1e7/RO7/TZAL/7u7/7XVx11VVXPR+v+Zqv+T733Xffrb/1W7/13b/927/9Pffdd9+tXHXVVVddddVV/5egBz3oQVx11VVXXXXVVf83XXPNNQ9+7dd+7fd6ndd5nfe+5pprHvy7v/u738VVV111FfCar/ma73Pffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVdd9X8VetCDHsRVV1111VVXXfV/3+u8zuu89+u8zuu814u92Iu99u/+7u9+F1ddddX/S6/5mq/5Pvfdd9+tP/qjP/o5v/Vbv/XdXHXVVVddddVV/9ehBz3oQVx11VVXXXXVVf9/XHPNNQ9+7dd+7fd6p3d6p88G+N3f/d3v4qqrrvo/7TVf8zXfB+BHfuRHPvu3f/u3v+e+++67lauuuuqqq6666v8L9KAHPYirrrrqqquuuur/n2uuuebBr/3ar/1er/M6r/Pe11xzzYN/93d/97u46qqr/k95zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrvr/CD3oQQ/iqquuuuqqq676/+uaa6558Iu92Iu99uu8zuu814u92Iu99u/+7u9+F1ddddX/aq/5mq/5Pvfdd9+tP/qjP/o5v/Vbv/XdXHXVVVddddVV/5+hBz3oQVx11VVXXXXVVVcBXHPNNQ9+7dd+7fd6p3d6p88G+N3f/d3v4qqrrvpf4TVf8zXfB+BHfuRHPvu3f/u3v+e+++67lauuuuqqq6666ipAD3rQg7jqqquuuuqqq656oGuuuebBr/3ar/1er/M6r/Pe11xzzYN/93d/97u46qqr/kd6zdd8zfe57777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrqOaEHPehBXHXVVVddddVVVz0/Z86cedCLv/iLv87rvM7rvNeLvdiLvfbv/u7vfhdXXXXV/wiv+Zqv+T733XffrT/6oz/6Ob/1W7/13Vx11VVXXXXVVVc9f+hBD3oQV1111VVXXXXVVf+Sa6655sHv+I7v+Fmv8zqv894Av/u7v/tdXHXVVf+lXvM1X/N9AH7kR37ks3/7t3/7e+67775bueqqq6666qqrrnrh0IMe9CCuuuqqq6666qqrXlRnzpx50Ou8zuu89+u8zuu89zXXXPPg3/3d3/0urrrqqv9Ur/mar/k+9913362/9Vu/9d0/+qM/+jlcddVVV1111VVXvejQgx70IK666qqrrrrqqqv+ta655poHv9iLvdhrv87rvM57vdiLvdhr/+7v/u53cdVVV/2Hes3XfM33ue+++279rd/6re/+0R/90c/hqquuuuqqq6666l8PPehBD+Kqq6666qqrrrrq3+PMmTMPeqd3eqfPfp3XeZ33Bvjd3/3d7+Kqq676N3nN13zN9wH4kR/5kc/+rd/6re8+e/bsM7jqqquuuuqqq676t0MPetCDuOqqq6666qqrrvqPcM011zz4tV/7td/rdV7ndd77mmuuefDv/u7vfhdXXXXVi+Q1X/M13+e+++679bd+67e++0d/9Ec/h6uuuuqqq6666qr/GOhBD3oQV1111VVXXXXVVf+Rrrnmmge/2Iu92Gu9zuu8znu/2Iu92Gv/7u/+7ndx1VVXPV+v+Zqv+T733Xffrb/1W7/13T/6oz/6OVx11VVXXXXVVVf9x0IPetCDuOqqq6666qqrrvrPcs011zz4Hd/xHT/rdV7ndd4b4Hd/93e/i6uu+n/uNV/zNd8H4Ld+67e++0d/9Ec/57777ruVq6666qqrrrrqqv8c6EEPehBXXXXVVVddddVV/9muueaaB7/2a7/2e73TO73TZ9933323XnPNNQ/mqqv+H7rvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquuuuo/H3rQgx7EVVddddVVV1111X+la6655sE8k21LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25LEA9i2JPEAti1JPIBtSxIPYNuSxAPYtiTxALYtSTyAbUsSD2DbksQD2LYk8QC2LUk8gG1LEg9g25IEcN99993KVVddddVVV1111X8t9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CPics5oVBdOZAAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl/std.json b/docs/kcl/std.json index bf20b0f44..216e1dd16 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -31861,3867 +31861,6 @@ "const exampleSketch = startSketchOn('XZ')\n |> startProfileAt([0, 0], %)\n |> line([10, 0], %)\n |> arc({\n angleStart: 0,\n angleEnd: 280,\n radius: 16\n }, %)\n |> close(%)" ] }, - { - "name": "arrayReduce", - "summary": "Take a starting value. Then, for each element of an array, calculate the next value,", - "description": "using the previous value and the element.", - "tags": [], - "args": [ - { - "name": "array", - "type": "[u64]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_uint64", - "type": "array", - "items": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - } - }, - "required": true - }, - { - "name": "start", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "start", - "value" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "start", - "value" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - } - } - }, - "required": true - }, - { - "name": "reduce_fn", - "type": "FunctionParam", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "FunctionParam", - "type": "null", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "start", - "value" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - } - } - }, - "required": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "start", - "value" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "end", - "start", - "value" - ], - "properties": { - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 2, - "minItems": 2 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "description": "A plane.", - "type": "object", - "required": [ - "__meta", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "__meta", - "id", - "solid", - "type", - "value", - "xAxis", - "yAxis", - "zAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face’s X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face’s Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "zAxis": { - "description": "The z-axis (normal).", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - } - } - }, - "Metadata": { - "description": "Metadata.", - "type": "object", - "required": [ - "sourceRange" - ], - "properties": { - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "Solid": { - "description": "An solid is a collection of extrude surfaces.", - "type": "object", - "required": [ - "__meta", - "height", - "id", - "sketch", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "description": "A sketch is a collection of paths.", - "type": "object", - "required": [ - "__meta", - "id", - "on", - "start", - "value" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "__meta": { - "description": "Metadata.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "__meta", - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "info": { - "allOf": [ - { - "$ref": "#/components/schemas/TagEngineInfo" - } - ], - "nullable": true - }, - "__meta": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Metadata" - } - } - } - }, - "TagEngineInfo": { - "description": "Engine information for a tag.", - "type": "object", - "required": [ - "id", - "sketch" - ], - "properties": { - "id": { - "description": "The id of the tagged object.", - "type": "string", - "format": "uuid" - }, - "sketch": { - "description": "The sketch the tag is on.", - "type": "string", - "format": "uuid" - }, - "path": { - "description": "The path the tag is on.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ], - "nullable": true - }, - "surface": { - "description": "The surface information for the tag.", - "allOf": [ - { - "$ref": "#/components/schemas/ExtrudeSurface" - } - ], - "nullable": true - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "type": "number", - "format": "double" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - } - } - }, - "required": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - "fn decagon = (radius) => {\n let step = 1 / 10 * tau()\n let sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius])\n return arrayReduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], sketch001, (i, sg) => {\n let x = cos(step * i) * radius\n let y = sin(step * i) * radius\n return lineTo([x, y], sg)\n})\n}\ndecagon(5.0)\n |> close(%)" - ] - }, { "name": "asin", "summary": "Compute the arcsine of a number (in radians).", @@ -116325,6 +112464,3867 @@ "const sketch001 = startSketchOn('XY')\n |> startProfileAt([5, 2], %)\n |> angledLine({ angle: -60, length: 14 }, %)\n |> angledLineToY({ angle: 30, to: profileStartY(%) }, %)" ] }, + { + "name": "reduce", + "summary": "Take a starting value. Then, for each element of an array, calculate the next value,", + "description": "using the previous value and the element.", + "tags": [], + "args": [ + { + "name": "array", + "type": "[u64]", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Array_of_uint64", + "type": "array", + "items": { + "type": "integer", + "format": "uint64", + "minimum": 0.0 + } + }, + "required": true + }, + { + "name": "start", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true + }, + { + "name": "reduce_fn", + "type": "FunctionParam", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "FunctionParam", + "type": "null", + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true + } + ], + "returnValue": { + "name": "", + "type": "Sketch", + "schema": { + "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", + "title": "Sketch", + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "definitions": { + "Path": { + "description": "A path.", + "oneOf": [ + { + "description": "A path that goes to a point.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "ToPoint" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment that goes to a point", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArcTo" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A arc that is tangential to the last path segment", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "TangentialArc" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "a complete arc", + "type": "object", + "required": [ + "__geoMeta", + "ccw", + "center", + "from", + "radius", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Circle" + ] + }, + "center": { + "description": "the arc's center", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "radius": { + "description": "the arc's radius", + "type": "number", + "format": "double" + }, + "ccw": { + "description": "arc's direction", + "type": "boolean" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A path that is horizontal.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type", + "x" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Horizontal" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double" + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "An angled line to.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "AngledLineTo" + ] + }, + "x": { + "description": "The x coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "y": { + "description": "The y coordinate.", + "type": "number", + "format": "double", + "nullable": true + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "Base" + ] + }, + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + } + ] + }, + "TagDeclarator": { + "type": "object", + "required": [ + "end", + "start", + "value" + ], + "properties": { + "start": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "end": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "value": { + "type": "string" + }, + "digest": { + "type": "array", + "items": { + "type": "integer", + "format": "uint8", + "minimum": 0.0 + }, + "maxItems": 32, + "minItems": 32, + "nullable": true + } + } + }, + "GeoMeta": { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "id", + "sourceRange" + ], + "properties": { + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "SourceRange": { + "type": "array", + "items": { + "type": "integer", + "format": "uint", + "minimum": 0.0 + }, + "maxItems": 2, + "minItems": 2 + }, + "SketchSurface": { + "description": "A sketch type.", + "oneOf": [ + { + "description": "A plane.", + "type": "object", + "required": [ + "__meta", + "id", + "origin", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "plane" + ] + }, + "id": { + "description": "The id of the plane.", + "type": "string", + "format": "uuid" + }, + "value": { + "$ref": "#/components/schemas/PlaneType" + }, + "origin": { + "description": "Origin of the plane.", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "xAxis": { + "description": "What should the plane’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the plane’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + { + "description": "A face.", + "type": "object", + "required": [ + "__meta", + "id", + "solid", + "type", + "value", + "xAxis", + "yAxis", + "zAxis" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "face" + ] + }, + "id": { + "description": "The id of the face.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The tag of the face.", + "type": "string" + }, + "xAxis": { + "description": "What should the face’s X axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "yAxis": { + "description": "What should the face’s Y axis be?", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "zAxis": { + "description": "The z-axis (normal).", + "allOf": [ + { + "$ref": "#/components/schemas/Point3d" + } + ] + }, + "solid": { + "description": "The solid the face is on.", + "allOf": [ + { + "$ref": "#/components/schemas/Solid" + } + ] + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + } + ] + }, + "PlaneType": { + "description": "Type for a plane.", + "oneOf": [ + { + "type": "string", + "enum": [ + "XY", + "XZ", + "YZ" + ] + }, + { + "description": "A custom plane.", + "type": "string", + "enum": [ + "Custom" + ] + } + ] + }, + "Point3d": { + "type": "object", + "required": [ + "x", + "y", + "z" + ], + "properties": { + "x": { + "type": "number", + "format": "double" + }, + "y": { + "type": "number", + "format": "double" + }, + "z": { + "type": "number", + "format": "double" + } + } + }, + "Metadata": { + "description": "Metadata.", + "type": "object", + "required": [ + "sourceRange" + ], + "properties": { + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + "Solid": { + "description": "An solid is a collection of extrude surfaces.", + "type": "object", + "required": [ + "__meta", + "height", + "id", + "sketch", + "value" + ], + "properties": { + "id": { + "description": "The id of the solid.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The extrude surfaces.", + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtrudeSurface" + } + }, + "sketch": { + "description": "The sketch.", + "allOf": [ + { + "$ref": "#/components/schemas/Sketch" + } + ] + }, + "height": { + "description": "The height of the solid.", + "type": "number", + "format": "double" + }, + "startCapId": { + "description": "The id of the extrusion start cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "endCapId": { + "description": "The id of the extrusion end cap", + "type": "string", + "format": "uuid", + "nullable": true + }, + "edgeCuts": { + "description": "Chamfers or fillets on this solid.", + "type": "array", + "items": { + "$ref": "#/components/schemas/EdgeCut" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "ExtrudeSurface": { + "description": "An extrude surface.", + "oneOf": [ + { + "description": "An extrude plane.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudePlane" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "An extruded arc.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "extrudeArc" + ] + }, + "faceId": { + "description": "The face id for the extrude plane.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "faceId": { + "description": "The id for the chamfer surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + }, + { + "description": "Geometry metadata.", + "type": "object", + "required": [ + "faceId", + "id", + "sourceRange", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "faceId": { + "description": "The id for the fillet surface.", + "type": "string", + "format": "uuid" + }, + "tag": { + "description": "The tag.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "id": { + "description": "The id of the geometry.", + "type": "string", + "format": "uuid" + }, + "sourceRange": { + "description": "The source range.", + "allOf": [ + { + "$ref": "#/components/schemas/SourceRange" + } + ] + } + } + } + ] + }, + "Sketch": { + "description": "A sketch is a collection of paths.", + "type": "object", + "required": [ + "__meta", + "id", + "on", + "start", + "value" + ], + "properties": { + "id": { + "description": "The id of the sketch (this will change when the engine's reference to it changes.", + "type": "string", + "format": "uuid" + }, + "value": { + "description": "The paths in the sketch.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Path" + } + }, + "on": { + "description": "What the sketch is on (can be a plane or a face).", + "allOf": [ + { + "$ref": "#/components/schemas/SketchSurface" + } + ] + }, + "start": { + "description": "The starting path.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ] + }, + "tags": { + "description": "Tag identifiers that have been declared in this sketch.", + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/TagIdentifier" + } + }, + "__meta": { + "description": "Metadata.", + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "BasePath": { + "description": "A base path.", + "type": "object", + "required": [ + "__geoMeta", + "from", + "to" + ], + "properties": { + "from": { + "description": "The from point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "to": { + "description": "The to point.", + "type": "array", + "items": { + "type": "number", + "format": "double" + }, + "maxItems": 2, + "minItems": 2 + }, + "tag": { + "description": "The tag of the path.", + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + }, + "__geoMeta": { + "description": "Metadata.", + "allOf": [ + { + "$ref": "#/components/schemas/GeoMeta" + } + ] + } + } + }, + "TagIdentifier": { + "type": "object", + "required": [ + "__meta", + "value" + ], + "properties": { + "value": { + "type": "string" + }, + "info": { + "allOf": [ + { + "$ref": "#/components/schemas/TagEngineInfo" + } + ], + "nullable": true + }, + "__meta": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Metadata" + } + } + } + }, + "TagEngineInfo": { + "description": "Engine information for a tag.", + "type": "object", + "required": [ + "id", + "sketch" + ], + "properties": { + "id": { + "description": "The id of the tagged object.", + "type": "string", + "format": "uuid" + }, + "sketch": { + "description": "The sketch the tag is on.", + "type": "string", + "format": "uuid" + }, + "path": { + "description": "The path the tag is on.", + "allOf": [ + { + "$ref": "#/components/schemas/BasePath" + } + ], + "nullable": true + }, + "surface": { + "description": "The surface information for the tag.", + "allOf": [ + { + "$ref": "#/components/schemas/ExtrudeSurface" + } + ], + "nullable": true + } + } + }, + "EdgeCut": { + "description": "A fillet or a chamfer.", + "oneOf": [ + { + "description": "A fillet.", + "type": "object", + "required": [ + "edgeId", + "id", + "radius", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "fillet" + ] + }, + "id": { + "description": "The id of the engine command that called this fillet.", + "type": "string", + "format": "uuid" + }, + "radius": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to fillet.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + }, + { + "description": "A chamfer.", + "type": "object", + "required": [ + "edgeId", + "id", + "length", + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "chamfer" + ] + }, + "id": { + "description": "The id of the engine command that called this chamfer.", + "type": "string", + "format": "uuid" + }, + "length": { + "type": "number", + "format": "double" + }, + "edgeId": { + "description": "The engine id of the edge to chamfer.", + "type": "string", + "format": "uuid" + }, + "tag": { + "allOf": [ + { + "$ref": "#/components/schemas/TagDeclarator" + } + ], + "nullable": true + } + } + } + ] + } + } + }, + "required": true + }, + "unpublished": false, + "deprecated": false, + "examples": [ + "fn decagon = (radius) => {\n let step = 1 / 10 * tau()\n let sketch001 = startSketchAt([cos(0) * radius, sin(0) * radius])\n return reduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], sketch001, (i, sg) => {\n let x = cos(step * i) * radius\n let y = sin(step * i) * radius\n return lineTo([x, y], sg)\n})\n}\ndecagon(5.0)\n |> close(%)" + ] + }, { "name": "rem", "summary": "Compute the remainder after dividing `num` by `div`.", diff --git a/src/wasm-lib/Cargo.lock b/src/wasm-lib/Cargo.lock index c1cb9e80e..ca2f7d63e 100644 --- a/src/wasm-lib/Cargo.lock +++ b/src/wasm-lib/Cargo.lock @@ -1958,7 +1958,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] diff --git a/src/wasm-lib/kcl/src/std/array.rs b/src/wasm-lib/kcl/src/std/array.rs index 006bc3abc..22c287f50 100644 --- a/src/wasm-lib/kcl/src/std/array.rs +++ b/src/wasm-lib/kcl/src/std/array.rs @@ -97,7 +97,7 @@ async fn call_map_closure<'a>( } /// For each item in an array, update a value. -pub async fn array_reduce(exec_state: &mut ExecState, args: Args) -> Result { +pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result { let (array, start, f): (Vec, Sketch, FnAsArg<'_>) = FromArgs::from_args(&args, 0)?; let reduce_fn = FunctionParam { inner: f.func, @@ -106,7 +106,7 @@ pub async fn array_reduce(exec_state: &mut ExecState, args: Args) -> Result Result { /// let step = (1/10) * tau() /// let sketch001 = startSketchAt([(cos(0)*radius), (sin(0) * radius)]) -/// return arrayReduce([1..10], sketch001, (i, sg) => { +/// return reduce([1..10], sketch001, (i, sg) => { /// let x = cos(step * i) * radius /// let y = sin(step * i) * radius /// return lineTo([x, y], sg) @@ -126,9 +126,9 @@ pub async fn array_reduce(exec_state: &mut ExecState, args: Args) -> Result close(%) /// ``` #[stdlib { - name = "arrayReduce", + name = "reduce", }] -async fn inner_array_reduce<'a>( +async fn inner_reduce<'a>( array: Vec, start: Sketch, reduce_fn: FunctionParam<'a>, diff --git a/src/wasm-lib/kcl/src/std/mod.rs b/src/wasm-lib/kcl/src/std/mod.rs index 79f567ef3..a8681457f 100644 --- a/src/wasm-lib/kcl/src/std/mod.rs +++ b/src/wasm-lib/kcl/src/std/mod.rs @@ -97,7 +97,7 @@ lazy_static! { Box::new(crate::std::patterns::PatternCircular2D), Box::new(crate::std::patterns::PatternCircular3D), Box::new(crate::std::patterns::PatternTransform), - Box::new(crate::std::array::ArrayReduce), + Box::new(crate::std::array::Reduce), Box::new(crate::std::array::Map), Box::new(crate::std::chamfer::Chamfer), Box::new(crate::std::fillet::Fillet), diff --git a/src/wasm-lib/kcl/tests/outputs/serial_test_example_array_reduce0.png b/src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png similarity index 100% rename from src/wasm-lib/kcl/tests/outputs/serial_test_example_array_reduce0.png rename to src/wasm-lib/kcl/tests/outputs/serial_test_example_reduce0.png