helloadhavan/github_issues huggingface dataset:
Repository: huggingface/transformers
Pull request: [Tests] Reduced model size for albert-test model

# What does this PR do?

Reduces the Model size for ALBERT test model to improve testing speed.

Fixes  #38344

# Changes Made:
- Reduced the number of parameters in the ALBERT test model.
- Optimized the model architecture to maintain testing relevance while minimizing resource usage.




Changed files:
filename: tests/models/albert/test_modeling_albert.py
patch: @@ -51,19 +51,19 @@ def __init__(
         use_input_mask=True,
         use_token_type_ids=True,
         use_labels=True,
-        vocab_size=99,
-        embedding_size=16,
-        hidden_size=36,
+        vocab_size=32,
+        embedding_size=8,
+        hidden_size=12,
         num_hidden_layers=2,
         # this needs to be the same as `num_hidden_layers`!
         num_hidden_groups=2,
-        num_attention_heads=6,
-        intermediate_size=37,
+        num_attention_heads=4,
+        intermediate_size=16,
         hidden_act="gelu",
         hidden_dropout_prob=0.1,
         attention_probs_dropout_prob=0.1,
-        max_position_embeddings=512,
-        type_vocab_size=16,
+        max_position_embeddings=8,
+        type_vocab_size=2,
         type_sequence_label_size=2,
         initializer_range=0.02,
         num_labels=3,
@@ -121,6 +121,7 @@ def prepare_config_and_inputs(self):
     def get_config(self):
         return AlbertConfig(
             vocab_size=self.vocab_size,
+            embedding_size=self.embedding_size,
             hidden_size=self.hidden_size,
             num_hidden_layers=self.num_hidden_layers,
             num_attention_heads=self.num_attention_heads,
@@ -132,6 +133,7 @@ def get_config(self):
             type_vocab_size=self.type_vocab_size,
             initializer_range=self.initializer_range,
             num_hidden_groups=self.num_hidden_groups,
+            inner_group_num=1,
         )
 
     def create_and_check_model(
Repository: facebook/react
Pull request: [DevTools] permanently polyfill for rAF in devtools_page

## Summary

We had this as a temporary fix for #24626. Now that Chrome team decides to turn the flag on again (with good reasons explained in https://bugs.chromium.org/p/chromium/issues/detail?id=1241986#c31), we will turn it into a long term solution. 
In the future, we want to explore whether we can render React elements on panel.html instead, as `requestAnimationFrame` produces higher quality animation.

## How did you test this change?

Tested on local build with "Throttle non-visible cross-origin iframes" flag enabled.


Changed files:
filename: packages/react-devtools-extensions/src/main.js
patch: @@ -30,29 +30,20 @@ const LOCAL_STORAGE_SUPPORTS_PROFILING_KEY =
 const isChrome = getBrowserName() === 'Chrome';
 const isEdge = getBrowserName() === 'Edge';
 
-// since Chromium v102, requestAnimationFrame no longer fires in devtools_page (i.e. this file)
-// mock requestAnimationFrame with setTimeout as a temporary workaround
-// https://github.com/facebook/react/issues/24626
-if (isChrome || isEdge) {
-  const timeoutID = setTimeout(() => {
-    // if requestAnimationFrame is not working, polyfill it
-    // The polyfill is based on https://gist.github.com/jalbam/5fe05443270fa6d8136238ec72accbc0
-    const FRAME_TIME = 16;
-    let lastTime = 0;
-    window.requestAnimationFrame = function (callback, element) {
-      const now = window.performance.now();
-      const nextTime = Math.max(lastTime + FRAME_TIME, now);
-      return setTimeout(function () {
-        callback((lastTime = nextTime));
-      }, nextTime - now);
-    };
-    window.cancelAnimationFrame = clearTimeout;
-  }, 400);
-
-  requestAnimationFrame(() => {
-    clearTimeout(timeoutID);
-  });
-}
+// rAF never fires on devtools_page (because it's in the background)
+// https://bugs.chromium.org/p/chromium/issues/detail?id=1241986#c31
+// Since we render React elements here, we need to polyfill it with setTimeout
+// The polyfill is based on https://gist.github.com/jalbam/5fe05443270fa6d8136238ec72accbc0
+const FRAME_TIME = 16;
+let lastTime = 0;
+window.requestAnimationFrame = function (callback, element) {
+  const now = window.performance.now();
+  const nextTime = Math.max(lastTime + FRAME_TIME, now);
+  return setTimeout(function () {
+    callback((lastTime = nextTime));
+  }, nextTime - now);
+};
+window.cancelAnimationFrame = clearTimeout;
 
 let panelCreated = false;
Repository: facebook/react
Pull request: [difftrain] Make github sha clickable for easier debugging


Changed files:
filename: .github/workflows/commit_artifacts.yml
patch: @@ -152,7 +152,7 @@ jobs:
           commit_message: |
             ${{ github.event.head_commit.message }}
 
-            DiffTrain build for commit ${{ github.sha }}.
+            DiffTrain build for [${{ github.sha }}](https://github.com/facebook/react/commit/${{ github.sha }})
           branch: builds/facebook-www
           commit_user_name: ${{ github.actor }}
           commit_user_email: ${{ github.actor }}@users.noreply.github.com
Repository: vercel/next.js
Pull request: Update font data

This auto-generated PR updates font data with latest available

Changed files:
filename: packages/font/src/google/font-data.json
patch: @@ -1680,8 +1680,16 @@
     "subsets": ["latin", "latin-ext"]
   },
   "Baskervville SC": {
-    "weights": ["400"],
+    "weights": ["400", "500", "600", "700", "variable"],
     "styles": ["normal"],
+    "axes": [
+      {
+        "tag": "wght",
+        "min": 400,
+        "max": 700,
+        "defaultValue": 400
+      }
+    ],
     "subsets": ["latin", "latin-ext"]
   },
   "Battambang": {
@@ -8368,8 +8376,27 @@
     "subsets": ["cyrillic", "latin", "latin-ext"]
   },
   "Nokora": {
-    "weights": ["100", "300", "400", "700", "900"],
+    "weights": [
+      "100",
+      "200",
+      "300",
+      "400",
+      "500",
+      "600",
+      "700",
+      "800",
+      "900",
+      "variable"
+    ],
     "styles": ["normal"],
+    "axes": [
+      {
+        "tag": "wght",
+        "min": 100,
+        "max": 900,
+        "defaultValue": 400
+      }
+    ],
     "subsets": ["khmer", "latin"]
   },
   "Norican": {

filename: packages/font/src/google/index.ts
patch: @@ -2770,8 +2770,14 @@ export declare function Baskervville<
 }): T extends undefined ? NextFont : NextFontWithVariable
 export declare function Baskervville_SC<
   T extends CssVariable | undefined = undefined,
->(options: {
-  weight: '400' | Array<'400'>
+>(options?: {
+  weight?:
+    | '400'
+    | '500'
+    | '600'
+    | '700'
+    | 'variable'
+    | Array<'400' | '500' | '600' | '700'>
   style?: 'normal' | Array<'normal'>
   display?: Display
   variable?: T
@@ -14784,14 +14790,21 @@ export declare function Nobile<
 }): T extends undefined ? NextFont : NextFontWithVariable
 export declare function Nokora<
   T extends CssVariable | undefined = undefined,
->(options: {
-  weight:
+>(options?: {
+  weight?:
     | '100'
+    | '200'
     | '300'
     | '400'
+    | '500'
+    | '600'
     | '700'
+    | '800'
     | '900'
-    | Array<'100' | '300' | '400' | '700' | '900'>
+    | 'variable'
+    | Array<
+        '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'
+      >
   style?: 'normal' | Array<'normal'>
   display?: Display
   variable?: T
Repository: denoland/deno
Pull request: fix(lsp): skip code action edits that can't be converted

Fixes #26777. No reproduction that works for me, so just improving fail-safeness without a test.

Changed files:
filename: cli/lsp/analysis.rs
patch: @@ -10,6 +10,7 @@ use super::tsc;
 use super::urls::url_to_uri;
 
 use crate::args::jsr_url;
+use crate::lsp::logging::lsp_warn;
 use crate::lsp::search::PackageSearchApi;
 use crate::tools::lint::CliLinter;
 use crate::util::path::relative_specifier;
@@ -747,8 +748,14 @@ pub fn ts_changes_to_edit(
 ) -> Result<Option<lsp::WorkspaceEdit>, AnyError> {
   let mut text_document_edits = Vec::new();
   for change in changes {
-    let text_document_edit = change.to_text_document_edit(language_server)?;
-    text_document_edits.push(text_document_edit);
+    let edit = match change.to_text_document_edit(language_server) {
+      Ok(e) => e,
+      Err(err) => {
+        lsp_warn!("Couldn't covert text document edit: {:#}", err);
+        continue;
+      }
+    };
+    text_document_edits.push(edit);
   }
   Ok(Some(lsp::WorkspaceEdit {
     changes: None,
Repository: nodejs/node
Pull request: assert: fix deepStrictEqual on errors when cause is present

Refs #55310
Fixes #55310

This PR fixes AssertionError reporting when [`cause`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) is present.


Changed files:
filename: lib/internal/assert/assertion_error.js
patch: @@ -15,6 +15,8 @@ const {
   StringPrototypeSplit,
 } = primordials;
 
+const { isError } = require('internal/util');
+
 const { inspect } = require('internal/util/inspect');
 const colors = require('internal/util/colors');
 const { validateObject } = require('internal/validators');
@@ -47,6 +49,15 @@ function copyError(source) {
     __proto__: null,
     value: source.message,
   });
+  if (source.cause !== undefined) {
+    let cause = source.cause;
+
+    if (isError(cause)) {
+      cause = copyError(cause);
+    }
+
+    ObjectDefineProperty(target, 'cause', { __proto__: null, value: cause });
+  }
   return target;
 }
 

filename: test/parallel/test-assert-deep-with-error.js
patch: @@ -0,0 +1,39 @@
+'use strict';
+require('../common');
+const assert = require('assert');
+const { test } = require('node:test');
+
+const defaultStartMessage = 'Expected values to be strictly deep-equal:\n' +
+  '+ actual - expected\n' +
+  '\n';
+
+test('Handle error causes', () => {
+  assert.throws(() => {
+    assert.deepStrictEqual(new Error('a', { cause: new Error('x') }), new Error('a', { cause: new Error('y') }));
+  }, { message: defaultStartMessage + '  [Error: a] {\n' +
+    '+   [cause]: [Error: x]\n' +
+    '-   [cause]: [Error: y]\n' +
+    '  }\n' });
+
+  assert.throws(() => {
+    assert.deepStrictEqual(new Error('a'), new Error('a', { cause: new Error('y') }));
+  }, { message: defaultStartMessage + '+ [Error: a]\n' +
+    '- [Error: a] {\n' +
+    '-   [cause]: [Error: y]\n' +
+    '- }\n' });
+
+  assert.throws(() => {
+    assert.deepStrictEqual(new Error('a'), new Error('a', { cause: { prop: 'value' } }));
+  }, { message: defaultStartMessage + '+ [Error: a]\n' +
+    '- [Error: a] {\n' +
+    '-   [cause]: {\n' +
+    '-     prop: \'value\'\n' +
+    '-   }\n' +
+    '- }\n' });
+
+  assert.notDeepStrictEqual(new Error('a', { cause: new Error('x') }), new Error('a', { cause: new Error('y') }));
+  assert.notDeepStrictEqual(
+    new Error('a', { cause: { prop: 'value' } }),
+    new Error('a', { cause: { prop: 'a different value' } })
+  );
+});
Repository: denoland/deno
Pull request: ci: use self-hosted mac arm runner only on main branch

We can have 2 concurrent runs now, so
it's worth trying it out on `main`.

Changed files:
filename: .github/workflows/ci.generate.ts
patch: @@ -42,7 +42,7 @@ const Runners = {
     os: "macos",
     arch: "aarch64",
     runner:
-      `\${{ github.repository == 'denoland/deno' && startsWith(github.ref, 'refs/tags/') && '${selfHostedMacosArmRunner}' || '${macosArmRunner}' }}`,
+      `\${{ github.repository == 'denoland/deno' && github.ref == 'refs/heads/main' && '${selfHostedMacosArmRunner}' || '${macosArmRunner}' }}`,
   },
   windowsX86: {
     os: "windows",

filename: .github/workflows/ci.yml
patch: @@ -68,12 +68,12 @@ jobs:
             skip: '${{ !contains(github.event.pull_request.labels.*.name, ''ci-full'') && (github.event_name == ''pull_request'') }}'
           - os: macos
             arch: aarch64
-            runner: '${{ github.repository == ''denoland/deno'' && startsWith(github.ref, ''refs/tags/'') && ''self-hosted'' || ''macos-14'' }}'
+            runner: '${{ github.repository == ''denoland/deno'' && github.ref == ''refs/heads/main'' && ''self-hosted'' || ''macos-14'' }}'
             job: test
             profile: debug
           - os: macos
             arch: aarch64
-            runner: '${{ (!contains(github.event.pull_request.labels.*.name, ''ci-full'') && (github.event_name == ''pull_request'')) && ''ubuntu-24.04'' || github.repository == ''denoland/deno'' && startsWith(github.ref, ''refs/tags/'') && ''self-hosted'' || ''macos-14'' }}'
+            runner: '${{ (!contains(github.event.pull_request.labels.*.name, ''ci-full'') && (github.event_name == ''pull_request'')) && ''ubuntu-24.04'' || github.repository == ''denoland/deno'' && github.ref == ''refs/heads/main'' && ''self-hosted'' || ''macos-14'' }}'
             job: test
             profile: release
             skip: '${{ !contains(github.event.pull_request.labels.*.name, ''ci-full'') && (github.event_name == ''pull_request'') }}'
Repository: huggingface/transformers
Pull request: from 1.11.0, torchao.prototype.low_bit_optim is promoted to torchao.optim

per https://github.com/pytorch/ao/tree/main/torchao/prototype, from1.11.0, `torchao.prototype.low_bit_optim` is promoted to `torchao.optim`, so will have `AttributeError: module 'torchao.prototype' has no attribute 'low_bit_optim' ` w/ torchao 1.11.0. 

@ydshieh , pls help review, thx.

Changed files:
filename: tests/trainer/test_trainer.py
patch: @@ -5368,19 +5368,19 @@ def hp_name(trial):
             )
         )
     if is_torchao_available():
-        import torchao
+        from torchao.optim import AdamW4bit, AdamW8bit
 
         optim_test_params.append(
             (
                 OptimizerNames.ADAMW_TORCH_4BIT,
-                torchao.prototype.low_bit_optim.AdamW4bit,
+                AdamW4bit,
                 default_adam_kwargs,
             )
         )
         optim_test_params.append(
             (
                 TrainingArguments(optim=OptimizerNames.ADAMW_TORCH_8BIT, output_dir="None"),
-                torchao.prototype.low_bit_optim.AdamW8bit,
+                AdamW8bit,
                 default_adam_kwargs,
             )
         )
Repository: ggml-org/llama.cpp
Pull request: llama-bench : use local GPUs along with RPC servers

Currently if RPC servers are specified with '--rpc' and there is a local GPU available (e.g. CUDA), the benchmark will be performed only on the RPC device(s) but the backend result column will say "CUDA,RPC" which is incorrect. This patch is adding all local GPU devices and makes llama-bench consistent with llama-cli.


Changed files:
filename: tools/llama-bench/llama-bench.cpp
patch: @@ -950,6 +950,7 @@ struct cmd_params_instance {
                 }
                 static std::vector<ggml_backend_dev_t> devices;
                 devices.clear();
+                // RPC devices should always come first for performance reasons
                 for (const std::string & server : rpc_servers) {
                     ggml_backend_dev_t dev = ggml_backend_rpc_add_device_fn(server.c_str());
                     if (dev) {
@@ -959,6 +960,20 @@ struct cmd_params_instance {
                         exit(1);
                     }
                 }
+                // add local GPU devices if any
+                for (size_t i = 0; i < ggml_backend_dev_count(); ++i) {
+                    ggml_backend_dev_t dev = ggml_backend_dev_get(i);
+                    switch (ggml_backend_dev_type(dev)) {
+                        case GGML_BACKEND_DEVICE_TYPE_CPU:
+                        case GGML_BACKEND_DEVICE_TYPE_ACCEL:
+                            // skip CPU backends since they are handled separately
+                            break;
+
+                        case GGML_BACKEND_DEVICE_TYPE_GPU:
+                            devices.push_back(dev);
+                            break;
+                    }
+                }
                 devices.push_back(nullptr);
                 mparams.devices = devices.data();
             }
Repository: denoland/deno
Pull request: ci: try fix cache


Changed files:
filename: .github/workflows/ci.generate.ts
patch: @@ -59,6 +59,15 @@ const Runners = {
 
 const prCacheKeyPrefix =
   `${cacheVersion}-cargo-target-\${{ matrix.os }}-\${{ matrix.arch }}-\${{ matrix.profile }}-\${{ matrix.job }}-`;
+const prCacheKey = `${prCacheKeyPrefix}\${{ github.sha }}`;
+const prCachePath = [
+  // this must match for save and restore (https://github.com/actions/cache/issues/1444)
+  "./target",
+  "!./target/*/gn_out",
+  "!./target/*/gn_root",
+  "!./target/*/*.zip",
+  "!./target/*/*.tar.gz",
+].join("\n");
 
 // Note that you may need to add more version to the `apt-get remove` line below if you change this
 const llvmVersion = 19;
@@ -612,7 +621,7 @@ const ci = {
               `${cacheVersion}-cargo-home-\${{ matrix.os }}-\${{ matrix.arch }}-\${{ hashFiles('Cargo.lock') }}`,
             // We will try to restore from the closest cargo-home we can find
             "restore-keys":
-              `${cacheVersion}-cargo-home-\${{ matrix.os }}-\${{ matrix.arch }}`,
+              `${cacheVersion}-cargo-home-\${{ matrix.os }}-\${{ matrix.arch }}-`,
           },
         },
         {
@@ -622,13 +631,7 @@ const ci = {
           if:
             "github.ref != 'refs/heads/main' && !startsWith(github.ref, 'refs/tags/')",
           with: {
-            path: [
-              "./target",
-              "!./target/*/gn_out",
-              "!./target/*/gn_root",
-              "!./target/*/*.zip",
-              "!./target/*/*.tar.gz",
-            ].join("\n"),
+            path: prCachePath,
             key: "never_saved",
             "restore-keys": prCacheKeyPrefix,
           },
@@ -1080,14 +1083,8 @@ const ci = {
           if:
             "(matrix.job == 'test' || matrix.job == 'lint') && github.ref == 'refs/heads/main'",
           with: {
-            path: [
-              "./target",
-              "!./target/*/gn_out",
-              "!./target/*/*.zip",
-              "!./target/*/*.sha256sum",
-              "!./target/*/*.tar.gz",
-            ].join("\n"),
-            key: prCacheKeyPrefix + "${{ github.sha }}",
+            path: prCachePath,
+            key: prCacheKey,
           },
         },
       ]),

filename: .github/workflows/ci.yml
patch: @@ -362,7 +362,7 @@ jobs:
             ~/.cargo/registry/index
             ~/.cargo/registry/cache
           key: '30-cargo-home-${{ matrix.os }}-${{ matrix.arch }}-${{ hashFiles(''Cargo.lock'') }}'
-          restore-keys: '30-cargo-home-${{ matrix.os }}-${{ matrix.arch }}'
+          restore-keys: '30-cargo-home-${{ matrix.os }}-${{ matrix.arch }}-'
         if: '!(matrix.skip)'
       - name: Restore cache build output (PR)
         uses: actions/cache/restore@v4
@@ -682,8 +682,8 @@ jobs:
           path: |-
             ./target
             !./target/*/gn_out
+            !./target/*/gn_root
             !./target/*/*.zip
-            !./target/*/*.sha256sum
             !./target/*/*.tar.gz
           key: '30-cargo-target-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.profile }}-${{ matrix.job }}-${{ github.sha }}'
   publish-canary:
Repository: denoland/deno
Pull request: fix(lint): do not error providing --allow-import

Closes https://github.com/denoland/deno/issues/27318

Changed files:
filename: cli/args/flags.rs
patch: @@ -2904,6 +2904,7 @@ To ignore linting on an entire file, you can add an ignore comment at the top of
       .arg(watch_arg(false))
       .arg(watch_exclude_arg())
       .arg(no_clear_screen_arg())
+      .arg(allow_import_arg())
   })
 }
 
@@ -5083,6 +5084,7 @@ fn lint_parse(
   unstable_args_parse(flags, matches, UnstableArgsConfig::ResolutionOnly);
   ext_arg_parse(flags, matches);
   config_args_parse(flags, matches);
+  allow_import_parse(flags, matches);
 
   let files = match matches.remove_many::<String>("files") {
     Some(f) => f.collect(),
@@ -7141,6 +7143,7 @@ mod tests {
     let r = flags_from_vec(svec![
       "deno",
       "lint",
+      "--allow-import",
       "--watch",
       "script_1.ts",
       "script_2.ts"
@@ -7162,6 +7165,10 @@ mod tests {
           compact: false,
           watch: Some(Default::default()),
         }),
+        permissions: PermissionFlags {
+          allow_import: Some(vec![]),
+          ..Default::default()
+        },
         ..Flags::default()
       }
     );
Repository: ggml-org/llama.cpp
Pull request: CUDA: fix pointer incrementation in FA

Fixes https://github.com/ggml-org/llama.cpp/issues/14888 (I was unable to reproduce the issue).

It seems that I forgot to correctly increment the pointers when skipping tiles. I moved the pointer incrementation into the for loop itself to ensure that it always happens.

Changed files:
filename: ggml/src/ggml-cuda/fattn-vec-f16.cuh
patch: @@ -174,7 +174,10 @@ static __global__ void flash_attn_vec_ext_f16(
     K     += blockIdx.y*D * nb11;
     V     += blockIdx.y*D * nb21;
     maskh += blockIdx.y*D;
-    for (int k_VKQ_0 = blockIdx.y*D; k_VKQ_0 < ne11; k_VKQ_0 += gridDim.y*D) {
+    for (int k_VKQ_0 = blockIdx.y*D; k_VKQ_0 < ne11; k_VKQ_0 += gridDim.y*D,
+             // Increment pointers after each loop:
+             K += gridDim.y*D*nb11, V += gridDim.y*D*nb21, maskh += gridDim.y*D) {
+
         // Calculate KQ tile and keep track of new maximum KQ values:
 
         if (mask) {
@@ -291,10 +294,6 @@ static __global__ void flash_attn_vec_ext_f16(
             }
         }
 
-        K     += gridDim.y*D * nb11;
-        V     += gridDim.y*D * nb21;
-        maskh += gridDim.y*D;
-
         __syncthreads();
     }
 

filename: ggml/src/ggml-cuda/fattn-vec-f32.cuh
patch: @@ -180,7 +180,10 @@ static __global__ void flash_attn_vec_ext_f32(
     K     += blockIdx.y*D * nb11;
     V     += blockIdx.y*D * nb21;
     maskh += blockIdx.y*D;
-    for (int k_VKQ_0 = blockIdx.y*D; k_VKQ_0 < ne11; k_VKQ_0 += gridDim.y*D) {
+    for (int k_VKQ_0 = blockIdx.y*D; k_VKQ_0 < ne11; k_VKQ_0 += gridDim.y*D,
+             // Increment pointers after each loop:
+             K += gridDim.y*D*nb11, V += gridDim.y*D*nb21, maskh += gridDim.y*D) {
+
         // Calculate KQ tile and keep track of new maximum KQ values:
 
         if (mask) {
@@ -286,10 +289,6 @@ static __global__ void flash_attn_vec_ext_f32(
             }
         }
 
-        K     += gridDim.y*D * nb11;
-        V     += gridDim.y*D * nb21;
-        maskh += gridDim.y*D;
-
         __syncthreads();
     }
Repository: ggml-org/llama.cpp
Pull request: ops : update BLAS

Ran the `test-backend-ops support` separately with Metal and BLAS

Changed files:
filename: docs/ops.md
patch: @@ -72,7 +72,6 @@ Legend:
 |                      REPEAT_BACK | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
 |                         RMS_NORM | ❌ | ✅ | ✅ | 🟡 | ✅ | ✅ |
 |                    RMS_NORM_BACK | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ |
-|                     RMS_NORM_MUL | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
 |                 RMS_NORM_MUL_ADD | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
 |                             ROLL | ❌ | ✅ | ❌ | ❌ | ❌ | ✅ |
 |                             ROPE | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |