···11-{ stdenv
11+{
22+ stdenv,
23 # nix tooling and utilities
33-, callPackage
44-, lib
55-, fetchurl
66-, makeWrapper
77-, writeTextFile
88-, substituteAll
99-, writeShellApplication
1010-, makeBinaryWrapper
44+ lib,
55+ fetchurl,
66+ makeWrapper,
77+ writeTextFile,
88+ substituteAll,
99+ writeShellApplication,
1010+ makeBinaryWrapper,
1111+ autoPatchelfHook,
1212+ buildFHSEnv,
1113 # this package (through the fixpoint glass)
1212-, bazel_self
1414+ # TODO probably still need for tests at some point
1515+ bazel_self,
1316 # native build inputs
1414-, runtimeShell
1515-, zip
1616-, unzip
1717-, bash
1818-, coreutils
1919-, which
2020-, gawk
2121-, gnused
2222-, gnutar
2323-, gnugrep
2424-, gzip
2525-, findutils
2626-, diffutils
2727-, gnupatch
2828-, file
2929-, installShellFiles
3030-, lndir
3131-, python3
1717+ runtimeShell,
1818+ zip,
1919+ unzip,
2020+ bash,
2121+ coreutils,
2222+ which,
2323+ gawk,
2424+ gnused,
2525+ gnutar,
2626+ gnugrep,
2727+ gzip,
2828+ findutils,
2929+ diffutils,
3030+ gnupatch,
3131+ file,
3232+ installShellFiles,
3333+ lndir,
3434+ python3,
3235 # Apple dependencies
3333-, cctools
3434-, libcxx
3535-, sigtool
3636-, CoreFoundation
3737-, CoreServices
3838-, Foundation
3939-, IOKit
3636+ cctools,
3737+ libcxx,
3838+ sigtool,
3939+ CoreFoundation,
4040+ CoreServices,
4141+ Foundation,
4242+ IOKit,
4043 # Allow to independently override the jdks used to build and run respectively
4141-, buildJdk
4242-, runJdk
4444+ buildJdk,
4545+ runJdk,
4346 # Always assume all markers valid (this is needed because we remove markers; they are non-deterministic).
4447 # Also, don't clean up environment variables (so that NIX_ environment variables are passed to compilers).
4545-, enableNixHacks ? false
4646-, version ? "7.1.2"
4848+ enableNixHacks ? false,
4949+ version ? "7.3.1",
4750}:
48514952let
···51545255 src = fetchurl {
5356 url = "https://github.com/bazelbuild/bazel/releases/download/${version}/bazel-${version}-dist.zip";
5454- hash = "sha256-nPbtIxnIFpGdlwFe720MWULNGu1I4DxzuggV2VPtYas=";
5555- };
5656-5757- # Use builtins.fetchurl to avoid IFD, in particular on hydra
5858- #lockfile = builtins.fetchurl {
5959- # url = "https://raw.githubusercontent.com/bazelbuild/bazel/release-${version}/MODULE.bazel.lock";
6060- # sha256 = "sha256-5xPpCeWVKVp1s4RVce/GoW2+fH8vniz5G1MNI4uezpc=";
6161- #};
6262- # Use a local copy of the above lockfile to make ofborg happy.
6363- lockfile = ./MODULE.bazel.lock;
6464-6565- # Two-in-one format
6666- distDir = repoCache;
6767- repoCache = callPackage ./bazel-repository-cache.nix {
6868- inherit lockfile;
6969-7070- # We use the release tarball that already has everything bundled so we
7171- # should not need any extra external deps. But our nonprebuilt java
7272- # toolchains hack needs just one non bundled dep.
7373- requiredDepNamePredicate = name:
7474- null != builtins.match "rules_java~.*~toolchains~remote_java_tools" name;
5757+ hash = "sha256-8FAfkMn8dM1pM9vcWeF7jWJy1sCfi448QomFxYlxR8c=";
7558 };
76597760 defaultShellUtils =
···117100 unzip
118101 which
119102 zip
103103+ runJdk
104104+ makeWrapper
105105+ ];
106106+107107+ # Bootstrap an existing Bazel so we can vendor deps with vendor mode
108108+ bazel_bootstrap = stdenv.mkDerivation rec {
109109+ name = "bazel_bootstrap";
110110+ src = fetchurl {
111111+ url = "https://github.com/bazelbuild/bazel/releases/download/${version}/bazel_nojdk-${version}-linux-x86_64";
112112+ hash = "sha256-05fHtz47OilpOVYawB17VRVEDpycfYTIHBmwYCOyPjI=";
113113+ };
114114+115115+ nativeBuildInputs = defaultShellUtils;
116116+ buildInputs = [
117117+ stdenv.cc.cc
118118+ autoPatchelfHook
120119 ];
121120121121+ dontUnpack = true;
122122+ dontPatch = true;
123123+ dontBuild = true;
124124+ dontStrip = true;
125125+ installPhase = ''
126126+ runHook preInstall
127127+128128+ mkdir -p $out/bin
129129+ install -Dm755 $src $out/bin/bazel
130130+131131+ runHook postInstall
132132+ '';
133133+134134+ postFixup = ''
135135+ wrapProgram $out/bin/bazel \
136136+ --prefix PATH : ${lib.makeBinPath nativeBuildInputs}
137137+ '';
138138+ };
139139+140140+ # The bootstrapped Bazel did not work on its own for vendoring, but a wrapped FHS did
141141+ bazel_fhs = buildFHSEnv {
142142+ name = "bazel";
143143+ targetPkgs = _: [ bazel_bootstrap ];
144144+ runScript = "bazel";
145145+ };
146146+147147+ # A FOD that vendors the Bazel dependencies using Bazel's new vendor mode.
148148+ # See https://bazel.build/versions/7.3.0/external/vendor for details.
149149+ # Note that it may be possible to vendor less than the full set of deps in
150150+ # the future, as this is approximately 16GB.
151151+ bazel_deps = stdenv.mkDerivation {
152152+ name = "bazel_deps";
153153+ src = fetchurl {
154154+ url = "https://github.com/bazelbuild/bazel/releases/download/${version}/bazel-${version}-dist.zip";
155155+ hash = "sha256-8FAfkMn8dM1pM9vcWeF7jWJy1sCfi448QomFxYlxR8c=";
156156+ };
157157+ inherit version;
158158+ sourceRoot = ".";
159159+ patches = [
160160+ # The repo rule that creates a manifest of the bazel source for testing
161161+ # the cli is not reproducible. This patch ensures that it is by sorting
162162+ # the results in the repo rule rather than the downstream genrule.
163163+ ./test_source_sort.patch
164164+ ];
165165+ patchFlags = [
166166+ "--no-backup-if-mismatch"
167167+ "-p1"
168168+ ];
169169+ nativeBuildInputs = [
170170+ unzip
171171+ bazel_fhs
172172+ ];
173173+ configurePhase = ''
174174+ runHook preConfigure
175175+176176+ mkdir bazel_src
177177+ shopt -s dotglob extglob
178178+ mv !(bazel_src) bazel_src
179179+ mkdir vendor_dir
180180+181181+ runHook postConfigure
182182+ '';
183183+ dontFixup = true;
184184+ buildPhase = ''
185185+ runHook preBuild
186186+ export HOME=$TMP
187187+ (cd bazel_src; ${bazel_fhs}/bin/bazel --server_javabase=${runJdk} mod deps --curses=no;
188188+ ${bazel_fhs}/bin/bazel --server_javabase=${runJdk} vendor \
189189+ --curses=no \
190190+ --vendor_dir ../vendor_dir \
191191+ --verbose_failures \
192192+ --experimental_strict_java_deps=off \
193193+ --strict_proto_deps=off \
194194+ --tool_java_runtime_version=local_jdk_21 \
195195+ --java_runtime_version=local_jdk_21 \
196196+ --tool_java_language_version=21 \
197197+ --java_language_version=21)
198198+199199+ # Some post-fetch fixup is necessary, because the deps come with some
200200+ # baggage that is not reproducible. Luckily, this baggage does not factor
201201+ # into the final product, so removing it is enough.
202202+203203+ # the GOCACHE is poisonous!
204204+ rm -rf vendor_dir/gazelle~~non_module_deps~bazel_gazelle_go_repository_cache/gocache
205205+206206+ # so are .pyc files apparently
207207+ find vendor_dir -name "*.pyc" -type f -delete
208208+209209+ runHook postBuild
210210+ '';
211211+212212+ installPhase = ''
213213+ mkdir -p $out/vendor_dir
214214+ cp -r --reflink=auto vendor_dir/* $out/vendor_dir
215215+ '';
216216+217217+ outputHashMode = "recursive";
218218+ outputHash = "sha256-xW+KZIsOGrDV7WIcg/elHpFEmfs1TfFky3bVqCdWr9k=";
219219+ outputHashAlgo = "sha256";
220220+221221+ };
222222+122223 defaultShellPath = lib.makeBinPath defaultShellUtils;
123224124225 bashWithDefaultShellUtilsSh = writeShellApplication {
···174275 inherit version src;
175276 inherit sourceRoot;
176277177177- patches = [
178178- # Remote java toolchains do not work on NixOS because they download binaries,
179179- # so we need to use the @local_jdk//:jdk
180180- # It could in theory be done by registering @local_jdk//:all toolchains,
181181- # but these java toolchains still bundle binaries for ijar and stuff. So we
182182- # need a nonprebult java toolchain (where ijar and stuff is built from
183183- # sources).
184184- # There is no such java toolchain, so we introduce one here.
185185- # By providing no version information, the toolchain will set itself to the
186186- # version of $JAVA_HOME/bin/java, just like the local_jdk does.
187187- # To ensure this toolchain gets used, we can set
188188- # --{,tool_}java_runtime_version=local_jdk and rely on the fact no java
189189- # toolchain registered by default uses the local_jdk, making the selection
190190- # unambiguous.
191191- # This toolchain has the advantage that it can use any ambiant java jdk,
192192- # not only a given, fixed version. It allows bazel to work correctly in any
193193- # environment where JAVA_HOME is set to the right java version, like inside
194194- # nix derivations.
195195- # However, this patch breaks bazel hermeticity, by picking the ambiant java
196196- # version instead of the more hermetic remote_jdk prebuilt binaries that
197197- # rules_java provide by default. It also requires the user to have a
198198- # JAVA_HOME set to the exact version required by the project.
199199- # With more code, we could define java toolchains for all the java versions
200200- # supported by the jdk as in rules_java's
201201- # toolchains/local_java_repository.bzl, but this is not implemented here.
202202- # To recover vanilla behavior, non NixOS users can set
203203- # --{,tool_}java_runtime_version=remote_jdk, effectively reverting the
204204- # effect of this patch and the fake system bazelrc.
205205- ./java_toolchain.patch
278278+ patches =
279279+ [
280280+ # Remote java toolchains do not work on NixOS because they download binaries,
281281+ # so we need to use the @local_jdk//:jdk
282282+ # It could in theory be done by registering @local_jdk//:all toolchains,
283283+ # but these java toolchains still bundle binaries for ijar and stuff. So we
284284+ # need a nonprebult java toolchain (where ijar and stuff is built from
285285+ # sources).
286286+ # There is no such java toolchain, so we introduce one here.
287287+ # By providing no version information, the toolchain will set itself to the
288288+ # version of $JAVA_HOME/bin/java, just like the local_jdk does.
289289+ # To ensure this toolchain gets used, we can set
290290+ # --{,tool_}java_runtime_version=local_jdk and rely on the fact no java
291291+ # toolchain registered by default uses the local_jdk, making the selection
292292+ # unambiguous.
293293+ # This toolchain has the advantage that it can use any ambiant java jdk,
294294+ # not only a given, fixed version. It allows bazel to work correctly in any
295295+ # environment where JAVA_HOME is set to the right java version, like inside
296296+ # nix derivations.
297297+ # However, this patch breaks bazel hermeticity, by picking the ambiant java
298298+ # version instead of the more hermetic remote_jdk prebuilt binaries that
299299+ # rules_java provide by default. It also requires the user to have a
300300+ # JAVA_HOME set to the exact version required by the project.
301301+ # With more code, we could define java toolchains for all the java versions
302302+ # supported by the jdk as in rules_java's
303303+ # toolchains/local_java_repository.bzl, but this is not implemented here.
304304+ # To recover vanilla behavior, non NixOS users can set
305305+ # --{,tool_}java_runtime_version=remote_jdk, effectively reverting the
306306+ # effect of this patch and the fake system bazelrc.
307307+ ./java_toolchain.patch
206308207207- # Bazel integrates with apple IOKit to inhibit and track system sleep.
208208- # Inside the darwin sandbox, these API calls are blocked, and bazel
209209- # crashes. It seems possible to allow these APIs inside the sandbox, but it
210210- # feels simpler to patch bazel not to use it at all. So our bazel is
211211- # incapable of preventing system sleep, which is a small price to pay to
212212- # guarantee that it will always run in any nix context.
213213- #
214214- # See also ./bazel_darwin_sandbox.patch in bazel_5. That patch uses
215215- # NIX_BUILD_TOP env var to conditionnally disable sleep features inside the
216216- # sandbox.
217217- #
218218- # If you want to investigate the sandbox profile path,
219219- # IORegisterForSystemPower can be allowed with
220220- #
221221- # propagatedSandboxProfile = ''
222222- # (allow iokit-open (iokit-user-client-class "RootDomainUserClient"))
223223- # '';
224224- #
225225- # I do not know yet how to allow IOPMAssertion{CreateWithName,Release}
226226- ./darwin_sleep.patch
309309+ # Bazel integrates with apple IOKit to inhibit and track system sleep.
310310+ # Inside the darwin sandbox, these API calls are blocked, and bazel
311311+ # crashes. It seems possible to allow these APIs inside the sandbox, but it
312312+ # feels simpler to patch bazel not to use it at all. So our bazel is
313313+ # incapable of preventing system sleep, which is a small price to pay to
314314+ # guarantee that it will always run in any nix context.
315315+ #
316316+ # See also ./bazel_darwin_sandbox.patch in bazel_5. That patch uses
317317+ # NIX_BUILD_TOP env var to conditionnally disable sleep features inside the
318318+ # sandbox.
319319+ #
320320+ # If you want to investigate the sandbox profile path,
321321+ # IORegisterForSystemPower can be allowed with
322322+ #
323323+ # propagatedSandboxProfile = ''
324324+ # (allow iokit-open (iokit-user-client-class "RootDomainUserClient"))
325325+ # '';
326326+ #
327327+ # I do not know yet how to allow IOPMAssertion{CreateWithName,Release}
328328+ ./darwin_sleep.patch
227329228228- # Fix DARWIN_XCODE_LOCATOR_COMPILE_COMMAND by removing multi-arch support.
229229- # Nixpkgs toolcahins do not support that (yet?) and get confused.
230230- # Also add an explicit /usr/bin prefix that will be patched below.
231231- ./xcode_locator.patch
330330+ # Fix DARWIN_XCODE_LOCATOR_COMPILE_COMMAND by removing multi-arch support.
331331+ # Nixpkgs toolcahins do not support that (yet?) and get confused.
332332+ # Also add an explicit /usr/bin prefix that will be patched below.
333333+ ./xcode_locator.patch
232334233233- # On Darwin, the last argument to gcc is coming up as an empty string. i.e: ''
234234- # This is breaking the build of any C target. This patch removes the last
235235- # argument if it's found to be an empty string.
236236- ../trim-last-argument-to-gcc-if-empty.patch
335335+ # On Darwin, the last argument to gcc is coming up as an empty string. i.e: ''
336336+ # This is breaking the build of any C target. This patch removes the last
337337+ # argument if it's found to be an empty string.
338338+ ../trim-last-argument-to-gcc-if-empty.patch
237339238238- # --experimental_strict_action_env (which may one day become the default
239239- # see bazelbuild/bazel#2574) hardcodes the default
240240- # action environment to a non hermetic value (e.g. "/usr/local/bin").
241241- # This is non hermetic on non-nixos systems. On NixOS, bazel cannot find the required binaries.
242242- # So we are replacing this bazel paths by defaultShellPath,
243243- # improving hermeticity and making it work in nixos.
244244- (substituteAll {
245245- src = ../strict_action_env.patch;
246246- strictActionEnvPatch = defaultShellPath;
247247- })
340340+ # --experimental_strict_action_env (which may one day become the default
341341+ # see bazelbuild/bazel#2574) hardcodes the default
342342+ # action environment to a non hermetic value (e.g. "/usr/local/bin").
343343+ # This is non hermetic on non-nixos systems. On NixOS, bazel cannot find the required binaries.
344344+ # So we are replacing this bazel paths by defaultShellPath,
345345+ # improving hermeticity and making it work in nixos.
346346+ (substituteAll {
347347+ src = ../strict_action_env.patch;
348348+ strictActionEnvPatch = defaultShellPath;
349349+ })
248350249249- # bazel reads its system bazelrc in /etc
250250- # override this path to a builtin one
251251- (substituteAll {
252252- src = ../bazel_rc.patch;
253253- bazelSystemBazelRCPath = bazelRC;
254254- })
255255- ]
256256- # See enableNixHacks argument above.
257257- ++ lib.optional enableNixHacks ./nix-hacks.patch;
351351+ # bazel reads its system bazelrc in /etc
352352+ # override this path to a builtin one
353353+ (substituteAll {
354354+ src = ../bazel_rc.patch;
355355+ bazelSystemBazelRCPath = bazelRC;
356356+ })
357357+ ]
358358+ # See enableNixHacks argument above.
359359+ ++ lib.optional enableNixHacks ./nix-hacks.patch;
258360259361 postPatch =
260362 let
···339441 -e 's!/bin/bash!${bashWithDefaultShellUtils}/bin/bash!g' \
340442 -e 's!shasum -a 256!sha256sum!g'
341443342342- # Augment bundled repository_cache with our extra paths
343343- ${lndir}/bin/lndir ${repoCache}/content_addressable \
344344- $PWD/derived/repository_cache/content_addressable
345345-346444 # Add required flags to bazel command line.
347445 # XXX: It would suit a bazelrc file better, but I found no way to pass it.
348446 # It seems that bazel bootstrapping ignores it.
···350448 sedVerbose compile.sh \
351449 -e "/bazel_build /a\ --verbose_failures \\\\" \
352450 -e "/bazel_build /a\ --curses=no \\\\" \
353353- -e "/bazel_build /a\ --features=-layering_check \\\\" \
354354- -e "/bazel_build /a\ --experimental_strict_java_deps=off \\\\" \
355355- -e "/bazel_build /a\ --strict_proto_deps=off \\\\" \
356451 -e "/bazel_build /a\ --toolchain_resolution_debug='@bazel_tools//tools/jdk:(runtime_)?toolchain_type' \\\\" \
357357- -e "/bazel_build /a\ --tool_java_runtime_version=local_jdk_17 \\\\" \
358358- -e "/bazel_build /a\ --java_runtime_version=local_jdk_17 \\\\" \
359359- -e "/bazel_build /a\ --tool_java_language_version=17 \\\\" \
360360- -e "/bazel_build /a\ --java_language_version=17 \\\\" \
452452+ -e "/bazel_build /a\ --tool_java_runtime_version=local_jdk_21 \\\\" \
453453+ -e "/bazel_build /a\ --java_runtime_version=local_jdk_21 \\\\" \
454454+ -e "/bazel_build /a\ --tool_java_language_version=21 \\\\" \
455455+ -e "/bazel_build /a\ --java_language_version=21 \\\\" \
361456 -e "/bazel_build /a\ --extra_toolchains=@bazel_tools//tools/jdk:all \\\\" \
457457+ -e "/bazel_build /a\ --vendor_dir=../vendor_dir \\\\" \
458458+ -e "/bazel_build /a\ --repository_disable_download \\\\" \
459459+ -e "/bazel_build /a\ --announce_rc \\\\" \
460460+ -e "/bazel_build /a\ --nobuild_python_zip \\\\" \
362461363462 # Also build parser_deploy.jar with bootstrap bazel
364463 # TODO: Turn into a proper patch
···407506 # Bazel starts a local server and needs to bind a local address.
408507 __darwinAllowLocalNetworking = true;
409508410410- buildInputs = [ buildJdk bashWithDefaultShellUtils ] ++ defaultShellUtils;
509509+ buildInputs = [
510510+ buildJdk
511511+ bashWithDefaultShellUtils
512512+ ] ++ defaultShellUtils;
411513412514 # when a command can’t be found in a bazel build, you might also
413515 # need to add it to `defaultShellPath`.
414414- nativeBuildInputs = [
415415- installShellFiles
416416- makeWrapper
417417- python3
418418- unzip
419419- which
420420- zip
421421- python3.pkgs.absl-py # Needed to build fish completion
422422- ] ++ lib.optionals (stdenv.hostPlatform.isDarwin) [
423423- cctools
424424- libcxx
425425- Foundation
426426- CoreFoundation
427427- CoreServices
428428- ];
516516+ nativeBuildInputs =
517517+ [
518518+ installShellFiles
519519+ makeWrapper
520520+ python3
521521+ unzip
522522+ which
523523+ zip
524524+ python3.pkgs.absl-py # Needed to build fish completion
525525+ ]
526526+ ++ lib.optionals (stdenv.hostPlatform.isDarwin) [
527527+ cctools
528528+ libcxx
529529+ Foundation
530530+ CoreFoundation
531531+ CoreServices
532532+ ];
429533430534 # Bazel makes extensive use of symlinks in the WORKSPACE.
431535 # This causes problems with infinite symlinks if the build output is in the same location as the
···437541 mkdir bazel_src
438542 shopt -s dotglob extglob
439543 mv !(bazel_src) bazel_src
544544+ # Augment bundled repository_cache with our extra paths
545545+ mkdir vendor_dir
546546+ ${lndir}/bin/lndir ${bazel_deps}/vendor_dir vendor_dir
547547+ rm vendor_dir/VENDOR.bazel
548548+ find vendor_dir -maxdepth 1 -type d -printf "pin(\"@@%P\")\n" > vendor_dir/VENDOR.bazel
440549 '';
441550 buildPhase = ''
442551 runHook preBuild
443443-444444- # Increasing memory during compilation might be necessary.
445445- # export BAZEL_JAVAC_OPTS="-J-Xmx2g -J-Xms200m"
552552+ export HOME=$(mktemp -d)
446553447554 # If EMBED_LABEL isn't set, it'd be auto-detected from CHANGELOG.md
448555 # and `git rev-parse --short HEAD` which would result in
···452559 # Note that .bazelversion is always correct and is based on bazel-*
453560 # executable name, version checks should work fine
454561 export EMBED_LABEL="${version}- (@non-git)"
562562+455563 echo "Stage 1 - Running bazel bootstrap script"
456564 ${bash}/bin/bash ./bazel_src/compile.sh
457565···554662555663 # Save paths to hardcoded dependencies so Nix can detect them.
556664 # This is needed because the templates get tar’d up into a .jar.
557557- postFixup = ''
558558- mkdir -p $out/nix-support
559559- echo "${defaultShellPath}" >> $out/nix-support/depends
560560- # The string literal specifying the path to the bazel-rc file is sometimes
561561- # stored non-contiguously in the binary due to gcc optimisations, which leads
562562- # Nix to miss the hash when scanning for dependencies
563563- echo "${bazelRC}" >> $out/nix-support/depends
564564- '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
565565- echo "${cctools}" >> $out/nix-support/depends
566566- '';
665665+ postFixup =
666666+ ''
667667+ mkdir -p $out/nix-support
668668+ echo "${defaultShellPath}" >> $out/nix-support/depends
669669+ # The string literal specifying the path to the bazel-rc file is sometimes
670670+ # stored non-contiguously in the binary due to gcc optimisations, which leads
671671+ # Nix to miss the hash when scanning for dependencies
672672+ echo "${bazelRC}" >> $out/nix-support/depends
673673+ ''
674674+ + lib.optionalString stdenv.hostPlatform.isDarwin ''
675675+ echo "${cctools}" >> $out/nix-support/depends
676676+ '';
567677568678 dontStrip = true;
569679 dontPatchELF = true;
···571681 passthru = {
572682 # Additional tests that check bazel’s functionality. Execute
573683 #
574574- # nix-build . -A bazel_7.tests
684684+ # nix-build . -A bazel_73.tests
575685 #
576686 # in the nixpkgs checkout root to exercise them locally.
577577- tests = callPackage ./tests.nix {
578578- inherit Foundation bazel_self lockfile repoCache;
579579- };
687687+ # tests = callPackage ./tests.nix {
688688+ # inherit Foundation bazel_self lockfile repoCache;
689689+ # };
690690+ # TODO tests have not been updated yet and will likely need a rewrite
691691+ # tests = callPackage ./tests.nix { inherit Foundation bazel_deps bazel_self; };
580692581693 # For ease of debugging
582582- inherit distDir repoCache lockfile;
694694+ inherit bazel_deps bazel_fhs;
583695 };
584696}