diff --git a/changelog/unreleased/pr-26105.toml b/changelog/unreleased/pr-26105.toml new file mode 100644 index 000000000000..eaef3ec2b8df --- /dev/null +++ b/changelog/unreleased/pr-26105.toml @@ -0,0 +1,4 @@ +type = "f" +message = "Upgrade openapi-explorer to fix schema parsing bugs in the REST API browser." + +pulls = ["26105"] diff --git a/graylog2-web-interface/package.json b/graylog2-web-interface/package.json index 07fa7d60acdc..5710f09faef7 100644 --- a/graylog2-web-interface/package.json +++ b/graylog2-web-interface/package.json @@ -24,7 +24,8 @@ "lint:changes": "./dev/lintChanges.sh", "test": "jest --maxWorkers=50%", "check-production-build": "node checkProductionBuild.js", - "format": "oxfmt src test docs" + "format": "oxfmt src test docs", + "postinstall": "patch-package" }, "eslintConfig": { "extends": "graylog" @@ -79,10 +80,12 @@ "moment-precise-range-plugin": "^1.3.0", "mousetrap": "^1.6.5", "numeral": "^2.0.6", - "openapi-explorer": "^2.4.793", + "openapi-explorer": "^2.4.799", "p-debounce": "^4.0.0", + "patch-package": "^8.0.1", "plotly.js": "3.5.0", "posthog-js": "^1.371.1", + "postinstall-postinstall": "^2.1.0", "qs": "^6.15.1", "react-ace": "14.0.1", "react-color": "^2.19.3", diff --git a/graylog2-web-interface/patches/openapi-explorer+2.4.799.patch b/graylog2-web-interface/patches/openapi-explorer+2.4.799.patch new file mode 100644 index 000000000000..0f3199bba2d8 --- /dev/null +++ b/graylog2-web-interface/patches/openapi-explorer+2.4.799.patch @@ -0,0 +1,40 @@ +diff --git a/node_modules/openapi-explorer/dist/lib/utils/schema-utils.js b/node_modules/openapi-explorer/dist/lib/utils/schema-utils.js +--- a/node_modules/openapi-explorer/dist/lib/utils/schema-utils.js ++++ b/node_modules/openapi-explorer/dist/lib/utils/schema-utils.js +@@ -514,11 +514,14 @@ + '🆁': schema.readOnly && '🆁', + '🆆': schema.writeOnly && '🆆' + }, +- '::link': arrayItemsSchema.title || schema.title || '', ++ '::link': (arrayItemsSchema === null || arrayItemsSchema === void 0 ? void 0 : arrayItemsSchema.title) || schema.title || '', + '::circular': !!schema.circularReference, + '::type': 'array', + // Array properties are read from the ::props object instead of reading from the keys of this object +- '::props': schemaInObjectNotation(Object.assign({}, schema, arrayItemsSchema, { ++ // Use type: undefined to prevent schema recursion by passing array from the parent to the next loop, matching the single-type-array branch below. ++ '::props': schemaInObjectNotation(Object.assign({}, schema, { ++ type: undefined ++ }, arrayItemsSchema, { + description: schema.description || (arrayItemsSchema === null || arrayItemsSchema === void 0 ? void 0 : arrayItemsSchema.description) + }), options, level + 1), + '::deprecated': schema.deprecated || false, +diff --git a/node_modules/openapi-explorer/dist/es/utils/schema-utils.js b/node_modules/openapi-explorer/dist/es/utils/schema-utils.js +--- a/node_modules/openapi-explorer/dist/es/utils/schema-utils.js ++++ b/node_modules/openapi-explorer/dist/es/utils/schema-utils.js +@@ -505,11 +505,14 @@ + '🆁': schema.readOnly && '🆁', + '🆆': schema.writeOnly && '🆆' + }, +- '::link': arrayItemsSchema.title || schema.title || '', ++ '::link': (arrayItemsSchema === null || arrayItemsSchema === void 0 ? void 0 : arrayItemsSchema.title) || schema.title || '', + '::circular': !!schema.circularReference, + '::type': 'array', + // Array properties are read from the ::props object instead of reading from the keys of this object +- '::props': schemaInObjectNotation(Object.assign({}, schema, arrayItemsSchema, { ++ // Use type: undefined to prevent schema recursion by passing array from the parent to the next loop, matching the single-type-array branch below. ++ '::props': schemaInObjectNotation(Object.assign({}, schema, { ++ type: undefined ++ }, arrayItemsSchema, { + description: schema.description || (arrayItemsSchema === null || arrayItemsSchema === void 0 ? void 0 : arrayItemsSchema.description) + }), options, level + 1), + '::deprecated': schema.deprecated || false, diff --git a/graylog2-web-interface/yarn.lock b/graylog2-web-interface/yarn.lock index 0226697dbfe6..a75f45a384ef 100644 --- a/graylog2-web-interface/yarn.lock +++ b/graylog2-web-interface/yarn.lock @@ -4946,6 +4946,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + "@yornaath/batshit-devtools@^1.7.1": version "1.7.1" resolved "https://registry.yarnpkg.com/@yornaath/batshit-devtools/-/batshit-devtools-1.7.1.tgz#6c247f2c4c4e3322811beca96cb62bbf19489e04" @@ -6208,6 +6213,11 @@ chromium-bidi@14.0.0: mitt "^3.0.1" zod "^3.24.1" +ci-info@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + ci-info@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.3.0.tgz#c39b1013f8fdbd28cd78e62318357d02da160cd7" @@ -8221,7 +8231,7 @@ escodegen@^2.1.0: eslint "9.39.2" eslint-import-resolver-webpack "0.13.11" eslint-plugin-compat "7.0.2" - eslint-plugin-graylog "file:../../../../.cache/yarn/v6/npm-eslint-config-graylog-1.3.0-87a27480-e030-41f7-ace6-80e0397391bc-1779237294598/node_modules/eslint-plugin-graylog" + eslint-plugin-graylog "file:../../../../.cache/yarn/v6/npm-eslint-config-graylog-1.3.0-14157ccf-2cb5-4137-8021-59429231938a-1779459617648/node_modules/eslint-plugin-graylog" eslint-plugin-import "2.32.0" eslint-plugin-jest "29.15.2" eslint-plugin-jest-dom "5.5.0" @@ -9024,6 +9034,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" @@ -9809,7 +9826,7 @@ gopd@^1.2.0: resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -9826,12 +9843,12 @@ graphemer@^1.4.0: "@reduxjs/toolkit" "^2.5.1" "@tanstack/react-query" "5.100.10" "@types/react" "18.3.13" - babel-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-2c5cbc31-3c2d-4727-a70b-856f70b4fdf9-1779237294208/node_modules/babel-preset-graylog" - eslint-config-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-2c5cbc31-3c2d-4727-a70b-856f70b4fdf9-1779237294208/node_modules/eslint-config-graylog" + babel-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-8c024e23-692c-467a-90a6-0b8b4d67c868-1779459617609/node_modules/babel-preset-graylog" + eslint-config-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-8c024e23-692c-467a-90a6-0b8b4d67c868-1779459617609/node_modules/eslint-config-graylog" formik "2.4.9" history "^5.3.0" html-webpack-plugin "^5.5.0" - jest-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-2c5cbc31-3c2d-4727-a70b-856f70b4fdf9-1779237294208/node_modules/jest-preset-graylog" + jest-preset-graylog "file:../../../../.cache/yarn/v6/npm-graylog-web-plugin-7.2.0-SNAPSHOT-8c024e23-692c-467a-90a6-0b8b4d67c868-1779459617609/node_modules/jest-preset-graylog" moment "2.30.1" moment-timezone "0.6.2" react "18.3.1" @@ -10658,6 +10675,11 @@ is-date-object@^1.1.0: call-bound "^1.0.2" has-tostringtag "^1.0.2" +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -11038,6 +11060,13 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + is-wsl@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" @@ -11745,6 +11774,17 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz#8903cfac42ea1a0f97f35d63a4ce0518f0cc6a70" + integrity sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json-stringify-pretty-compact@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz#cf4844770bddee3cb89a6170fe4b00eee5dbf1d4" @@ -11788,6 +11828,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.0.0.tgz#0f49d5093bafa4b45d3fe02147d8b40ffc6c7438" @@ -11840,6 +11885,13 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + known-css-properties@^0.37.0: version "0.37.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" @@ -12968,6 +13020,14 @@ open@^10.0.3: is-inside-container "^1.0.0" is-wsl "^3.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + openapi-data-validator@^2.0.40: version "2.0.54" resolved "https://registry.yarnpkg.com/openapi-data-validator/-/openapi-data-validator-2.0.54.tgz#504682d142e9a9c06b93c6898500cfbb9efde83a" @@ -12982,10 +13042,10 @@ openapi-data-validator@^2.0.40: media-typer "^1.1" require-from-string "^2.0.2" -openapi-explorer@^2.4.793: - version "2.4.793" - resolved "https://registry.yarnpkg.com/openapi-explorer/-/openapi-explorer-2.4.793.tgz#553a3bc21fb85604c2ef4d21f370df6090861b4b" - integrity sha512-6dT+8tKRPKFtfeYsyr5Jkq20H04eZKBXA6t93kofym0DLnpK4Mr/JT7Bv2aGFd5h3MyFOjrLpfNvq7x6oHvNaA== +openapi-explorer@^2.4.799: + version "2.4.799" + resolved "https://registry.yarnpkg.com/openapi-explorer/-/openapi-explorer-2.4.799.tgz#bbc15414159604cd47d47e5f136140fc09737dc8" + integrity sha512-HIfQ2XMBZ0eCKi0hUgdEHP4yRmNkkwy4t0OQpXtJiRBNr3T/Q/1/49iNOGlE77ehLLS7RWlx7I5tk7Og3oupHA== dependencies: "@authress/login" "^2.0" base64url "^3.0.1" @@ -13259,6 +13319,26 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +patch-package@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.1.tgz#79d02f953f711e06d1f8949c8a13e5d3d7ba1a60" + integrity sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^10.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.2.4" + yaml "^2.2.2" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -13571,6 +13651,11 @@ posthog-js@^1.371.1: query-selector-shadow-dom "^1.0.1" web-vitals "^5.1.0" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + potpack@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.1.tgz#d1b1afd89e4c8f7762865ec30bd112ab767e2ebf" @@ -15046,6 +15131,11 @@ semver@^7.3.5, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@^7.5.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.1.tgz#bf4970b5e70fda0686363cc18bfe8805d5ed957e" + integrity sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg== + semver@^7.7.2: version "7.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" @@ -15365,6 +15455,11 @@ sirv@^3.0.2: mrmime "^2.0.0" totalist "^3.0.0" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -16339,6 +16434,11 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.86" +tmp@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -17636,6 +17736,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== +yaml@^2.2.2: + version "2.9.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4" + integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"