diff --git a/.gitignore b/.gitignore index 9120eeb..eccc91d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,6 @@ out/ .gradle build/ /notebooks/.ipynb_checkpoints +/kotlin-js-store/ !gradle-wrapper.jar \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 3182602..4638da2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,16 +8,18 @@ allprojects { repositories { mavenLocal() maven("https://repo.kotlin.link") + maven("https://maven.pkg.jetbrains.space/spc/p/sci/dev") } group = "ru.inr.mass" - version = "0.1.2" + version = "0.1.3" } -val dataforgeVersion by extra("0.5.3-dev-4") -val tablesVersion: String by extra("0.1.2") -val kmathVersion by extra("0.3.0-dev-17") -val plotlyVersion: String by extra("0.5.0") +val dataforgeVersion by extra("0.6.0-dev-15") +val tablesVersion: String by extra("0.2.0-dev-3") +val kmathVersion by extra("0.3.1-dev-6") +val visionForgeVersion: String by rootProject.extra("0.3.0-dev-6") + ksciencePublish { diff --git a/gradle.properties b/gradle.properties index a514121..29eb27f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,3 +13,4 @@ org.gradle.parallel=true org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G toolsVersion=0.13.3-kotlin-1.7.20 +compose.version=1.2.1 diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 512fd9b..e69de29 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -1,1943 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@js-joda/core@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@js-joda/core/-/core-3.2.0.tgz#3e61e21b7b2b8a6be746df1335cf91d70db2a273" - integrity sha512-PMqgJ0sw5B7FKb2d5bWYIoxjri+QlW/Pys7+Rw82jSH0QN3rB05jZ/VrrsUdh1w4+i2kw9JOejXGq/KhDOX7Kg== - -"@socket.io/component-emitter@~3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" - integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/node@*", "@types/node@>=10.0.0": - version "17.0.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" - integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== - -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -accepts@~1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@^1.19.0: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" - type-is "~1.6.18" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.14.5: - version "4.19.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" - integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== - dependencies: - caniuse-lite "^1.0.30001312" - electron-to-chromium "^1.4.71" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001312: - version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" - integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.3, chokidar@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-loader@6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.5" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - -date-format@^4.0.14: - version "4.0.14" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" - integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.4, debug@^4.3.4, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@~4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dukat@0.5.8-rc.4: - version "0.5.8-rc.4" - resolved "https://registry.yarnpkg.com/dukat/-/dukat-0.5.8-rc.4.tgz#90384dcb50b14c26f0e99dae92b2dea44f5fce21" - integrity sha512-ZnMt6DGBjlVgK2uQamXfd7uP/AxH7RqI0BL9GLrrJb2gKdDxvJChWy+M9AQEaL+7/6TmxzJxFOsRiInY9oGWTA== - dependencies: - google-protobuf "3.12.2" - typescript "3.9.5" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.4.71: - version "1.4.71" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" - integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -engine.io-parser@~5.0.3: - version "5.0.6" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" - integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== - -engine.io@~6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.1.tgz#e3f7826ebc4140db9bbaa9021ad6b1efb175878f" - integrity sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" - -enhanced-resolve@^5.9.3: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.0.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -format-util@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.2.0, glob@^7.1.3, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -google-protobuf@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.12.2.tgz#50ce9f9b6281235724eb243d6a83e969a2176e53" - integrity sha512-4CZhpuRr1d6HjlyrxoXoocoGFnRYgKULgMtikMddA9ztRyYR59Aondv2FioyxWVamRo0rF2XpYawkTCBEQOSkA== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isbinaryfile@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -karma-chrome-launcher@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz#baca9cc071b1562a1db241827257bfe5cab597ea" - integrity sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz#d4bae72fb7a8397328a62b75013d2df937bdcf9c" - integrity sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g== - dependencies: - graceful-fs "^4.1.2" - -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - webpack-merge "^4.1.5" - -karma@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.0.tgz#82652dfecdd853ec227b74ed718a997028a99508" - integrity sha512-s8m7z0IF5g/bS5ONT7wsOavhW4i4aFkzD4u4wgzAQWT4HGUeWI3i21cK2Yz6jndMAeHETp5XuNsRoyGJZXVd4w== - dependencies: - "@colors/colors" "1.5.0" - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.4.1" - mime "^2.5.2" - minimatch "^3.0.4" - mkdirp "^0.5.5" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^4.4.1" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.30" - yargs "^16.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.4.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.7.1.tgz#06e12b1ac915dd1067146ffad8215f666f7d2c51" - integrity sha512-lzbd0Eq1HRdWM2abSD7mk6YIVY0AogGJzb/z+lqzRk+8+XJP+M6L1MS5FUSc3jjGru4dbKjEMJmqlsoYYpuivQ== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - flatted "^3.2.7" - rfdc "^1.3.0" - streamroller "^3.1.3" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.7: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== - -socket.io-parser@~4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" - integrity sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw== - dependencies: - "@socket.io/component-emitter" "~3.1.0" - debug "~4.3.1" - -socket.io@^4.4.1: - version "4.5.4" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.4.tgz#a4513f06e87451c17013b8d13fdfaf8da5a86a90" - integrity sha512-m3GC94iK9MfIEeIBfbhJs5BqFibMtkRk8ZpKwG2QwxV0m/eEhPIV4ara6XCF1LWNAus7z58RodiZlAH71U3EhQ== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.2" - engine.io "~6.2.1" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.2.1" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.0.tgz#bdc6b118bc6c87ee4d8d851f2d4efcc5abdb2ef5" - integrity sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw== - dependencies: - abab "^2.0.6" - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -streamroller@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.4.tgz#844a18e795d39c1089a8216e66a1cf1151271df0" - integrity sha512-Ha1Ccw2/N5C/IF8Do6zgNe8F3jQo8MPBnMBGvX0QjNv/I97BcNRzK6/mzOpZHHK7DjMLTI3c7Xw7Y1KvdChkvw== - dependencies: - date-format "^4.0.14" - debug "^4.3.4" - fs-extra "^8.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-loader@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.1.3: - version "5.3.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" - integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== - dependencies: - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - -terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@3.9.5: - version "3.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" - integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== - -ua-parser-js@^0.7.30: - version "0.7.33" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" - integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -vary@^1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -watchpack@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-cli@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" - colorette "^2.0.14" - commander "^7.0.0" - cross-spawn "^7.0.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@5.73.0: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/notebooks/jupyter-demo.ipynb b/notebooks/jupyter-demo.ipynb index c4bb193..bd57568 100644 --- a/notebooks/jupyter-demo.ipynb +++ b/notebooks/jupyter-demo.ipynb @@ -9,7 +9,7 @@ "source": [ "@file:Repository(\"https://repo.kotlin.link\")\n", "@file:Repository(\"*mavenLocal\")\n", - "@file:DependsOn(\"ru.inr.mass:numass-workspace:0.1.1\")" + "@file:DependsOn(\"ru.inr.mass:numass-workspace:0.1.3\")" ] }, { diff --git a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAmplitudeSpectrum.kt b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAmplitudeSpectrum.kt index 1a98e3c..c00e5f4 100644 --- a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAmplitudeSpectrum.kt +++ b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAmplitudeSpectrum.kt @@ -1,9 +1,9 @@ package ru.inr.mass.data.analysis import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.launch import ru.inr.mass.data.api.NumassBlock +import ru.inr.mass.data.api.NumassEvent import space.kscience.kmath.histogram.LongCounter import kotlin.math.min @@ -44,6 +44,25 @@ public suspend fun NumassBlock.amplitudeSpectrum( return NumassAmplitudeSpectrum(map.mapValues { it.value.value.toULong() }) } +public suspend fun NumassBlock.energySpectrum( + extractor: NumassEventExtractor = NumassEventExtractor.EVENTS_ONLY, + calibration: (NumassEvent) -> Double, +): Map { + val map = HashMap() + extractor.extract(this).collect { event -> + map.getOrPut(calibration(event)) { LongCounter() }.add(1L) + } + return map.mapValues { it.value.value } +} + +public suspend fun NumassBlock.eventsCount(extractor: NumassEventExtractor = NumassEventExtractor.EVENTS_ONLY): Long { + var counter: Long = 0L + extractor.extract(this).collect { + counter++ + } + return counter +} + /** * Collect events from block in parallel */ diff --git a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAnalyzer.kt b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAnalyzer.kt index cd62169..009315a 100644 --- a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAnalyzer.kt +++ b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassAnalyzer.kt @@ -23,10 +23,6 @@ import ru.inr.mass.data.api.NumassPoint.Companion.HV_KEY import space.kscience.dataforge.meta.* import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName -import space.kscience.dataforge.values.ListValue -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.values.ValueType -import space.kscience.dataforge.values.int import space.kscience.tables.ColumnHeader import space.kscience.tables.MetaRow import space.kscience.tables.RowTable diff --git a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassEventExtractor.kt b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassEventExtractor.kt index 798f1f3..f455e54 100644 --- a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassEventExtractor.kt +++ b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/NumassEventExtractor.kt @@ -2,6 +2,7 @@ package ru.inr.mass.data.analysis import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.mapNotNull import ru.inr.mass.data.api.NumassBlock import ru.inr.mass.data.api.NumassEvent @@ -37,6 +38,41 @@ public fun interface NumassEventExtractor { ) } } + + + public val TQDC_V2: NumassEventExtractor = NumassEventExtractor { block -> + block.frames.mapNotNull { frame -> + var max = Short.MIN_VALUE + var min = Short.MAX_VALUE + var indexOfMax = 0 + + // Taking first 8 points as a baseline + val baseline = frame.signal.take(8).average() + + frame.signal.forEachIndexed { index, sh: Short -> + if (sh >= max) { + max = sh + indexOfMax = index + } + if (sh <= min) { + min = sh + } + } + + /* + * Filtering large negative splashes + */ + if (baseline - min < 300) { + NumassEvent( + (max - baseline).toInt().toShort(), + frame.timeOffset + frame.tickSize.inWholeNanoseconds * indexOfMax, + block + ) + } else { + null + } + } + } } } diff --git a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/TimeAnalyzer.kt b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/TimeAnalyzer.kt index 2f09607..06b427a 100644 --- a/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/TimeAnalyzer.kt +++ b/numass-analysis/src/commonMain/kotlin/ru/inr/mass/data/analysis/TimeAnalyzer.kt @@ -31,7 +31,9 @@ import kotlin.math.* * An analyzer which uses time information from events * Created by darksnake on 11.07.2017. */ -public open class TimeAnalyzer(override val extractor: NumassEventExtractor) : NumassAnalyzer() { +public open class TimeAnalyzer( + override val extractor: NumassEventExtractor = NumassEventExtractor.EVENTS_ONLY, +) : NumassAnalyzer() { override suspend fun analyzeInternal( block: NumassBlock, @@ -76,7 +78,7 @@ public open class TimeAnalyzer(override val extractor: NumassEventExtractor) : N filter { pair -> pair.second >= t0 }.collect { pair -> totalN++ //TODO add progress listener here - totalT+= pair.second + totalT += pair.second } if (totalN == 0L) { @@ -114,10 +116,12 @@ public open class TimeAnalyzer(override val extractor: NumassEventExtractor) : N sumOf { it.countRate } / size, sumOf { it.countRateError.pow(2.0) } / size / size ) + AveragingMethod.WEIGHTED -> Pair( sumOf { it.countRate * it.length } / totalTime, sumOf { (it.countRateError * it.length / totalTime).pow(2.0) } ) + AveragingMethod.GEOMETRIC -> { val mean = exp(sumOf { ln(it.countRate) } / size) val variance = (mean / size).pow(2.0) * sumOf { diff --git a/numass-analysis/src/jvmMain/kotlin/ru/inr/mass/data/analysis/timeHistogram.kt b/numass-analysis/src/jvmMain/kotlin/ru/inr/mass/data/analysis/timeHistogram.kt index 2a6aa79..44c25e9 100644 --- a/numass-analysis/src/jvmMain/kotlin/ru/inr/mass/data/analysis/timeHistogram.kt +++ b/numass-analysis/src/jvmMain/kotlin/ru/inr/mass/data/analysis/timeHistogram.kt @@ -1,12 +1,14 @@ package ru.inr.mass.data.analysis import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.transform import kotlinx.coroutines.runBlocking import ru.inr.mass.data.api.NumassBlock import ru.inr.mass.data.api.getTime -import space.kscience.kmath.histogram.UnivariateHistogram +import space.kscience.kmath.histogram.Histogram +import space.kscience.kmath.histogram.UniformHistogram1D +import space.kscience.kmath.histogram.uniform1D +import space.kscience.kmath.operations.DoubleField import kotlin.math.max import kotlin.time.DurationUnit @@ -23,7 +25,7 @@ public fun Flow.zipWithNext(block: (l: T, r: T) -> R): Flow { public fun NumassBlock.timeHistogram( binSize: Double, extractor: NumassEventExtractor = NumassEventExtractor.EVENTS_ONLY, -): UnivariateHistogram = UnivariateHistogram.uniform(binSize) { +): UniformHistogram1D = Histogram.uniform1D(DoubleField, binSize).produce { runBlocking { extractor.extract(this@timeHistogram).zipWithNext { l, r -> if(l.owner == r.owner) { diff --git a/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt b/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt index 190e679..3e69714 100644 --- a/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt +++ b/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt @@ -6,6 +6,7 @@ package ru.inr.mass.data.api import kotlinx.datetime.Instant +import ru.inr.mass.data.proto.HVData import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.long @@ -40,6 +41,8 @@ public interface NumassSet : Iterable, Provider { override val defaultTarget: String get() = NUMASS_POINT_TARGET + public val hvData: HVData? + override fun content(target: String): Map = if (target == NUMASS_POINT_TARGET) { points.associateBy { NameToken("point", it.voltage.toString()).asName() } } else { diff --git a/numass-data-proto/build.gradle.kts b/numass-data-proto/build.gradle.kts index 8157571..c47065c 100644 --- a/numass-data-proto/build.gradle.kts +++ b/numass-data-proto/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("space.kscience.gradle.jvm") - id("com.squareup.wire") version "4.4.3" + id("com.squareup.wire") version "4.4.1" `maven-publish` } @@ -9,9 +9,15 @@ val dataforgeVersion: String by rootProject.extra dependencies { api(project(":numass-data-model")) api("space.kscience:dataforge-io:$dataforgeVersion") -// api(npmlibs.ktor.io) } -wire{ - kotlin{} +wire { + kotlin { + out = "src/gen/kotlin" + } +} + + +sourceSets.main { + kotlin.srcDir("src/gen/kotlin") } diff --git a/numass-data-proto/src/gen/kotlin/ru/inr/mass/data/proto/Point.kt b/numass-data-proto/src/gen/kotlin/ru/inr/mass/data/proto/Point.kt new file mode 100644 index 0000000..1ccfaa2 --- /dev/null +++ b/numass-data-proto/src/gen/kotlin/ru/inr/mass/data/proto/Point.kt @@ -0,0 +1,659 @@ +// Code generated by Wire protocol buffer compiler, do not edit. +// Source: ru.inr.mass.data.proto.Point in numass-proto.proto +package ru.inr.mass.`data`.proto + +import com.squareup.wire.* +import com.squareup.wire.Syntax.PROTO_3 +import com.squareup.wire.internal.immutableCopyOf +import com.squareup.wire.internal.redactElements +import okio.ByteString + +public class Point( + channels: List = emptyList(), + unknownFields: ByteString = ByteString.EMPTY, +) : Message(ADAPTER, unknownFields) { + /** + * Array of measuring channels + */ + @field:WireField( + tag = 1, + adapter = "ru.inr.mass.data.proto.Point${'$'}Channel#ADAPTER", + label = WireField.Label.REPEATED, + ) + public val channels: List = immutableCopyOf("channels", channels) + + @Deprecated( + message = "Shouldn't be used in Kotlin", + level = DeprecationLevel.HIDDEN, + ) + public override fun newBuilder(): Nothing = throw + AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin") + + public override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is Point) return false + if (unknownFields != other.unknownFields) return false + if (channels != other.channels) return false + return true + } + + public override fun hashCode(): Int { + var result = super.hashCode + if (result == 0) { + result = unknownFields.hashCode() + result = result * 37 + channels.hashCode() + super.hashCode = result + } + return result + } + + public override fun toString(): String { + val result = mutableListOf() + if (channels.isNotEmpty()) result += """channels=$channels""" + return result.joinToString(prefix = "Point{", separator = ", ", postfix = "}") + } + + public fun copy(channels: List = this.channels, unknownFields: ByteString = + this.unknownFields): Point = Point(channels, unknownFields) + + public companion object { + @JvmField + public val ADAPTER: ProtoAdapter = object : ProtoAdapter( + FieldEncoding.LENGTH_DELIMITED, + Point::class, + "type.googleapis.com/ru.inr.mass.data.proto.Point", + PROTO_3, + null, + "numass-proto.proto" + ) { + public override fun encodedSize(`value`: Point): Int { + var size = value.unknownFields.size + size += Channel.ADAPTER.asRepeated().encodedSizeWithTag(1, value.channels) + return size + } + + public override fun encode(writer: ProtoWriter, `value`: Point): Unit { + Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels) + writer.writeBytes(value.unknownFields) + } + + public override fun encode(writer: ReverseProtoWriter, `value`: Point): Unit { + writer.writeBytes(value.unknownFields) + Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels) + } + + public override fun decode(reader: ProtoReader): Point { + val channels = mutableListOf() + val unknownFields = reader.forEachTag { tag -> + when (tag) { + 1 -> channels.add(Channel.ADAPTER.decode(reader)) + else -> reader.readUnknownField(tag) + } + } + return Point( + channels = channels, + unknownFields = unknownFields + ) + } + + public override fun redact(`value`: Point): Point = value.copy( + channels = value.channels.redactElements(Channel.ADAPTER), + unknownFields = ByteString.EMPTY + ) + } + + private const val serialVersionUID: Long = 0L + } + + /** + * A single channel for multichannel detector readout + */ + public class Channel( + /** + * The number of measuring channel + */ + @field:WireField( + tag = 1, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.OMIT_IDENTITY, + ) + public val id: Long = 0L, + blocks: List = emptyList(), + unknownFields: ByteString = ByteString.EMPTY, + ) : Message(ADAPTER, unknownFields) { + /** + * Blocks + */ + @field:WireField( + tag = 2, + adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block#ADAPTER", + label = WireField.Label.REPEATED, + ) + public val blocks: List = immutableCopyOf("blocks", blocks) + + @Deprecated( + message = "Shouldn't be used in Kotlin", + level = DeprecationLevel.HIDDEN, + ) + public override fun newBuilder(): Nothing = throw + AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin") + + public override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is Channel) return false + if (unknownFields != other.unknownFields) return false + if (id != other.id) return false + if (blocks != other.blocks) return false + return true + } + + public override fun hashCode(): Int { + var result = super.hashCode + if (result == 0) { + result = unknownFields.hashCode() + result = result * 37 + id.hashCode() + result = result * 37 + blocks.hashCode() + super.hashCode = result + } + return result + } + + public override fun toString(): String { + val result = mutableListOf() + result += """id=$id""" + if (blocks.isNotEmpty()) result += """blocks=$blocks""" + return result.joinToString(prefix = "Channel{", separator = ", ", postfix = "}") + } + + public fun copy( + id: Long = this.id, + blocks: List = this.blocks, + unknownFields: ByteString = this.unknownFields, + ): Channel = Channel(id, blocks, unknownFields) + + public companion object { + @JvmField + public val ADAPTER: ProtoAdapter = object : ProtoAdapter( + FieldEncoding.LENGTH_DELIMITED, + Channel::class, + "type.googleapis.com/ru.inr.mass.data.proto.Point.Channel", + PROTO_3, + null, + "numass-proto.proto" + ) { + public override fun encodedSize(`value`: Channel): Int { + var size = value.unknownFields.size + if (value.id != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.id) + size += Block.ADAPTER.asRepeated().encodedSizeWithTag(2, value.blocks) + return size + } + + public override fun encode(writer: ProtoWriter, `value`: Channel): Unit { + if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id) + Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks) + writer.writeBytes(value.unknownFields) + } + + public override fun encode(writer: ReverseProtoWriter, `value`: Channel): Unit { + writer.writeBytes(value.unknownFields) + Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks) + if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id) + } + + public override fun decode(reader: ProtoReader): Channel { + var id: Long = 0L + val blocks = mutableListOf() + val unknownFields = reader.forEachTag { tag -> + when (tag) { + 1 -> id = ProtoAdapter.UINT64.decode(reader) + 2 -> blocks.add(Block.ADAPTER.decode(reader)) + else -> reader.readUnknownField(tag) + } + } + return Channel( + id = id, + blocks = blocks, + unknownFields = unknownFields + ) + } + + public override fun redact(`value`: Channel): Channel = value.copy( + blocks = value.blocks.redactElements(Block.ADAPTER), + unknownFields = ByteString.EMPTY + ) + } + + private const val serialVersionUID: Long = 0L + } + + /** + * A continuous measurement block + */ + public class Block( + /** + * Block start in epoch nanos + */ + @field:WireField( + tag = 1, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.OMIT_IDENTITY, + ) + public val time: Long = 0L, + frames: List = emptyList(), + /** + * Events array + */ + @field:WireField( + tag = 3, + adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Events#ADAPTER", + label = WireField.Label.OMIT_IDENTITY, + ) + public val events: Events? = null, + /** + * block size in nanos. If missing, take from meta. + */ + @field:WireField( + tag = 4, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.OMIT_IDENTITY, + ) + public val length: Long = 0L, + /** + * tick size in nanos. Obsolete, to be removed + */ + @field:WireField( + tag = 5, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.OMIT_IDENTITY, + jsonName = "binSize", + ) + public val bin_size: Long = 0L, + unknownFields: ByteString = ByteString.EMPTY, + ) : Message(ADAPTER, unknownFields) { + /** + * Frames array + */ + @field:WireField( + tag = 2, + adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Frame#ADAPTER", + label = WireField.Label.REPEATED, + ) + public val frames: List = immutableCopyOf("frames", frames) + + @Deprecated( + message = "Shouldn't be used in Kotlin", + level = DeprecationLevel.HIDDEN, + ) + public override fun newBuilder(): Nothing = throw + AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin") + + public override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is Block) return false + if (unknownFields != other.unknownFields) return false + if (time != other.time) return false + if (frames != other.frames) return false + if (events != other.events) return false + if (length != other.length) return false + if (bin_size != other.bin_size) return false + return true + } + + public override fun hashCode(): Int { + var result = super.hashCode + if (result == 0) { + result = unknownFields.hashCode() + result = result * 37 + time.hashCode() + result = result * 37 + frames.hashCode() + result = result * 37 + (events?.hashCode() ?: 0) + result = result * 37 + length.hashCode() + result = result * 37 + bin_size.hashCode() + super.hashCode = result + } + return result + } + + public override fun toString(): String { + val result = mutableListOf() + result += """time=$time""" + if (frames.isNotEmpty()) result += """frames=$frames""" + if (events != null) result += """events=$events""" + result += """length=$length""" + result += """bin_size=$bin_size""" + return result.joinToString(prefix = "Block{", separator = ", ", postfix = "}") + } + + public fun copy( + time: Long = this.time, + frames: List = this.frames, + events: Events? = this.events, + length: Long = this.length, + bin_size: Long = this.bin_size, + unknownFields: ByteString = this.unknownFields, + ): Block = Block(time, frames, events, length, bin_size, unknownFields) + + public companion object { + @JvmField + public val ADAPTER: ProtoAdapter = object : ProtoAdapter( + FieldEncoding.LENGTH_DELIMITED, + Block::class, + "type.googleapis.com/ru.inr.mass.data.proto.Point.Channel.Block", + PROTO_3, + null, + "numass-proto.proto" + ) { + public override fun encodedSize(`value`: Block): Int { + var size = value.unknownFields.size + if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time) + size += Frame.ADAPTER.asRepeated().encodedSizeWithTag(2, value.frames) + if (value.events != null) size += Events.ADAPTER.encodedSizeWithTag(3, value.events) + if (value.length != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(4, value.length) + if (value.bin_size != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(5, + value.bin_size) + return size + } + + public override fun encode(writer: ProtoWriter, `value`: Block): Unit { + if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) + Frame.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames) + if (value.events != null) Events.ADAPTER.encodeWithTag(writer, 3, value.events) + if (value.length != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 4, value.length) + if (value.bin_size != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 5, value.bin_size) + writer.writeBytes(value.unknownFields) + } + + public override fun encode(writer: ReverseProtoWriter, `value`: Block): Unit { + writer.writeBytes(value.unknownFields) + if (value.bin_size != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 5, value.bin_size) + if (value.length != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 4, value.length) + if (value.events != null) Events.ADAPTER.encodeWithTag(writer, 3, value.events) + Frame.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames) + if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) + } + + public override fun decode(reader: ProtoReader): Block { + var time: Long = 0L + val frames = mutableListOf() + var events: Events? = null + var length: Long = 0L + var bin_size: Long = 0L + val unknownFields = reader.forEachTag { tag -> + when (tag) { + 1 -> time = ProtoAdapter.UINT64.decode(reader) + 2 -> frames.add(Frame.ADAPTER.decode(reader)) + 3 -> events = Events.ADAPTER.decode(reader) + 4 -> length = ProtoAdapter.UINT64.decode(reader) + 5 -> bin_size = ProtoAdapter.UINT64.decode(reader) + else -> reader.readUnknownField(tag) + } + } + return Block( + time = time, + frames = frames, + events = events, + length = length, + bin_size = bin_size, + unknownFields = unknownFields + ) + } + + public override fun redact(`value`: Block): Block = value.copy( + frames = value.frames.redactElements(Frame.ADAPTER), + events = value.events?.let(Events.ADAPTER::redact), + unknownFields = ByteString.EMPTY + ) + } + + private const val serialVersionUID: Long = 0L + } + + /** + * Raw data frame + */ + public class Frame( + /** + * Time in nanos from the beginning of the block + */ + @field:WireField( + tag = 1, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.OMIT_IDENTITY, + ) + public val time: Long = 0L, + /** + * Frame data as an array of int16 measured in arbitrary channels + */ + @field:WireField( + tag = 2, + adapter = "com.squareup.wire.ProtoAdapter#BYTES", + label = WireField.Label.OMIT_IDENTITY, + declaredName = "data", + ) + public val data_: ByteString = ByteString.EMPTY, + unknownFields: ByteString = ByteString.EMPTY, + ) : Message(ADAPTER, unknownFields) { + @Deprecated( + message = "Shouldn't be used in Kotlin", + level = DeprecationLevel.HIDDEN, + ) + public override fun newBuilder(): Nothing = throw + AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin") + + public override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is Frame) return false + if (unknownFields != other.unknownFields) return false + if (time != other.time) return false + if (data_ != other.data_) return false + return true + } + + public override fun hashCode(): Int { + var result = super.hashCode + if (result == 0) { + result = unknownFields.hashCode() + result = result * 37 + time.hashCode() + result = result * 37 + data_.hashCode() + super.hashCode = result + } + return result + } + + public override fun toString(): String { + val result = mutableListOf() + result += """time=$time""" + result += """data_=$data_""" + return result.joinToString(prefix = "Frame{", separator = ", ", postfix = "}") + } + + public fun copy( + time: Long = this.time, + data_: ByteString = this.data_, + unknownFields: ByteString = this.unknownFields, + ): Frame = Frame(time, data_, unknownFields) + + public companion object { + @JvmField + public val ADAPTER: ProtoAdapter = object : ProtoAdapter( + FieldEncoding.LENGTH_DELIMITED, + Frame::class, + "type.googleapis.com/ru.inr.mass.data.proto.Point.Channel.Block.Frame", + PROTO_3, + null, + "numass-proto.proto" + ) { + public override fun encodedSize(`value`: Frame): Int { + var size = value.unknownFields.size + if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time) + if (value.data_ != ByteString.EMPTY) size += ProtoAdapter.BYTES.encodedSizeWithTag(2, + value.data_) + return size + } + + public override fun encode(writer: ProtoWriter, `value`: Frame): Unit { + if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) + if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2, + value.data_) + writer.writeBytes(value.unknownFields) + } + + public override fun encode(writer: ReverseProtoWriter, `value`: Frame): Unit { + writer.writeBytes(value.unknownFields) + if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2, + value.data_) + if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) + } + + public override fun decode(reader: ProtoReader): Frame { + var time: Long = 0L + var data_: ByteString = ByteString.EMPTY + val unknownFields = reader.forEachTag { tag -> + when (tag) { + 1 -> time = ProtoAdapter.UINT64.decode(reader) + 2 -> data_ = ProtoAdapter.BYTES.decode(reader) + else -> reader.readUnknownField(tag) + } + } + return Frame( + time = time, + data_ = data_, + unknownFields = unknownFields + ) + } + + public override fun redact(`value`: Frame): Frame = value.copy( + unknownFields = ByteString.EMPTY + ) + } + + private const val serialVersionUID: Long = 0L + } + } + + /** + * Event block obtained directly from device of from frame analysis + * In order to save space, times and amplitudes are in separate arrays. + * Amplitude and time with the same index correspond to the same event + */ + public class Events( + times: List = emptyList(), + amplitudes: List = emptyList(), + unknownFields: ByteString = ByteString.EMPTY, + ) : Message(ADAPTER, unknownFields) { + /** + * Array of time in nanos from the beginning of the block + */ + @field:WireField( + tag = 1, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.PACKED, + ) + public val times: List = immutableCopyOf("times", times) + + /** + * Array of amplitudes of events in channels + */ + @field:WireField( + tag = 2, + adapter = "com.squareup.wire.ProtoAdapter#UINT64", + label = WireField.Label.PACKED, + ) + public val amplitudes: List = immutableCopyOf("amplitudes", amplitudes) + + @Deprecated( + message = "Shouldn't be used in Kotlin", + level = DeprecationLevel.HIDDEN, + ) + public override fun newBuilder(): Nothing = throw + AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin") + + public override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is Events) return false + if (unknownFields != other.unknownFields) return false + if (times != other.times) return false + if (amplitudes != other.amplitudes) return false + return true + } + + public override fun hashCode(): Int { + var result = super.hashCode + if (result == 0) { + result = unknownFields.hashCode() + result = result * 37 + times.hashCode() + result = result * 37 + amplitudes.hashCode() + super.hashCode = result + } + return result + } + + public override fun toString(): String { + val result = mutableListOf() + if (times.isNotEmpty()) result += """times=$times""" + if (amplitudes.isNotEmpty()) result += """amplitudes=$amplitudes""" + return result.joinToString(prefix = "Events{", separator = ", ", postfix = "}") + } + + public fun copy( + times: List = this.times, + amplitudes: List = this.amplitudes, + unknownFields: ByteString = this.unknownFields, + ): Events = Events(times, amplitudes, unknownFields) + + public companion object { + @JvmField + public val ADAPTER: ProtoAdapter = object : ProtoAdapter( + FieldEncoding.LENGTH_DELIMITED, + Events::class, + "type.googleapis.com/ru.inr.mass.data.proto.Point.Channel.Block.Events", + PROTO_3, + null, + "numass-proto.proto" + ) { + public override fun encodedSize(`value`: Events): Int { + var size = value.unknownFields.size + size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(1, value.times) + size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(2, value.amplitudes) + return size + } + + public override fun encode(writer: ProtoWriter, `value`: Events): Unit { + ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times) + ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes) + writer.writeBytes(value.unknownFields) + } + + public override fun encode(writer: ReverseProtoWriter, `value`: Events): Unit { + writer.writeBytes(value.unknownFields) + ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes) + ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times) + } + + public override fun decode(reader: ProtoReader): Events { + val times = mutableListOf() + val amplitudes = mutableListOf() + val unknownFields = reader.forEachTag { tag -> + when (tag) { + 1 -> times.add(ProtoAdapter.UINT64.decode(reader)) + 2 -> amplitudes.add(ProtoAdapter.UINT64.decode(reader)) + else -> reader.readUnknownField(tag) + } + } + return Events( + times = times, + amplitudes = amplitudes, + unknownFields = unknownFields + ) + } + + public override fun redact(`value`: Events): Events = value.copy( + unknownFields = ByteString.EMPTY + ) + } + + private const val serialVersionUID: Long = 0L + } + } + } + } +} diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt index 45e1d24..f5f25a6 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt @@ -4,10 +4,7 @@ import ru.inr.mass.data.api.NumassPoint import ru.inr.mass.data.api.NumassSet import ru.inr.mass.data.api.NumassSet.Companion.NUMASS_HV_TARGET import ru.inr.mass.data.api.readEnvelope -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.error -import space.kscience.dataforge.context.logger -import space.kscience.dataforge.context.warn +import space.kscience.dataforge.context.* import space.kscience.dataforge.io.io import space.kscience.dataforge.io.readEnvelopeFile import space.kscience.dataforge.meta.Meta @@ -16,13 +13,16 @@ import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.asName import java.nio.file.Files import java.nio.file.Path +import java.util.stream.Collectors import kotlin.io.path.* -import kotlin.streams.toList public class NumassDirectorySet internal constructor( - public val context: Context, + public val numassProto: NumassProtoPlugin, public val path: Path, -) : NumassSet { +) : NumassSet, ContextAware { + + override val context: Context + get() = numassProto.context @OptIn(DFExperimental::class) override val meta: Meta @@ -42,27 +42,24 @@ public class NumassDirectorySet internal constructor( it.fileName.name.startsWith("p") }.map { pointPath -> try { - context.readNumassPointFile(pointPath) + numassProto.readNumassPointFile(pointPath) } catch (e: Exception) { context.logger.error(e) { "Error reading Numass point file $pointPath" } null } - }.toList().filterNotNull() + }.collect(Collectors.toList()).filterNotNull() @OptIn(DFExperimental::class) - public fun getHvData(): HVData? { - val hvFile = path / "voltage" - return if (hvFile.exists()) { + override val hvData: HVData? + get() = (path / "voltage").takeIf { it.exists() }?.let { hvFile -> val envelope = context.io.readEnvelopeFile(hvFile) HVData.readEnvelope(envelope) - } else { - null } - } + override fun content(target: String): Map = if (target == NUMASS_HV_TARGET) { - val hvData = getHvData() + val hvData = hvData if (hvData != null) { mapOf("hv".asName() to hvData) } else { @@ -72,20 +69,3 @@ public class NumassDirectorySet internal constructor( public companion object } - -@OptIn(DFExperimental::class) -public fun Context.readNumassPointFile(path: Path): NumassPoint? { - val envelope = io.readEnvelopeFile(path) - return ProtoNumassPoint.fromEnvelope(envelope) -} - -public fun Context.readNumassPointFile(path: String): NumassPoint? = readNumassPointFile(Path.of(path)) - -@OptIn(ExperimentalPathApi::class) -public fun Context.readNumassDirectory(path: Path): NumassDirectorySet { - if (!path.exists()) error("Path $path does not exist") - if (!path.isDirectory()) error("The path $path is not a directory") - return NumassDirectorySet(this, path) -} - -public fun Context.readNumassDirectory(path: String): NumassDirectorySet = readNumassDirectory(Path.of(path)) \ No newline at end of file diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt index 69811d1..512c548 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt @@ -1,22 +1,34 @@ package ru.inr.mass.data.proto +import ru.inr.mass.data.api.NumassPoint import space.kscience.dataforge.context.AbstractPlugin import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.data.DataSource +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.static import space.kscience.dataforge.io.EnvelopeFormatFactory import space.kscience.dataforge.io.IOPlugin +import space.kscience.dataforge.io.readEnvelopeFile import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.DFExperimental import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import java.nio.file.Files +import java.nio.file.Path +import kotlin.io.path.exists +import kotlin.io.path.isDirectory +import kotlin.io.path.relativeTo import kotlin.reflect.KClass public class NumassProtoPlugin : AbstractPlugin() { public val io: IOPlugin by require(IOPlugin) override val tag: PluginTag get() = Companion.tag - override fun content(target: String): Map = if(target == EnvelopeFormatFactory.ENVELOPE_FORMAT_TYPE){ + override fun content(target: String): Map = if (target == EnvelopeFormatFactory.ENVELOPE_FORMAT_TYPE) { mapOf(TaggedNumassEnvelopeFormat.name to TaggedNumassEnvelopeFormat) - } else{ + } else { super.content(target) } @@ -26,3 +38,39 @@ public class NumassProtoPlugin : AbstractPlugin() { override val type: KClass = NumassProtoPlugin::class } } + + +@OptIn(DFExperimental::class) +public fun NumassProtoPlugin.readNumassPointFile(path: Path): NumassPoint? { + val envelope = io.readEnvelopeFile(path) + return ProtoNumassPoint.fromEnvelope(envelope) +} + +public fun NumassProtoPlugin.readNumassPointFile(path: String): NumassPoint? = readNumassPointFile(Path.of(path)) + +public fun NumassProtoPlugin.readNumassDirectory(path: Path): NumassDirectorySet { + if (!path.exists()) error("Path $path does not exist") + if (!path.isDirectory()) error("The path $path is not a directory") + return NumassDirectorySet(this, path) +} + +public fun NumassProtoPlugin.readNumassDirectory(path: String): NumassDirectorySet = readNumassDirectory(Path.of(path)) +public suspend fun NumassProtoPlugin.readRepository(path: Path): DataTree = DataSource { + Files.walk(path).filter { + it.isDirectory() && it.resolve("meta").exists() + }.forEach { childPath -> + val name = Name(childPath.relativeTo(path).map { segment -> + NameToken(segment.fileName.toString()) + }) + val value = readNumassDirectory(childPath) + static(name, value, value.meta) + } + + //TODO add file watcher +} + +public suspend fun NumassProtoPlugin.readRepository(path: String): DataTree = + readRepository(Path.of(path)) + +public fun NumassProtoPlugin.readPoint(path: String): NumassPoint = readNumassPointFile(path) + ?: error("Can't read numass point at $path") diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/ProtoNumassPoint.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/ProtoNumassPoint.kt index 7434174..ac28838 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/ProtoNumassPoint.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/ProtoNumassPoint.kt @@ -20,6 +20,9 @@ import io.ktor.utils.io.core.readBytes import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlocking import kotlinx.datetime.Instant +import kotlinx.datetime.LocalDateTime +import kotlinx.datetime.TimeZone +import kotlinx.datetime.toInstant import okio.ByteString import org.slf4j.LoggerFactory import ru.inr.mass.data.api.NumassBlock @@ -79,9 +82,17 @@ internal class ProtoNumassPoint( override val index: Int get() = meta["external_meta.point_index"].int ?: super.index override val startTime: Instant - get() = meta["start_time"].long?.let { - Instant.fromEpochMilliseconds(it) - } ?: Instant.DISTANT_PAST + get() { + val startTimeValue = meta["start_time"]?.value + return when { + startTimeValue == null -> Instant.DISTANT_PAST + startTimeValue.type == ValueType.STRING -> LocalDateTime.parse(startTimeValue.string) + .toInstant(TimeZone.UTC) + //TODO fix time zones!!! + startTimeValue.type == ValueType.NUMBER -> Instant.fromEpochMilliseconds(startTimeValue.long) + else -> error("Can't decode start time") + } + } override suspend fun getLength(): Duration = meta["acquisition_time"].double?.let { (it * 1000).milliseconds @@ -103,7 +114,7 @@ internal class ProtoNumassPoint( override fun toString(): String = "ProtoNumassPoint(index = ${index}, hv = $voltage)" - public companion object { + companion object { /** * Get valid data stream utilizing compression if it is present @@ -129,6 +140,7 @@ internal class ProtoNumassPoint( inflater.end() ByteArrayInputStream(unzippeddata).use(block) } + else -> { data?.read { block(asInputStream()) @@ -136,7 +148,7 @@ internal class ProtoNumassPoint( } } - public fun fromEnvelope(envelope: Envelope): ProtoNumassPoint? { + fun fromEnvelope(envelope: Envelope): ProtoNumassPoint? { if (envelope.data == null) return null return ProtoNumassPoint(envelope.meta) { envelope.useData { @@ -167,6 +179,7 @@ public class ProtoNumassBlock( block.length > 0 -> block.length.nanoseconds parent?.meta?.get("acquisition_time") != null -> (parent.meta["acquisition_time"].double ?: (0.0 * 1000)).milliseconds + else -> { LoggerFactory.getLogger(javaClass) .error("No length information on block. Trying to infer from first and last events") @@ -208,7 +221,8 @@ public class ProtoNumassBlock( } else { ShortArray(shortBuffer.limit()) { shortBuffer.get(it) } } - FrameType.TQDC2021 -> ShortArray(shortBuffer.limit()){ + + FrameType.TQDC2021 -> ShortArray(shortBuffer.limit()) { (shortBuffer.get(it).toUShort().toInt() - Short.MAX_VALUE).toShort() } } diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/TaggedNumassEnvelopeFormat.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/TaggedNumassEnvelopeFormat.kt index d198d06..ef9b310 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/TaggedNumassEnvelopeFormat.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/TaggedNumassEnvelopeFormat.kt @@ -24,13 +24,13 @@ import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.plus +import space.kscience.dataforge.names.parseAsName import java.util.* public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeFormat { - private fun Tag.toBinary() = Binary(24) { + private fun Tag.toBinary() = Binary { writeRawString(START_SEQUENCE) writeRawString("DFNU") writeShort(metaFormatKey) @@ -71,7 +71,7 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm val metaFormat = io.resolveMetaFormat(tag.metaFormatKey) ?: error("Meta format with key ${tag.metaFormatKey} not found") - val meta: Meta = metaFormat.readObject(input.readBinary(tag.metaSize.toInt())) + val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt())) val data = input.readBinary(tag.dataSize.toInt()) @@ -88,10 +88,10 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm ?: error("Meta format with key ${tag.metaFormatKey} not found") } - val meta: Meta = metaFormat.readObject(input.readBinary(tag.metaSize.toInt())) + val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt())) - return PartialEnvelope(meta, 30u + tag.metaSize, tag.dataSize) + return PartialEnvelope(meta, 30 + tag.metaSize.toInt(), tag.dataSize) } private data class Tag( @@ -100,15 +100,15 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm val dataSize: ULong, ) - override fun toMeta(): Meta = Meta { - IOFormat.NAME_KEY put name.toString() - } +// override fun toMeta(): Meta = Meta { +// NAME_KEY put name.toString() +// } public companion object : EnvelopeFormatFactory { private const val START_SEQUENCE = "#!" private const val END_SEQUENCE = "!#\r\n" - override val name: Name = super.name + "numass" + override val name: Name = "envelope.numass".parseAsName() override fun build(context: Context, meta: Meta): EnvelopeFormat { val io = context.io diff --git a/numass-data-proto/src/main/proto/ru/inr/mass/data/proto/numass-proto.proto b/numass-data-proto/src/main/proto/numass-proto.proto similarity index 100% rename from numass-data-proto/src/main/proto/ru/inr/mass/data/proto/numass-proto.proto rename to numass-data-proto/src/main/proto/numass-proto.proto diff --git a/numass-data-proto/src/test/kotlin/ru/inr/mass/data/proto/TestNumassDirectory.kt b/numass-data-proto/src/test/kotlin/ru/inr/mass/data/proto/TestNumassDirectory.kt index 0dcc5f9..ac6ea64 100644 --- a/numass-data-proto/src/test/kotlin/ru/inr/mass/data/proto/TestNumassDirectory.kt +++ b/numass-data-proto/src/test/kotlin/ru/inr/mass/data/proto/TestNumassDirectory.kt @@ -6,9 +6,10 @@ import ru.inr.mass.data.api.NumassSet import ru.inr.mass.data.api.ParentBlock import ru.inr.mass.data.api.channels import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.meta.ListValue import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string -import space.kscience.dataforge.values.ListValue import java.nio.file.Path import kotlin.test.assertEquals @@ -16,11 +17,12 @@ class TestNumassDirectory { val context = Context("numass-test") { plugin(NumassProtoPlugin) } + val numassProto = context.fetch(NumassProtoPlugin) @Test fun testDanteRead() { val dataPath = Path.of("src/test/resources", "testData/dante") - val testSet = context.readNumassDirectory(dataPath) + val testSet = numassProto.readNumassDirectory(dataPath) assertEquals("2018-04-13T22:01:46", testSet.meta["end_time"].string) assertEquals(ListValue.EMPTY, testSet.meta["comments"]?.value) assertEquals(31, testSet.points.size) @@ -32,12 +34,12 @@ class TestNumassDirectory { @Test fun testTQDCRead() = runBlocking { val pointPath = Path.of("src/test/resources", "testData/tqdc") - val set: NumassSet = context.readNumassDirectory(pointPath) + val set: NumassSet = numassProto.readNumassDirectory(pointPath) val point = set.first { it.voltage == 18200.0 } point.channels.forEach { (channel, block) -> println("$channel: $block") - if(block is ParentBlock){ - block.blocks.toList().forEach{ + if (block is ParentBlock) { + block.blocks.toList().forEach { println("\t${it.channel}:${it.eventsCount}") } } diff --git a/numass-data-server/build.gradle.kts b/numass-data-server/build.gradle.kts index c264151..670453e 100644 --- a/numass-data-server/build.gradle.kts +++ b/numass-data-server/build.gradle.kts @@ -1,13 +1,15 @@ plugins { - kotlin("multiplatform") - id("space.kscience.gradle.common") + id("space.kscience.gradle.mpp") + id("org.jetbrains.compose") `maven-publish` } -val visionForgeVersion = "0.2.0-dev-24" +val visionForgeVersion: String by rootProject.extra + +val production: Boolean by rootProject.extra(true) kotlin { - js{ + js(IR) { browser { webpackTask { this.outputFileName = "js/numass-web.js" @@ -16,36 +18,51 @@ kotlin { binaries.executable() } - afterEvaluate { - val jsBrowserDistribution by tasks.getting - - tasks.getByName("jvmProcessResources") { - dependsOn(jsBrowserDistribution) - afterEvaluate { - from(jsBrowserDistribution) - } - } - } - sourceSets { commonMain { dependencies { implementation(project(":numass-data-model")) + implementation("space.kscience:visionforge-core:$visionForgeVersion") implementation("space.kscience:visionforge-plotly:$visionForgeVersion") } } jvmMain { dependencies { implementation(project(":numass-data-proto")) - implementation("space.kscience:visionforge-server:$visionForgeVersion") + implementation("io.ktor:ktor-server-cio:2.1.3") + implementation("io.ktor:ktor-server-html-builder-jvm:2.1.3") + implementation("space.kscience:visionforge-plotly:$visionForgeVersion") + } + } + jsMain{ + dependencies{ + implementation(compose.web.core) } } } } -kscience{ +afterEvaluate { + val distributionTask = if (production) { + tasks.getByName("jsBrowserDistribution") + } else { + tasks.getByName("jsBrowserDevelopmentExecutableDistribution") + } + + tasks.getByName("jvmProcessResources") { + dependsOn(distributionTask) + from(distributionTask) + include("**/*.js") + if (production) { + include("**/*.map") + } + } +} + +kscience { useSerialization { json() } + withContextReceivers() } diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/NumassCommonPlugin.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/NumassCommonPlugin.kt index 8f0556b..6813a39 100644 --- a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/NumassCommonPlugin.kt +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/NumassCommonPlugin.kt @@ -8,32 +8,27 @@ import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta import space.kscience.visionforge.Vision -import space.kscience.visionforge.VisionBase -import space.kscience.visionforge.VisionGroupBase import space.kscience.visionforge.VisionPlugin -import space.kscience.visionforge.plotly.PlotlyPlugin import kotlin.reflect.KClass -public class NumassCommonPlugin(meta: Meta) : VisionPlugin(meta) { +public class NumassCommonPlugin(meta: Meta = Meta.EMPTY) : VisionPlugin(meta) { override val tag: PluginTag get() = Companion.tag - public val plotlyPlugin: PlotlyPlugin by require(PlotlyPlugin) - override val visionSerializersModule: SerializersModule get() = numassSerializersModule public companion object : PluginFactory { override val tag: PluginTag = PluginTag("numass.common", "ru.inr.mass") override val type: KClass = NumassCommonPlugin::class - override fun invoke(meta: Meta, context: Context): NumassCommonPlugin = NumassCommonPlugin() - private val numassSerializersModule = SerializersModule { + override fun build(context: Context, meta: Meta): NumassCommonPlugin = NumassCommonPlugin() + + internal val numassSerializersModule = SerializersModule { polymorphic(Vision::class) { - subclass(VisionBase.serializer()) - subclass(VisionGroupBase.serializer()) subclass(VisionOfNumassHv.serializer()) subclass(VisionOfNumassPoint.serializer()) - subclass(VisionOfNumassHv.serializer()) subclass(VisionOfNumassSet.serializer()) + subclass(VisionOfNumassSetRef.serializer()) + subclass(VisionOfNumassRepository.serializer()) } } } diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassPoint.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassPoint.kt index 0739976..2985cc0 100644 --- a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassPoint.kt +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassPoint.kt @@ -1,24 +1,20 @@ package ru.inr.mass.data.server -import kotlinx.coroutines.flow.collect import kotlinx.serialization.Serializable import ru.inr.mass.data.api.NumassBlock import ru.inr.mass.data.api.NumassPoint -import ru.inr.mass.data.api.NumassSet -import ru.inr.mass.data.api.NumassSet.Companion.NUMASS_HV_TARGET +import ru.inr.mass.data.api.channels import ru.inr.mass.data.proto.HVData import ru.inr.mass.data.proto.HVEntry import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.names.NameToken -import space.kscience.dataforge.provider.top -import space.kscience.visionforge.VisionBase -import space.kscience.visionforge.VisionGroupBase +import space.kscience.visionforge.AbstractVision -public typealias SimpleAmplitudeSpectrum = Map +public typealias SimpleAmplitudeSpectrum = Map -private suspend fun NumassBlock.simpleAmplitudeSpectrum(): SimpleAmplitudeSpectrum { - val res = mutableMapOf() +internal suspend fun NumassBlock.simpleAmplitudeSpectrum(): SimpleAmplitudeSpectrum { + val res = mutableMapOf() events.collect { res[it.amplitude] = (res[it.amplitude] ?: 0U) + 1U } @@ -31,36 +27,21 @@ public class VisionOfNumassPoint( public val index: Int, public val voltage: Double, public val spectra: Map, -) : VisionBase() +) : AbstractVision() public suspend fun NumassPoint.toVision(): VisionOfNumassPoint = VisionOfNumassPoint( meta, index, voltage, - getChannels().entries.associate { (k, v) -> + channels.entries.associate { (k, v) -> k.toString() to v.simpleAmplitudeSpectrum() } ) @Serializable -public class VisionOfNumassHv(public val hv: HVData) : VisionBase(), Iterable { +public class VisionOfNumassHv(public val hv: HVData) : AbstractVision(), Iterable { override fun iterator(): Iterator = hv.iterator() } private val VisionOfNumassPoint.token: NameToken get() = NameToken("point", index.toString()) -@Serializable -public class VisionOfNumassSet(public val points: List) : VisionBase() { -// init { -// points.forEach { -// //childrenInternal[it.token] = it -// } -// -// } -} - -public suspend fun NumassSet.toVision(): VisionOfNumassSet = VisionOfNumassSet(points.map { it.toVision() }).apply { - this@toVision.top(NUMASS_HV_TARGET).forEach { (key, hv) -> - // set(key, VisionOfNumassHv(hv)) - } -} diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt new file mode 100644 index 0000000..b7f6f37 --- /dev/null +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt @@ -0,0 +1,35 @@ +package ru.inr.mass.data.server + +import kotlinx.serialization.Serializable +import ru.inr.mass.data.api.NumassSet +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.DataTreeItem +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.AbstractVision +import space.kscience.visionforge.AbstractVisionGroup + +@Serializable +public class VisionOfNumassRepository : AbstractVisionGroup() { + override fun createGroup(): VisionOfNumassRepository = VisionOfNumassRepository() +} + +@Serializable +public class VisionOfNumassSetRef( + override val name: Name, +) : Named, AbstractVision() + +public suspend fun VisionOfNumassRepository( + repoName: Name, + tree: DataTree, +): VisionOfNumassRepository = VisionOfNumassRepository().apply { + tree.items.forEach { (key: NameToken, value) -> + children[key] = when (value) { + is DataTreeItem.Leaf -> VisionOfNumassSetRef(repoName + key) + is DataTreeItem.Node -> VisionOfNumassRepository(repoName + key, value.tree) + } + } + //TODO listen to changes +} \ No newline at end of file diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt new file mode 100644 index 0000000..3096eb4 --- /dev/null +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt @@ -0,0 +1,38 @@ +package ru.inr.mass.data.server + +import kotlinx.serialization.Serializable +import ru.inr.mass.data.api.NumassSet +import ru.inr.mass.data.proto.HVData +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.AbstractVision + +@Serializable +public data class PointRef( + override val name: Name, + public val pointMeta: Meta, + public val index: Int, + public val voltage: Double, +) : Named + +@Serializable +public class VisionOfNumassSet( + public val meta: Meta, + public val points: List, + public val hvData: HVData? = null, +) : AbstractVision() + +public fun VisionOfNumassSet(setName: Name, set: NumassSet): VisionOfNumassSet = VisionOfNumassSet( + set.meta, + set.points.map { point -> + PointRef( + setName + point.index.toString(), + point.meta, + point.index, + point.voltage + ) + }, + set.hvData +) \ No newline at end of file diff --git a/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassJsPlugin.kt b/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassJsPlugin.kt index dd85906..c30acb6 100644 --- a/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassJsPlugin.kt +++ b/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassJsPlugin.kt @@ -8,17 +8,22 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.context.PluginFactory import space.kscience.dataforge.context.PluginTag import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName import space.kscience.plotly.models.LineShape import space.kscience.plotly.models.ScatterMode -import space.kscience.plotly.plot +import space.kscience.plotly.plotElement import space.kscience.plotly.scatter import space.kscience.visionforge.ElementVisionRenderer import space.kscience.visionforge.Vision +import space.kscience.visionforge.VisionClient +import space.kscience.visionforge.plotly.PlotlyPlugin import kotlin.reflect.KClass public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer { + public val client: VisionClient by require(VisionClient) public val numassCommon: NumassCommonPlugin by require(NumassCommonPlugin) - private val plotly = numassCommon.plotlyPlugin + public val plotly: PlotlyPlugin by require(PlotlyPlugin) override val tag: PluginTag get() = Companion.tag @@ -27,7 +32,12 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer { else -> ElementVisionRenderer.ZERO_RATING } - override fun render(element: Element, vision: Vision, meta: Meta) { + override fun content(target: String): Map = when (target) { + ElementVisionRenderer.TYPE -> mapOf("numass".asName() to this) + else -> super.content(target) + } + + override fun render(element: Element, name: Name, vision: Vision, meta: Meta) { when (vision) { is VisionOfNumassHv -> element.append { h1 { +"HV" } @@ -47,22 +57,25 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer { } } } + is VisionOfNumassPoint -> element.append { - h1{ +"Point"} - plot { + h1 { +"Point" } + plotElement { vision.spectra.forEach { (channel, spectrum) -> + val pairs = spectrum.entries.sortedBy { it.key } scatter { - name = channel + this.name = channel mode = ScatterMode.lines line { shape = LineShape.hv } - x.numbers = spectrum.keys.map { it.toInt() } - y.numbers = spectrum.values.map { it.toInt() } + x.numbers = pairs.map { it.key.toInt() } + y.numbers = pairs.map { it.value.toInt() } } } } } + is VisionOfNumassSet -> {} } } @@ -71,6 +84,8 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer { public companion object : PluginFactory { override val tag: PluginTag = PluginTag("numass.js", "ru.inr.mass") override val type: KClass = NumassJsPlugin::class - override fun invoke(meta: Meta, context: Context): NumassJsPlugin = NumassJsPlugin() + + override fun build(context: Context, meta: Meta): NumassJsPlugin = NumassJsPlugin() + } } \ No newline at end of file diff --git a/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassViewerApplication.kt b/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassViewerApplication.kt new file mode 100644 index 0000000..b228c17 --- /dev/null +++ b/numass-data-server/src/jsMain/kotlin/ru/inr/mass/data/server/NumassViewerApplication.kt @@ -0,0 +1,27 @@ +package ru.inr.mass.data.server + +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.renderComposable +import org.w3c.dom.Document +import space.kscience.dataforge.context.Context +import space.kscience.visionforge.Application + +public class NumassViewerApplication : Application { + private val context = Context("NumassViewer") { + plugin(NumassJsPlugin) + } + + override fun start(document: Document, state: Map) { + renderComposable(rootElementId = "application") { + Div({ classes("container") }) { + Div({ classes("row") }) + Div({ classes("col-md-3") }) { + + } + Div({ classes("col-md-9") }) { + + } + } + } + } +} \ No newline at end of file diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/demo.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/demo.kt deleted file mode 100644 index 4365abf..0000000 --- a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/demo.kt +++ /dev/null @@ -1,53 +0,0 @@ -package ru.inr.mass.data.server - -import kotlinx.coroutines.runBlocking -import kotlinx.html.div -import kotlinx.html.h1 -import ru.inr.mass.data.api.NumassPoint -import ru.inr.mass.data.proto.NumassProtoPlugin -import ru.inr.mass.data.proto.readNumassPointFile -import space.kscience.dataforge.context.Context -import space.kscience.visionforge.three.server.close -import space.kscience.visionforge.three.server.serve -import space.kscience.visionforge.three.server.show -import space.kscience.visionforge.visionManager -import java.nio.file.Path - - -public fun main() { - val context = Context("Numass") { - plugin(NumassProtoPlugin) - plugin(NumassCommonPlugin) - } - - val pointPath = Path.of("C:\\Users\\altavir\\Desktop\\p20211122173034(20s).dat") - val point: NumassPoint = context.readNumassPointFile(pointPath)!! - - val visionOfNumass = runBlocking { - point.toVision() - } - - val server = context.visionManager.serve { - //use client library - useNumassWeb() - //use css - //useCss("css/styles.css") - page { - div("flex-column") { - h1 { +"Satellite detector demo" } - //vision(visionOfNumass) - } - } - } - - server.show() - - - println("Enter 'exit' to close server") - while (readLine() != "exit") { - // - } - - server.close() - -} \ No newline at end of file diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt new file mode 100644 index 0000000..1eb9f8b --- /dev/null +++ b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt @@ -0,0 +1,142 @@ +package ru.inr.mass.data.server + +import io.ktor.http.ContentType +import io.ktor.http.HttpStatusCode +import io.ktor.server.application.Application +import io.ktor.server.application.call +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.html.respondHtml +import io.ktor.server.http.content.resources +import io.ktor.server.response.respondText +import io.ktor.server.routing.get +import io.ktor.server.routing.routing +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import kotlinx.html.* +import ru.inr.mass.data.api.NumassPoint +import ru.inr.mass.data.proto.NumassDirectorySet +import ru.inr.mass.data.proto.NumassProtoPlugin +import ru.inr.mass.data.proto.readRepository +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.await +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.cutLast +import space.kscience.dataforge.names.lastOrNull + + +public fun main() { + val port = 7777 + val host = "localhost" + embeddedServer(CIO, port, host, module = Application::numassModule).start() +} + +public fun Application.numassModule(repositoryName: String = "D:\\Work\\Numass\\data\\test") { + val context = Context("Numass") { + plugin(NumassProtoPlugin) + plugin(NumassCommonPlugin) + } + + val numassProto = context.fetch(NumassProtoPlugin) + val numassCommon = context.fetch(NumassCommonPlugin) + + val visionManager = numassCommon.visionManager + val repository: DataTree = runBlocking { numassProto.readRepository(repositoryName) } + + routing { + resources() + + get("/") { + call.respondHtml { + head { + meta { charset = "utf-8" } + meta { + name = "viewport" + content = "width=device-width, initial-scale=1" + } + title("Numass Data Viewer") + link { + href = "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" + rel = "stylesheet" + attributes["integrity"] = + "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" + attributes["crossorigin"] = "anonymous" + } + } + body { + div { + id = "application" + } + script { + src = "js/numass-web.js" + } + script { + src = "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" + integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" + attributes["crossorigin"] = "anonymous" + } + } + } + } + + get("/repository") { + call.respondText(ContentType.Application.Json) { + visionManager.encodeToString(VisionOfNumassRepository(Name.EMPTY, repository)) + } + } + + get("/sets/{name...}") { + val setName: Name? = call.parameters.getAll("name") + ?.map { NameToken.parse(it) }?.let(::Name) + + if (setName == null) { + call.respondText(status = HttpStatusCode.BadRequest) { "Set name is empty" } + return@get + } + + val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() } + if (set == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" } + return@get + } + + call.respondText(ContentType.Application.Json) { + visionManager.encodeToString(VisionOfNumassSet(setName, set)) + } + } + get("/points/{name...}") { + val fullName: Name? = call.parameters.getAll("name") + ?.map { NameToken.parse(it) }?.let(::Name) + + if (fullName == null) { + call.respondText(status = HttpStatusCode.BadRequest) { "Point name is empty" } + return@get + } + + val setName = fullName.cutLast() + + val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() } + if (set == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" } + return@get + } + + val pointIndex: Int? = fullName.lastOrNull()?.body?.toIntOrNull() + + val point: NumassPoint? = set.points.find { it.index == pointIndex } + + if (point == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A point with name $setName/$pointIndex not found in the repository" } + return@get + } + call.respondText(ContentType.Application.Json) { + visionManager.encodeToString(point.toVision()) + } + } + } + //serveVisionData(VisionRoute("/visions", visionManager)) +} \ No newline at end of file diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverExtensions.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverExtensions.kt index 97706e2..7ca1ebd 100644 --- a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverExtensions.kt +++ b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverExtensions.kt @@ -4,29 +4,26 @@ import space.kscience.dataforge.context.Context import space.kscience.dataforge.misc.DFExperimental import space.kscience.visionforge.html.HtmlVisionFragment import space.kscience.visionforge.html.ResourceLocation -import space.kscience.visionforge.html.page -import space.kscience.visionforge.html.scriptHeader +import space.kscience.visionforge.html.VisionPage +import space.kscience.visionforge.html.importScriptHeader import space.kscience.visionforge.makeFile -import space.kscience.visionforge.three.server.VisionServer -import space.kscience.visionforge.three.server.useScript import java.awt.Desktop import java.nio.file.Path -public fun VisionServer.useNumassWeb(): Unit { - useScript("js/numass-web.js") -} - @DFExperimental public fun Context.makeNumassWebFile( - content: HtmlVisionFragment, path: Path? = null, title: String = "VisionForge Numass page", resourceLocation: ResourceLocation = ResourceLocation.SYSTEM, show: Boolean = true, + content: HtmlVisionFragment, ): Unit { - val actualPath = page(title, content = content).makeFile(path) { actualPath -> - mapOf("numassWeb" to scriptHeader("js/numass-web.js", resourceLocation, actualPath)) + val actualPath = VisionPage(this, content = content).makeFile(path) { actualPath: Path -> + mapOf( + "title" to VisionPage.title(title), + "numassWeb" to VisionPage.importScriptHeader("js/numass-web.js", resourceLocation, actualPath) + ) } if (show) Desktop.getDesktop().browse(actualPath.toFile().toURI()) } diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/staticDemo.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/staticDemo.kt new file mode 100644 index 0000000..1456d49 --- /dev/null +++ b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/staticDemo.kt @@ -0,0 +1,28 @@ +package ru.inr.mass.data.server + +import ru.inr.mass.data.api.NumassPoint +import ru.inr.mass.data.proto.NumassProtoPlugin +import ru.inr.mass.data.proto.readNumassPointFile +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch +import java.nio.file.Path + + +@Suppress("OPT_IN_USAGE") +public suspend fun main() { + val context = Context("Numass") { + plugin(NumassProtoPlugin) + plugin(NumassCommonPlugin) + } + + val numassProto = context.fetch(NumassProtoPlugin) + + val pointPath = Path.of("D:\\Work\\Numass\\data\\test\\set_7\\p120(30s)(HV1=13300)") + val point: NumassPoint = numassProto.readNumassPointFile(pointPath)!! + + val visionOfNumass: VisionOfNumassPoint = point.toVision() + + context.makeNumassWebFile { + vision { visionOfNumass } + } +} \ No newline at end of file diff --git a/numass-model/src/commonMain/kotlin/ru/inr/mass/models/NumassTransmission.kt b/numass-model/src/commonMain/kotlin/ru/inr/mass/models/NumassTransmission.kt index a9ce83f..438865f 100644 --- a/numass-model/src/commonMain/kotlin/ru/inr/mass/models/NumassTransmission.kt +++ b/numass-model/src/commonMain/kotlin/ru/inr/mass/models/NumassTransmission.kt @@ -7,8 +7,8 @@ package ru.inr.mass.models import space.kscience.kmath.expressions.Symbol import space.kscience.kmath.expressions.symbol +import space.kscience.kmath.functions.Function1D import space.kscience.kmath.functions.PiecewisePolynomial -import space.kscience.kmath.functions.UnivariateFunction import space.kscience.kmath.functions.asFunction import space.kscience.kmath.integration.* import space.kscience.kmath.operations.DoubleField @@ -84,7 +84,7 @@ public class NumassTransmission( public val trap: Symbol by symbol public val thickness: Symbol by symbol - private val cache = HashMap>() + private val cache = HashMap>() private const val ION_POTENTIAL = 15.4//eV @@ -130,7 +130,7 @@ public class NumassTransmission( return exp(-x) } - private fun getCachedSpectrum(order: Int): UnivariateFunction { + private fun getCachedSpectrum(order: Int): Function1D { return when { order <= 0 -> error("Non-positive loss cache order") order == 1 -> singleScatterFunction @@ -147,7 +147,7 @@ public class NumassTransmission( * @param order * @return */ - private fun getLoss(order: Int): UnivariateFunction = getCachedSpectrum(order) + private fun getLoss(order: Int): Function1D = getCachedSpectrum(order) private fun getLossProbDerivs(x: Double): List { val res = ArrayList() @@ -260,7 +260,7 @@ public class NumassTransmission( * @return */ @Synchronized - private fun getNextLoss(margin: Double, loss: UnivariateFunction): PiecewisePolynomial { + private fun getNextLoss(margin: Double, loss: Function1D): PiecewisePolynomial { val res = { x: Double -> DoubleField.simpsonIntegrator.integrate(5.0..margin, IntegrandMaxCalls(200)) { y -> loss(x - y) * singleScatterFunction(y) @@ -324,7 +324,7 @@ public class NumassTransmission( private val w1 = 1.85 private val w2 = 12.5 - public val singleScatterFunction: UnivariateFunction = { eps: Double -> + public val singleScatterFunction: Function1D = { eps: Double -> when { eps <= 0 -> 0.0 eps <= b -> { diff --git a/numass-model/src/commonMain/kotlin/ru/inr/mass/models/functionCaching.kt b/numass-model/src/commonMain/kotlin/ru/inr/mass/models/functionCaching.kt index b71eb34..0e08af7 100644 --- a/numass-model/src/commonMain/kotlin/ru/inr/mass/models/functionCaching.kt +++ b/numass-model/src/commonMain/kotlin/ru/inr/mass/models/functionCaching.kt @@ -1,15 +1,15 @@ package ru.inr.mass.models +import space.kscience.kmath.functions.Function1D import space.kscience.kmath.functions.PiecewisePolynomial -import space.kscience.kmath.functions.UnivariateFunction import space.kscience.kmath.interpolation.SplineInterpolator import space.kscience.kmath.interpolation.interpolatePolynomials import space.kscience.kmath.operations.DoubleField import space.kscience.kmath.structures.DoubleBuffer import kotlin.math.abs -public fun UnivariateFunction.cache( +public fun Function1D.cache( range: ClosedFloatingPointRange, numCachePoints: Int, ): PiecewisePolynomial { diff --git a/numass-workspace/build.gradle.kts b/numass-workspace/build.gradle.kts index a655d79..18e9212 100644 --- a/numass-workspace/build.gradle.kts +++ b/numass-workspace/build.gradle.kts @@ -1,6 +1,6 @@ plugins { id("space.kscience.gradle.jvm") - id("com.github.johnrengelman.shadow") version "7.1.1" + id("com.github.johnrengelman.shadow") version "7.1.2" `maven-publish` } @@ -9,7 +9,7 @@ kotlin { } val dataforgeVersion: String by rootProject.extra -val plotlyVersion: String by rootProject.extra("0.5.0") +val visionForgeVersion: String by rootProject.extra val kmathVersion: String by rootProject.extra val tablesVersion: String by rootProject.extra @@ -18,12 +18,10 @@ dependencies { implementation(projects.numassModel) implementation(projects.numassAnalysis) implementation("space.kscience:dataforge-workspace:$dataforgeVersion") - implementation("space.kscience:plotlykt-jupyter:$plotlyVersion") + implementation("space.kscience:kmath-jupyter:$kmathVersion") implementation("space.kscience:tables-kt:$tablesVersion") -// implementation(platform("com.google.cloud:libraries-bom:23.0.0")) -// implementation("com.google.cloud:google-cloud-nio:0.123.10") -// implementation("com.google.auth:google-auth-library-oauth2-http:1.3.0") + implementation("space.kscience:visionforge-plotly:$visionForgeVersion") } kscience{ diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/notebook/NumassJupyter.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/notebook/NumassJupyter.kt index c660607..003f3a7 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/notebook/NumassJupyter.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/notebook/NumassJupyter.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.html.* import kotlinx.html.stream.createHTML import org.jetbrains.kotlinx.jupyter.api.HTML +import org.jetbrains.kotlinx.jupyter.api.declare import org.jetbrains.kotlinx.jupyter.api.libraries.JupyterIntegration import ru.inr.mass.data.api.NumassBlock import ru.inr.mass.data.api.NumassFrame @@ -23,7 +24,8 @@ import space.kscience.plotly.toPage internal class NumassJupyter : JupyterIntegration() { override fun Builder.onLoaded() { repositories( - "https://repo.kotlin.link" + "https://repo.kotlin.link", + "https://maven.pkg.jetbrains.space/spc/p/sci/dev" ) import( @@ -39,6 +41,9 @@ internal class NumassJupyter : JupyterIntegration() { import() + onLoaded { + declare("Numass" to Numass, "workspace" to Numass.workspace) + } render { HTML(Plotly.plotNumassBlock(it).toPage().render()) @@ -60,7 +65,7 @@ internal class NumassJupyter : JupyterIntegration() { } render> { tree -> - HTML(createHTML().div { numassTree(tree)}) + HTML(createHTML().div { numassTree(tree) }) } } } @@ -68,7 +73,7 @@ internal class NumassJupyter : JupyterIntegration() { private fun FlowContent.numassTree(tree: DataTree) { ul { runBlocking { - tree.items().forEach { (token, treeItem) -> + tree.items.forEach { (token, treeItem) -> li { p { +token.toString() } when (treeItem) { diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/demo.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/demo.kt index b2b2d6a..9427e1c 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/demo.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/demo.kt @@ -5,13 +5,13 @@ import ru.inr.mass.workspace.Numass.readRepository import ru.inr.mass.workspace.plotNumassSet import space.kscience.dataforge.data.DataTree import space.kscience.dataforge.data.await -import space.kscience.dataforge.data.getData +import space.kscience.dataforge.data.get import space.kscience.plotly.Plotly import space.kscience.plotly.makeFile suspend fun main() { val repo: DataTree = readRepository("D:\\Work\\Numass\\data\\2018_04") - val testSet = repo.getData("Adiabacity_19.set_3")?.await() ?: error("Not found") + val testSet = repo["Adiabacity_19.set_3"]?.await() ?: error("Not found") Plotly.plotNumassSet(testSet).makeFile() } \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/extract_data.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/extract_data.kt new file mode 100644 index 0000000..be91dc7 --- /dev/null +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/extract_data.kt @@ -0,0 +1,40 @@ +package ru.inr.mass.scripts + +import ru.inr.mass.data.api.NumassBlock +import ru.inr.mass.data.api.channels +import ru.inr.mass.workspace.Numass +import ru.inr.mass.workspace.listFrames +import space.kscience.dataforge.io.write +import space.kscience.dataforge.io.writeUtf8String +import java.nio.file.Files +import kotlin.io.path.createDirectories +import kotlin.io.path.writeText + +fun main() { + + val point = Numass.readPoint("D:\\Work\\Numass\\data\\test\\set_7\\p59(30s)(HV1=14000)") + val channels: Map = point.channels + + //Initialize and create target directory + val targetDir = Files.createTempDirectory("numass_p101(30s)(HV1=14150)") + targetDir.createDirectories() + + //dumping meta + targetDir.resolve("meta").writeText(point.meta.toString()) + + val pointTime = point.startTime + + channels.forEach { (key, block) -> + targetDir.resolve("channel-$key.csv").write { + block.listFrames().forEach { frame -> +// val frameTime = pointTime.plus(frame.timeOffset, DateTimeUnit.NANOSECOND) +// writeUtf8String("$frameTime,") + writeUtf8String("${frame.timeOffset},") + val line = frame.signal.joinToString(",", postfix = "\n" ) + writeUtf8String(line) + } + } + } + + println("Exported to $targetDir") +} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_2021_11.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_2021_11.kt index cd38880..6e9283f 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_2021_11.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_2021_11.kt @@ -1,8 +1,10 @@ package ru.inr.mass.scripts import ru.inr.mass.data.analysis.NumassEventExtractor -import ru.inr.mass.data.analysis.amplitudeSpectrum +import ru.inr.mass.data.analysis.energySpectrum +import ru.inr.mass.data.api.NumassEvent import ru.inr.mass.data.api.NumassPoint +import ru.inr.mass.data.api.channel import ru.inr.mass.data.proto.NumassDirectorySet import ru.inr.mass.models.* import ru.inr.mass.workspace.Numass @@ -38,6 +40,30 @@ fun Spectrum.convolve(range: ClosedRange, function: (Double) -> Double): }.value } +/** + * E = A * ADC +B + * Channel A B + * 0 0.01453 1.3 + * 2 0.01494 -4.332 + * 3 0.01542 -5.183 + * 4 0.01573 -2.115 + * 5 0.0152 -3.808 + * 6 0.0155 -3.015 + * 7 0.01517 -0.5429 + */ +val calibration: (NumassEvent) -> Double = { + when (it.channel) { + 0 -> 0.01453 * it.amplitude + 1.3 + 2 -> 0.01494 * it.amplitude - 5.183 + 3 -> 0.01542 * it.amplitude - 5.183 + 4 -> 0.01573 * it.amplitude - 2.115 + 5 -> 0.0152 * it.amplitude - 3.808 + 6 -> 0.0155 * it.amplitude - 3.015 + 7 -> 0.01517 * it.amplitude - 0.5429 + else -> error("Unrecognized channel ${it.channel}") + } * 1000.0 +} + private val neutrinoSpectrum = NumassBeta.withFixedX(0.0) private val args: Map = mapOf( @@ -59,26 +85,27 @@ suspend fun main() { val hv = 16900.0 //select point number 2 (U = 16900 V) from each directory - val points: Map = repo.items().mapValues { + val points: Map = repo.items.mapValues { val directory = it.value.data?.await() val point = directory?.points?.find { point -> point.voltage == hv } point } - val spectrum: Map = points.values.first()!! - .amplitudeSpectrum(NumassEventExtractor.TQDC) - .amplitudes.toSortedMap() + val spectrum: Map = points.values.first()!! + .energySpectrum(NumassEventExtractor.TQDC, calibration) + .filter { it.key > 9000.0 } + .toSortedMap() - //the channel of spectrum peak position - val argmax = spectrum.maxByOrNull { it.value }!!.key - - // convert channel to energy - fun Short.toEnergy(): Double = toDouble() / argmax * gunEnergy +// //the channel of spectrum peak position +// val argmax = spectrum.maxByOrNull { it.value }!!.key +// +// // convert channel to energy +// fun Short.toEnergy(): Double = toDouble() / argmax * gunEnergy val norm = spectrum.values.sum().toDouble() val interpolated: PiecewisePolynomial = LinearInterpolator(DoubleField).interpolatePolynomials( - spectrum.keys.map { it.toEnergy() - gunEnergy }.asBuffer(), + spectrum.keys.map { it - gunEnergy }.asBuffer(), spectrum.values.map { it.toDouble() / norm }.asBuffer() ) @@ -93,7 +120,7 @@ suspend fun main() { Plotly.plot { scatter { name = "gun" - x.numbers = spectrum.keys.map { it.toEnergy() } + x.numbers = spectrum.keys y.numbers = spectrum.values.map { it.toDouble() / norm } } @@ -101,15 +128,17 @@ suspend fun main() { name = "convoluted" x.buffer = 0.0..19000.0 step 100.0 y.numbers = x.doubles.map { model(it, args) } - y.numbers = y.doubles.map { it / y.doubles.maxOrNull()!! } + val yNorm = y.doubles.maxOrNull()!! + y.numbers = y.doubles.map { it / yNorm } } scatter { name = "tritium" - val tritiumSpectrum = tritiumData.amplitudeSpectrum(NumassEventExtractor.TQDC).amplitudes.toSortedMap() - x.numbers = tritiumSpectrum.keys.map { it.toEnergy() } - y.numbers = tritiumSpectrum.values.map { it.toDouble()} - y.numbers = y.doubles.map { it / y.doubles.maxOrNull()!! } + val tritiumSpectrum = tritiumData.energySpectrum(NumassEventExtractor.TQDC, calibration).toSortedMap() + x.numbers = tritiumSpectrum.keys + y.numbers = tritiumSpectrum.values.map { it.toDouble() } + val yNorm = y.doubles.maxOrNull()!! + y.numbers = y.doubles.map { it / yNorm } } }.makeFile() } \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_sim.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_sim.kt new file mode 100644 index 0000000..ea9c656 --- /dev/null +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/gun_sim.kt @@ -0,0 +1,63 @@ +package ru.inr.mass.scripts + +import ru.inr.mass.workspace.buffer +import space.kscience.kmath.functions.asFunction +import space.kscience.kmath.integration.integrate +import space.kscience.kmath.integration.splineIntegrator +import space.kscience.kmath.integration.value +import space.kscience.kmath.interpolation.interpolatePolynomials +import space.kscience.kmath.interpolation.splineInterpolator +import space.kscience.kmath.operations.DoubleField +import space.kscience.kmath.real.step +import space.kscience.plotly.Plotly +import space.kscience.plotly.layout +import space.kscience.plotly.makeFile +import space.kscience.plotly.models.AxisType +import space.kscience.plotly.scatter +import kotlin.math.PI +import kotlin.math.exp +import kotlin.math.pow +import kotlin.math.sqrt + +fun main() { + val backScatteringSpectrum: List> = {}.javaClass + .getResource("/simulation/Gun19_E_back_scatt.dat")!!.readText() + .lineSequence().drop(2).mapNotNull { + if (it.isBlank()) return@mapNotNull null + val (e, p) = it.split('\t') + Pair(e.toDouble(), p.toDouble()) + }.toList() + + val interpolated = DoubleField.splineInterpolator + .interpolatePolynomials(backScatteringSpectrum) + .asFunction(DoubleField, 0.0) + + val sigma = 0.3 + val detectorResolution: (Double) -> Double = { x -> + 1.0 / sqrt(2 * PI) / sigma * exp(-(x / sigma).pow(2) / 2.0) + } + + val convoluted: (Double) -> Double = { x -> + DoubleField.splineIntegrator.integrate(-2.0..2.0) { y -> + detectorResolution(y) * interpolated(x - y) + }.value + } + + Plotly.plot { +// scatter { +// name = "simulation" +// x.numbers = backScatteringSpectrum.map { 19.0 - it.first } +// y.numbers = backScatteringSpectrum.map { it.second } +// } + scatter { + name = "smeared" + x.buffer = 0.0..20.0 step 0.1 + y.numbers = x.doubles.map { convoluted(19.0 - it) * 0.14/0.01 + 0.86 * detectorResolution(it - 19.0) } + println(y.doubles.sum()*0.1)//Norm check + } + layout { + yaxis.type = AxisType.log + } + }.makeFile() + +} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2020_12.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2020_12.kt index 11a126b..7f93713 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2020_12.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2020_12.kt @@ -1,20 +1,22 @@ package ru.inr.mass.scripts -import kotlinx.coroutines.flow.collect import ru.inr.mass.data.proto.NumassDirectorySet import ru.inr.mass.workspace.Numass.readRepository +import space.kscience.dataforge.data.DataSource import space.kscience.dataforge.data.DataTree import space.kscience.dataforge.data.filter +import space.kscience.dataforge.data.forEach +import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.string suspend fun main() { val repo: DataTree = readRepository("D:\\Work\\Numass\\data\\2018_04") - val filtered = repo.filter { _, data -> - val operator by data.meta.string() + val filtered: DataSource = repo.filter { _, meta: Meta -> + val operator by meta.string() operator?.startsWith("Vas") ?: false } - filtered.flowData().collect { + filtered.forEach{ println(it) } } \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2021_11.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2021_11.kt index abf3ce1..b16da94 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2021_11.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/run_2021_11.kt @@ -1,50 +1,59 @@ package ru.inr.mass.scripts -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking +import kotlinx.html.code import kotlinx.html.h2 import kotlinx.html.p +import kotlinx.html.unsafe import kotlinx.serialization.json.Json +import ru.inr.mass.data.analysis.NumassEventExtractor +import ru.inr.mass.data.analysis.amplitudeSpectrum import ru.inr.mass.data.api.NumassFrame +import ru.inr.mass.data.api.channels import ru.inr.mass.workspace.Numass.readDirectory +import ru.inr.mass.workspace.Numass.readPoint import ru.inr.mass.workspace.listFrames import space.kscience.dataforge.meta.MetaSerializer import space.kscience.plotly.* -fun NumassFrame.tqdcAmplitude(): Short { - var max = Short.MIN_VALUE - var min = Short.MAX_VALUE +//fun NumassFrame.tqdcAmplitude(): Short { +// var max = Short.MIN_VALUE +// var min = Short.MAX_VALUE +// +// signal.forEach { sh: Short -> +// if (sh >= max) { +// max = sh +// } +// if (sh <= min) { +// min = sh +// } +// } +// +// return (max - min).toShort() +//} - signal.forEach { sh: Short -> - if (sh >= max) { - max = sh - } - if (sh <= min) { - min = sh - } - } +//fun Flow.tqdcAmplitudes(): List = runBlocking { +// map { it.tqdcAmplitude() }.toList() +//} - return (max - min).toShort() -} - -fun Flow.tqdcAmplitudes(): List = runBlocking { - map { it.tqdcAmplitude() }.toList() -} +val IntRange.center: Double get() = (endInclusive + start).toDouble() / 2.0 suspend fun main() { //val repo: DataTree = readNumassRepository("D:\\Work\\numass-data\\") - val directory = readDirectory("D:\\Work\\Numass\\data\\test\\set_7") - val point = directory.points.first() + //val directory = readDirectory("D:\\Work\\Numass\\data\\2021_11\\Tritium_2\\set_11\\") + val point = readPoint("D:\\Work\\Numass\\data\\2021_11\\Tritium_2\\set_11\\p0(30s)(HV1=14000)") + val channel = point.channels[4]!! - val frames: List = point.listFrames() + val binning = 16U + + val frames: List = channel.listFrames() Plotly.page { p { +"${frames.size} frames" } h2 { +"Random frames" } plot { val random = kotlin.random.Random(1234) - repeat(10) { val frame = frames.random(random) scatter { @@ -54,21 +63,46 @@ suspend fun main() { } h2 { +"Analysis" } plot { - histogram { + scatter { name = "max" - x.numbers = frames.map { frame -> frame.signal.maxOrNull() ?: 0 } + val spectrum = runBlocking { + channel.amplitudeSpectrum(NumassEventExtractor.EVENTS_ONLY) + }.binned(binning) + x.numbers = spectrum.keys.map { it.center } + y.numbers = spectrum.values.map { it } } - histogram { + scatter { name = "max-min" + val spectrum = runBlocking { + channel.amplitudeSpectrum(NumassEventExtractor.TQDC) + }.binned(binning) + x.numbers = spectrum.keys.map { it.center } + y.numbers = spectrum.values.map { it} + } + + scatter { + name = "max-baseline + filter" + val spectrum = runBlocking { + channel.amplitudeSpectrum(NumassEventExtractor.TQDC_V2) + }.binned(binning) + x.numbers = spectrum.keys.map { it.center } + y.numbers = spectrum.values.map { it } + } + histogram { + name = "events" xbins { size = 2.0 } - x.numbers = frames.map { it.tqdcAmplitude() } + x.numbers = runBlocking { point.events.map { it.amplitude.toInt() }.toList() } } } h2 { +"Meta" } - p { +Json.encodeToString(MetaSerializer, point.meta) } + code { + unsafe { + +Json { prettyPrint = true }.encodeToString(MetaSerializer, point.meta) + } + } }.makeFile() diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/show_monotors.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/show_monotors.kt new file mode 100644 index 0000000..b53dcfa --- /dev/null +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/scripts/show_monotors.kt @@ -0,0 +1,22 @@ +package ru.inr.mass.scripts + +import ru.inr.mass.data.api.NumassPoint +import ru.inr.mass.workspace.Numass +import space.kscience.plotly.Plotly +import space.kscience.plotly.makeFile +import space.kscience.plotly.scatter + +fun main() { + val directory = Numass.readDirectory("D:\\Work\\Numass\\data\\test\\set_7\\") + + val monitorPoints: List = directory.filter { it.voltage == 14000.0 }.sortedBy { it.startTime } + + Plotly.plot { + scatter { + x.numbers = monitorPoints.map { + it.startTime.toEpochMilliseconds() + } + y.numbers = monitorPoints.map { it.framesCount } + } + }.makeFile() +} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/Numass.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/Numass.kt index 2d907b9..76f7816 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/Numass.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/Numass.kt @@ -3,51 +3,41 @@ package ru.inr.mass.workspace import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.toList import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import ru.inr.mass.data.api.NumassBlock import ru.inr.mass.data.api.NumassPoint -import ru.inr.mass.data.api.NumassSet -import ru.inr.mass.data.proto.NumassDirectorySet -import ru.inr.mass.data.proto.readNumassDirectory -import ru.inr.mass.data.proto.readNumassPointFile -import space.kscience.dataforge.data.* -import space.kscience.dataforge.names.Name -import space.kscience.dataforge.names.NameToken -import java.nio.file.Files +import ru.inr.mass.data.proto.* +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.workspace.Workspace import java.nio.file.Path -import kotlin.io.path.exists -import kotlin.io.path.isDirectory -import kotlin.io.path.relativeTo object Numass { - fun readDirectory(path: String): NumassDirectorySet = NUMASS.context.readNumassDirectory(path) - - fun readRepository(path: Path): DataTree = runBlocking { - ActiveDataTree { - @Suppress("BlockingMethodInNonBlockingContext") - withContext(Dispatchers.IO) { - Files.walk(path).filter { - it.isDirectory() && it.resolve("meta").exists() - }.toList().forEach { childPath -> - val name = Name(childPath.relativeTo(path).map { segment -> - NameToken(segment.fileName.toString()) - }) - val value = NUMASS.context.readNumassDirectory(childPath) - static(name, value, value.meta) - } - } - //TODO add file watcher + val workspace = Workspace { + context { + plugin(NumassWorkspacePlugin) } } - fun readRepository(path: String): DataTree = readRepository(Path.of(path)) + val context get() = workspace.context - fun readPoint(path: String): NumassPoint = NUMASS.context.readNumassPointFile(path) - ?: error("Can't read numass point at $path") -} + val numassProto by lazy { context.fetch(NumassProtoPlugin) } + + fun readPoint(path: Path): NumassPoint = + numassProto.readNumassPointFile(path) ?: error("Can't read numass point at $path") + + fun readPoint(path: String): NumassPoint = + numassProto.readNumassPointFile(path) ?: error("Can't read numass point at $path") + + fun readDirectory(path: Path): NumassDirectorySet = numassProto.readNumassDirectory(path) + + fun readDirectory(path: String): NumassDirectorySet = numassProto.readNumassDirectory(path) + + fun readRepository(path: Path): DataTree = + runBlocking(Dispatchers.IO) { numassProto.readRepository(path) } + + fun readRepository(path: String): DataTree = + runBlocking(Dispatchers.IO) { numassProto.readRepository(path) } -operator fun DataSet.get(name: String): NumassSet? = runBlocking { - getData(Name.parse(name))?.await() } fun NumassBlock.listFrames() = runBlocking { frames.toList() } diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassPlugin.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassPlugin.kt index a7e747d..e69de29 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassPlugin.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassPlugin.kt @@ -1,119 +0,0 @@ -package ru.inr.mass.workspace - -import ru.inr.mass.data.proto.NumassProtoPlugin -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.PluginFactory -import space.kscience.dataforge.context.PluginTag -import space.kscience.dataforge.meta.Meta -import space.kscience.dataforge.values.Value -import space.kscience.dataforge.workspace.TaskReference -import space.kscience.dataforge.workspace.WorkspacePlugin -import space.kscience.dataforge.workspace.task -import space.kscience.tables.Table -import kotlin.reflect.KClass - -class NumassPlugin : WorkspacePlugin() { - override val tag: PluginTag get() = Companion.tag - - val numassProtoPlugin by require(NumassProtoPlugin) - -// val select by task( -// descriptor = MetaDescriptor { -// info = "Select data from workspace data pool" -// value("forward", ValueType.BOOLEAN) { -// info = "Select only forward or only backward sets" -// } -// } -// ) { -// val forward = meta["forward"]?.boolean -// val filtered = workspace.data.select { _, meta -> -// when (forward) { -// true -> meta["iteration_info.reverse"]?.boolean?.not() ?: false -// false -> meta["iteration_info.reverse"]?.boolean ?: false -// else -> true -// } -// } -// -// emit(Name.EMPTY, filtered) -// } -// -// val analyze by task>( -// MetaDescriptor { -// info = "Count the number of events for each voltage and produce a table with the results" -// } -// ) { -// pipeFrom(select) { set, name, meta -> -// val res = SmartAnalyzer.analyzeSet(set, meta["analyzer"] ?: Meta.EMPTY) -// val outputMeta = meta.toMutableMeta().apply { -// "data" put set.meta -// } -// // context.output.render(res, stage = "numass.analyze", name = name, meta = outputMeta) -// res -// } -// } - - val monitorTableTask: TaskReference> by task { - -// descriptor { -// value("showPlot", types = listOf(ValueType.BOOLEAN), info = "Show plot after complete") -// value("monitorPoint", types = listOf(ValueType.NUMBER), info = "The voltage for monitor point") -// } -// model { meta -> -// dependsOn(selectTask, meta) -//// if (meta.getBoolean("monitor.correctForThreshold", false)) { -//// dependsOn(subThresholdTask, meta, "threshold") -//// } -// configure(meta.getMetaOrEmpty("monitor")) -// configure { -// meta.useMeta("analyzer") { putNode(it) } -// setValue("@target", meta.getString("@target", meta.name)) -// } -// } -// join { data -> -// val monitorVoltage = meta.getDouble("monitorPoint", 16000.0); -// val analyzer = SmartAnalyzer() -// val analyzerMeta = meta.getMetaOrEmpty("analyzer") -// -// //val thresholdCorrection = da -// //TODO add separator labels -// val res = ListTable.Builder("timestamp", "count", "cr", "crErr", "index", "set") -// .rows( -// data.values.stream().flatMap { set -> -// set.points.stream() -// .filter { it.voltage == monitorVoltage } -// .parallel() -// .map { point -> -// analyzer.analyzeParent(point, analyzerMeta).edit { -// "index" to point.index -// "set" to set.name -// } -// } -// } -// -// ).build() -// -// if (meta.getBoolean("showPlot", true)) { -// val plot = DataPlot.plot(name, res, Adapters.buildXYAdapter("timestamp", "cr", "crErr")) -// context.plot(plot, name, "numass.monitor") { -// "xAxis.title" to "time" -// "xAxis.type" to "time" -// "yAxis.title" to "Count rate" -// "yAxis.units" to "Hz" -// } -// -// ((context.output["numass.monitor", name] as? PlotOutput)?.frame as? JFreeChartFrame)?.addSetMarkers(data.values) -// } -// -// context.output.render(res, stage = "numass.monitor", name = name, meta = meta) -// -// return@join res; -// } - } - - companion object : PluginFactory { - override val tag: PluginTag = PluginTag("numass", "ru.mipt.npm") - override val type: KClass = NumassPlugin::class - - override fun build(context: Context, meta: Meta): NumassPlugin = NumassPlugin() - } -} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassWorkspacePlugin.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassWorkspacePlugin.kt new file mode 100644 index 0000000..f7bc2b5 --- /dev/null +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassWorkspacePlugin.kt @@ -0,0 +1,134 @@ +package ru.inr.mass.workspace + +import ru.inr.mass.data.analysis.NumassAnalyzerParameters +import ru.inr.mass.data.analysis.NumassEventExtractor +import ru.inr.mass.data.analysis.TimeAnalyzer +import ru.inr.mass.data.analysis.analyzeSet +import ru.inr.mass.data.api.NumassSet +import ru.inr.mass.data.proto.NumassProtoPlugin +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.PluginFactory +import space.kscience.dataforge.context.PluginTag +import space.kscience.dataforge.data.filterByType +import space.kscience.dataforge.meta.* +import space.kscience.dataforge.meta.descriptors.MetaDescriptor +import space.kscience.dataforge.meta.descriptors.value +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.workspace.WorkspacePlugin +import space.kscience.dataforge.workspace.pipeFrom +import space.kscience.dataforge.workspace.task +import space.kscience.tables.Table +import kotlin.reflect.KClass + +class NumassWorkspacePlugin : WorkspacePlugin() { + override val tag: PluginTag get() = Companion.tag + + val numassProtoPlugin by require(NumassProtoPlugin) + + val selectSets by task( + descriptor = MetaDescriptor { + info = "Select data from workspace data pool" + value("forward", ValueType.BOOLEAN) { + info = "Select only forward or only backward sets" + } + } + ) { + val forward = meta["forward"]?.boolean + val filtered = workspace.data.filterByType { _, meta -> + when (forward) { + true -> meta["iteration_info.reverse"]?.boolean?.not() ?: false + false -> meta["iteration_info.reverse"]?.boolean ?: false + else -> true + } + } + + node(Name.EMPTY, filtered) + } + + + val analyzeSets by task>( + MetaDescriptor { + info = "Count the number of events for each voltage and produce a table with the results" + } + ) { + pipeFrom(selectSets) { set, name, meta -> + val res = TimeAnalyzer(NumassEventExtractor.EVENTS_ONLY).analyzeSet( + set, + NumassAnalyzerParameters.read(meta["analyzer"] ?: Meta.EMPTY) + ) + val outputMeta = meta.toMutableMeta().apply { + "data" put set.meta + } + // context.output.render(res, stage = "numass.analyze", name = name, meta = outputMeta) + res + } + } +// +// val monitorTableTask: TaskReference> by task( +// MetaDescriptor { +// value("showPlot", type = ValueType.BOOLEAN) { +// info = "Show plot after complete" +// } +// value("monitorPoint", type = ValueType.NUMBER) { +// info = "The voltage for monitor point" +// } +// } +// ) { +// val data = from(selectSets) +//// model { meta -> +//// dependsOn(selectTask, meta) +////// if (meta.getBoolean("monitor.correctForThreshold", false)) { +////// dependsOn(subThresholdTask, meta, "threshold") +////// } +//// configure(meta.getMetaOrEmpty("monitor")) +//// configure { +//// meta.useMeta("analyzer") { putNode(it) } +//// setValue("@target", meta.getString("@target", meta.name)) +//// } +//// } +// +// val monitorVoltage = meta["monitorPoint"].double ?: 16000.0 +// val analyzer = TimeAnalyzer() +// val analyzerMeta = meta["analyzer"] +// +// //val thresholdCorrection = da +// //TODO add separator labels +// val res = ListTable.Builder("timestamp", "count", "cr", "crErr", "index", "set") +// .rows( +// data.values.stream().flatMap { set -> +// set.points.stream() +// .filter { it.voltage == monitorVoltage } +// .parallel() +// .map { point -> +// analyzer.analyzeParent(point, analyzerMeta).edit { +// "index" to point.index +// "set" to set.name +// } +// } +// } +// +// ).build() +// +// if (meta["showPlot"].boolean ?: true) { +// val plot = DataPlot.plot(name, res, Adapters.buildXYAdapter("timestamp", "cr", "crErr")) +// context.plot(plot, name, "numass.monitor") { +// "xAxis.title" to "time" +// "xAxis.type" to "time" +// "yAxis.title" to "Count rate" +// "yAxis.units" to "Hz" +// } +// +// ((context.output["numass.monitor", name] as? PlotOutput)?.frame as? JFreeChartFrame)?.addSetMarkers(data.values) +// } +// +// context.output.render(res, stage = "numass.monitor", name = name, meta = meta) +// +// data(Name.EMPTY, res) +// } + + companion object : PluginFactory { + override val tag: PluginTag = PluginTag("numass", "ru.mipt.npm") + override val type: KClass = NumassWorkspacePlugin::class + override fun build(context: Context, meta: Meta): NumassWorkspacePlugin = NumassWorkspacePlugin() + } +} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt index 01d2699..797d00a 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt @@ -10,10 +10,10 @@ import ru.inr.mass.data.analysis.timeHistogram import ru.inr.mass.data.api.* import ru.inr.mass.data.proto.HVData import ru.inr.mass.data.proto.NumassDirectorySet -import space.kscience.dataforge.values.asValue -import space.kscience.dataforge.values.double -import space.kscience.kmath.histogram.UnivariateHistogram -import space.kscience.kmath.histogram.center +import space.kscience.dataforge.meta.asValue +import space.kscience.dataforge.meta.double +import space.kscience.kmath.domains.center +import space.kscience.kmath.histogram.Histogram1D import space.kscience.kmath.misc.UnstableKMathAPI import space.kscience.kmath.operations.asIterable import space.kscience.kmath.structures.Buffer @@ -26,9 +26,9 @@ import kotlin.time.DurationUnit * Plot a kmath histogram */ @OptIn(UnstableKMathAPI::class) -fun Plot.histogram(histogram: UnivariateHistogram, block: Scatter.() -> Unit = {}): Trace = scatter { +fun Plot.histogram(histogram: Histogram1D, block: Scatter.() -> Unit = {}): Trace = scatter { x.numbers = histogram.bins.map { it.domain.center } - y.numbers = histogram.bins.map { it.value } + y.numbers = histogram.bins.map { it.binValue } line.shape = LineShape.hv block() } @@ -58,7 +58,7 @@ fun Plotly.plotNumassBlock( block: NumassBlock, amplitudeBinSize: UInt = 20U, eventExtractor: NumassEventExtractor = NumassEventExtractor.EVENTS_ONLY, - splitChannels: Boolean = true + splitChannels: Boolean = true, ): PlotlyFragment = Plotly.fragment { plot { runBlocking { @@ -105,11 +105,11 @@ fun Plotly.plotNumassSet( h2 { +"Time spectra" } plot { - spectra.forEach { (point,spectrum) -> + spectra.forEach { (point, spectrum) -> val countRate = runBlocking { spectrum.sum().toDouble() / point.getLength().toDouble(DurationUnit.SECONDS) } - val binSize = 1.0 / countRate / 10.0 + val binSize = 1.0 / countRate / 10.0 histogram(point.timeHistogram(binSize)) { name = point.title } @@ -128,7 +128,7 @@ fun Plotly.plotNumassSet( } if (set is NumassDirectorySet) { - set.getHvData()?.let { entries -> + set.hvData?.let { entries -> h2 { +"HV" } plot { hvData(entries) diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/workspace.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/workspace.kt deleted file mode 100644 index 7d1785f..0000000 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/workspace.kt +++ /dev/null @@ -1,10 +0,0 @@ -package ru.inr.mass.workspace - -import ru.inr.mass.data.proto.NumassProtoPlugin -import space.kscience.dataforge.workspace.Workspace - -val NUMASS = Workspace { - context{ - plugin(NumassProtoPlugin) - } -} \ No newline at end of file diff --git a/numass-workspace/src/main/resources/simulation/Gun19_E_back_scatt.dat b/numass-workspace/src/main/resources/simulation/Gun19_E_back_scatt.dat new file mode 100644 index 0000000..8fdfaf2 --- /dev/null +++ b/numass-workspace/src/main/resources/simulation/Gun19_E_back_scatt.dat @@ -0,0 +1,1903 @@ +Backscattered Energy +Energy (KeV) Hits (Normalized) +0 0 +0.01 0 +0.02 0 +0.03 0 +0.04 0 +0.05 0 +0.06 1.43386e-005 +0.07 0 +0.08 1.43386e-005 +0.09 1.43386e-005 +0.1 0 +0.11 0 +0.12 0 +0.13 1.43386e-005 +0.14 1.43386e-005 +0.15 0 +0.16 1.43386e-005 +0.17 0 +0.18 0 +0.19 4.30157e-005 +0.2 0 +0.21 1.43386e-005 +0.22 4.30157e-005 +0.23 1.43386e-005 +0.24 0 +0.25 0 +0.26 1.43386e-005 +0.27 0 +0.28 0 +0.29 1.43386e-005 +0.3 0 +0.31 1.43386e-005 +0.32 1.43386e-005 +0.33 0 +0.34 0 +0.35 0 +0.36 4.30157e-005 +0.37 2.86771e-005 +0.38 0 +0.39 1.43386e-005 +0.4 1.43386e-005 +0.41 1.43386e-005 +0.42 0 +0.43 0 +0.44 1.43386e-005 +0.45 2.86771e-005 +0.46 0 +0.47 2.86771e-005 +0.48 0 +0.49 0 +0.5 1.43386e-005 +0.51 2.86771e-005 +0.52 2.86771e-005 +0.53 0 +0.54 0 +0.55 0 +0.56 0 +0.57 0 +0.58 5.73542e-005 +0.59 1.43386e-005 +0.6 4.30157e-005 +0.61 2.86771e-005 +0.62 5.73542e-005 +0.63 1.43386e-005 +0.64 2.86771e-005 +0.65 1.43386e-005 +0.66 1.43386e-005 +0.67 4.30157e-005 +0.68 0 +0.69 1.43386e-005 +0.7 2.86771e-005 +0.71 0 +0.72 2.86771e-005 +0.73 4.30157e-005 +0.74 4.30157e-005 +0.75 0 +0.76 4.30157e-005 +0.77 1.43386e-005 +0.78 1.43386e-005 +0.79 1.43386e-005 +0.8 4.30157e-005 +0.81 0 +0.82 1.43386e-005 +0.83 1.43386e-005 +0.84 4.30157e-005 +0.85 1.43386e-005 +0.86 8.60314e-005 +0.87 2.86771e-005 +0.88 2.86771e-005 +0.89 4.30157e-005 +0.9 0 +0.91 4.30157e-005 +0.92 2.86771e-005 +0.93 2.86771e-005 +0.94 4.30157e-005 +0.95 2.86771e-005 +0.96 1.43386e-005 +0.97 0 +0.98 1.43386e-005 +0.99 5.73542e-005 +1 4.30157e-005 +1.01 2.86771e-005 +1.02 4.30157e-005 +1.03 5.73542e-005 +1.04 1.43386e-005 +1.05 5.73542e-005 +1.06 7.16928e-005 +1.07 8.60314e-005 +1.08 4.30157e-005 +1.09 5.73542e-005 +1.1 7.16928e-005 +1.11 5.73542e-005 +1.12 4.30157e-005 +1.13 5.73542e-005 +1.14 5.73542e-005 +1.15 2.86771e-005 +1.16 1.43386e-005 +1.17 1.43386e-005 +1.18 2.86771e-005 +1.19 7.16928e-005 +1.2 5.73542e-005 +1.21 2.86771e-005 +1.22 5.73542e-005 +1.23 5.73542e-005 +1.24 5.73542e-005 +1.25 2.86771e-005 +1.26 5.73542e-005 +1.27 1.43386e-005 +1.28 4.30157e-005 +1.29 4.30157e-005 +1.3 5.73542e-005 +1.31 5.73542e-005 +1.32 8.60314e-005 +1.33 2.86771e-005 +1.34 5.73542e-005 +1.35 7.16928e-005 +1.36 8.60314e-005 +1.37 0 +1.38 1.43386e-005 +1.39 7.16928e-005 +1.4 4.30157e-005 +1.41 5.73542e-005 +1.42 4.30157e-005 +1.43 7.16928e-005 +1.44 1.43386e-005 +1.45 2.86771e-005 +1.46 8.60314e-005 +1.47 7.16928e-005 +1.48 5.73542e-005 +1.49 5.73542e-005 +1.5 8.60314e-005 +1.51 8.60314e-005 +1.52 4.30157e-005 +1.53 2.86771e-005 +1.54 7.16928e-005 +1.55 7.16928e-005 +1.56 4.30157e-005 +1.57 5.73542e-005 +1.58 0.000114708 +1.59 2.86771e-005 +1.6 2.86771e-005 +1.61 0.000114708 +1.62 7.16928e-005 +1.63 4.30157e-005 +1.64 7.16928e-005 +1.65 7.16928e-005 +1.66 8.60314e-005 +1.67 7.16928e-005 +1.68 4.30157e-005 +1.69 0 +1.7 8.60314e-005 +1.71 7.16928e-005 +1.72 7.16928e-005 +1.73 4.30157e-005 +1.74 4.30157e-005 +1.75 0.000172063 +1.76 0.000129047 +1.77 5.73542e-005 +1.78 7.16928e-005 +1.79 8.60314e-005 +1.8 0.00010037 +1.81 0.00010037 +1.82 5.73542e-005 +1.83 5.73542e-005 +1.84 0.000114708 +1.85 4.30157e-005 +1.86 8.60314e-005 +1.87 8.60314e-005 +1.88 7.16928e-005 +1.89 7.16928e-005 +1.9 4.30157e-005 +1.91 0.000143386 +1.92 0.000157724 +1.93 8.60314e-005 +1.94 0.00010037 +1.95 0.000143386 +1.96 5.73542e-005 +1.97 8.60314e-005 +1.98 4.30157e-005 +1.99 4.30157e-005 +2 0.00010037 +2.01 5.73542e-005 +2.02 8.60314e-005 +2.03 0.000114708 +2.04 7.16928e-005 +2.05 0.000114708 +2.06 7.16928e-005 +2.07 8.60314e-005 +2.08 7.16928e-005 +2.09 0.000215078 +2.1 0.00010037 +2.11 8.60314e-005 +2.12 7.16928e-005 +2.13 4.30157e-005 +2.14 7.16928e-005 +2.15 0.000114708 +2.16 0.000143386 +2.17 0.000114708 +2.18 0.000229417 +2.19 0.000129047 +2.2 8.60314e-005 +2.21 0.000114708 +2.22 0.000143386 +2.23 0.000129047 +2.24 8.60314e-005 +2.25 0.000157724 +2.26 8.60314e-005 +2.27 0.000143386 +2.28 0.000129047 +2.29 0.000143386 +2.3 7.16928e-005 +2.31 5.73542e-005 +2.32 0.000114708 +2.33 7.16928e-005 +2.34 0.000129047 +2.35 0.00010037 +2.36 7.16928e-005 +2.37 0.000114708 +2.38 0.000129047 +2.39 2.86771e-005 +2.4 8.60314e-005 +2.41 0.000129047 +2.42 0.00020074 +2.43 0.000157724 +2.44 0.000114708 +2.45 0.00020074 +2.46 0.00010037 +2.47 0.00010037 +2.48 0.00010037 +2.49 7.16928e-005 +2.5 0.000129047 +2.51 0.000143386 +2.52 0.000186401 +2.53 0.000143386 +2.54 0.000143386 +2.55 0.000129047 +2.56 7.16928e-005 +2.57 8.60314e-005 +2.58 0.000114708 +2.59 0.000157724 +2.6 0.00010037 +2.61 0.000157724 +2.62 0.000172063 +2.63 8.60314e-005 +2.64 0.000129047 +2.65 0.000172063 +2.66 7.16928e-005 +2.67 0.000114708 +2.68 0.000143386 +2.69 0.000172063 +2.7 0.00010037 +2.71 0.000129047 +2.72 0.000143386 +2.73 0.00010037 +2.74 0.000172063 +2.75 0.000129047 +2.76 0.00010037 +2.77 0.00010037 +2.78 0.000172063 +2.79 0.000215078 +2.8 0.000172063 +2.81 0.00020074 +2.82 0.000143386 +2.83 0.000143386 +2.84 8.60314e-005 +2.85 0.000143386 +2.86 0.00010037 +2.87 0.000157724 +2.88 0.000157724 +2.89 0.000186401 +2.9 0.000229417 +2.91 0.000157724 +2.92 0.000143386 +2.93 0.00020074 +2.94 8.60314e-005 +2.95 0.000129047 +2.96 0.00010037 +2.97 0.000129047 +2.98 0.000114708 +2.99 0.00020074 +3 0.000172063 +3.01 0.000157724 +3.02 0.000186401 +3.03 0.000215078 +3.04 5.73542e-005 +3.05 0.00020074 +3.06 0.000172063 +3.07 0.000114708 +3.08 0.00010037 +3.09 0.000157724 +3.1 0.000172063 +3.11 0.000143386 +3.12 0.000143386 +3.13 0.000114708 +3.14 0.000114708 +3.15 0.000157724 +3.16 0.000129047 +3.17 0.000215078 +3.18 0.000286771 +3.19 0.00010037 +3.2 0.000114708 +3.21 0.000172063 +3.22 0.000114708 +3.23 0.000157724 +3.24 0.000172063 +3.25 0.000157724 +3.26 0.000243756 +3.27 0.00020074 +3.28 0.000186401 +3.29 0.00020074 +3.3 0.000157724 +3.31 0.000186401 +3.32 0.000286771 +3.33 0.000172063 +3.34 0.000143386 +3.35 0.000186401 +3.36 0.00010037 +3.37 0.000229417 +3.38 0.000215078 +3.39 0.000272433 +3.4 0.000157724 +3.41 0.00020074 +3.42 0.000129047 +3.43 0.000186401 +3.44 0.000258094 +3.45 0.000243756 +3.46 0.000157724 +3.47 0.000186401 +3.48 0.000143386 +3.49 0.00020074 +3.5 0.000258094 +3.51 0.000186401 +3.52 8.60314e-005 +3.53 0.000143386 +3.54 0.000129047 +3.55 0.000157724 +3.56 0.00020074 +3.57 0.000157724 +3.58 0.000215078 +3.59 0.00010037 +3.6 0.000329787 +3.61 0.000286771 +3.62 0.000215078 +3.63 0.000129047 +3.64 0.000186401 +3.65 0.00020074 +3.66 0.000243756 +3.67 0.000114708 +3.68 0.000215078 +3.69 0.000186401 +3.7 0.000258094 +3.71 0.000258094 +3.72 0.00030111 +3.73 0.00030111 +3.74 0.000229417 +3.75 0.000143386 +3.76 0.000186401 +3.77 0.00030111 +3.78 0.000272433 +3.79 0.000186401 +3.8 0.000215078 +3.81 0.000258094 +3.82 0.000258094 +3.83 0.000286771 +3.84 0.00020074 +3.85 0.000172063 +3.86 0.00020074 +3.87 0.000143386 +3.88 0.000272433 +3.89 0.000229417 +3.9 0.000315448 +3.91 0.000157724 +3.92 0.000587881 +3.93 0.000229417 +3.94 0.000272433 +3.95 0.000286771 +3.96 0.000358464 +3.97 0.000272433 +3.98 0.000315448 +3.99 0.000258094 +4 0.000243756 +4.01 0.000157724 +4.02 0.000143386 +4.03 0.000329787 +4.04 0.00030111 +4.05 0.000344125 +4.06 0.000172063 +4.07 0.000315448 +4.08 0.000286771 +4.09 0.000157724 +4.1 0.000358464 +4.11 0.000215078 +4.12 0.000229417 +4.13 0.000315448 +4.14 0.000258094 +4.15 0.000172063 +4.16 0.000286771 +4.17 0.000358464 +4.18 0.00030111 +4.19 0.000243756 +4.2 0.000186401 +4.21 0.000315448 +4.22 0.000186401 +4.23 0.000243756 +4.24 0.00030111 +4.25 0.000172063 +4.26 0.000229417 +4.27 0.000358464 +4.28 0.000243756 +4.29 0.000286771 +4.3 0.000258094 +4.31 0.000258094 +4.32 0.000258094 +4.33 0.000229417 +4.34 0.000229417 +4.35 0.000272433 +4.36 0.000258094 +4.37 0.000272433 +4.38 0.00030111 +4.39 0.000286771 +4.4 0.000272433 +4.41 0.000286771 +4.42 0.000229417 +4.43 0.000172063 +4.44 0.000315448 +4.45 0.000458834 +4.46 0.000258094 +4.47 0.000286771 +4.48 0.000358464 +4.49 0.00030111 +4.5 0.000272433 +4.51 0.000286771 +4.52 0.000286771 +4.53 0.000243756 +4.54 0.00030111 +4.55 0.000258094 +4.56 0.000258094 +4.57 0.000458834 +4.58 0.000229417 +4.59 0.000372803 +4.6 0.000315448 +4.61 0.000243756 +4.62 0.000229417 +4.63 0.00030111 +4.64 0.000344125 +4.65 0.000272433 +4.66 0.000329787 +4.67 0.000315448 +4.68 0.00030111 +4.69 0.000186401 +4.7 0.000229417 +4.71 0.000329787 +4.72 0.000258094 +4.73 0.00020074 +4.74 0.000243756 +4.75 0.000258094 +4.76 0.00030111 +4.77 0.000315448 +4.78 0.000258094 +4.79 0.000415818 +4.8 0.00040148 +4.81 0.000544865 +4.82 0.000329787 +4.83 0.000358464 +4.84 0.000358464 +4.85 0.000286771 +4.86 0.000329787 +4.87 0.000315448 +4.88 0.000329787 +4.89 0.000258094 +4.9 0.000372803 +4.91 0.000444495 +4.92 0.000372803 +4.93 0.000387141 +4.94 0.000315448 +4.95 0.000286771 +4.96 0.000272433 +4.97 0.00030111 +4.98 0.000372803 +4.99 0.000329787 +5 0.000387141 +5.01 0.000315448 +5.02 0.00030111 +5.03 0.000458834 +5.04 0.000215078 +5.05 0.00040148 +5.06 0.00030111 +5.07 0.000344125 +5.08 0.000315448 +5.09 0.00030111 +5.1 0.00050185 +5.11 0.000272433 +5.12 0.000286771 +5.13 0.000387141 +5.14 0.000358464 +5.15 0.000487511 +5.16 0.000372803 +5.17 0.000372803 +5.18 0.000344125 +5.19 0.000215078 +5.2 0.000229417 +5.21 0.000344125 +5.22 0.000372803 +5.23 0.000415818 +5.24 0.000243756 +5.25 0.000458834 +5.26 0.000243756 +5.27 0.000372803 +5.28 0.000344125 +5.29 0.000430157 +5.3 0.000315448 +5.31 0.000243756 +5.32 0.000415818 +5.33 0.00050185 +5.34 0.000272433 +5.35 0.000329787 +5.36 0.000387141 +5.37 0.000315448 +5.38 0.000286771 +5.39 0.00040148 +5.4 0.000329787 +5.41 0.000315448 +5.42 0.000516188 +5.43 0.000315448 +5.44 0.000286771 +5.45 0.000415818 +5.46 0.000286771 +5.47 0.000329787 +5.48 0.00040148 +5.49 0.000516188 +5.5 0.000372803 +5.51 0.000444495 +5.52 0.00020074 +5.53 0.00040148 +5.54 0.000272433 +5.55 0.000544865 +5.56 0.000415818 +5.57 0.000329787 +5.58 0.000415818 +5.59 0.000344125 +5.6 0.00030111 +5.61 0.000387141 +5.62 0.000444495 +5.63 0.00030111 +5.64 0.000387141 +5.65 0.000272433 +5.66 0.00040148 +5.67 0.000473173 +5.68 0.00050185 +5.69 0.000458834 +5.7 0.000358464 +5.71 0.00040148 +5.72 0.000272433 +5.73 0.000387141 +5.74 0.000473173 +5.75 0.00040148 +5.76 0.000372803 +5.77 0.000286771 +5.78 0.000329787 +5.79 0.000344125 +5.8 0.000645235 +5.81 0.00040148 +5.82 0.000286771 +5.83 0.000430157 +5.84 0.000415818 +5.85 0.000544865 +5.86 0.000387141 +5.87 0.000458834 +5.88 0.000415818 +5.89 0.000372803 +5.9 0.000573542 +5.91 0.000458834 +5.92 0.000344125 +5.93 0.000387141 +5.94 0.000458834 +5.95 0.000272433 +5.96 0.000487511 +5.97 0.000258094 +5.98 0.000430157 +5.99 0.000516188 +6 0.000444495 +6.01 0.000315448 +6.02 0.000473173 +6.03 0.000387141 +6.04 0.000530527 +6.05 0.000415818 +6.06 0.000458834 +6.07 0.000458834 +6.08 0.000544865 +6.09 0.00060222 +6.1 0.000458834 +6.11 0.000458834 +6.12 0.000329787 +6.13 0.000358464 +6.14 0.00050185 +6.15 0.000544865 +6.16 0.000573542 +6.17 0.000616558 +6.18 0.000315448 +6.19 0.000430157 +6.2 0.00040148 +6.21 0.000372803 +6.22 0.000430157 +6.23 0.000473173 +6.24 0.000487511 +6.25 0.000516188 +6.26 0.000430157 +6.27 0.000559204 +6.28 0.00040148 +6.29 0.000444495 +6.3 0.000473173 +6.31 0.000415818 +6.32 0.00050185 +6.33 0.000530527 +6.34 0.000559204 +6.35 0.000415818 +6.36 0.00040148 +6.37 0.000530527 +6.38 0.000444495 +6.39 0.000415818 +6.4 0.000430157 +6.41 0.000344125 +6.42 0.000372803 +6.43 0.000573542 +6.44 0.000444495 +6.45 0.000473173 +6.46 0.000415818 +6.47 0.000587881 +6.48 0.000444495 +6.49 0.000444495 +6.5 0.000587881 +6.51 0.000415818 +6.52 0.00050185 +6.53 0.000372803 +6.54 0.000544865 +6.55 0.000444495 +6.56 0.000616558 +6.57 0.000544865 +6.58 0.000573542 +6.59 0.000487511 +6.6 0.000659574 +6.61 0.000387141 +6.62 0.00040148 +6.63 0.000387141 +6.64 0.000544865 +6.65 0.00050185 +6.66 0.000516188 +6.67 0.000444495 +6.68 0.000716928 +6.69 0.00060222 +6.7 0.000516188 +6.71 0.00050185 +6.72 0.000587881 +6.73 0.00060222 +6.74 0.000473173 +6.75 0.000587881 +6.76 0.000473173 +6.77 0.000473173 +6.78 0.000573542 +6.79 0.000616558 +6.8 0.000559204 +6.81 0.000544865 +6.82 0.000387141 +6.83 0.000659574 +6.84 0.000473173 +6.85 0.000659574 +6.86 0.000430157 +6.87 0.000387141 +6.88 0.000430157 +6.89 0.000616558 +6.9 0.000415818 +6.91 0.00050185 +6.92 0.00050185 +6.93 0.000544865 +6.94 0.00050185 +6.95 0.000587881 +6.96 0.000430157 +6.97 0.000544865 +6.98 0.000559204 +6.99 0.000645235 +7 0.000530527 +7.01 0.000688251 +7.02 0.000430157 +7.03 0.000516188 +7.04 0.00040148 +7.05 0.000587881 +7.06 0.000444495 +7.07 0.000573542 +7.08 0.000458834 +7.09 0.000573542 +7.1 0.000587881 +7.11 0.000473173 +7.12 0.000430157 +7.13 0.00050185 +7.14 0.000573542 +7.15 0.000444495 +7.16 0.000530527 +7.17 0.000573542 +7.18 0.000444495 +7.19 0.000530527 +7.2 0.000573542 +7.21 0.000473173 +7.22 0.000458834 +7.23 0.000487511 +7.24 0.000544865 +7.25 0.000645235 +7.26 0.000473173 +7.27 0.000559204 +7.28 0.000530527 +7.29 0.000530527 +7.3 0.000430157 +7.31 0.000487511 +7.32 0.000516188 +7.33 0.000645235 +7.34 0.000444495 +7.35 0.000645235 +7.36 0.000530527 +7.37 0.000587881 +7.38 0.000616558 +7.39 0.000559204 +7.4 0.00060222 +7.41 0.000487511 +7.42 0.000516188 +7.43 0.000616558 +7.44 0.000559204 +7.45 0.000587881 +7.46 0.000473173 +7.47 0.000616558 +7.48 0.000530527 +7.49 0.00060222 +7.5 0.000802959 +7.51 0.000673912 +7.52 0.000530527 +7.53 0.000731267 +7.54 0.000587881 +7.55 0.000630897 +7.56 0.000616558 +7.57 0.000630897 +7.58 0.000645235 +7.59 0.000573542 +7.6 0.000530527 +7.61 0.000544865 +7.62 0.000458834 +7.63 0.000573542 +7.64 0.00060222 +7.65 0.00060222 +7.66 0.000759944 +7.67 0.000673912 +7.68 0.000616558 +7.69 0.000573542 +7.7 0.00070259 +7.71 0.00060222 +7.72 0.000630897 +7.73 0.000559204 +7.74 0.000473173 +7.75 0.000444495 +7.76 0.000587881 +7.77 0.000430157 +7.78 0.000630897 +7.79 0.00070259 +7.8 0.000774282 +7.81 0.000544865 +7.82 0.000530527 +7.83 0.000530527 +7.84 0.000688251 +7.85 0.000659574 +7.86 0.000573542 +7.87 0.000530527 +7.88 0.000587881 +7.89 0.000544865 +7.9 0.000544865 +7.91 0.000659574 +7.92 0.000573542 +7.93 0.000759944 +7.94 0.000530527 +7.95 0.000559204 +7.96 0.000516188 +7.97 0.000673912 +7.98 0.000544865 +7.99 0.000530527 +8 0.000616558 +8.01 0.000731267 +8.02 0.000659574 +8.03 0.000616558 +8.04 0.000759944 +8.05 0.000673912 +8.06 0.000630897 +8.07 0.000516188 +8.08 0.000544865 +8.09 0.000788621 +8.1 0.000788621 +8.11 0.000616558 +8.12 0.000430157 +8.13 0.000473173 +8.14 0.000616558 +8.15 0.000731267 +8.16 0.000932007 +8.17 0.000716928 +8.18 0.000688251 +8.19 0.000716928 +8.2 0.000731267 +8.21 0.00050185 +8.22 0.000473173 +8.23 0.000645235 +8.24 0.000544865 +8.25 0.000630897 +8.26 0.00050185 +8.27 0.000759944 +8.28 0.000559204 +8.29 0.000444495 +8.3 0.000645235 +8.31 0.000673912 +8.32 0.000473173 +8.33 0.000587881 +8.34 0.000659574 +8.35 0.000645235 +8.36 0.000587881 +8.37 0.000745605 +8.38 0.000630897 +8.39 0.000874652 +8.4 0.000688251 +8.41 0.000587881 +8.42 0.000516188 +8.43 0.000587881 +8.44 0.000673912 +8.45 0.00070259 +8.46 0.000716928 +8.47 0.000616558 +8.48 0.000673912 +8.49 0.00050185 +8.5 0.000759944 +8.51 0.000673912 +8.52 0.000673912 +8.53 0.00060222 +8.54 0.000860314 +8.55 0.000616558 +8.56 0.000616558 +8.57 0.00104672 +8.58 0.000659574 +8.59 0.000731267 +8.6 0.000688251 +8.61 0.000673912 +8.62 0.00050185 +8.63 0.000630897 +8.64 0.000860314 +8.65 0.000745605 +8.66 0.000616558 +8.67 0.000845975 +8.68 0.000788621 +8.69 0.000788621 +8.7 0.000616558 +8.71 0.000774282 +8.72 0.000688251 +8.73 0.000630897 +8.74 0.000802959 +8.75 0.000731267 +8.76 0.000573542 +8.77 0.000544865 +8.78 0.000645235 +8.79 0.000788621 +8.8 0.000673912 +8.81 0.000573542 +8.82 0.000587881 +8.83 0.000874652 +8.84 0.000630897 +8.85 0.000573542 +8.86 0.000559204 +8.87 0.00060222 +8.88 0.000831637 +8.89 0.00060222 +8.9 0.000630897 +8.91 0.000874652 +8.92 0.000688251 +8.93 0.00060222 +8.94 0.000587881 +8.95 0.000845975 +8.96 0.000516188 +8.97 0.000745605 +8.98 0.00070259 +8.99 0.000659574 +9 0.000645235 +9.01 0.000688251 +9.02 0.000759944 +9.03 0.000860314 +9.04 0.000860314 +9.05 0.000673912 +9.06 0.000559204 +9.07 0.000688251 +9.08 0.000831637 +9.09 0.000759944 +9.1 0.000688251 +9.11 0.000774282 +9.12 0.000845975 +9.13 0.000831637 +9.14 0.000688251 +9.15 0.000759944 +9.16 0.000817298 +9.17 0.000473173 +9.18 0.000788621 +9.19 0.000688251 +9.2 0.000860314 +9.21 0.000616558 +9.22 0.000530527 +9.23 0.000975022 +9.24 0.000630897 +9.25 0.000573542 +9.26 0.000731267 +9.27 0.000774282 +9.28 0.000659574 +9.29 0.000630897 +9.3 0.000731267 +9.31 0.000917668 +9.32 0.000745605 +9.33 0.000745605 +9.34 0.00070259 +9.35 0.000559204 +9.36 0.000688251 +9.37 0.000860314 +9.38 0.000817298 +9.39 0.000788621 +9.4 0.000759944 +9.41 0.000989361 +9.42 0.000673912 +9.43 0.000874652 +9.44 0.000759944 +9.45 0.000673912 +9.46 0.000716928 +9.47 0.000688251 +9.48 0.000731267 +9.49 0.000802959 +9.5 0.000975022 +9.51 0.000659574 +9.52 0.00070259 +9.53 0.00070259 +9.54 0.00106105 +9.55 0.00060222 +9.56 0.000688251 +9.57 0.000673912 +9.58 0.00070259 +9.59 0.000616558 +9.6 0.000860314 +9.61 0.000645235 +9.62 0.000544865 +9.63 0.000888991 +9.64 0.000774282 +9.65 0.000788621 +9.66 0.000745605 +9.67 0.000831637 +9.68 0.000817298 +9.69 0.000774282 +9.7 0.000716928 +9.71 0.000731267 +9.72 0.000817298 +9.73 0.000745605 +9.74 0.000716928 +9.75 0.000788621 +9.76 0.000845975 +9.77 0.000759944 +9.78 0.000845975 +9.79 0.000759944 +9.8 0.000802959 +9.81 0.000759944 +9.82 0.000788621 +9.83 0.000874652 +9.84 0.000673912 +9.85 0.000874652 +9.86 0.00070259 +9.87 0.000788621 +9.88 0.000716928 +9.89 0.000688251 +9.9 0.00070259 +9.91 0.000788621 +9.92 0.000544865 +9.93 0.000645235 +9.94 0.000516188 +9.95 0.000759944 +9.96 0.000774282 +9.97 0.000817298 +9.98 0.000731267 +9.99 0.000688251 +10 0.000874652 +10.01 0.000860314 +10.02 0.000932007 +10.03 0.000874652 +10.04 0.000845975 +10.05 0.000630897 +10.06 0.000688251 +10.07 0.00103238 +10.08 0.000716928 +10.09 0.000616558 +10.1 0.000917668 +10.11 0.000716928 +10.12 0.000917668 +10.13 0.000831637 +10.14 0.000888991 +10.15 0.000917668 +10.16 0.000831637 +10.17 0.000745605 +10.18 0.000989361 +10.19 0.000802959 +10.2 0.000975022 +10.21 0.000788621 +10.22 0.000860314 +10.23 0.000559204 +10.24 0.000759944 +10.25 0.00060222 +10.26 0.000817298 +10.27 0.000745605 +10.28 0.00101804 +10.29 0.000845975 +10.3 0.000917668 +10.31 0.000831637 +10.32 0.000745605 +10.33 0.000788621 +10.34 0.000874652 +10.35 0.000817298 +10.36 0.000903329 +10.37 0.000831637 +10.38 0.000659574 +10.39 0.000845975 +10.4 0.000659574 +10.41 0.000932007 +10.42 0.000960684 +10.43 0.000888991 +10.44 0.000731267 +10.45 0.000845975 +10.46 0.000817298 +10.47 0.00101804 +10.48 0.00104672 +10.49 0.000874652 +10.5 0.000688251 +10.51 0.000903329 +10.52 0.000888991 +10.53 0.000903329 +10.54 0.000774282 +10.55 0.000903329 +10.56 0.000759944 +10.57 0.000845975 +10.58 0.00104672 +10.59 0.00070259 +10.6 0.00108973 +10.61 0.000817298 +10.62 0.000774282 +10.63 0.000888991 +10.64 0.000716928 +10.65 0.000817298 +10.66 0.000888991 +10.67 0.000774282 +10.68 0.000917668 +10.69 0.000946345 +10.7 0.000745605 +10.71 0.000888991 +10.72 0.000917668 +10.73 0.000688251 +10.74 0.000630897 +10.75 0.000903329 +10.76 0.000788621 +10.77 0.000759944 +10.78 0.000831637 +10.79 0.000731267 +10.8 0.000788621 +10.81 0.000745605 +10.82 0.00111841 +10.83 0.00060222 +10.84 0.000630897 +10.85 0.0010037 +10.86 0.000831637 +10.87 0.00070259 +10.88 0.00101804 +10.89 0.000845975 +10.9 0.00108973 +10.91 0.000673912 +10.92 0.000888991 +10.93 0.000802959 +10.94 0.000802959 +10.95 0.000759944 +10.96 0.000831637 +10.97 0.000960684 +10.98 0.00070259 +10.99 0.000831637 +11 0.000759944 +11.01 0.000903329 +11.02 0.000903329 +11.03 0.000716928 +11.04 0.000802959 +11.05 0.000874652 +11.06 0.000759944 +11.07 0.000831637 +11.08 0.000932007 +11.09 0.000874652 +11.1 0.000774282 +11.11 0.000946345 +11.12 0.000932007 +11.13 0.000860314 +11.14 0.000731267 +11.15 0.000817298 +11.16 0.000932007 +11.17 0.000716928 +11.18 0.000788621 +11.19 0.000802959 +11.2 0.000673912 +11.21 0.000831637 +11.22 0.000645235 +11.23 0.000817298 +11.24 0.000946345 +11.25 0.000989361 +11.26 0.00103238 +11.27 0.000932007 +11.28 0.000831637 +11.29 0.000989361 +11.3 0.000774282 +11.31 0.000845975 +11.32 0.000845975 +11.33 0.000960684 +11.34 0.00101804 +11.35 0.00101804 +11.36 0.000960684 +11.37 0.000932007 +11.38 0.000845975 +11.39 0.000975022 +11.4 0.000688251 +11.41 0.00114708 +11.42 0.000745605 +11.43 0.00114708 +11.44 0.000788621 +11.45 0.000975022 +11.46 0.000860314 +11.47 0.000888991 +11.48 0.000946345 +11.49 0.000716928 +11.5 0.000888991 +11.51 0.000788621 +11.52 0.000788621 +11.53 0.000903329 +11.54 0.000989361 +11.55 0.000874652 +11.56 0.000802959 +11.57 0.000888991 +11.58 0.000845975 +11.59 0.000774282 +11.6 0.000946345 +11.61 0.000903329 +11.62 0.00103238 +11.63 0.000888991 +11.64 0.000831637 +11.65 0.000817298 +11.66 0.000802959 +11.67 0.000874652 +11.68 0.000960684 +11.69 0.000860314 +11.7 0.000817298 +11.71 0.000888991 +11.72 0.00106105 +11.73 0.000759944 +11.74 0.00114708 +11.75 0.000888991 +11.76 0.000831637 +11.77 0.000845975 +11.78 0.000745605 +11.79 0.000688251 +11.8 0.000989361 +11.81 0.00108973 +11.82 0.00101804 +11.83 0.000860314 +11.84 0.000831637 +11.85 0.000888991 +11.86 0.000989361 +11.87 0.000975022 +11.88 0.000788621 +11.89 0.000932007 +11.9 0.000788621 +11.91 0.00070259 +11.92 0.00107539 +11.93 0.00111841 +11.94 0.000917668 +11.95 0.000989361 +11.96 0.000845975 +11.97 0.000817298 +11.98 0.000946345 +11.99 0.00106105 +12 0.000788621 +12.01 0.000888991 +12.02 0.000903329 +12.03 0.000888991 +12.04 0.000645235 +12.05 0.000788621 +12.06 0.000874652 +12.07 0.000788621 +12.08 0.000874652 +12.09 0.000903329 +12.1 0.000946345 +12.11 0.000903329 +12.12 0.00104672 +12.13 0.000845975 +12.14 0.000975022 +12.15 0.000745605 +12.16 0.000932007 +12.17 0.000716928 +12.18 0.0010037 +12.19 0.000975022 +12.2 0.00103238 +12.21 0.000874652 +12.22 0.000960684 +12.23 0.000659574 +12.24 0.00101804 +12.25 0.000960684 +12.26 0.000960684 +12.27 0.000802959 +12.28 0.000731267 +12.29 0.000731267 +12.3 0.0010037 +12.31 0.000960684 +12.32 0.000946345 +12.33 0.000874652 +12.34 0.000975022 +12.35 0.000874652 +12.36 0.000888991 +12.37 0.000903329 +12.38 0.00104672 +12.39 0.000975022 +12.4 0.000975022 +12.41 0.000975022 +12.42 0.0010037 +12.43 0.000903329 +12.44 0.000975022 +12.45 0.00104672 +12.46 0.000831637 +12.47 0.000716928 +12.48 0.000975022 +12.49 0.000903329 +12.5 0.00104672 +12.51 0.00103238 +12.52 0.000989361 +12.53 0.000874652 +12.54 0.000788621 +12.55 0.000903329 +12.56 0.000888991 +12.57 0.000831637 +12.58 0.000860314 +12.59 0.000831637 +12.6 0.000946345 +12.61 0.000917668 +12.62 0.000860314 +12.63 0.000860314 +12.64 0.000874652 +12.65 0.000817298 +12.66 0.000802959 +12.67 0.00106105 +12.68 0.000932007 +12.69 0.000946345 +12.7 0.000845975 +12.71 0.00107539 +12.72 0.000860314 +12.73 0.000817298 +12.74 0.000774282 +12.75 0.000802959 +12.76 0.000888991 +12.77 0.000831637 +12.78 0.00104672 +12.79 0.000989361 +12.8 0.000888991 +12.81 0.00103238 +12.82 0.000888991 +12.83 0.000745605 +12.84 0.000759944 +12.85 0.00110407 +12.86 0.000917668 +12.87 0.000831637 +12.88 0.00110407 +12.89 0.000860314 +12.9 0.000860314 +12.91 0.000888991 +12.92 0.000845975 +12.93 0.000903329 +12.94 0.000831637 +12.95 0.000845975 +12.96 0.000688251 +12.97 0.000874652 +12.98 0.000874652 +12.99 0.000774282 +13 0.000975022 +13.01 0.000759944 +13.02 0.000960684 +13.03 0.000932007 +13.04 0.000989361 +13.05 0.0010037 +13.06 0.000874652 +13.07 0.000874652 +13.08 0.00104672 +13.09 0.000659574 +13.1 0.000817298 +13.11 0.000759944 +13.12 0.000874652 +13.13 0.000903329 +13.14 0.000989361 +13.15 0.000946345 +13.16 0.000673912 +13.17 0.000903329 +13.18 0.000903329 +13.19 0.000788621 +13.2 0.000903329 +13.21 0.000831637 +13.22 0.000989361 +13.23 0.000975022 +13.24 0.000817298 +13.25 0.000831637 +13.26 0.000716928 +13.27 0.000903329 +13.28 0.000903329 +13.29 0.000946345 +13.3 0.0010037 +13.31 0.000817298 +13.32 0.000888991 +13.33 0.000860314 +13.34 0.00106105 +13.35 0.000831637 +13.36 0.00107539 +13.37 0.000917668 +13.38 0.00101804 +13.39 0.000831637 +13.4 0.000960684 +13.41 0.000874652 +13.42 0.000888991 +13.43 0.000774282 +13.44 0.000745605 +13.45 0.00104672 +13.46 0.000946345 +13.47 0.000802959 +13.48 0.00107539 +13.49 0.000788621 +13.5 0.000745605 +13.51 0.000817298 +13.52 0.000874652 +13.53 0.000688251 +13.54 0.000788621 +13.55 0.0010037 +13.56 0.000817298 +13.57 0.000975022 +13.58 0.000802959 +13.59 0.000845975 +13.6 0.000759944 +13.61 0.00104672 +13.62 0.000917668 +13.63 0.000774282 +13.64 0.000860314 +13.65 0.000802959 +13.66 0.000989361 +13.67 0.00070259 +13.68 0.000659574 +13.69 0.000860314 +13.7 0.000960684 +13.71 0.000888991 +13.72 0.000817298 +13.73 0.000845975 +13.74 0.000903329 +13.75 0.000860314 +13.76 0.000817298 +13.77 0.000960684 +13.78 0.000731267 +13.79 0.000903329 +13.8 0.00107539 +13.81 0.000874652 +13.82 0.000802959 +13.83 0.000673912 +13.84 0.000903329 +13.85 0.000860314 +13.86 0.000888991 +13.87 0.000731267 +13.88 0.000932007 +13.89 0.000860314 +13.9 0.000745605 +13.91 0.00070259 +13.92 0.000845975 +13.93 0.000817298 +13.94 0.000831637 +13.95 0.000888991 +13.96 0.000759944 +13.97 0.000759944 +13.98 0.000745605 +13.99 0.000759944 +14 0.000788621 +14.01 0.000745605 +14.02 0.000659574 +14.03 0.000802959 +14.04 0.00070259 +14.05 0.000745605 +14.06 0.000759944 +14.07 0.000845975 +14.08 0.000917668 +14.09 0.000774282 +14.1 0.000960684 +14.11 0.000860314 +14.12 0.000745605 +14.13 0.000845975 +14.14 0.000989361 +14.15 0.000788621 +14.16 0.000903329 +14.17 0.000903329 +14.18 0.000860314 +14.19 0.000745605 +14.2 0.000716928 +14.21 0.000888991 +14.22 0.000845975 +14.23 0.000802959 +14.24 0.000989361 +14.25 0.000860314 +14.26 0.000917668 +14.27 0.000788621 +14.28 0.000831637 +14.29 0.000802959 +14.3 0.000788621 +14.31 0.000845975 +14.32 0.000645235 +14.33 0.000888991 +14.34 0.000903329 +14.35 0.000860314 +14.36 0.000860314 +14.37 0.00070259 +14.38 0.000817298 +14.39 0.000745605 +14.4 0.000960684 +14.41 0.00103238 +14.42 0.000903329 +14.43 0.000759944 +14.44 0.000716928 +14.45 0.00070259 +14.46 0.000759944 +14.47 0.000659574 +14.48 0.000960684 +14.49 0.000888991 +14.5 0.000731267 +14.51 0.000960684 +14.52 0.00107539 +14.53 0.000745605 +14.54 0.00101804 +14.55 0.000802959 +14.56 0.000888991 +14.57 0.000860314 +14.58 0.000903329 +14.59 0.000745605 +14.6 0.000731267 +14.61 0.000745605 +14.62 0.0010037 +14.63 0.000774282 +14.64 0.000673912 +14.65 0.000731267 +14.66 0.000845975 +14.67 0.000587881 +14.68 0.000960684 +14.69 0.000860314 +14.7 0.000616558 +14.71 0.000731267 +14.72 0.000774282 +14.73 0.000673912 +14.74 0.000860314 +14.75 0.000845975 +14.76 0.000731267 +14.77 0.000802959 +14.78 0.000831637 +14.79 0.000788621 +14.8 0.000759944 +14.81 0.000731267 +14.82 0.000860314 +14.83 0.000774282 +14.84 0.000845975 +14.85 0.000673912 +14.86 0.000759944 +14.87 0.000831637 +14.88 0.000659574 +14.89 0.000802959 +14.9 0.000932007 +14.91 0.000788621 +14.92 0.000645235 +14.93 0.000817298 +14.94 0.000860314 +14.95 0.000860314 +14.96 0.000946345 +14.97 0.000659574 +14.98 0.000788621 +14.99 0.000774282 +15 0.000831637 +15.01 0.000673912 +15.02 0.000673912 +15.03 0.000659574 +15.04 0.000874652 +15.05 0.000774282 +15.06 0.000831637 +15.07 0.000802959 +15.08 0.000874652 +15.09 0.000530527 +15.1 0.000716928 +15.11 0.000745605 +15.12 0.00060222 +15.13 0.000731267 +15.14 0.00070259 +15.15 0.000587881 +15.16 0.000731267 +15.17 0.000731267 +15.18 0.000831637 +15.19 0.000831637 +15.2 0.000645235 +15.21 0.000802959 +15.22 0.000917668 +15.23 0.000645235 +15.24 0.000774282 +15.25 0.000788621 +15.26 0.000774282 +15.27 0.000802959 +15.28 0.000616558 +15.29 0.000616558 +15.3 0.000630897 +15.31 0.000630897 +15.32 0.000860314 +15.33 0.000946345 +15.34 0.000630897 +15.35 0.000731267 +15.36 0.000745605 +15.37 0.000817298 +15.38 0.000932007 +15.39 0.000530527 +15.4 0.000831637 +15.41 0.000559204 +15.42 0.000759944 +15.43 0.000774282 +15.44 0.000630897 +15.45 0.000731267 +15.46 0.000544865 +15.47 0.000860314 +15.48 0.000659574 +15.49 0.000788621 +15.5 0.00070259 +15.51 0.000659574 +15.52 0.000731267 +15.53 0.000788621 +15.54 0.000831637 +15.55 0.000802959 +15.56 0.000587881 +15.57 0.000688251 +15.58 0.00070259 +15.59 0.000616558 +15.6 0.000645235 +15.61 0.000774282 +15.62 0.000802959 +15.63 0.000845975 +15.64 0.000673912 +15.65 0.000759944 +15.66 0.000630897 +15.67 0.000788621 +15.68 0.000716928 +15.69 0.000903329 +15.7 0.000673912 +15.71 0.000630897 +15.72 0.000874652 +15.73 0.000659574 +15.74 0.000516188 +15.75 0.000630897 +15.76 0.000645235 +15.77 0.000716928 +15.78 0.000630897 +15.79 0.000774282 +15.8 0.000673912 +15.81 0.000645235 +15.82 0.000745605 +15.83 0.00060222 +15.84 0.000645235 +15.85 0.000458834 +15.86 0.000745605 +15.87 0.000659574 +15.88 0.000616558 +15.89 0.000573542 +15.9 0.000831637 +15.91 0.000573542 +15.92 0.000688251 +15.93 0.000860314 +15.94 0.000802959 +15.95 0.000530527 +15.96 0.000716928 +15.97 0.000645235 +15.98 0.00070259 +15.99 0.000487511 +16 0.000917668 +16.01 0.00060222 +16.02 0.000616558 +16.03 0.000630897 +16.04 0.000458834 +16.05 0.00050185 +16.06 0.000587881 +16.07 0.000659574 +16.08 0.000759944 +16.09 0.000530527 +16.1 0.000645235 +16.11 0.00070259 +16.12 0.000516188 +16.13 0.000616558 +16.14 0.000559204 +16.15 0.000544865 +16.16 0.00070259 +16.17 0.000673912 +16.18 0.000573542 +16.19 0.000544865 +16.2 0.000673912 +16.21 0.000745605 +16.22 0.000616558 +16.23 0.000616558 +16.24 0.000716928 +16.25 0.000616558 +16.26 0.000559204 +16.27 0.000473173 +16.28 0.000774282 +16.29 0.000716928 +16.3 0.000559204 +16.31 0.000458834 +16.32 0.000688251 +16.33 0.000731267 +16.34 0.000487511 +16.35 0.000788621 +16.36 0.00070259 +16.37 0.000673912 +16.38 0.000716928 +16.39 0.000559204 +16.4 0.000716928 +16.41 0.000759944 +16.42 0.000688251 +16.43 0.000530527 +16.44 0.000745605 +16.45 0.00070259 +16.46 0.000774282 +16.47 0.000673912 +16.48 0.000616558 +16.49 0.000688251 +16.5 0.000616558 +16.51 0.000616558 +16.52 0.000587881 +16.53 0.00060222 +16.54 0.00060222 +16.55 0.000387141 +16.56 0.000372803 +16.57 0.000516188 +16.58 0.000559204 +16.59 0.000587881 +16.6 0.00040148 +16.61 0.000616558 +16.62 0.000473173 +16.63 0.000544865 +16.64 0.000473173 +16.65 0.000645235 +16.66 0.000645235 +16.67 0.00060222 +16.68 0.000544865 +16.69 0.00050185 +16.7 0.000630897 +16.71 0.000587881 +16.72 0.000516188 +16.73 0.00060222 +16.74 0.000573542 +16.75 0.000329787 +16.76 0.00050185 +16.77 0.000487511 +16.78 0.000616558 +16.79 0.000616558 +16.8 0.000645235 +16.81 0.000745605 +16.82 0.000802959 +16.83 0.000716928 +16.84 0.000430157 +16.85 0.00050185 +16.86 0.000716928 +16.87 0.000516188 +16.88 0.00050185 +16.89 0.000673912 +16.9 0.00060222 +16.91 0.000659574 +16.92 0.000473173 +16.93 0.000458834 +16.94 0.00060222 +16.95 0.000573542 +16.96 0.000516188 +16.97 0.000444495 +16.98 0.000587881 +16.99 0.000530527 +17 0.000616558 +17.01 0.000559204 +17.02 0.00040148 +17.03 0.000473173 +17.04 0.000587881 +17.05 0.000659574 +17.06 0.000659574 +17.07 0.000559204 +17.08 0.000544865 +17.09 0.000487511 +17.1 0.000630897 +17.11 0.000616558 +17.12 0.00060222 +17.13 0.000544865 +17.14 0.000587881 +17.15 0.000616558 +17.16 0.000473173 +17.17 0.00060222 +17.18 0.000458834 +17.19 0.000530527 +17.2 0.000616558 +17.21 0.00060222 +17.22 0.00040148 +17.23 0.000559204 +17.24 0.000573542 +17.25 0.000430157 +17.26 0.00050185 +17.27 0.000544865 +17.28 0.000544865 +17.29 0.000430157 +17.3 0.000530527 +17.31 0.000573542 +17.32 0.000458834 +17.33 0.000473173 +17.34 0.000415818 +17.35 0.000516188 +17.36 0.000444495 +17.37 0.000544865 +17.38 0.000444495 +17.39 0.000358464 +17.4 0.000573542 +17.41 0.00070259 +17.42 0.000487511 +17.43 0.000559204 +17.44 0.000387141 +17.45 0.000573542 +17.46 0.000430157 +17.47 0.000415818 +17.48 0.000559204 +17.49 0.000473173 +17.5 0.000573542 +17.51 0.00050185 +17.52 0.000673912 +17.53 0.00040148 +17.54 0.000544865 +17.55 0.000444495 +17.56 0.000473173 +17.57 0.000587881 +17.58 0.000444495 +17.59 0.00050185 +17.6 0.000344125 +17.61 0.000415818 +17.62 0.000473173 +17.63 0.000444495 +17.64 0.000473173 +17.65 0.000587881 +17.66 0.000458834 +17.67 0.000616558 +17.68 0.000458834 +17.69 0.000344125 +17.7 0.000616558 +17.71 0.00060222 +17.72 0.000458834 +17.73 0.000645235 +17.74 0.000516188 +17.75 0.000444495 +17.76 0.000415818 +17.77 0.000444495 +17.78 0.00050185 +17.79 0.000473173 +17.8 0.000344125 +17.81 0.000587881 +17.82 0.000329787 +17.83 0.000516188 +17.84 0.00040148 +17.85 0.000358464 +17.86 0.00060222 +17.87 0.00050185 +17.88 0.00060222 +17.89 0.000473173 +17.9 0.000315448 +17.91 0.000415818 +17.92 0.000559204 +17.93 0.000444495 +17.94 0.000344125 +17.95 0.000458834 +17.96 0.000587881 +17.97 0.000487511 +17.98 0.000372803 +17.99 0.000358464 +18 0.000516188 +18.01 0.000673912 +18.02 0.00040148 +18.03 0.000487511 +18.04 0.000358464 +18.05 0.000358464 +18.06 0.000530527 +18.07 0.00040148 +18.08 0.000530527 +18.09 0.000473173 +18.1 0.00050185 +18.11 0.00040148 +18.12 0.00050185 +18.13 0.000473173 +18.14 0.000487511 +18.15 0.000387141 +18.16 0.000444495 +18.17 0.000444495 +18.18 0.000358464 +18.19 0.00040148 +18.2 0.000530527 +18.21 0.000516188 +18.22 0.000444495 +18.23 0.000487511 +18.24 0.000358464 +18.25 0.000430157 +18.26 0.000544865 +18.27 0.000372803 +18.28 0.000286771 +18.29 0.000387141 +18.3 0.000444495 +18.31 0.000530527 +18.32 0.000329787 +18.33 0.000315448 +18.34 0.000329787 +18.35 0.000573542 +18.36 0.00040148 +18.37 0.000430157 +18.38 0.000358464 +18.39 0.000372803 +18.4 0.000473173 +18.41 0.000215078 +18.42 0.000430157 +18.43 0.000487511 +18.44 0.000358464 +18.45 0.000444495 +18.46 0.000372803 +18.47 0.000372803 +18.48 0.000387141 +18.49 0.000473173 +18.5 0.000229417 +18.51 0.000344125 +18.52 0.000415818 +18.53 0.000430157 +18.54 0.00030111 +18.55 0.000430157 +18.56 0.000430157 +18.57 0.000344125 +18.58 0.000458834 +18.59 0.000387141 +18.6 0.000358464 +18.61 0.000329787 +18.62 0.000329787 +18.63 0.000415818 +18.64 0.000344125 +18.65 0.000315448 +18.66 0.000372803 +18.67 0.000530527 +18.68 0.00040148 +18.69 0.000315448 +18.7 0.000229417 +18.71 0.000415818 +18.72 0.000372803 +18.73 0.000358464 +18.74 0.000315448 +18.75 0.000243756 +18.76 0.000329787 +18.77 0.000229417 +18.78 0.000172063 +18.79 0.000358464 +18.8 0.00030111 +18.81 0.00030111 +18.82 0.000272433 +18.83 0.000229417 +18.84 0.00030111 +18.85 0.000258094 +18.86 0.00030111 +18.87 0.000286771 +18.88 0.000272433 +18.89 0.000286771 +18.9 0.000329787 +18.91 0.000143386 +18.92 0.000243756 +18.93 0.000329787 +18.94 0.000172063 +18.95 0.000114708 +18.96 0.000129047 +18.97 0.000157724 +18.98 2.86771e-005 +18.99 2.86771e-005 +19 0 diff --git a/settings.gradle.kts b/settings.gradle.kts index 0bfff51..70e2d4b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -15,6 +15,7 @@ pluginManagement { } plugins { + id("org.jetbrains.compose").version(extra["compose.version"] as String) id("space.kscience.gradle.project") version toolsVersion id("space.kscience.gradle.mpp") version toolsVersion id("space.kscience.gradle.jvm") version toolsVersion @@ -43,7 +44,7 @@ include( ":numass-data-model", ":numass-analysis", ":numass-data-proto", - //":numass-data-server", + ":numass-data-server", ":numass-workspace", ":numass-model", //":numass-detector-client"