helloadhavan/github_issues huggingface dataset:
Repository: nodejs/node
Pull request: doc: remove spawn with shell example from bat/cmd section

Remove the suggestion to use `child_process.spawn()` with the `shell`
option for running `.bat` and `.cmd` files on Windows. Passing arguments
through `spawn` with `shell: true` is deprecated ([DEP0190][]) due to
shell injection risks. The `exec()` and direct `cmd.exe` spawn
alternatives remain documented.

Continues the work from #58739 which addressed the same issue but
stale-closed without review.

Fixes: https://github.com/nodejs/node/issues/58735

[DEP0190]: https://nodejs.org/api/deprecations.html#dep0190-passing-args-to-nodechild_process-execfilespawn-with-shell-option-true

Changed files:
filename: doc/api/child_process.md
patch: @@ -120,23 +120,19 @@ however, `.bat` and `.cmd` files are not executable on their own without a
 terminal, and therefore cannot be launched using [`child_process.execFile()`][].
 When running on Windows, `.bat` and `.cmd` files can be invoked by:
 
-* using [`child_process.spawn()`][] with the `shell` option set, or
+* using [`child_process.spawn()`][] with the `shell` option set (not recommended, see [DEP0190][]), or
 * using [`child_process.exec()`][], or
 * spawning `cmd.exe` and passing the `.bat` or `.cmd` file as an argument
-  (which is what the `shell` option and [`child_process.exec()`][] do).
+  (which is what [`child_process.exec()`][] does internally).
 
 In any case, if the script filename contains spaces, it needs to be quoted.
 
 ```cjs
 const { exec, spawn } = require('node:child_process');
 
-// 1. child_process.spawn() with the shell option set
-const myBat = spawn('my.bat', { shell: true });
-
-// 2. child_process.exec()
 exec('my.bat', (err, stdout, stderr) => { /* ... */ });
 
-// 3. spawning cmd.exe and passing the .bat or .cmd file as an argument
+// Or, spawning cmd.exe directly:
 const bat = spawn('cmd.exe', ['/c', 'my.bat']);
 
 // If the script filename contains spaces, it needs to be quoted
@@ -146,13 +142,9 @@ exec('"my script.cmd" a b', (err, stdout, stderr) => { /* ... */ });
 ```mjs
 import { exec, spawn } from 'node:child_process';
 
-// 1. child_process.spawn() with the shell option set
-const myBat = spawn('my.bat', { shell: true });
-
-// 2. child_process.exec()
 exec('my.bat', (err, stdout, stderr) => { /* ... */ });
 
-// 3. spawning cmd.exe and passing the .bat or .cmd file as an argument
+// Or, spawning cmd.exe directly:
 const bat = spawn('cmd.exe', ['/c', 'my.bat']);
 
 // If the script filename contains spaces, it needs to be quoted
@@ -2364,6 +2356,7 @@ Therefore, this feature requires opting in by setting the
 or [`child_process.fork()`][].
 
 [Advanced serialization]: #advanced-serialization
+[DEP0190]: deprecations.md#DEP0190
 [Default Windows shell]: #default-windows-shell
 [HTML structured clone algorithm]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
 [Shell requirements]: #shell-requirements
Repository: ollama/ollama
Pull request: Revert "move tokenizers to separate package (#13825)"

This change is a partial revert of f1373193dc95c72207658aa705831102535000c7 which erroneously removes the mlx backend used by x/imagegen and breaking the build

Changed files:
filename: CMakeLists.txt
patch: @@ -182,7 +182,7 @@ option(MLX_ENGINE "Enable MLX backend" OFF)
 
 if(MLX_ENGINE)
     message(STATUS "Setting up MLX (this takes a while...)")
-    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/x/ml/backend/mlx)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/x/imagegen/mlx)
 
     # Find CUDA toolkit if MLX is built with CUDA support
     find_package(CUDAToolkit)
@@ -216,4 +216,4 @@ if(MLX_ENGINE)
                 COMPONENT MLX)
         endif()
     endif()
-endif()
\ No newline at end of file
+endif()

filename: x/imagegen/mlx/CMakeLists.txt
patch: @@ -0,0 +1,61 @@
+include(FetchContent)
+
+# Read MLX version from top-level file (shared with Dockerfile)
+file(READ "${CMAKE_SOURCE_DIR}/MLX_VERSION" MLX_C_GIT_TAG)
+string(STRIP "${MLX_C_GIT_TAG}" MLX_C_GIT_TAG)
+
+set(MLX_C_BUILD_EXAMPLES OFF)
+
+set(MLX_BUILD_GGUF OFF)
+set(MLX_BUILD_SAFETENSORS ON)
+
+function(set_target_output_directory _target)
+    if(TARGET ${_target})
+        set_target_properties(${_target} PROPERTIES
+            RUNTIME_OUTPUT_DIRECTORY ${OLLAMA_BUILD_DIR}
+            LIBRARY_OUTPUT_DIRECTORY ${OLLAMA_BUILD_DIR}
+            ARCHIVE_OUTPUT_DIRECTORY ${OLLAMA_BUILD_DIR}
+        )
+    endif()
+endfunction()
+
+# Check for Metal support (macOS only)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+    execute_process(
+      COMMAND
+        zsh "-c"
+        "echo \"__METAL_VERSION__\" | xcrun -sdk macosx metal ${XCRUN_FLAGS} -E -x metal -P - | tail -1 | tr -d '\n'"
+      OUTPUT_VARIABLE MLX_METAL_VERSION COMMAND_ERROR_IS_FATAL ANY)
+
+    if(NOT MLX_METAL_VERSION)
+        message(STATUS "`xcrun metal` error. Setting MLX_BUILD_METAL=OFF")
+        set(MLX_BUILD_METAL OFF)
+    endif()
+else()
+    # On Linux, disable Metal backend
+    message(STATUS "Non-macOS platform detected. Setting MLX_BUILD_METAL=OFF")
+    set(MLX_BUILD_METAL OFF)
+endif()
+
+# Map CMAKE_CUDA_ARCHITECTURES to MLX_CUDA_ARCHITECTURES if not explicitly set
+if(NOT MLX_CUDA_ARCHITECTURES AND CMAKE_CUDA_ARCHITECTURES)
+    set(MLX_CUDA_ARCHITECTURES ${CMAKE_CUDA_ARCHITECTURES})
+    message(STATUS "Using CMAKE_CUDA_ARCHITECTURES for MLX: ${MLX_CUDA_ARCHITECTURES}")
+endif()
+
+# Enable CUDA backend if CUDA architectures are specified and CUDA compiler is available
+if(MLX_CUDA_ARCHITECTURES AND CMAKE_CUDA_COMPILER)
+    set(MLX_BUILD_CUDA ON CACHE BOOL "Build CUDA backend for MLX" FORCE)
+    message(STATUS "Enabling MLX CUDA backend with architectures: ${MLX_CUDA_ARCHITECTURES}")
+elseif(MLX_CUDA_ARCHITECTURES)
+    message(WARNING "MLX_CUDA_ARCHITECTURES specified but CUDA compiler not found, CUDA backend will be disabled")
+endif()
+
+FetchContent_Declare(
+  mlx-c
+  GIT_REPOSITORY "https://github.com/ml-explore/mlx-c.git"
+  GIT_TAG ${MLX_C_GIT_TAG})
+FetchContent_MakeAvailable(mlx-c)
+
+set_target_output_directory(mlx)
+set_target_output_directory(mlxc)
Repository: facebook/react
Pull request: Fix textchange event enqueueing

(Was broken by e1535fbd71d8c89c82cd9d9073c1ee97ee6a3b00.)

Can't think of a great way to write unit tests for this right now.


Changed files:
filename: src/eventPlugins/TextChangeEventPlugin.js
patch: @@ -140,8 +140,8 @@ var handlePropertyChange = function(nativeEvent) {
       // events and have it go through ReactEventTopLevelCallback. Since it
       // doesn't, we manually listen for the propertychange event and so we
       // have to enqueue and process the abstract event manually.
-      EventPluginHub.enqueueAbstractEvents(abstractEvent);
-      EventPluginHub.processAbstractEventQueue();
+      EventPluginHub.enqueueEvents(abstractEvent);
+      EventPluginHub.processEventQueue();
     }
   }
 };
Repository: rust-lang/rust
Pull request: Rollup of 2 pull requests

Successful merges:

 - rust-lang/rust#154249 (Mention on which items the `missing_doc_code_examples` is not emitted)
 - rust-lang/rust#154266 (UdpSocket: document `recv/recv_from` differences)

<!-- homu-ignore:start -->
r? @ghost

[Create a similar rollup](https://bors.rust-lang.org/queue/rust?prs=154249,154266)
<!-- homu-ignore:end -->



Changed files:
filename: library/std/src/net/udp.rs
patch: @@ -129,6 +129,10 @@ impl UdpSocket {
     /// hold the message bytes. If a message is too long to fit in the supplied buffer,
     /// excess bytes may be discarded.
     ///
+    /// Refer to the platform-specific documentation on this function; it is considered
+    /// correct for its behavior to differ from [`UdpSocket::recv`] if the underlying system
+    /// call does so.
+    ///
     /// # Examples
     ///
     /// ```no_run
@@ -711,6 +715,10 @@ impl UdpSocket {
     /// [`UdpSocket::connect`] will connect this socket to a remote address. This
     /// method will fail if the socket is not connected.
     ///
+    /// Refer to the platform-specific documentation on this function; it is considered
+    /// correct for its behavior to differ from [`UdpSocket::recv_from`] if the underlying
+    /// system call does so.
+    ///
     /// # Examples
     ///
     /// ```no_run

filename: src/doc/rustdoc/src/lints.md
patch: @@ -190,6 +190,16 @@ To fix the lint, you need to add a code example into the documentation block:
 pub fn no_code_example() {}
 ```
 
+This lint is not emitted on the following items:
+
+ * Impl blocks (both trait and inherent)
+ * Enum variants
+ * Struct/union fields
+ * Type aliases, including associated types
+ * Statics/constants
+ * Modules (including the top-level module of a crate)
+ * Foreign items from reexports (functions, statics, types, etc)
+
 ## `private_doc_tests`
 
 This lint is **allowed by default**. It detects documentation tests when they
Repository: nodejs/node
Pull request: test_runner: make it compatible with fake timers

If `setTimeout` is monkey-patched, it might be missing the symbol. Moreover, we plan to remove it in the future anyway in https://github.com/nodejs/node/issues/58689.

Changed files:
filename: lib/internal/test_runner/test.js
patch: @@ -149,7 +149,7 @@ function stopTest(timeout, signal) {
 
     disposeFunction = () => {
       abortListener[SymbolDispose]();
-      timer[SymbolDispose]();
+      clearTimeout(timer);
     };
   }
 

filename: test/fixtures/test-runner/mock-timers-with-timeout.js
patch: @@ -0,0 +1,43 @@
+'use strict';
+
+// Simulate @sinonjs/fake-timers: patch the timers module BEFORE
+// the test runner is loaded, so the test runner captures the patched
+// versions at import time.
+const nodeTimers = require('node:timers');
+const originalSetTimeout = nodeTimers.setTimeout;
+const originalClearTimeout = nodeTimers.clearTimeout;
+
+const fakeTimers = new Map();
+let nextId = 1;
+
+nodeTimers.setTimeout = (fn, delay, ...args) => {
+  const id = nextId++;
+  const timer = originalSetTimeout(fn, delay, ...args);
+  fakeTimers.set(id, timer);
+  // Sinon fake timers return an object with unref/ref but without
+  // Symbol.dispose, which would cause the test runner to throw.
+  return { id, unref() {}, ref() {} };
+};
+
+nodeTimers.clearTimeout = (id) => {
+  if (id != null && typeof id === 'object') id = id.id;
+  const timer = fakeTimers.get(id);
+  if (timer) {
+    originalClearTimeout(timer);
+    fakeTimers.delete(id);
+  }
+};
+
+// Now load the test runner - it will capture our patched setTimeout/clearTimeout
+const { test } = require('node:test');
+
+test('test with fake timers and timeout', { timeout: 10_000 }, () => {
+  // This test verifies that the test runner works when setTimeout returns
+  // an object without Symbol.dispose (like sinon fake timers).
+  // Previously, the test runner called timer[Symbol.dispose]() which would
+  // throw TypeError on objects returned by fake timer implementations.
+});
+
+// Restore
+nodeTimers.setTimeout = originalSetTimeout;
+nodeTimers.clearTimeout = originalClearTimeout;

filename: test/parallel/test-runner-mock-timers-with-timeout.js
patch: @@ -0,0 +1,14 @@
+'use strict';
+require('../common');
+const fixtures = require('../common/fixtures');
+const assert = require('node:assert');
+const { spawnSync } = require('node:child_process');
+const { test } = require('node:test');
+
+test('mock timers do not break test timeout cleanup', async () => {
+  const fixture = fixtures.path('test-runner', 'mock-timers-with-timeout.js');
+  const cp = spawnSync(process.execPath, ['--test', fixture], {
+    timeout: 30_000,
+  });
+  assert.strictEqual(cp.status, 0, `Test failed:\nstdout: ${cp.stdout}\nstderr: ${cp.stderr}`);
+});
Repository: rust-lang/rust
Pull request: UdpSocket: document `recv/recv_from` differences

Per libs-api consensus, fixes rust-lang/rust#149392 by documenting possible platform-specific behavior in `UdpSocket`.

r? libs

Changed files:
filename: library/std/src/net/udp.rs
patch: @@ -129,6 +129,10 @@ impl UdpSocket {
     /// hold the message bytes. If a message is too long to fit in the supplied buffer,
     /// excess bytes may be discarded.
     ///
+    /// Refer to the platform-specific documentation on this function; it is considered
+    /// correct for its behavior to differ from [`UdpSocket::recv`] if the underlying system
+    /// call does so.
+    ///
     /// # Examples
     ///
     /// ```no_run
@@ -711,6 +715,10 @@ impl UdpSocket {
     /// [`UdpSocket::connect`] will connect this socket to a remote address. This
     /// method will fail if the socket is not connected.
     ///
+    /// Refer to the platform-specific documentation on this function; it is considered
+    /// correct for its behavior to differ from [`UdpSocket::recv_from`] if the underlying
+    /// system call does so.
+    ///
     /// # Examples
     ///
     /// ```no_run
Repository: nodejs/node
Pull request: doc: minor typo fix

Purely just a minor typo fix. `compield` -> `compiled`

Changed files:
filename: doc/api/vm.md
patch: @@ -1835,10 +1835,10 @@ It does several things at once:
 
 1. Creates a new context.
 2. If `contextObject` is an object, [contextifies][contextified] it with the new context.
-   If  `contextObject` is undefined, creates a new object and [contextifies][contextified] it.
+   If `contextObject` is undefined, creates a new object and [contextifies][contextified] it.
    If `contextObject` is [`vm.constants.DONT_CONTEXTIFY`][], don't [contextify][contextified] anything.
-3. Compiles the code as a`vm.Script`
-4. Runs the compield code within the created context. The code does not have access to the scope in
+3. Compiles the code as a `vm.Script`
+4. Runs the compiled code within the created context. The code does not have access to the scope in
    which this method is called.
 5. Returns the result.
Repository: ollama/ollama
Pull request: scheduler: default parallel=1 for qwen3next/lfm


Changed files:
filename: server/sched.go
patch: @@ -417,9 +417,9 @@ func (s *Scheduler) load(req *LlmRequest, f *ggml.GGML, systemInfo ml.SystemInfo
 		numParallel = 1
 	}
 
-	// `mllama`, `qwen3vl`, and `qwen3vlmoe` are snowflakes and uses an encoder cache which cannot be used with num_parallel > 1
+	// Some architectures are not safe with num_parallel > 1.
 	// ref: https://github.com/ollama/ollama/issues/4165
-	if slices.Contains([]string{"mllama", "qwen3vl", "qwen3vlmoe"}, req.model.Config.ModelFamily) && numParallel != 1 {
+	if slices.Contains([]string{"mllama", "qwen3vl", "qwen3vlmoe", "qwen3next", "lfm2", "lfm2moe"}, req.model.Config.ModelFamily) && numParallel != 1 {
 		numParallel = 1
 		slog.Warn("model architecture does not currently support parallel requests", "architecture", req.model.Config.ModelFamily)
 	}
Repository: vercel/next.js
Pull request: fix: test-cargo-unit CI job timing out since LTO was enabled

## What

Fixes the `test cargo unit` CI job which has been consistently timing out (30 min) on canary since #91343 landed on Mar 14.

## Why

Two issues were contributing to the timeout:

1. **LTO on unit test binaries**: #91343 added `lto = "thin"` to `[profile.release]`. The `release-with-assertions` profile (used by `test-cargo-unit`) inherits from `release`, so it inherited LTO. Unlike the native binary build which only links one artifact, `cargo nextest run --workspace` builds test binaries for dozens of crates — each requiring its own LTO link pass. This pushed the build from ~8 minutes to 30+ minutes, exceeding the job timeout.

2. **No remote cache timeout or streaming output**: The `turbo run test-cargo-unit` command had no `--remote-cache-timeout` (unlike the build step which uses `--remote-cache-timeout 60`) and used turbo's default grouped log output, which buffers all output until the task completes. This made the job appear completely silent for 30 minutes before being killed, making it impossible to diagnose.

## How

- Added a `release-with-assertions-no-lto` cargo profile that inherits from `release-with-assertions` but disables LTO, and switched `test-cargo-unit` to use it. The production native build continues to use `release-with-assertions` with LTO.
- Added `--remote-cache-timeout 60 --log-order stream` to the turbo command for `test-cargo-unit` for parity with the build step and real-time output visibility.

Changed files:
filename: .github/workflows/build_and_test.yml
patch: @@ -191,7 +191,7 @@ jobs:
       needsRust: 'yes'
       needsNextest: 'yes'
       skipNativeBuild: 'yes'
-      afterBuild: pnpm dlx turbo@${TURBO_VERSION} run test-cargo-unit
+      afterBuild: pnpm dlx turbo@${TURBO_VERSION} run test-cargo-unit --remote-cache-timeout 60 --log-order stream
       mold: 'yes'
       stepName: 'test-cargo-unit'
     secrets: inherit

filename: Cargo.toml
patch: @@ -278,6 +278,11 @@ inherits = "release"
 debug-assertions = true
 overflow-checks = true
 
+# Like release-with-assertions but without LTO for faster test binary linking
+[profile.release-with-assertions-no-lto]
+inherits = "release-with-assertions"
+lto = false
+
 [profile.release-with-debug]
 inherits = "release"
 debug = true

filename: packages/next-swc/package.json
patch: @@ -19,7 +19,7 @@
     "rust-check-fmt": "cd ../..; cargo fmt -- --check",
     "rust-check-clippy": "cargo clippy --workspace --all-targets -- -D warnings -A deprecated",
     "rust-check-napi": "cargo check -p next-napi-bindings",
-    "test-cargo-unit": "cargo nextest run --workspace --exclude next-napi-bindings --exclude turbo-tasks-macros --cargo-profile release-with-assertions --no-fail-fast"
+    "test-cargo-unit": "cargo nextest run --workspace --exclude next-napi-bindings --exclude turbo-tasks-macros --cargo-profile release-with-assertions-no-lto --no-fail-fast"
   },
   "napi": {
     "name": "next-swc",
Repository: nodejs/node
Pull request: doc: add path to vulnerabilities.json mention

Refs: https://github.com/nodejs/node-core-utils/commit/89df0538426b32826db9f8e39a3d1f687d42abaa

<!--
Before submitting a pull request, please read:

- the CONTRIBUTING guide at https://github.com/nodejs/node/blob/HEAD/CONTRIBUTING.md
- the commit message formatting guidelines at
  https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines

For code changes:
1. Include tests for any bug fixes or new features.
2. Update documentation if relevant.
3. Ensure that `make -j4 test` (UNIX), or `vcbuild test` (Windows) passes.

If you believe this PR should be highlighted in the Node.js CHANGELOG
please add the `notable-change` label.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
-->


Changed files:
filename: doc/contributing/releases.md
patch: @@ -314,22 +314,22 @@ git checkout -b v1.2.3-proposal upstream/v1.x-staging
 You can also run:
 
 ```bash
-git node release -S --prepare --security --filterLabel vX.x
+git node release -S --prepare --security=../vulnerabilities.json --filterLabel vX.x
 ```
 
 Example:
 
 ```bash
 git checkout v20.x
-git node release -S --prepare --security --filterLabel v20.x
+git node release -S --prepare --security=../vulnerabilities.json --filterLabel v20.x
 ```
 
 to automate the remaining steps until step 6 or you can perform it manually
 following the below steps. For semver-minors, you can pass the new version
 explicitly with `--newVersion` arg:
 
 ```bash
-git node release -S --prepare --security --filterLabel v20.x --newVersion 20.20.0
+git node release -S --prepare --security=../vulnerabilities.json --filterLabel v20.x --newVersion 20.20.0
 ```
 
 <details>
Repository: huggingface/transformers
Pull request: Fix dtype guessing from state dict

# What does this PR do?

Fix https://github.com/huggingface/transformers/issues/44589.

Changed files:
filename: src/transformers/modeling_utils.py
patch: @@ -259,7 +259,8 @@ def get_state_dict_dtype(state_dict):
     Returns the first found floating dtype in `state_dict` if there is one, otherwise returns the first dtype.
     """
     for t in state_dict.values():
-        if t.is_floating_point():
+        # We cannot instantiate a whole model under float4/8_xxx dtypes (torch does not allow setting them as default dtype)
+        if t.is_floating_point() and "float8_" not in str(t.dtype) and "float4_" not in str(t.dtype):
             return t.dtype
 
     # if no floating dtype was found return whatever the first dtype is
Repository: rust-lang/rust
Pull request: Fix AtomicPtr::update's cfg gate

I'm *pretty* sure this is supposed to be `#[cfg(target_has_atomic = "ptr")]` like `AtomicPtr::try_update` is.

cc @GrigorenkoPV (author), @Noratrieb (r+ to rust-lang/rust#133829)


Changed files:
filename: library/core/src/sync/atomic.rs
patch: @@ -2136,7 +2136,7 @@ impl<T> AtomicPtr<T> {
     /// ```
     #[inline]
     #[stable(feature = "atomic_try_update", since = "1.95.0")]
-    #[cfg(target_has_atomic = "8")]
+    #[cfg(target_has_atomic = "ptr")]
     #[cfg_attr(miri, track_caller)] // even without panics, this helps for Miri backtraces
     #[rustc_should_not_be_called_on_const_items]
     pub fn update(
Repository: huggingface/transformers
Pull request: Add missing dunder methods to `SizeDict`

Some libraries that use Transformers (i.e. vLLM) use `|` on the `size` config.

This PR adds `__or__` and `__ror__` so that the following works:

```console
$ {"longest_edge": 20} | SizeDict(height=10, width=20)
{'longest_edge': 20, 'height': 10, 'width': 20}
$ SizeDict(height=10, width=20) | {"longest_edge": 20}
SizeDict(height=10, width=20, longest_edge=20, shortest_edge=None, max_height=None, max_width=None)
$ SizeDict(height=10, width=20) | SizeDict(longest_edge=20)
SizeDict(height=10, width=20, longest_edge=20, shortest_edge=None, max_height=None, max_width=None)
```

Changed files:
filename: src/transformers/image_utils.py
patch: @@ -1001,3 +1001,17 @@ def __eq__(self, other):
                 getattr(other, f.name) for f in fields(self)
             )
         return NotImplemented
+
+    def __or__(self, other) -> "SizeDict":
+        if isinstance(other, dict | SizeDict):
+            merged = dict(self)
+            merged.update(dict(other))
+            return SizeDict(**merged)
+        return NotImplemented
+
+    def __ror__(self, other) -> dict:
+        if isinstance(other, dict):
+            merged = dict(other)
+            merged.update(dict(self))
+            return merged
+        return NotImplemented