emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 6c540e38f4 7/8: Merge from origin/emacs-29


From: Stefan Kangas
Subject: master 6c540e38f4 7/8: Merge from origin/emacs-29
Date: Sun, 18 Dec 2022 23:01:24 -0500 (EST)

branch: master
commit 6c540e38f4d9528f8e6dfdc44d1b95840efab456
Merge: 0ef6d4c34f 12e26cc0c1
Author: Stefan Kangas <stefankangas@gmail.com>
Commit: Stefan Kangas <stefankangas@gmail.com>

    Merge from origin/emacs-29
    
    12e26cc0c1b ; * admin/git-bisect-start: Add mistakenly ommitted commi...
    9a751e0a38b ruby-mode: Support endless singleton method definitions too
    ce7b7e5af3d Remove comment-start-skip preset in tree-sitter indentati...
    c1e015ae320 Fix recent change in tramp-smb.el
    cf1b771864a ; * etc/NEWS: Fix typos.
    50d18bb6ea7 Make tramp-archive autoloads robust for older Emacs versions
    3941cc29df3 ; Improve documentation of 'setopt'
    6f88de109c8 ruby-mode: Support endless methods (bug#54702)
    91dd893e343 ; * lisp/progmodes/sql.el (sql-product-interactive): Doc ...
    138d9dc4cb0 * lisp/cus-edit.el (setopt--set): Warn instead of rasing ...
    d1e0542f336 Allow customising windmove user options with an empty prefix
    c2375e77914 Improve and extend admin/git-bisect-start
    7cc2313eb0a Make 'rmail-summary-by-thread' faster
    88e59b16cbe ; Improve documentation of installing tree-sitter and gra...
    897f33bf316 Fix the MS-DOS build
    660e941235d Avoid crashes in PGTK build due to signal in 'note_mouse_...
    0fc5fb2d054 Fix MS-Windows build broken by recent treesit.c changes
    5b2e6d04ce2 Fix wrong capture in typescript-ts-mode (bug#60167)
    cb8ccdd2670 Add rust-ts-mode (Bug#60136)
    9fcf764dd73 Indentation fixes for jsx/tsx (bug#60169)
    69f2c71135f Fix treesit-query-validate problem with view-mode
    1fc7535546c Use cursor API in treesit-node-parent
    5f0286c0afa Switch to use cursor API in treesit.c
    a275e436df4 Add treesit_assume_true and treesit_cursor_helper
    a54c7a8df0c Remove file-exists-in-trash-p
    3e02029642c Update to Org 9.6-49-g47d129
    4a8ff671b0e Don’t assume make-directory handler returns nil
    44c83b239d3 Fix copy-directory bug when dest dir exists
    bef1edc9cac make-directory now returns t if dir already exists
    8a9579ca29d Use make-directory handlers uniformly
    627e7e0243d Improve documentation of 'file-exists-p'
    c9015ef55ff Fix resizing of mini-windows by 'set-minibuffer-message'
    5a245bc786e Prevent Abort dialogs from async-compiling jobs on Windows
    4d1e4a48938 Fix 'window-max-chars-per-line' when there are no fringes
    d65beb820cc ; Revert "; * lisp/subr.el (internal--with-narrowing): Si...
    1c0b90e5f7d ruby-mode: Recognize instance or global var as first arg ...
    3356c0cb163 Fix end-of-defun in ruby-mode
    
    # Conflicts:
    #       etc/NEWS
---
 admin/git-bisect-start                          | 1623 ++++++++++++++++++++++-
 admin/notes/repo                                |    8 +-
 doc/lispref/files.texi                          |   17 +-
 doc/lispref/modes.texi                          |   28 +-
 doc/lispref/parsing.texi                        |   14 -
 doc/lispref/variables.texi                      |   13 +-
 doc/misc/org.org                                |   13 +-
 etc/NEWS.29                                     |   71 +-
 lisp/cus-edit.el                                |    2 +-
 lisp/emacs-lisp/comp.el                         |    7 +-
 lisp/files.el                                   |   96 +-
 lisp/gnus/nnmaildir.el                          |    2 +-
 lisp/ido.el                                     |    2 +-
 lisp/mail/rmailsum.el                           |   62 +-
 lisp/net/tramp-archive.el                       |    9 +-
 lisp/net/tramp-smb.el                           |   13 +-
 lisp/net/tramp.el                               |    6 +-
 lisp/org/ob-R.el                                |    4 +-
 lisp/org/ob-octave.el                           |    2 +-
 lisp/org/org-element.el                         |    1 +
 lisp/org/org-persist.el                         |  252 ++--
 lisp/org/org-version.el                         |    2 +-
 lisp/org/org.el                                 |   12 +-
 lisp/org/ox.el                                  |   31 +-
 lisp/progmodes/c-ts-mode.el                     |    1 -
 lisp/progmodes/eglot.el                         |    2 +-
 lisp/progmodes/js.el                            |   11 +-
 lisp/progmodes/ruby-mode.el                     |   38 +-
 lisp/progmodes/rust-ts-mode.el                  |  371 ++++++
 lisp/progmodes/sql.el                           |    3 +-
 lisp/progmodes/typescript-ts-mode.el            |   17 +-
 lisp/subr.el                                    |    7 +-
 lisp/treesit.el                                 |   26 +-
 lisp/windmove.el                                |    3 +-
 lisp/window.el                                  |   15 +-
 src/fileio.c                                    |    5 -
 src/lread.c                                     |   15 +-
 src/treesit.c                                   |  410 ++++--
 src/xdisp.c                                     |   18 +-
 test/lisp/files-tests.el                        |   26 +-
 test/lisp/progmodes/ruby-mode-resources/ruby.rb |   38 +
 test/lisp/progmodes/ruby-mode-tests.el          |   12 +
 test/src/treesit-tests.el                       |  135 ++
 43 files changed, 2942 insertions(+), 501 deletions(-)

diff --git a/admin/git-bisect-start b/admin/git-bisect-start
index dcb291a3ac..945d4901c1 100755
--- a/admin/git-bisect-start
+++ b/admin/git-bisect-start
@@ -1,7 +1,8 @@
 #!/bin/bash
 
-### Start a git bisection, and prune the branches that are the result of
-### merging external trees into the Emacs repository.
+### Start a git bisection, ensuring that commits in branches that are
+### the result of merging external trees into the Emacs repository, as
+### well as certain commits on which Emacs fails to build, are skipped.
 
 ## Copyright (C) 2022 Free Software Foundation, Inc.
 
@@ -22,23 +23,1617 @@
 
 ### Commentary:
 
-## Marking the last commits of external tree merges as "good" ensures
-## that all the commits between the external tree root and the merge
-## (excluding the merge-commit itself) are regarded as "good", so "git
-## bisect" will never descend into these branches, which only have the
-## files of the external tree, and in which Emacs can therefore not be
-## built.  The last commit is the parent of the merge commit in the
-## external tree, that is, the parent of the merge commit that is not
-## on master.
+## This script can be executed directly, at the root of the Emacs
+## repository, with:
+##
+## ./admin/git-bisect-start
+##
+## The arguments to that script, if any, are passed to 'git bisect
+## start' (see 'git help bisect' for a description of the arguments
+## that can be used with 'git bisect start').
+##
+## It can also be executed automatically, when 'git bisect start' is
+## called, with the help of the following wrapper script, that should
+## be named 'git' and should be placed before the actual git binary in
+## PATH.  This is useful in particular when git is used through an
+## interface such as Magit.
+##
+## #!/bin/bash
+## REAL_GIT=$(which -a git | sed -n 2p)
+## [ -z $REAL_GIT ] && { echo "fatal: 'git' not found"; exit 128; }
+## if [[ "$($REAL_GIT rev-parse --show-toplevel 2> /dev/null)" == "$(pwd)" ]] 
&&
+##    [ -x ./admin/git-bisect-start ] &&
+##    [[ "$1" == "bisect" && "$2" == "start" ]]
+## then
+##   shift 2
+##   exec env REAL_GIT=$REAL_GIT ./admin/git-bisect-start "$@"
+## else
+##   exec $REAL_GIT "$@"
+## fi
 
 ### Code:
 
-git bisect start
+[ -z $REAL_GIT ] && REAL_GIT=git
+
+$REAL_GIT bisect start "$@"
+
+## After the merge of an external tree, the last commit in the
+## external tree and all its parents should be skipped, because Emacs
+## cannot be built on these commits, as they only contain the files of
+## the external tree.  That last commit that should be placed after a
+## '# SKIP-BRANCH ' below is the parent of the merge commit in the
+## external tree, that is, the parent of the merge commit that is not
+## already on master.  In other words, it is the parent of the merge
+## commit for which 'git rev-list --max-parents=0 <commit>' does not
+## include ce5584125c44a1a2fbb46e810459c50b227a95e2 (which is the root
+## commit of the Emacs respository).
+
+for C in $(cat $0 | grep '^# SKIP-BRANCH ' | sed 's/^# SKIP-BRANCH //')
+do
+  $REAL_GIT bisect skip $($REAL_GIT rev-list $C)
+done
 
 # Prune commits 1e5b753bf4..806734c1b1 introduced by 0186faf2a1
 # (Eglot merge on Oct 20 2022)
-git bisect good 806734c1b1f433de43d59d9a5e3a1e89d64315f6
+# SKIP-BRANCH 806734c1b1f433de43d59d9a5e3a1e89d64315f6
 
-# Prune commits 31ea42e15e..a6cbfdd8f1 introduced by 4a1e9d61b5
+# Prune commits 31ea42e15e..58cc931e92 introduced by 4a1e9d61b5
 # (use-package merge on Nov 30 2022)
-git bisect good 58cc931e92ece70c3e64131ee12a799d65409100
+# SKIP-BRANCH 58cc931e92ece70c3e64131ee12a799d65409100
+
+## The list below is the exhaustive list of all commits between Dec 1
+## 2016 and Nov 30 2022 on which building Emacs with the default
+## options, on a GNU/Linux computer and with GCC, fails.  It is
+## possible (though unlikely) that building Emacs with non-default
+## options, with other compilers, or on other platforms, would succeed
+## on some of these commits.  It is of course also possible (and
+## likely) that building Emacs on some commits not present in that
+## list will fail with non-default options, with other compilers, or
+## on other platforms.
+
+$REAL_GIT bisect skip $(cat $0 | grep '^# SKIP-SINGLE ' | sed 's/^# 
SKIP-SINGLE //')
+
+# SKIP-SINGLE f37f93f364aed34275f515a8c933f48a0e2735b9
+# SKIP-SINGLE ba8e883fa30f1267c27751c1ee9df25a5dde4c0c
+# SKIP-SINGLE 3ef50c1ff691b0a6c2f56da76f7c1c9b572d8be8
+# SKIP-SINGLE 54f52a1390c394f42203f39d0b4d73318203e092
+# SKIP-SINGLE 128cacda1c79983f0b64773afc029bc757cfb7b8
+# SKIP-SINGLE fa7d1f075fb862ae4ca28390abf33d625dbd2813
+# SKIP-SINGLE 16ac7c0fc91b5eb09f2a129fc2c01281369f897a
+# SKIP-SINGLE 8ad92413b9349613f9815bd0aaf523896a84b479
+# SKIP-SINGLE 137898d89359c63ec05d7bb5eedc2d2f59102a11
+# SKIP-SINGLE 66a5abb102ec1d6e4c327632ef235d1eb6433291
+# SKIP-SINGLE e4deba098e0281538a0e7b04d849989f17e5bcc7
+# SKIP-SINGLE de4624c99ea5bbe38ad5aff7b6461cc5c740d0be
+# SKIP-SINGLE bfa88520136dd6b187ba101e6db5a5f8f0d5e874
+# SKIP-SINGLE f441451658ecb8d0d8ba386d9fd3eebf3b17d549
+# SKIP-SINGLE bf7f7c0d82a56ed1b76358657e74ca2833b19fe2
+# SKIP-SINGLE a1cb68be6c94513c436fd52e4453cb7afe28f2ba
+# SKIP-SINGLE 25d38a06eceb0853190a2d9acf53d85686f524bd
+# SKIP-SINGLE a7e4870f165e9fd36d5cfcabb19b215b94373602
+# SKIP-SINGLE 6a82d19db18f8480342cc4c1a0ad76c75df41941
+# SKIP-SINGLE cd0e63652445c90af7167b48d83e410af1e6e590
+# SKIP-SINGLE 097b1686b6ac518ba8c2ae225eb62560c2010431
+# SKIP-SINGLE 27accec97022a49b362feeb36293fdce2947eb43
+# SKIP-SINGLE e0e95199b93a232e5d4da67823364676ca9cb67c
+# SKIP-SINGLE 36cbe217c818000d90fea132f0c8041f06748502
+# SKIP-SINGLE 6b4195f2ace1f6328c5a833fde40f39babef4fa6
+# SKIP-SINGLE 4e6140b28324a9a63d54084c920206d00aed094e
+# SKIP-SINGLE 19cb3985a3795539b51d70625904e95a6e581eef
+# SKIP-SINGLE c52a9b6ddd9166571e6bc8bb9426b0267874f9fa
+# SKIP-SINGLE 8189b97e5ca12aff8ea34617431a868010643b5b
+# SKIP-SINGLE 0d3c57dcf3187864c0b6fd6115ee80ad33faf553
+# SKIP-SINGLE 23a130ee0d61fc39cee157921679809017a02b39
+# SKIP-SINGLE fbe6b90b0ced594cf74d5fd0dc9a32666f0d7d38
+# SKIP-SINGLE 5f3379b33866ff7dc16856b6c29712eae860af0e
+# SKIP-SINGLE 46193d5209780d21b848374d8c377fb6c8896d1b
+# SKIP-SINGLE 522f16dac945eee351cefb066af40f0d1a683f38
+# SKIP-SINGLE 1fcbd352f8116aca1ecdb62e84f3d86b89bc446f
+# SKIP-SINGLE 086c4eaf9d4ecc5074088115fa01c0b2fb061246
+# SKIP-SINGLE 37956463d67795819fe7d8fe02d6249388364783
+# SKIP-SINGLE 309b46420e83826ed1e0b947f98a47e8525e3c36
+# SKIP-SINGLE 8c0f326ea237e8acd03c51c1b3a44d237c044562
+# SKIP-SINGLE 88549ec38e9bb30e338a9985d0de4e6263b40fb7
+# SKIP-SINGLE 99af58d74e431da6b55f21272bf72a9f56ce0900
+# SKIP-SINGLE 630e2d2e6aeba60f178c6ef2b283622070b873b3
+# SKIP-SINGLE 79f017d5c3019f8bc2a5014beda28bb3b829a8e3
+# SKIP-SINGLE 78f869687e86d4a9f91003dbbbbacde2e2741487
+# SKIP-SINGLE 3ea055c90ed0b6c486518265300fa7219f8e5a29
+# SKIP-SINGLE b91bfa10413182654a76d0ba337198f39a4d0e8e
+# SKIP-SINGLE 7cc95d4d86e5a9f2df248d2aa7c8cc423c8f06e3
+# SKIP-SINGLE cb70725584a754a491ddad82c42278f17c714a2f
+# SKIP-SINGLE 0b544b676473dedf34c6cb6a3315bec1f42d7162
+# SKIP-SINGLE 8929746489bb257d1e29c3bab629b3b67e3117d2
+# SKIP-SINGLE 064541af6a71bf45d530fe34b7e00c8123ee93d8
+# SKIP-SINGLE 501ad546263ed2a902be1c9d8c1bb3af5794066b
+# SKIP-SINGLE 236648fe2623a10c8ca02637b79cd0ceffd0b6b9
+# SKIP-SINGLE 1b4442bee921d6698fc8ecac1c95c39f7ca2efe4
+# SKIP-SINGLE 8ed8ef307d9a28f6c3336a448c7fbdfe8a733d83
+# SKIP-SINGLE adfb6f1dc26a927cf4bab24bdfae54b51e3ae0ec
+# SKIP-SINGLE 6220faeb4e9be16b9dec728e72ea8dff2cfe35ba
+# SKIP-SINGLE 5ec3a58462e99533ea5200de356302181d634d0b
+# SKIP-SINGLE 04ea55fa471f0c75eeee6ccea33cf91c81fc246c
+# SKIP-SINGLE e9ec1c5b26139057f85548184ee4b47f3e29f564
+# SKIP-SINGLE ee9970734facdff57c79811a7b60973a0b9ec6b2
+# SKIP-SINGLE 4c1d7acf81a4dcec97fa4daf9e9f414e1321bfdb
+# SKIP-SINGLE 01ebe5dc0b1c71191f6a713fec245a188d587772
+# SKIP-SINGLE d8cca4d8c56a90ec9215d7bfb0b0edfa3a36ad4f
+# SKIP-SINGLE 382f6603ad4ba2a69b3961bdc68580ce77d222f9
+# SKIP-SINGLE 490fc5a5029c0d8e527a0c7f423ba83fd6afda60
+# SKIP-SINGLE cadb044fc2e69266308cdcabe6181be0f624b484
+# SKIP-SINGLE fea1ad36a0f7b1538984ab0f077095a53c570aa4
+# SKIP-SINGLE 84eef501554324b22c7a838aabed77aa79315121
+# SKIP-SINGLE 44c95c58b26b7b9d75965a83930ec3d77ffae28f
+# SKIP-SINGLE de456d1e4a1d7e34be6d040e0d8a04c42b14e62e
+# SKIP-SINGLE ce16aba66d39c076aeef0c898403e44cbfbfabbb
+# SKIP-SINGLE 89159e78bb449d3c13506a37d4a5df4424958279
+# SKIP-SINGLE 4db844a4532592ed2542c05a1747dad7ed319e15
+# SKIP-SINGLE 5b0fdefb4ca54b0d3dac3047ac1e4b380beb6ba7
+# SKIP-SINGLE c1e71d3899daca49e216dfa3a6e6e07169d02e1e
+# SKIP-SINGLE 735ae5cd3a76735c1b51913eaeff5df5f0b2b53e
+# SKIP-SINGLE e0150de010af2d9770380217f90bdc09592c968e
+# SKIP-SINGLE d22ddf5944b97ca7f853d034f9e2e812d9bf5552
+# SKIP-SINGLE 46dafe4103d1d24a9ec9b3a7a561829bcd5807aa
+# SKIP-SINGLE 622c24a2b75a564b9861fc3ca7a7878741e8568d
+# SKIP-SINGLE 6e45de6bacc508db11b15b2c8ba86aad8c0570df
+# SKIP-SINGLE 2d0a3feda61186319b7c834ee08c96926dd7ab92
+# SKIP-SINGLE 53f8f4bf2db097f4a2c68194c55a87c5a1176c8c
+# SKIP-SINGLE 2205546269bf5af01d766dc38720f71046b08dfa
+# SKIP-SINGLE e589018b48f802d69f62ab1e7e266df1c7d8cf68
+# SKIP-SINGLE fe304efa5155cd6a5c20a0731475a0ad6d087c4c
+# SKIP-SINGLE a1f93c1dfa53dbe007faa09ab0c6e913e86e3ffe
+# SKIP-SINGLE a02885a37031ec0e199dcb38ff9cb93e65e7b7cb
+# SKIP-SINGLE b20d05c6d76ddaf7e70da1430c9aac56ef1d6b31
+# SKIP-SINGLE 5317193fe55d130a456fe0cf06c56f027d617b09
+# SKIP-SINGLE 03f63888923404cd99023b853294f92536d3c87c
+# SKIP-SINGLE ea9acccd643272962831b63d932e283b8ecca7a7
+# SKIP-SINGLE 6df3eea9380f3684475e205a680804f3ff355402
+# SKIP-SINGLE 6fa9cc0593150a318f0e08e69ec10672d548a7c1
+# SKIP-SINGLE 4713dd425beac5cb459704e67dcb8f6faf714375
+# SKIP-SINGLE 2f6769f9cdb799e880fdcc09057353a0a2349bfc
+# SKIP-SINGLE 8bb5d7adaf45264900385530c7f76175ba490a77
+# SKIP-SINGLE 43c84577a3055d5ddf1f5d1b999e6ecca6139f60
+# SKIP-SINGLE 66dc8dd6d13d37ef23b52873293d95d87dca497f
+# SKIP-SINGLE 1c91bc9221d12618c9fb5507561dd35b7e392cb6
+# SKIP-SINGLE ace38bafa6ae0d40bf3fac9f998c8ecbe36d5f41
+# SKIP-SINGLE d354fc38286cba05b3ba2fefb9d9cd6d30deac3d
+# SKIP-SINGLE eb52828a439f674733ba70844b795c6673733572
+# SKIP-SINGLE 401e41df0c6aee6c071a26e0b89f16c70375fc2d
+# SKIP-SINGLE d812d20fbc3e1eff0f10443baed801adda9031cd
+# SKIP-SINGLE a3b8618d79657af0d7fea9cb6fd914ccf0f67849
+# SKIP-SINGLE 89898e43c7ceef28bb3c2116b4d8a3ec96d9c8da
+# SKIP-SINGLE 72d7961d678f9c5f4cb812e0bb9b6dffafb47c68
+# SKIP-SINGLE b1fe497a445a8be1b50c5b5952f3380ee9546710
+# SKIP-SINGLE 0ca61907cf4fe8afc723ed1e89e1a15ee69507ce
+# SKIP-SINGLE e8875bcbe067ea020dba95530ec4e9485942babd
+# SKIP-SINGLE a6b375ba4bfc9453abc428dcb73e65bfcf61b794
+# SKIP-SINGLE d490770dd09f1121b637eebdad82531de654189b
+# SKIP-SINGLE b389379c87481b6bc647ceb4d323f861281cad72
+# SKIP-SINGLE 4364a769b489c044c4e9eeac6cfbabcc844ab332
+# SKIP-SINGLE cd56490fef9cf585708b9d11de2f3f2ec1e2d5b2
+# SKIP-SINGLE 992e2019d3c535a61df064de25f664c01b8c309f
+# SKIP-SINGLE 41a5b76f79e2ef12a089e94406159e2d0e1fad1f
+# SKIP-SINGLE 3533623c4a007df80d57fe2dbc47d7e40d85041c
+# SKIP-SINGLE 21fa90b0488b2344b9b93ccc77263968d1b903b7
+# SKIP-SINGLE aca21d42d3c1327ddc202a03585416f2821e6839
+# SKIP-SINGLE 0f8343394675480f18c121520eed2203bbe1d6ec
+# SKIP-SINGLE d831312d668fbedeffe3711b13cd455309da84a1
+# SKIP-SINGLE 0c98dec5c9d0e0146a1519b9a7e099aae668c059
+# SKIP-SINGLE 491531b20d05a0f2cc747aa01e697a764c34a99d
+# SKIP-SINGLE 861824dbecc96339c68b1e15008a21c31e04721b
+# SKIP-SINGLE a13eaddce2ddbe3ba0b7f4c81715bc0fcdba99f6
+# SKIP-SINGLE 4ad6be65f68a5c875ecbaa9e66d8ced28f43670a
+# SKIP-SINGLE 2d42bf7f5e57001a836b7b4e6303fac9d3f00a1d
+# SKIP-SINGLE 2e3a33659fb85330ec76a67b2113472e7e0b546a
+# SKIP-SINGLE d0397f4a5764d3be93be3e3d35bccc1bf27522cf
+# SKIP-SINGLE d5ead735a07e619e514dd10b9e84e5d788b8a5f0
+# SKIP-SINGLE b8e0d203febffe7446cbc5e0ee7d9bf168854a88
+# SKIP-SINGLE 932698b7891668318ba9ca93375d8d27d52a07f5
+# SKIP-SINGLE 09eaf661eb6ea49c6324d8819a872c523133dc2b
+# SKIP-SINGLE 630df0587e1069b2cd2f2536d5fb61175adac3a2
+# SKIP-SINGLE edc63bf94f3cd3f52fab86fe7b92a3ec6a19de40
+# SKIP-SINGLE 47122295521c63febe9fc64680430812da3a3acf
+# SKIP-SINGLE 750721c3943e5837d7d9292d6462a144a49347c7
+# SKIP-SINGLE 1cad61030160ebc4b73e1f4212155a180d417be3
+# SKIP-SINGLE c68cce94c46140f2ad1411550427d3cc2658ec02
+# SKIP-SINGLE 8750a4546a1da4f03243df12c7e5b89f2c32d27e
+# SKIP-SINGLE 8d96feae07c618f591a952f8f10ae949735b4050
+# SKIP-SINGLE 92879a1b035baf297158812ccdbaf6ae1d157e16
+# SKIP-SINGLE bdd0c8600fcd33b6f8a535a66343591a29575042
+# SKIP-SINGLE 58430f29968a5661caff630d20dbbe7c864fe08d
+# SKIP-SINGLE f3b24e90dc9fad355102e1fdf2828ca33d447a07
+# SKIP-SINGLE 1bf7ca623b3d3e02617cf0b5f8d7f980384838d3
+# SKIP-SINGLE 0ef7f64407525a1e1bcc8aef4d1fd19a1cf60ec6
+# SKIP-SINGLE 23d3eeb798c7edc27898b0dbd4c2364a6ca6247d
+# SKIP-SINGLE 28718c4449972640c39a7be1b62ccc7f50c6e801
+# SKIP-SINGLE e6750596ef55352c260c200747bec3303e181fe8
+# SKIP-SINGLE fc05d4fec98387097c30a5c60e2f343cb797af26
+# SKIP-SINGLE 96644ed496cfc36ef886c401250203c57d77ab75
+# SKIP-SINGLE 86e512ed10d83e2d233cfb95bff68b6c05729686
+# SKIP-SINGLE a855473b7079b467ac01dbcee89cb57b3599fdac
+# SKIP-SINGLE e8adf68824178ea25a5fda0c53233a42883de861
+# SKIP-SINGLE 393228bd7a96b121f2ffba5fb7072a6cbf5ecefd
+# SKIP-SINGLE ad128fee434a954da2ead75647b6396ddbf91f6a
+# SKIP-SINGLE 056548283884d61b1b9637c3e56855ce3a17274d
+# SKIP-SINGLE aa779b0f15faa114fa5e3f59b17e628b1a837af8
+# SKIP-SINGLE cb8fcbc3cbd8f6cf95bb858b72188d752672cf6b
+# SKIP-SINGLE 0397f85c6f9b0a5325f774e2a56e7cd85176e228
+# SKIP-SINGLE 22fc91704be4737865b3715e5278dc78029791bd
+# SKIP-SINGLE 6d58dda40a0a43d14dffdd995f0cb3dcc329fa4b
+# SKIP-SINGLE 5772b920f40a8c9f0a5266caf8d0f4729f6d2c13
+# SKIP-SINGLE b104d764216026d77680a79993a051725e5ab94c
+# SKIP-SINGLE 89b5a8283375f83b8f0e174a3a8760158b99be6e
+# SKIP-SINGLE 1784ce6080e4895a48ce71747a136d9642baa73e
+# SKIP-SINGLE a3e9694078e24d19db860aa4ff8dec8bc34b59b7
+# SKIP-SINGLE 5e47c2e52b9b7616668c5586084e0128b231272a
+# SKIP-SINGLE 7a762fbbfc1c05be8de3d253251f5e7b32da2c73
+# SKIP-SINGLE eebb9783e1674732b7c63d50211b524ff0fea7bd
+# SKIP-SINGLE d533f5f2a783e4c6448f841e709f4528f498b7ea
+# SKIP-SINGLE 85f6aa33f55da97b13b5e81616f16a517d24f3d5
+# SKIP-SINGLE 59f3c86659c061e2673eb0da0bc78528d30f8f76
+# SKIP-SINGLE b91455633b03add918af3eb166ac797fd6c95722
+# SKIP-SINGLE 6c106712a8d2ffd0c932541cb50cc59a6df732f4
+# SKIP-SINGLE 65d428228bb57ce434a8eb5a4eeb2274171586b8
+# SKIP-SINGLE 4219240e1df6abbd842f4474fe7862f341cc355a
+# SKIP-SINGLE 6f6639d6ed6c6314b2643f6c22498fc2e23d34c7
+# SKIP-SINGLE 633db417fc3e905b28b017facdf596b36914b44d
+# SKIP-SINGLE 28e6584861a7f80b199edcd0d9eb3d97e344958f
+# SKIP-SINGLE 9b4b2e9fc8dfd37ad8f44940a16330c477f896ea
+# SKIP-SINGLE c3ac93bb9ff8b1fe1fc32f99c725e6cc209aa6ca
+# SKIP-SINGLE 885c512603f946dfb7a45c181e94b8677be2678d
+# SKIP-SINGLE 2cb9805702a4f15ca7ee4ef4edb6e6048b1d3320
+# SKIP-SINGLE 66d37175ecac41dfb2f854dbb148dcc7ca87b345
+# SKIP-SINGLE bb47c72de35312b742a1964b31ff315727baed00
+# SKIP-SINGLE 2c39565dc046d428127735552db6e7814631d4d4
+# SKIP-SINGLE 3c2e8eff8cc9a4a535f473b3e150cb056d8f891d
+# SKIP-SINGLE d79cf638f278e50c22feb53d6ba556f5ce9d7853
+# SKIP-SINGLE 06e452a57287c797cb96a6d4b45220358daab379
+# SKIP-SINGLE 85b4e88194cae541a0093a9166f4306e6fd3109e
+# SKIP-SINGLE 9613690f6e51e2f2aa2bcbbede3e209d08cfaaad
+# SKIP-SINGLE 6735df4443fe0aa60862a95c38746edf2b053862
+# SKIP-SINGLE f07c325d1f49e4b722f76aa730ac5d084bd0e77a
+# SKIP-SINGLE 151496a4b96430924bc148f85b9c8471d1e132b1
+# SKIP-SINGLE 9793a4616833a26157b4c60278ec17a9be233d8f
+# SKIP-SINGLE dad1aeb30760ef524e95e636c22346b051233a38
+# SKIP-SINGLE 8ba61ffd8cebb0ff9f7a219022f3c1f3eac2f6d0
+# SKIP-SINGLE e9ca57cfcbaf1a8dfc6bde5a2afd5f3c7b357cb1
+# SKIP-SINGLE 682118f5a06eebdc38767047e65d42aa9356cfe8
+# SKIP-SINGLE 2825d849451be45ea738e2d2b2567c834fe5a0fb
+# SKIP-SINGLE 0263216ec39d0914f17b662a3e45b4163ab6cc78
+# SKIP-SINGLE 3ba07bfc3ec43aa10d8e2d06a8f36f7022287573
+# SKIP-SINGLE e442879b5a963a6eb37403fe09f476e7ee8e0f55
+# SKIP-SINGLE 4575ae5a9c5589ac903362486951f0d36c8ff8ee
+# SKIP-SINGLE 67afa75e2b97c08976f0e5a8502dac5851d45f93
+# SKIP-SINGLE 64eb2fc74013a221927f9bef920e367758e1bc15
+# SKIP-SINGLE 37dd95866a004a9db1d77f075715243246033773
+# SKIP-SINGLE 8af26410a91c3c9679bb0281ddd71f0dd77ec97c
+# SKIP-SINGLE 76715f8921dca740880cd22c644a6328cd810846
+# SKIP-SINGLE 678881e428073b39a906c1ffd01e1b76e271cb5d
+# SKIP-SINGLE 155ec5096928ddb121fb725fca65436d6353cb67
+# SKIP-SINGLE cc3d7580fc1cab3119e5e05c427575a2668cbb4f
+# SKIP-SINGLE e2a78b0d6d844f29acaaddd775c7b1cd6dec7af8
+# SKIP-SINGLE 45eb3b3513619d97d046a8efbe0d16fafc75a734
+# SKIP-SINGLE 27980e36040d0693fe997de6b6b73c09c3ce1cb5
+# SKIP-SINGLE cca0e79ea81712786f92a6668c61001e60d24f32
+# SKIP-SINGLE 3dea8f8f53f81a1d15a55c9e3c87a7eade7ca273
+# SKIP-SINGLE d0fac17abdf6883bbf82b1752988db38d05282e6
+# SKIP-SINGLE 8fb995b9e360270b6a4d7b7732a127a6234eba23
+# SKIP-SINGLE a770fb44288c75fa2b0471ceaf00bf741376e40f
+# SKIP-SINGLE c7e393bc4130c871a92fef7e9ac0c7c1832aa614
+# SKIP-SINGLE 0d868917efb46400cf7dd57a1cdbba7404f322a7
+# SKIP-SINGLE 025adce2cf43f4ce9f3c543c1b8973541e1414d2
+# SKIP-SINGLE 872faabbd8cb0f5518777b2d4fe7de187f684a92
+# SKIP-SINGLE d14808cd271abf6a723bf495a6a01c14d18b5893
+# SKIP-SINGLE 23eab9a6a67604b5ebcdc99efc42fbfd3345c0b0
+# SKIP-SINGLE 6d4bf2cedab365411f0aedb373b63291086658e9
+# SKIP-SINGLE 5875fbaa2dfd919a2ba22db1d20ffa6c4c6e13bd
+# SKIP-SINGLE babe0d4508273c5fe0a3228b3d2b4d3dcb72cd58
+# SKIP-SINGLE eb83344fc7c08ec08b51e7700f1ac2632afa462c
+# SKIP-SINGLE 5c3dba24ef5f40825a01e30d2790c66df202b8b1
+# SKIP-SINGLE 47b7a5bd492e92dda928843e28a707b9682cb32f
+# SKIP-SINGLE accb7b7ecc19f85c2750ded1046a464bc73c6a52
+# SKIP-SINGLE 10a45096988f6f19e36e2e7865b6eb35c0929b6d
+# SKIP-SINGLE fe859a07870d5204adfd5c9a7f83bf69658d37c8
+# SKIP-SINGLE 61f3a4b4fcc43241caaac63195205774ab1a5732
+# SKIP-SINGLE 410e65e4ce6f871fd1b8a2ef4b227cbeeb17c1dd
+# SKIP-SINGLE 4fbdccedd58ffe4cd5f7ed7b744123cc25084bc4
+# SKIP-SINGLE a9140091dd0df7e89ddbaabec17608a20f06f7b0
+# SKIP-SINGLE 0c9bce3fc490d6f5e935883e9690871cce4f9150
+# SKIP-SINGLE 6c560a3b16f9015a19044395f0ef41b718d73496
+# SKIP-SINGLE cd06d173a602bf0aa8a227ff1626dc70013fe480
+# SKIP-SINGLE d1ea675d2cfccfb043c8e853c410427ca62dd921
+# SKIP-SINGLE 5e841bc9e5ff878b3dce36a712386ed6f53b6e60
+# SKIP-SINGLE 284f635da833d2dbf0102af3442197b46adf78c5
+# SKIP-SINGLE 41e20ee4bc01576d23fb8fd4f875385ce57eb36a
+# SKIP-SINGLE a411517faf624657aa58979f5463115115093309
+# SKIP-SINGLE da9541dd1086b7bab52940c82915efe114bb7419
+# SKIP-SINGLE fe6c507f5ce0fd744b5bd1d0db6ea175e1188a7f
+# SKIP-SINGLE e08e0880f9892fba747abdb95b1f3382ebd17e32
+# SKIP-SINGLE b6d8d34aede02a6af7a614f32b86292ee4ba1757
+# SKIP-SINGLE c4bacb1215bfdf058b374312256c27eaea1304a4
+# SKIP-SINGLE 534c33cf375182c97291d2dd242f936df5953321
+# SKIP-SINGLE d8a6d82c4d34286b377fd7bddd4be0116e8dd4b9
+# SKIP-SINGLE b3df3729596332a39404c364798a61bfef2adcc2
+# SKIP-SINGLE 134edc10367a8434167656e631865c85b5f10c42
+# SKIP-SINGLE d3a0ddedba53b9e2c99274c8ec125d53f991da5d
+# SKIP-SINGLE 4498e5a13a3b63a3024ceef102ae3b5c50f58be1
+# SKIP-SINGLE 9813905f834aa43eb194023f579c7e7951d96d0f
+# SKIP-SINGLE ec2e5a54b3b6324f1039f355fa646034918f6dba
+# SKIP-SINGLE 4a04046b7200b9c7201c252c23a8c313d4687b5f
+# SKIP-SINGLE bfcff8f88a472bd1a64922da094cd007d3b7a70a
+# SKIP-SINGLE b552fc05c231ca6800330a318d3a74ddd0f5a13c
+# SKIP-SINGLE 01963fbbe10d290ba037cd523d21ebbcd2536b40
+# SKIP-SINGLE c31823a51bba1e4f0c87af1a08ce856cc600f5c8
+# SKIP-SINGLE 66c388c21aa83d3ddb5a1827f81dd432514242ac
+# SKIP-SINGLE 77b1148b5164c71c4ba673173eed2a37918d4f78
+# SKIP-SINGLE 63091313490beee4c5ed9767195c2a3df98f0332
+# SKIP-SINGLE f0c0b2cea3ffea7e3c53ff24c58e7a08ac40babb
+# SKIP-SINGLE 1ac5c6c3cfc4c50347af893aa72926cdf2edb8c1
+# SKIP-SINGLE 926a394997eaae55b797a90cb2cd037bbe3c3db4
+# SKIP-SINGLE 31c60dfbd8541c9f1b1bc8127dde85e5d5af51b5
+# SKIP-SINGLE be3ab9f301bf741b0410c1f9fb1c5ce6dda1c39a
+# SKIP-SINGLE 4bfde2a79046519815e2bb8a8eb72e22eca0641f
+# SKIP-SINGLE 7bba702e1ad1ed343618e44cf5bbc2a1f079be0c
+# SKIP-SINGLE c64cb02cca320811032bb300ea6d12cf59acf65d
+# SKIP-SINGLE f208d5ae77cf381c6f1db9b1aef76d5e9805a106
+# SKIP-SINGLE c113d6f3c1e12fed3aa627e74a2a43be0350c31c
+# SKIP-SINGLE fa3af359df8754423a197682d31245ad88c02033
+# SKIP-SINGLE 6fe661342a24edcaea255c3ba9a37613031554da
+# SKIP-SINGLE b93e5463885f9c99e74b52d2f569ad06ec2d0ff8
+# SKIP-SINGLE 8a11e430ec261c08cc928a7a5b05ee1027f50368
+# SKIP-SINGLE 699fce296b13d7db386b1cb5cecf2710e5196691
+# SKIP-SINGLE 698ff554ac2699ec48fefc85a1307cbc4a183b0d
+# SKIP-SINGLE ab9e58b8e39f19cb35513f77310141a344a4de15
+# SKIP-SINGLE 648fdbbcec159e6bfdb7cd06d32c59e8a17a055e
+# SKIP-SINGLE 52e17e53b7dbafb4877d98d99188c335db6a3b5b
+# SKIP-SINGLE 394282142563fe1341eba1845672e2412bf8c7d9
+# SKIP-SINGLE f0151e17d296bfdeb1ca3f002c9b430c8302a6e7
+# SKIP-SINGLE 90c25b245259e99013dfb9292bea054a0ab4ffb6
+# SKIP-SINGLE b26c2767edd98787297879c4570a2702eef031be
+# SKIP-SINGLE 8c17995f7f948955c765562f32526d0a3b87398e
+# SKIP-SINGLE 093f5d0045cc5facd3728e385a71ef84f218bdfe
+# SKIP-SINGLE 18a7e5414c534db38eedb06b16ef68f2c17b98fd
+# SKIP-SINGLE 34f01eb88f87fb8bd5b816d76a2527b5277862a7
+# SKIP-SINGLE a1deb6cac305a73e799c63e2fbfe7221790e1e61
+# SKIP-SINGLE 58a3c54c7ea86ea6b715483e7b017008a78fbf14
+# SKIP-SINGLE 2da3305c3c335adcbc9e541b7c50e4e814df87d1
+# SKIP-SINGLE 2c5a3f413b7477544ba8f5b18ed233ea6ab6f2aa
+# SKIP-SINGLE 45a0ce0905e495ae93b39e75cedb34ac95c6ea71
+# SKIP-SINGLE b67a6cb8dd7f8e6757a54f1547f631f26fe26e74
+# SKIP-SINGLE c2e27949d5917256bb419dcdae73566079844b4d
+# SKIP-SINGLE 0701634aa788b316f331ccbb6c44dfd8304a271d
+# SKIP-SINGLE 8b379bbeca9b3765e2b1e948d9d9c90ab92ff4b6
+# SKIP-SINGLE f6ab713bbc3dc8fccf5fe490615aa2b679071010
+# SKIP-SINGLE a7f71e8dfae9b1571a2ad34e44f000ff4a391644
+# SKIP-SINGLE f21ec24524c705e18674a2e9e4db37b11fa3ebab
+# SKIP-SINGLE d715ae8788e16b22f7f68cb82b51a40ad95c78c2
+# SKIP-SINGLE 7bbb56bc430465a6807a8129a322c704c89e3eba
+# SKIP-SINGLE 7f6b0c1ee93663892c6220b982f7bc3275dcaa85
+# SKIP-SINGLE 18c83aedd91023a677153abeafe561eddb430146
+# SKIP-SINGLE 68b8980eee5683128035800d6a04c27c764fcc5f
+# SKIP-SINGLE 26577415400b88c66add5ac8848e6e370739bc21
+# SKIP-SINGLE 5b525f4f56f458d88b66be73cae2d1fc5b382db4
+# SKIP-SINGLE 9fac0e70e3f5b7d0b12b77cac50078e01f68ee70
+# SKIP-SINGLE c717a5bf53a9f08f2123968b62800a8450589719
+# SKIP-SINGLE 73ab8f4b8cb6f08e7b694bdadcd42751b3916dae
+# SKIP-SINGLE e2e63dc3f062ec3dee56f003efb3e093b56692d4
+# SKIP-SINGLE d16b73fb4a9d87ec220444d220c6b45879806fc0
+# SKIP-SINGLE 982af7f516efb190d19946bff7bb37567328b4b9
+# SKIP-SINGLE 9645b5752a3e40754d22d9e805778e95fdc86337
+# SKIP-SINGLE 1743da11d0fdbb24f6c6e8d084e98d0b6e4d3f62
+# SKIP-SINGLE 7556772ac2e375d3812665dd8e31548e0dd1f7ee
+# SKIP-SINGLE e4636297c630a81e1e201210b4e6da7e99b823a7
+# SKIP-SINGLE 5fb3782e95d512ddb9a23e7d713de5980c7c4c2a
+# SKIP-SINGLE 7e911d007d25df9a483eaad54956a4273405574e
+# SKIP-SINGLE daf32f1f87b3d71cddd9ab2e9e4c3f5b523ae409
+# SKIP-SINGLE 0dc5a85a1c3772a6e78f077719d82f437f626b1e
+# SKIP-SINGLE 0c450e09b8eea8839d10c329debb3be37ccd9a34
+# SKIP-SINGLE a7aae1473c1aed7758b550a23cda61ee17668e23
+# SKIP-SINGLE 48daf77a9d963c05ee198b3ab108c7f0b3686da6
+# SKIP-SINGLE 8f522efe9a963cd3523ea6863f9bd44881cdf6b7
+# SKIP-SINGLE b82f34f996c25deda1b89fc7006833335bb1a6fa
+# SKIP-SINGLE d38110efa75372d4c3be702f157d3a8c6b7f37b5
+# SKIP-SINGLE 30026cfe666e9647aeef73e26df5ffca2fa2c662
+# SKIP-SINGLE dff4f9c759f5cf19047719716ea5ee8ffdc3006e
+# SKIP-SINGLE 6eb122c8db9d6a445b2002f025e01215ab560843
+# SKIP-SINGLE 79a01866a01754b9f566af76ef96e80cd90d094b
+# SKIP-SINGLE 34f1035e878a06ad181ff7fc533cd1fa0a565847
+# SKIP-SINGLE b478444099655f36f7b243e21e8f98051299ca8f
+# SKIP-SINGLE feae2de4242d7288f94c4bb41a9b7deed8679da0
+# SKIP-SINGLE 7fc0292f5c49d11fc39853f8bc25586d54221e6a
+# SKIP-SINGLE 278b7c1b52be11e8c49b8252953e8e84d45765c3
+# SKIP-SINGLE 2385dddb3338fd0f34aac0633dde78dd650f7d94
+# SKIP-SINGLE 5ea28ea4d12140ebcfaa293b6f29521a80b3de25
+# SKIP-SINGLE 981c309325d55e8c5947274e4df6346ea51a056a
+# SKIP-SINGLE 11c3ec3df6ad79ee5175094f0cf14248d9724aa2
+# SKIP-SINGLE 21f5bd6154f254a53942a9823c9c708ffa4b22a4
+# SKIP-SINGLE 9a56b9bf71af83292d6831e08a8179b7cf5ee7d8
+# SKIP-SINGLE 120f691e99d7d98a959ec9a6075cb4e473831bee
+# SKIP-SINGLE c4fcaf5e729fe5ff9249a56b1d0f5927ef3932a5
+# SKIP-SINGLE 9aa13cd4beccfe41e8f4930cb029bd60e7788e93
+# SKIP-SINGLE 8aeba640460adbad283d4a18f91cce8e0364c40d
+# SKIP-SINGLE f521225736b2a6ab38bb94298fb4d3ace3d9a9ec
+# SKIP-SINGLE eac531b760aa805c293339eba78e58b5b89fa211
+# SKIP-SINGLE a590a8058d52c1cbe0f80b7ed0d8b0abed7bf7ef
+# SKIP-SINGLE f0f2a53b27187903c86189bd03f072ac6ddaba9c
+# SKIP-SINGLE d8c2da46e7e51a11882dabd593af29f4146aa0b3
+# SKIP-SINGLE 7844846e3fedac8f32f0d81d3c5e906715d39fd2
+# SKIP-SINGLE 3886a5c140b03f07c8faea7cacad0a791bc54fa5
+# SKIP-SINGLE a397fa06d18d6ae37a3a1288f269e1ae9eb3b569
+# SKIP-SINGLE ad33e3e549e24c48259c6bdfb069e41be0a31f98
+# SKIP-SINGLE afe4969a3b3b38014387a828b66f5dbc3a462a57
+# SKIP-SINGLE 5c74b806a6fb0a4cb237300ab0a5418a109ced5e
+# SKIP-SINGLE d9c6b4378ac851f5e730daa0ae36c9ee2d0292fe
+# SKIP-SINGLE 7362554eafd7e255b3d96a4f711e11708dee950f
+# SKIP-SINGLE b293aa91bcc7f553ffbc6c67027f3c86d06ffbd7
+# SKIP-SINGLE 232a36f17e2796c52cb0b1afd5872c454b92ce62
+# SKIP-SINGLE c4687d920db081f29e93cca8156793d545a827e2
+# SKIP-SINGLE 3fc859d9550ff6d35dbb453eb75c3296f23a94cb
+# SKIP-SINGLE 11192b29adf4ee500f5056d1b02d35908f858b53
+# SKIP-SINGLE 3ba1b52e277261286738b637e45a675b7d587f58
+# SKIP-SINGLE 498468a2367524c7bd763826df5aad2b76345912
+# SKIP-SINGLE c4b886831acb82643a38f48c91456b15363bed75
+# SKIP-SINGLE b18f92a942dca6f95c9a74835644e482f3b1b907
+# SKIP-SINGLE 6c77a9e046de682aaace72aaf3af78e6ba9e5489
+# SKIP-SINGLE 976b7fcc8ced57fa12a0504899974b5b2057c943
+# SKIP-SINGLE f0290502f3354f9ed7e8ec84c24ac13a7bad2fc0
+# SKIP-SINGLE 4946ed48fee637eba75b674b9ad568b9df26bac9
+# SKIP-SINGLE 2875340c9fcc3bd6a799a3c4a4d875fc753ea7b1
+# SKIP-SINGLE 037b9897a464bf25ef9587ee860cc7f20376a97c
+# SKIP-SINGLE e666bf781f1d3d74068e8d2b505e35dd75b5b423
+# SKIP-SINGLE 00f7fd7d427b85e69a53403a1d10ac122a92a95d
+# SKIP-SINGLE 0bb5a47402313634b0e8654355e519388851e07f
+# SKIP-SINGLE c00236a880567c72dcdba5fc90d6de1125616c76
+# SKIP-SINGLE 1c08dc82121d50e80bd2dcb0d1f39654cc6762dd
+# SKIP-SINGLE f4cb9cc9034c09a8798df3d98f6fa9313a777a96
+# SKIP-SINGLE a5a1b53807a9449298f62c761223e6a1c5654bf7
+# SKIP-SINGLE 92e285fdf0821d8a01db598c4e2ac7e2e0fbb3cf
+# SKIP-SINGLE fdb31d6a2709bff751c2ad240c41b30db1848b44
+# SKIP-SINGLE 9514dbf7ed70b6c08a11fd58c7889ff49e30ac13
+# SKIP-SINGLE 4beb850efb99b881fb8b648ad7bb43c6539a2431
+# SKIP-SINGLE 5f63ac26ccc18bcf9e364b74af4424f9e3677cf8
+# SKIP-SINGLE 726d8c5bae847a3240b758a1d25135865e9304f0
+# SKIP-SINGLE 44db9b912f1d8165383b5b30732fa9caa3d3a185
+# SKIP-SINGLE cedc19297e47473ae599faa7cbcb2f3f6c9d5846
+# SKIP-SINGLE e678021f0c3db705c91831cff466561fd73c3040
+# SKIP-SINGLE ef59b67e4657fa80d1528b9d476c67f01abecc35
+# SKIP-SINGLE 2ccce1bc3954ce5f2faa0dcf7fa68ec5cae710ca
+# SKIP-SINGLE 568883c9be8bfbb15ea48ae0de2c117894e8db4e
+# SKIP-SINGLE b6d6e7feb75b792c74fe3e1d036b9edf540d771e
+# SKIP-SINGLE 15ac087712250b5ffeb4d162761b2495a5e572a3
+# SKIP-SINGLE 36ab5c6d49f8fbfb858844743223414e6f2f2564
+# SKIP-SINGLE 080dacda7896e0eb5ee54b1550097e45a4f423de
+# SKIP-SINGLE df62baa7d4e8ce0760f32122899ae3c803180907
+# SKIP-SINGLE 8b1d9b8e5ed8035bd2f42517bb6bc3c8a6d6f0ae
+# SKIP-SINGLE ca8d5ed6ecd5ca3eafa2923ee04e56dc474bd964
+# SKIP-SINGLE df0a7547cbaf19152a74b5dda760e5d1f6c92ecc
+# SKIP-SINGLE 12639610f78f9006b70933bfc6898c1312f95290
+# SKIP-SINGLE fd3c00ff92826b466a3292a05072eb5b4f23a701
+# SKIP-SINGLE 0a74771ee9c406cf98d391378340c79645c88d52
+# SKIP-SINGLE 5dae0a9a55101aeb668f90e1fece1ffbab5e7ee2
+# SKIP-SINGLE b275ddd63a24b15dd8f90ea0c4f27341a8dfa977
+# SKIP-SINGLE 5ecb71c1e65038b79933c06e1c0303b3e58ef4b5
+# SKIP-SINGLE 42362d991443689162c3e0bf1eb683a85481a391
+# SKIP-SINGLE a88e5f0f199ad018d57d07016dce20e5462dbbca
+# SKIP-SINGLE 4c8b46514d87856e5e2044bce804ad0156097d04
+# SKIP-SINGLE c5bb62f99db4b1c70e68e7c7a30ede8227f199a3
+# SKIP-SINGLE 79436f0c744a65ed2757f0119f5bd13e2fbef995
+# SKIP-SINGLE 54677f96f3ad8e489e04c8bc7875e1ec4d6b9a79
+# SKIP-SINGLE 9a8f33f285295daff8ed02d35ece5e8fe11ac887
+# SKIP-SINGLE f0671c60637e218a54f9f3ac8e5950d17884f50b
+# SKIP-SINGLE 4496a3f5ba899c89e45cd478a22b25ddf77869ec
+# SKIP-SINGLE b3cbdfc86474932e4ef8d1237ed100a6f4f4c854
+# SKIP-SINGLE a647a97320e72db275a05961ae09e487ee3063e2
+# SKIP-SINGLE ee4feb005ffe1d35ffc4d390d18b88ecfdebe2c2
+# SKIP-SINGLE 88671e638b308886a9d6b5a590ee1aee56746d7b
+# SKIP-SINGLE a10405386f83333184c94a0a194b404e4273e2d0
+# SKIP-SINGLE d0fcb15fa9858eb600b0a8f35ebbdf5aadc2cd7c
+# SKIP-SINGLE d0173ecd0ce8c2ac458cd84c25216f59f3fc9889
+# SKIP-SINGLE ac08a7f26c53d65df7d9c2a5d76300a6a1a8106b
+# SKIP-SINGLE 694ece772220346aef12520bc66ca401d08809bb
+# SKIP-SINGLE 740462da6153b111a8196b003791a55c7f7fa878
+# SKIP-SINGLE 8234a62e6fb9f706f410a96e2ce9877c19e44a20
+# SKIP-SINGLE 26ce5664ae431ec141e852a4183844d83c3f8856
+# SKIP-SINGLE 54e0b112d3a91c86230bc4329e00ae8f2faa05e8
+# SKIP-SINGLE 6c9acd13d0d2aa181d21bf78d6530b3399520533
+# SKIP-SINGLE b3db331e8c36ef9706ad16c12055079bcd93c022
+# SKIP-SINGLE 3345399e87fe6100ef82c399337760ab01182240
+# SKIP-SINGLE a248dfe2c3341ed73de38c2feea64ec12f053aaa
+# SKIP-SINGLE 48f5530e7922e4c46db1c4ab82b1c3532db724c9
+# SKIP-SINGLE d7071c64575bd3116e154f93915ff099c6e0f3a0
+# SKIP-SINGLE e2855d93ee41bf23a72fdcb49bd5347512989f6f
+# SKIP-SINGLE f4de790beec514808eafd1cb22fa5eacdecd4552
+# SKIP-SINGLE e05253cb9bc4a35c7dedc3cbb2830e37d385a339
+# SKIP-SINGLE 60a81f44e49c77ef9143a665f94f89109002133d
+# SKIP-SINGLE 4a639f3ae9594f0d16835d5151b6dda7e83e1a1f
+# SKIP-SINGLE ce254ffa44e33352605e49aaa7d5fc4f545c1add
+# SKIP-SINGLE 9a87c4404fd0097e2efa14f63b97a9df8df6c07d
+# SKIP-SINGLE 7f5f60d54340aa0b36f22057fd3f2665fbcd5d67
+# SKIP-SINGLE a214a29e48397cf259327e1ffb44479648301e47
+# SKIP-SINGLE 5411beae0225937446eb8509c56277b120a2eb92
+# SKIP-SINGLE ba51c31b47a62e6815d8cb2cb34ecd642a677105
+# SKIP-SINGLE 10adad440b2eb3b09d9d4e876023dd13d8b3dab9
+# SKIP-SINGLE 6a3624eecbc0a116b293d05e044b8b40a86022e9
+# SKIP-SINGLE 44023f3db21c0365ceeb179657447d7cdb1feb8f
+# SKIP-SINGLE ba2bbea816ac5a20fa3090b634a17ed0d4a1c2ca
+# SKIP-SINGLE 9650e5a1a90768953ce9f3eef014616180bfed8e
+# SKIP-SINGLE 831f5e606125c48f783daee9643d101b7fad665f
+# SKIP-SINGLE f0b1519fbd0fea728238758d6bec074c32be1142
+# SKIP-SINGLE ea421cfefef6826dd99a9cc884b46178b2c0e1a8
+# SKIP-SINGLE d4a5aba954c838b32317560dd84e6681578b0e32
+# SKIP-SINGLE d2d229043674c59dead9a58a9ae20f8e62427fc1
+# SKIP-SINGLE 4fc8524df0e2ce0579d6bc298dc07d1e442587c6
+# SKIP-SINGLE 0c94e69fa6ed5a4f5d551f37f7f2632d2f2b2952
+# SKIP-SINGLE 960aa0c7985f6c61a26f99653c6e9ae9369e944e
+# SKIP-SINGLE c039822082983d6618b6e06c73a31cf6b63467cc
+# SKIP-SINGLE a421c277237ab6b5923473f6dbb9c196b16bc833
+# SKIP-SINGLE d901221e2bb2168cd1f05e3b2355e078c45f1f42
+# SKIP-SINGLE 954eb9b4a0b9d616db9646f081d11b2c6dd19581
+# SKIP-SINGLE 8ef0a1814eca5dc7f32e2784b3fa61498d220a70
+# SKIP-SINGLE 99258421bbb123e6f277610dcf94e022dde3a5c0
+# SKIP-SINGLE d0e6a276643b2590eebf81e305b006c768653b10
+# SKIP-SINGLE 0bf55d3a8131da02999fe694caf34096d7408952
+# SKIP-SINGLE 71b363e2b3c709e64f8ef8ab7446cc3a19573eeb
+# SKIP-SINGLE 23874aee8825a6f670b6c2da9eca2d9cf643b3af
+# SKIP-SINGLE 4fe02acb6b0556c4b17c7a8e01f41698f5109512
+# SKIP-SINGLE 95eb82644d348c59af9f4ec10ad315bf5e498353
+# SKIP-SINGLE eae7f30a9a338b5713d7808c9f791e1a7f79b3cf
+# SKIP-SINGLE 630fcab4fcfa9afab4688d803892d76cf6f46961
+# SKIP-SINGLE 37989f9431bc32f7ebac76cfc02f5e1d03486bcf
+# SKIP-SINGLE e97826ab845597fe09be43b2df888e96c7502bee
+# SKIP-SINGLE 0c60b3bae71a010e6abdcfd4d8d38b92c7874609
+# SKIP-SINGLE ab5611c25b92ca06238de3d0ae53226176c2ae0d
+# SKIP-SINGLE 407f5aac70f1481dfb365db7ba2e435f439498d0
+# SKIP-SINGLE 3681402bf163a3b5a7b7642f553e87693028649e
+# SKIP-SINGLE 16fe8a4678d20eac893bd05941071396b67bc84d
+# SKIP-SINGLE a99a3fbc40076aa3965feb759e816a8a25621c6a
+# SKIP-SINGLE 42b08f8a9ada7791c992894e88f648909e1ecc95
+# SKIP-SINGLE 41bfb91f5db878d139d5c0c631c569475018a7c2
+# SKIP-SINGLE 77c9236957a195a4ad0f50e8f19653a5c6918c8e
+# SKIP-SINGLE 41e5c9400cd9eeeecff2262907c09c3b10a5cde7
+# SKIP-SINGLE 3850be836ec7223c895901dd21f2a4e429314b94
+# SKIP-SINGLE 065dd0b5c6a7e11e79fe5ec02b153bb53bde0e77
+# SKIP-SINGLE 207b15147366be47d58c40a6f03888243602b11e
+# SKIP-SINGLE 6a546e63d0134861b208ab1bac259f71fcb30b83
+# SKIP-SINGLE f6b58e8016c7ce7b332a3b2a8a56bd2f9987d95a
+# SKIP-SINGLE ab3f36fac2da2979713109561f086d95bb26d580
+# SKIP-SINGLE 437c75cfcda4a0e9fd387d22aa8c0177c835c66b
+# SKIP-SINGLE 13f3b52fa422bed85fd7d50b43a167bb011e9070
+# SKIP-SINGLE f7c52087b2a836ab8913b7718ad37230a2895ef3
+# SKIP-SINGLE 3d0a3a51b8f1635ec872fc3f0a54c2d58ba48b4e
+# SKIP-SINGLE 76fcc2a69a96a7ab68b82ebc96c234dd58ef7e61
+# SKIP-SINGLE a82f1929fef5072a4b04e326b467cca8a8a21c0e
+# SKIP-SINGLE 4bb671f1c6adb6cbdcf90abe73967c24e5296372
+# SKIP-SINGLE 11b34169f802908348e99d0a52b9c50a64028964
+# SKIP-SINGLE b91cbf80aeb4487ad3e1fa0e64e3cb5549ec663c
+# SKIP-SINGLE 787444c7690d97d8702db059cb51ac506cb8a5e4
+# SKIP-SINGLE a1fd3d6eacaf425eadd121dcacee95a26f96505f
+# SKIP-SINGLE 0f526028b1830e72df1c39220c5efdc7e545885b
+# SKIP-SINGLE 9b44051ea530247e73dbc0bdc2998d2dbf9688c1
+# SKIP-SINGLE 6317f9e7b847f83e6a6d0f9ce9233a0566d84f0c
+# SKIP-SINGLE 0f59ce58fc558643f97175a32f2a82cc209f2bb4
+# SKIP-SINGLE 06fc663f519eefb431912ebdae8711ed016e0703
+# SKIP-SINGLE f59a96f5655c0ac2846a06cbad11ef3039476fb0
+# SKIP-SINGLE d8f3f8736c7d36b220a478f98deae9f82f25a4f7
+# SKIP-SINGLE 8b8b8539d7415f1decde46d088c89c2fc69b1010
+# SKIP-SINGLE 4320307843b44fa049ba7e8217f0349932ff56e5
+# SKIP-SINGLE 0cf4a9fdfc63577c97ff0d0e46f49cd685c5291f
+# SKIP-SINGLE fd42b6c696564cdb44999f6d4d3f91a63799191a
+# SKIP-SINGLE 009089f0d69a26e9779628e5b9c1d139eddf20d2
+# SKIP-SINGLE 7c9a3556e3d66c1ebe75f675341117bb28041da8
+# SKIP-SINGLE 37a04737218281fecf7b4e8b9a58839e25f02815
+# SKIP-SINGLE 3bc77cca86fbed8c12fb6c10c51e1237d65c9143
+# SKIP-SINGLE 13816f14b2f459a97d309f202f218282888e9bc9
+# SKIP-SINGLE e1128305102bab268272770b4a77361dcd9efb5d
+# SKIP-SINGLE 942702f506de1c7c3eff4e13470248be1a26e778
+# SKIP-SINGLE 00c493f01703f619a62e08bea17a49ce12f2367b
+# SKIP-SINGLE c9f367950652a3728cc94c7a7faf0aa55c2aae9f
+# SKIP-SINGLE c33c2ef5119a3e1ba9c97ca03e001916f83d09f9
+# SKIP-SINGLE d5ffb4949044ae58fb418b1b214cc7c6eb16a29c
+# SKIP-SINGLE f9ea53442e6f492f1543a5e21479e72be8eff4c3
+# SKIP-SINGLE aee75b87719abfaed605e33ed0c9e3a9a81417d8
+# SKIP-SINGLE 76dd30a98590f2266290a70f2e3d4d272c092310
+# SKIP-SINGLE e176d04d45adbb51f6bfa0b5a0352927056f3519
+# SKIP-SINGLE 26aeca29801a8e8950141d9d54aeb9a22ee6c5ad
+# SKIP-SINGLE 2ee2c67736cd76a52a2eb1002d0ec15e883082e0
+# SKIP-SINGLE 105e7180230dc22db91af2c8cbfa6fc3d2fee7e6
+# SKIP-SINGLE 3ed524c908d4aefd174ae6a8adc2bdaabb4bc4da
+# SKIP-SINGLE c47892201b2b9f1ef903ff2a12bb9ed9e64d19de
+# SKIP-SINGLE 6d230fc2c04532b4abf2474411b2995c237d5cc8
+# SKIP-SINGLE ce4375f57f9b89d68fb639590f3e4a0a28e3a627
+# SKIP-SINGLE 6a34ff5d9c13688a7264b2654f04982c5a3cfc6b
+# SKIP-SINGLE ec00ef8d48afaef65527c02ea013ba4489ed279d
+# SKIP-SINGLE eca71dd5c7a8b7013eb20e1457eddf62776e6c29
+# SKIP-SINGLE 6761e69a2bce255bbd78e08b5c592f4de19253f5
+# SKIP-SINGLE 93aeb781e1da3cab6ae90c90cd3668862155ab85
+# SKIP-SINGLE f97c03ebca440229ff953baee9e458a3ddcdaa70
+# SKIP-SINGLE 33d8b736b0330f51050ca1fc389527d708b1eb23
+# SKIP-SINGLE d392276b63cd0d9eb16f0e624bd8da9737cc66cb
+# SKIP-SINGLE 9f15b4c3ca98e6af3dfe61f70d0043ae896167ac
+# SKIP-SINGLE 9ee6b685a338cd06d4b053e39f3e2da505d20612
+# SKIP-SINGLE 809bd5aa34727151bdf40230e2fbc3151760466b
+# SKIP-SINGLE a2ed435e3aa18c0e6d4997cbb9a81426c952a622
+# SKIP-SINGLE 5c188552341204daf53f0ae2aa4e0c73ec4feb1e
+# SKIP-SINGLE bf91dd23fb7dd37650dfdb218358c8bac659c5a6
+# SKIP-SINGLE 03d2dda12f9e5d877edd15e31d6076361ccbd75a
+# SKIP-SINGLE fb41165adf7c6a354876a26fd7a6cc686f3fe142
+# SKIP-SINGLE fb309c14f0f5075cd649c083abf2a0713b949030
+# SKIP-SINGLE 5eb8d3dba14d94386f42dbb8fcdd28a98d10ac64
+# SKIP-SINGLE d6ae5369b0682ada2e7d801a3cc54f671ed03bf3
+# SKIP-SINGLE 0720354082858f59db9f70ada33efc424126d668
+# SKIP-SINGLE 0f68de830acb5eef41307efc119f3f16fdb35ab3
+# SKIP-SINGLE a18e54f54bdcd5d9b2c11b0307b0a157f52e5926
+# SKIP-SINGLE e0e0b92c1d3fe39085731db04bacd9def31f3940
+# SKIP-SINGLE 515644edc0ed2e73198f4c4eeb822715b2589dc9
+# SKIP-SINGLE 0b9bec6863e138efee77c2948c355b53951e6d18
+# SKIP-SINGLE 283b0db31c87a8bed736a8459ab16ae066ceb024
+# SKIP-SINGLE 10c6303d242ce8f01f38e78da71d01c7a379e651
+# SKIP-SINGLE 96bca89e5b03b6d5ab7ac8bda8216adfc1911205
+# SKIP-SINGLE 475b4768c856c0a25ee236faf0c30b39d5cd804a
+# SKIP-SINGLE 67ac8603eaa5618622d746f4097a0ba6ca2f76b3
+# SKIP-SINGLE 45158ed98b345145eb3e9f8c27b0591433465ff1
+# SKIP-SINGLE cf72d9de0f46960d260e3f5eba843ff01f30eff0
+# SKIP-SINGLE face460c41f59b5097748159ce64a5a09b277dc7
+# SKIP-SINGLE 59f7b155119b5718b83f0bac7409dd597002c89b
+# SKIP-SINGLE 1d3c0d1716eb2025c1dd2e07195b55bb5781fdd3
+# SKIP-SINGLE adac6fa11a95b5c3dd5ae5766b1539687d5931f5
+# SKIP-SINGLE 4847522fd4030af7ddb92b789545bc4e253524ee
+# SKIP-SINGLE 96e2863f2e85bc907e5fc0cb7d86e0b6ff54317a
+# SKIP-SINGLE 8d08a8a1070435e12b77517808df34a8093abc67
+# SKIP-SINGLE 7ba9a4c895b61d5c12118a18cb337f621bea4442
+# SKIP-SINGLE 922c4128034149abb130c6a9a06efa72659ffaf3
+# SKIP-SINGLE e4684a2f9d07ca6ad836028514dda8e3e6643bf8
+# SKIP-SINGLE eab243d22203e0aa56576b00568a93f18e8196cd
+# SKIP-SINGLE 50604ff3872a46baec8578b35db92d9892a35396
+# SKIP-SINGLE 63a1f317d05c8eed256251e7952e621a37b5cf7b
+# SKIP-SINGLE f24c0c7111d9a11921c057eb8d77ca4287294c0d
+# SKIP-SINGLE 689bb582623450826a9e2cdcc2aa63aaa6ab5764
+# SKIP-SINGLE aadb83da748c6befaabab0583fd38bac7fb094ba
+# SKIP-SINGLE 661567b7cd8092e1b41346b77e97201ea4d2efc2
+# SKIP-SINGLE f0e83548ee9d08a558363f73d6ec8e6f30e1cab0
+# SKIP-SINGLE 1a4aa391eea22fc053aa40c1827c7726de5fa7ac
+# SKIP-SINGLE 3b58bac273b517844210c9ecd07757625dc9804d
+# SKIP-SINGLE 26db0a032640a107bb0155b2f1eb7a586dbd8985
+# SKIP-SINGLE c6d819ecb5dafddb7b4dffa4c84f5264a3061d53
+# SKIP-SINGLE a90803a4d1bc47fcfc3b9a3af519cd8441bd92de
+# SKIP-SINGLE ca907fe89b16d59b067669f1c43af3eace1509ea
+# SKIP-SINGLE cae7d6cd58868916bcec34d9572736e7541b9710
+# SKIP-SINGLE 6bbbf3fd829f5000acb63536b5019b5be62d3e66
+# SKIP-SINGLE 01334409d6b03ef101bfd5cc8f5589220fa16483
+# SKIP-SINGLE f69a2b851d80602a158f8878811a63b219eb7fc4
+# SKIP-SINGLE 4a00e47d4d75528ec69291c03615bd669c58ed7e
+# SKIP-SINGLE 4a526ab48d10a26c9f58bde504023dd83017b088
+# SKIP-SINGLE 4cc1374786dcc28b80da546e708f7360f102abd4
+# SKIP-SINGLE f8a454f3efa10d59b8228b5c1373bfc9fb8ed718
+# SKIP-SINGLE 63078fb5af152934c5aa5facc5afd7f8e1907ade
+# SKIP-SINGLE 0cbe9c204e938977fef12dd4cc47d43a702ebfa9
+# SKIP-SINGLE 0ae14c17a24545dacf8ed309b2a75f8f1ed7da5c
+# SKIP-SINGLE 65c0d931f79672e15c6dfd633b619eabfbe9183a
+# SKIP-SINGLE 1f91b8c6eedc12fce03e76ebf8b9c039c5a0a0b4
+# SKIP-SINGLE abac70f198fc6502e3b4d81f9d9590e9d7432378
+# SKIP-SINGLE 9ff098615f92cf9fe4aa0f1c6835dbf9198daa6c
+# SKIP-SINGLE d19bb4861553fe82b86ef09db6cb6b1fe1eae829
+# SKIP-SINGLE b8127e988e2af662bdcd7cf25d281469a5142df6
+# SKIP-SINGLE bf253dd2e9e41a14b813692828ffc43ed24391ae
+# SKIP-SINGLE de1f89c202427a8bcb783f0b44fd02326b320a65
+# SKIP-SINGLE 734eb8f940c197e4b3548e7b79d716203e37aa8d
+# SKIP-SINGLE 8f1670b40fc9a779303207710a913b769170e82a
+# SKIP-SINGLE 9da698575addc4b9c007d7d6c1590bc5ac245bdc
+# SKIP-SINGLE 7d3da0a37edd57f6a31dff4864bcf1753de48698
+# SKIP-SINGLE 5630ebaf74f2f86e5d59fe4cba5ba96333e9fa6f
+# SKIP-SINGLE 9c31066ccdd6dbc7e9bd7a9a56de5c3103841018
+# SKIP-SINGLE bb25117eb40a08824142a5a56acc14d3fb4c89a4
+# SKIP-SINGLE 82a018e0622221910a7a02f683601c9f8c569cb1
+# SKIP-SINGLE d66d6ec5138049b98d99c4dcdd2c78582a6afe0f
+# SKIP-SINGLE d9db77704026ab0871325d431cae765981d167c2
+# SKIP-SINGLE c0ac7d039fb003444769700d60d06538341ba884
+# SKIP-SINGLE 8f3af3f61f43f2090bef30edbb9f8ae1a36c2e5d
+# SKIP-SINGLE bdea0f62b55e986136f5677369f354e4f5849863
+# SKIP-SINGLE 414a2b5bbc6ce441a8102254c593699e503d4f57
+# SKIP-SINGLE 89abc8d66f7668060305e9f0e5dc3ebfddfff3fa
+# SKIP-SINGLE 9b5f8ebb5bb970c34400b149190b2d16886ae814
+# SKIP-SINGLE 59d53e1fde516b911c29cedf338779df29f59dff
+# SKIP-SINGLE 84caa1a404cb89a6f02aa1cb517f5251e7e0e022
+# SKIP-SINGLE 6eb77feeee2d85cca1d6695f809072c357875ba8
+# SKIP-SINGLE eaade31040503efdce5c0daccd4c06f856d3fe2f
+# SKIP-SINGLE d9670ef135893c41d33e5bd12c69659bb5d6158f
+# SKIP-SINGLE e3ed0208a8ce25ed1d6c82e7e5bb3058d074afc5
+# SKIP-SINGLE 86a22004c9bdd1e93aac773cfda1932061f3b724
+# SKIP-SINGLE 6e205873992a2f8eeaecb30adf56346481a2c192
+# SKIP-SINGLE 772357698a226cdbf123d04d58573b79fd8814a2
+# SKIP-SINGLE c8d745d10a45ca3f378d7434f1cff73ae02ba42d
+# SKIP-SINGLE b45122b7132bb4b7e41fff5434e669e4ca671b8c
+# SKIP-SINGLE fcab7f72e1765b883537a0ae2c3a82a802539375
+# SKIP-SINGLE a49be9dba96575b68f0657c21eebcfbb56463021
+# SKIP-SINGLE 4c33696014d28975bce559a333c845fffc695428
+# SKIP-SINGLE 4a0adfec2a1caabca3bf99881f98f24ad12216f9
+# SKIP-SINGLE be1b64bdb515d8328228138982850475d15a0feb
+# SKIP-SINGLE c6be6fd6ccca9b9af1d9c5916d3da39f965e0ec5
+# SKIP-SINGLE 5976919a3325c4512e450b9649a510f05e7d4fcd
+# SKIP-SINGLE 0a014a386200532d92974d255b0b3f6b33d07a22
+# SKIP-SINGLE 82778374fef72583ac7c64f96187f56b1641ddea
+# SKIP-SINGLE 10d7284a2a1e8a543b31e5c99c2fc0c26c8eb681
+# SKIP-SINGLE baf16746960ad5f7baaf21b44feff9c8f3a4fc29
+# SKIP-SINGLE 2fb2862facf3eb70897a2e5ba342971ce696bc5d
+# SKIP-SINGLE bbf8b1df90f327a74423b2ccbfe557da9b04dd9d
+# SKIP-SINGLE d87d9e41f5890fbe7d279053c9c7328890c94b2f
+# SKIP-SINGLE 89172ac4376403b987bad897cdcfd22f9e5d97c8
+# SKIP-SINGLE c31b471cadcb9b8171de04b09a044bb775682a3a
+# SKIP-SINGLE 4088e467b3be3fcf6a1813bc74de7c4d3c193f1f
+# SKIP-SINGLE 8124ddf387451ec95ee4f8e0f726ab234bd8b762
+# SKIP-SINGLE 2cd60cb592930d985565612e0f22766b98fcf341
+# SKIP-SINGLE 403a7e59d5c79d81ee018fd9e648a2af744211c1
+# SKIP-SINGLE a8d358ed231b7656be50b034484b498b0b222445
+# SKIP-SINGLE 9709ff1436d547664e6b3ca252cd37665467b4de
+# SKIP-SINGLE bd3cd579cb43ace253e245a7026b172f216f3a1f
+# SKIP-SINGLE a317620a52746ea4346eabf4559a1caac2b63011
+# SKIP-SINGLE 47b22e55141da090a3d4688851eaa808f9489078
+# SKIP-SINGLE 69cbf2b2f304f82c6d77cd663d4211bf125ebe74
+# SKIP-SINGLE 83a146b24ec230539c4520a4315b8bcdeebdb434
+# SKIP-SINGLE 17ecb1c728edebd00a787fd6c4bdf8b7722e9a2f
+# SKIP-SINGLE aba160b043588171eac8235105d45b30a7f141f5
+# SKIP-SINGLE 05b733e86c108bdacd3ff45d05d560d7b8778a9b
+# SKIP-SINGLE ca28d5fd72d3cc7e960f4f2bd1d8cf00ac3622dd
+# SKIP-SINGLE 6d1c453726cf8a903c6bc555bacf20b7a4ac8651
+# SKIP-SINGLE 747c6a0dc8e53d66c785500d122957f4a17a9325
+# SKIP-SINGLE 351576f913ded76fc2e984c3ad42d47c5c5bc482
+# SKIP-SINGLE 94cae7b2bc02f49f238496ae4c386bcb9cafaeea
+# SKIP-SINGLE bbde29c012868e130388d9975beded563643a7a7
+# SKIP-SINGLE 33ce5fe9da02f0d0f4e0c32b86dde5c5e81c9565
+# SKIP-SINGLE c74f30c8e0f1799ebca7eb144c56506a53290243
+# SKIP-SINGLE d7173579a7e9a0f71ccd02fdc9f694b49aadbd47
+# SKIP-SINGLE 7abf1ca1212d91d0d50d3dd4f6386fac98fd2209
+# SKIP-SINGLE b7d1b2e9462e8d81ec44c41d82d1b840ebc831f0
+# SKIP-SINGLE cb2e6461f3db45df70334016b2a8411605eb847f
+# SKIP-SINGLE 6963deed24b13b448835be0d72d9b943ae2a345f
+# SKIP-SINGLE e4b32e3c572ef0786d2e6215ceeffb21d6046177
+# SKIP-SINGLE deeae4c415166eb144d008f0e904ffa70034c146
+# SKIP-SINGLE 634f71a2238b9e29d6bcab196092edfef19ebaef
+# SKIP-SINGLE e39f5e5c806dc0f7ee0f3520993ba061af7cb040
+# SKIP-SINGLE 03045e2e73eba5578218e09127055ab07a7c398b
+# SKIP-SINGLE c158b52ea421b4ea49adb79c445b712d18ad8273
+# SKIP-SINGLE 89c144b83077aea584e9bbbf04e1d786220aec4c
+# SKIP-SINGLE d6d5062bbae5ee708a0b80ad9b5f400320239fcc
+# SKIP-SINGLE 7edbb163b322072da6666240a698b5dc5fc6aaef
+# SKIP-SINGLE 77e80ae0136d1d79c0ee33b9780445aa6498664d
+# SKIP-SINGLE 6a69e49f01fdd025912e2d4397ebe2f51e3f188d
+# SKIP-SINGLE 59035c17d08f0999ba96c74d1763eedb0347d11e
+# SKIP-SINGLE 24dcbf47d826f46821ed484f93ffb89d306a0b2d
+# SKIP-SINGLE 63ecf01d0b0897b948296eaaffd690290d536b72
+# SKIP-SINGLE b9f37a2a09ac6bcef1a03cc49489f15ff01a74b7
+# SKIP-SINGLE c702e25a7a9e1ba2b75942dcc00402947757786d
+# SKIP-SINGLE 5f1039630dc8bf63f65df5c7882246f267d01295
+# SKIP-SINGLE b32900474fb5e4afdfd0c0015f6b08d58b5e7847
+# SKIP-SINGLE a8517ba3ceb21f3fb5c452226d5ca6a3981ae852
+# SKIP-SINGLE a70e54f6f7a6e711bcc49fce4e117d9c3e9d71a1
+# SKIP-SINGLE a2b9d58b2e2f56679b33995e2d86b0624c0b1905
+# SKIP-SINGLE 5adfe6520b5a3ff2e3bacc603487c4f12e54dfc7
+# SKIP-SINGLE ef6c633b9d5532d8888535a43ec8abc7de0a34f7
+# SKIP-SINGLE 1b9b19ebf911a959948de513afe3f639e23f346a
+# SKIP-SINGLE 4c6272373d4e5a6fbb8668f4980bbafbdc28405e
+# SKIP-SINGLE f74ab3e9ef7a5a63efdb4a7e0bca0c9cc71bf575
+# SKIP-SINGLE 038f46c2526fcc3643a74a6c3e9fda40691f4067
+# SKIP-SINGLE fca675dae325a974c625893fb0ad1aa88abeab8f
+# SKIP-SINGLE 59a428ed6ccd7ee41e847b1d63889845fae7ebd5
+# SKIP-SINGLE 314f9fcf6cb8a6f513022a40ee384ff0e4ca513a
+# SKIP-SINGLE 555450c7b1b1c02126bd9fc86486090fe2b829b5
+# SKIP-SINGLE 06ad74581385cd1930a073b2fda314230b254608
+# SKIP-SINGLE 17259826f263f87d45eb98c8effe0ba7ee774f5d
+# SKIP-SINGLE 4814c6b1184a2b3fe673c5389ce0a8d2c67aec09
+# SKIP-SINGLE ac47ef773e0cf734a3e3e4237aca50704a0a68be
+# SKIP-SINGLE 29fcb6ca1280fc01c652dcecc331b20cd88a5729
+# SKIP-SINGLE 37a794ce21aa52180c3b5037c3825efee91ee7a0
+# SKIP-SINGLE 3d9d7b34511bc3601efa2ab4ad24d62c73b80cc0
+# SKIP-SINGLE 2b51859d447cf2914cb64936f18231363d971b21
+# SKIP-SINGLE 82eb75bd542ddc97b94a21bab25387f34c86f54a
+# SKIP-SINGLE 9913638cc596a018c7d687652a3abb61325dc4f1
+# SKIP-SINGLE ff7093d74b51f094b65314e3567fc96a3a37ffdf
+# SKIP-SINGLE c05d414844f6e1e0af05ef0cbcabe3313f5089d0
+# SKIP-SINGLE 43172dd01fc7344f71f6e1d92fe051942f360355
+# SKIP-SINGLE 5d6e42e013caf236f5f1c7a8bca6d76916bb404a
+# SKIP-SINGLE 7e92976bc7973a4b4be0719b06d3751e57ad80ea
+# SKIP-SINGLE 6d4d9225afcca63f36b318b11be945146007b00e
+# SKIP-SINGLE 2f559c267806f8524d43bc46c5814c69074b0b0a
+# SKIP-SINGLE f23894516ac731bc858158c3e7198db8aa54bfb6
+# SKIP-SINGLE 41f1fd53c830666c1274a602ca48c433da2425d6
+# SKIP-SINGLE 6cd45fbf37bd344c87b83424ecaccc8119c30dad
+# SKIP-SINGLE d88d35ffed6c1073a0695ba1e980cb8ea7f09c3a
+# SKIP-SINGLE 17cf659fdfab02d7c5008d4a4b1df11f93b4764d
+# SKIP-SINGLE 6ac6e5b4752a596436b35419e7ca111b04f35d95
+# SKIP-SINGLE 3f841a942b22c4b6b140654d3d8de535b08b672a
+# SKIP-SINGLE e672990d882ce53167b22969eec6b32e96503573
+# SKIP-SINGLE 211db146a2f475047b38b010ea55c27c08701114
+# SKIP-SINGLE 6df64d170a93970fd57932980fceed6bf1853ccb
+# SKIP-SINGLE 94c542da1ac13fc6052d02fc7b960176c09bbaa8
+# SKIP-SINGLE 895bb4c9112c715a1bfa66d9af0d945f4719db55
+# SKIP-SINGLE b9b5cf4196e7a5368c5e36c0c5e0364b5d3e15b3
+# SKIP-SINGLE 999e625bc94d08eadf92d42d5bb0fd6f6d35c268
+# SKIP-SINGLE bfc298ca31d11c09d49d792a88a9f72415bb4513
+# SKIP-SINGLE 76021e1e06c5c1af05b658310505da333bc0c214
+# SKIP-SINGLE 90425b6d4b314f8f4c26cbf61ec24fdffec4c0f7
+# SKIP-SINGLE a102f471b3973d46d6954bc31c6170ddffd508da
+# SKIP-SINGLE c698ac791b3755c340ff945c137f6732cd4e20e4
+# SKIP-SINGLE a2b1795b96b5ac5981220b1056f6ea222bc193f5
+# SKIP-SINGLE a2257a531d0cd4c1d2bbfe374f490fa956be0330
+# SKIP-SINGLE 3b696d1cdcc79505313b2f087fbf742e503a1998
+# SKIP-SINGLE 4c03c46946d95a7e9079a087b5e0e835f5a5beac
+# SKIP-SINGLE e3163f1d4cec335b5941c9bea267fe161c5ab83d
+# SKIP-SINGLE dc52036074c46d1772557436cda2866b346b4d16
+# SKIP-SINGLE 9413488ab4e8752a2fe88ce9f42ca83ffbe5f1a8
+# SKIP-SINGLE ad5488cad62b04ff1ae28cbbe2a0dcb2af817f27
+# SKIP-SINGLE cf0053a66a8055e05e9842c41f60c2130f4dd642
+# SKIP-SINGLE ed2d884872ab18e38ac7d8ba17e1d3a3446029e8
+# SKIP-SINGLE d34eb7a39f15524dd13681864be14f85d15b4a0b
+# SKIP-SINGLE 620794aa93107115b52f3622c7b6934ebc3fc8ac
+# SKIP-SINGLE 5e06f2fc31a12012d73ef741715a68e47f0c3a09
+# SKIP-SINGLE 8bf2e4e282ff3c0661ebea70e574cce16bdcc356
+# SKIP-SINGLE 5ebc3fc47cfefb9f6726e9308f153c0df6941c12
+# SKIP-SINGLE 79d4b6915c0dc3e27ca18353bf53ceb31a14ded2
+# SKIP-SINGLE 20d42249ce8d7fad1e377621e717b238df3a4b05
+# SKIP-SINGLE 4d7a51eba2c780d10a0b0dac33936c178c677f50
+# SKIP-SINGLE 70a7c65742244403422d7c3e4b79a2046c1cefb7
+# SKIP-SINGLE c8a0b81f8ffe093910dd3ad2852dd47a15587d9e
+# SKIP-SINGLE 6f6362207f7d39b5fb10b2968d238e37848a5a9d
+# SKIP-SINGLE eb6ac423aa21a50d86056fdda4b2bd58278dbef4
+# SKIP-SINGLE 6a65498228c80a6cafc514dee7092b64e9bb84c4
+# SKIP-SINGLE b6540a8ef5b2725812760f5a9a5cdaef591cb5b4
+# SKIP-SINGLE 765e57e2d25d34280b25b925dd8ede4cbfd39020
+# SKIP-SINGLE f5ab0db4b03c497112fdcde3b8b270c3fa14a3c3
+# SKIP-SINGLE 7cd401f63db705acb8ede6624c293843b41e7e20
+# SKIP-SINGLE 941937d295dce322e00a1d77b61041e6bda5cfd8
+# SKIP-SINGLE 52089993aa3231ccdfd0469aeb7c3e7b6b89edad
+# SKIP-SINGLE f4603ab67438ec1a31b35918608dc4db410be9c5
+# SKIP-SINGLE 311c278c5bb26291fbe6d2e28130c43a08dce096
+# SKIP-SINGLE c4d723e865e86a83cf87d4cc42e7dbca799dc4ff
+# SKIP-SINGLE bdcd8dd9fe4a9926a0dbc46ee1180ef53a91bf17
+# SKIP-SINGLE 24fe275711aa0964051f3b95c9bc9b4a3e524826
+# SKIP-SINGLE 281d3a7aadefb673917bc585224c9bf7dae449e6
+# SKIP-SINGLE 291531a7e46edcf52f49e193114e818c111d7af6
+# SKIP-SINGLE fd6c673cfa76b30d3910963982e2c28ca208e827
+# SKIP-SINGLE 15e31a4a1fa359cfabda074903fce79f4982245b
+# SKIP-SINGLE 916a87f0a9748b4c31f20496fff3223553f5226e
+# SKIP-SINGLE d73dd4c12c92db4419df1b96b1562c5c821bf877
+# SKIP-SINGLE ac036532599bdd49ab3bdd36437a06a12224a620
+# SKIP-SINGLE b72d1c5b157214bc8feb4e6364ba624f9feae271
+# SKIP-SINGLE 4ed657604d669b4ba05a9280734c5f006939cdab
+# SKIP-SINGLE 92fc5baf17ccd0999f631d469708523de50ac06e
+# SKIP-SINGLE b30bbf030bacdb0b66c0296d1368db7b4c07558c
+# SKIP-SINGLE 643771818e36a8448744f061184cb3411b13291e
+# SKIP-SINGLE af51e6556daaa4e847209f79ac9dbc1a3ecc8836
+# SKIP-SINGLE 757a95906805b1d7fcbe4b536841a7b53ce0c047
+# SKIP-SINGLE ab69bb63641d12f8a53a262f37908d8234935e13
+# SKIP-SINGLE b6288d1322ec476c156c165496d08e8f782bcb03
+# SKIP-SINGLE 74635dafacb9ebb640a4a69108dabdd897c2498f
+# SKIP-SINGLE 29e17e08b395db8e08e4c91a543750f8021376e8
+# SKIP-SINGLE 0c33a8ff4bd20fcb5f2d4d2a27907c77804f4e42
+# SKIP-SINGLE b6e7df0926b1a569a582b0d3ff0da0c27ad368bd
+# SKIP-SINGLE bb8f8f5cfa0f66729c6c6a333bee5bd4ba16c24c
+# SKIP-SINGLE 7dc99d5d51fcadafcd7e38f169ef8b353db61e81
+# SKIP-SINGLE bdadeff503d1796758a498dee218751520bb0cf8
+# SKIP-SINGLE 128cc4a2f401e96936e9e5791e65fbdc35ace6b2
+# SKIP-SINGLE 3e18100038a0514b1ea6bee01a141f1477fdfbf6
+# SKIP-SINGLE 5992502ca42263855e327239eeb7f51b59a2703d
+# SKIP-SINGLE f63e1740edac418c2ab88d72e1ee56cecfec038a
+# SKIP-SINGLE 5dda07d22c8d974b31e196a802414c267fac5cc9
+# SKIP-SINGLE 9901f47ef77e777ebe0183624024527ce691256d
+# SKIP-SINGLE e65d2f364cf40891d15009e9764143a45c2d164c
+# SKIP-SINGLE b9c228438d34b15ae2804a563d4d52b5e0de62ad
+# SKIP-SINGLE 9273afa89034783aa26d4f5bb43cf22afce57e74
+# SKIP-SINGLE df59970cc41cee834f2432a18a098ec7de16f7ae
+# SKIP-SINGLE a42d67628942244b0cb90276c4e0ec77e967c0bc
+# SKIP-SINGLE 26da67d10b93e2997679e27b56a072e4767102c2
+# SKIP-SINGLE e1757517c33d9c6428ecab8bc277aea14ec0c96f
+# SKIP-SINGLE 7720dceba1079151c37aa0a3117ac22dac45a119
+# SKIP-SINGLE b670b2d8be07dd47274e4e771437b6c4e8649d66
+# SKIP-SINGLE 39e224ba18485d7da68d13579c74afb2cc86f382
+# SKIP-SINGLE a5e428a638718223b0ab667382a8493a135db0ca
+# SKIP-SINGLE b3dc6e8f06892869e0dcf39fd226b63752ce6cf9
+# SKIP-SINGLE f46bfdf3234548f664824b7c96838d3f918950d7
+# SKIP-SINGLE 6465002b8a51d065a662cb589e8e1cf0a78ad160
+# SKIP-SINGLE dba7034ea10fb394b0dcf91256b7df094218119f
+# SKIP-SINGLE 63bcc81d1df8524b20dab1fd45b2cba4d822a786
+# SKIP-SINGLE c77ad1866d0e559db41118ad5a2c306c81fa3c21
+# SKIP-SINGLE 318c4772af4fa04fd8dc498bdc252b691b3cdab5
+# SKIP-SINGLE bebe5a9791f7db3f088e0c07b2fd68e1d21bb161
+# SKIP-SINGLE 79f7d40fa850806450621f2fa4c73974399bd7f9
+# SKIP-SINGLE 1b72dad74f2e193e8da8de58ef8c46341897269a
+# SKIP-SINGLE 8b22849a5cef3e81e8b81cf7f32c186471607e06
+# SKIP-SINGLE 868b6b454ea75361a706ab57b45b6a49b124231d
+# SKIP-SINGLE a2cf65d2030c7856d029e43fec378efe42934400
+# SKIP-SINGLE 976357769fe33e36afb37d5cd663587f46e88d0e
+# SKIP-SINGLE 759a15d446b7f728d2d146cb1bfd6d722df9e998
+# SKIP-SINGLE 7726cb254503c2c3d082ffb8aed9c12cbeeec12e
+# SKIP-SINGLE e25cf441152746a4686ab7adca8d3302e0740189
+# SKIP-SINGLE 6e1e1bdc2c6ee45ac12283f8e8096723d60d93a1
+# SKIP-SINGLE d025ce26f849ae8429f5250eeaf6f4915befe804
+# SKIP-SINGLE 80826b8220c6f26609ce916ceee3a0bd143a1b41
+# SKIP-SINGLE 8da012e224276e42c15d613c0aac3ce3e1a3d939
+# SKIP-SINGLE 13651c52ca6c90265fe568a62db1f81152cfbfa7
+# SKIP-SINGLE 231c71706b3b5eec8038986f54198a8983ae83c0
+# SKIP-SINGLE 45a4510738a0878267fca5fdd687981c70209023
+# SKIP-SINGLE c7341aad72ee4cfca5c989ef982f07fbd14d8837
+# SKIP-SINGLE f78257006c46ac537aba00658b11a75a11bd1fce
+# SKIP-SINGLE a556a2ef5b45a25ff5df9a7cf3dc50e1ec46224b
+# SKIP-SINGLE fb9711df98be83c357321761d06e902e5410da79
+# SKIP-SINGLE 13811eba32c8d43126e3d137ddcedbdab4dd81c6
+# SKIP-SINGLE c87027e054ec247f3c7b80b2159cfcc633bfab7c
+# SKIP-SINGLE 099f9159c4312ad17e51fd3c9571cf525fc01b15
+# SKIP-SINGLE f9723f947a919f70aeb54a9cb6515a4ead3c90d3
+# SKIP-SINGLE 53947aa60b193ec9a34442d4492ddee9ea36ff30
+# SKIP-SINGLE 5aee49d203aeae2dabd1263736c0c6bf799f4f8e
+# SKIP-SINGLE 721d1102986ad16bc71dc7a460ad08cbbe3ae979
+# SKIP-SINGLE 15e4c44564829f2eb3a7845ae94e064540ac1a4c
+# SKIP-SINGLE 8c149505a08ddec931b54e358f4d43e847920861
+# SKIP-SINGLE af7bfaad6a6efa67cab0855b93ebdd920548a007
+# SKIP-SINGLE 988a5133dc86e28e4b097d2c8d64d25e37bb6c5d
+# SKIP-SINGLE 1deb54f5c9c0b4f3c594e4f4aa76b42a67643976
+# SKIP-SINGLE e1d945421522f5b944b35e70cc0a535acc942230
+# SKIP-SINGLE ac297b67bb5fbd4488023ca693a1dc62f012da5d
+# SKIP-SINGLE 210a3c0b3ad2a944bfed4e87a5039a9e4e14329a
+# SKIP-SINGLE a11dc2c8ad5f4162fbad497ce7a813d9f58837b4
+# SKIP-SINGLE 8f446c06498b0c41e58d9265aa72c4615a220956
+# SKIP-SINGLE 79dc3a717e23cf66d04cf3ec3392bd7635839bd0
+# SKIP-SINGLE 187c1eed6f5e21088c5b9b129c65b3e2fe512d1b
+# SKIP-SINGLE d88694315f88baa24d4e0bd40be450218088292b
+# SKIP-SINGLE f3fd0293d9112e5e1ad9ad3bfb1e982dcb0d032b
+# SKIP-SINGLE d6ab30499153b2d6b9565039714f210930a10f65
+# SKIP-SINGLE 592bfe5a978c949883472e66bd6c00f58808a506
+# SKIP-SINGLE b3d858da8d577449e2ab40572422fdd1bdf8b538
+# SKIP-SINGLE 4da353c6a3900ddacab00d685432fba12099dbd0
+# SKIP-SINGLE 1001af9b847c1c338638ba1aee037dd8451882d0
+# SKIP-SINGLE 87bf022f2f5457febf23c2ce792c549928771bbd
+# SKIP-SINGLE 203b6ce9fa148ca05fc2688a8a1a607dc922acd7
+# SKIP-SINGLE edcadf5c440a95c0c6a564d89eb9beac64e229fc
+# SKIP-SINGLE 3ee58c64e57cde232a062cb199688b2686488ef1
+# SKIP-SINGLE 5c406adac75e1b007545991fb7f20068bcaa5b22
+# SKIP-SINGLE 7ce2c17a0fbde3203f311c6b91d8bb2ba77adeda
+# SKIP-SINGLE 65eb55ff4194c67ede020ceabd7b92e7d2128908
+# SKIP-SINGLE 097f36bc75a6570e64f80451ae4bbe2172d610e0
+# SKIP-SINGLE f867699b23ad012ad71f08f88ecf3e0e8df045da
+# SKIP-SINGLE a5803441934b5a128f02169c37e4e00b25b4fc10
+# SKIP-SINGLE 8bfe8ce8d0885e8022b2bea82d1cff9cbed86fb1
+# SKIP-SINGLE 96fc40d7dbdc77efa7b2e01f231bef9e19e96786
+# SKIP-SINGLE efd20b8c4bec0b6edfeb0c415719cb7b230496ba
+# SKIP-SINGLE 34d1a15307a4cb1f667e8af6ecca523369c436c1
+# SKIP-SINGLE 1e9bd1df4c1def12750b2ce6dc335c1921a21686
+# SKIP-SINGLE e642113184136a66fee782c3cdec832ec2ba4c0b
+# SKIP-SINGLE b8aeb2e35d99e14970d15561fcf161ce78fd2426
+# SKIP-SINGLE 16b2a5471eaa7ae2514398720696b3da12514e84
+# SKIP-SINGLE 5cbb6ad8951e8393c3cd728738214a0c87e149be
+# SKIP-SINGLE b3038fa86716edfe9f015c3d0a4c53b9a61c975e
+# SKIP-SINGLE 2b56339f75811a670a18439fedd17de932662c78
+# SKIP-SINGLE c43a9d940a9d033f7770f241f920a537167b211b
+# SKIP-SINGLE 37381fb9b2cc225d127d8eb7cfc0e42c27cc1413
+# SKIP-SINGLE d234e9bc8ae3c8ea1ecb82970a4fd1fd89850249
+# SKIP-SINGLE 70fc2a742d28697b0bb05c16665f038f6f79c86e
+# SKIP-SINGLE 3943db1ab27a29105520bb4e2975e68540e3f055
+# SKIP-SINGLE c6680e15d7c46b9c15358c5bcca4c70b3b2608be
+# SKIP-SINGLE 1121416cfde99f0738d0dac63b6fdd2667de2c5e
+# SKIP-SINGLE 15b4f9d8786d4ecc9eab81d114f09448de2b9ce9
+# SKIP-SINGLE 68472f45a6a441b1436b5949c0384dd57111077c
+# SKIP-SINGLE a80140032be992d170925f274fad215de97d9a50
+# SKIP-SINGLE 7e3d6657e7a952c2eaf9d814ac639613ec81ac1d
+# SKIP-SINGLE 7ad90d410813dae9d2fda3c251d14678b8f104d0
+# SKIP-SINGLE a5524504164ed9077984b90ecf5067d1e8bcbdb2
+# SKIP-SINGLE 2a5c81a5c92d15e8db471d16f3a014a338f9c271
+# SKIP-SINGLE 6ce8092a01519acd2afe29a68b11809280677ad7
+# SKIP-SINGLE 28cd3abbdf24660d8c3587ee983037f82058b87c
+# SKIP-SINGLE 38a5a36a17578a5e06ab18986ce6dae68938e1be
+# SKIP-SINGLE f42b2b0143f5f6e6fd9741b482cd98785feb95da
+# SKIP-SINGLE 17807af213da9eb08507d47dff142a1f8672b4e7
+# SKIP-SINGLE bebd14acc1f646c79702fca4f7081df30a49a66c
+# SKIP-SINGLE 770e52e7001ccdd309a47cbf8b8c9862bfd44ab5
+# SKIP-SINGLE 2b48e5f979610de9c92df24d7cc6c47b6d8d83da
+# SKIP-SINGLE 5a9d4d67043e86831df9c8b3dcb398c45b01bb06
+# SKIP-SINGLE f4d2f75a0782c53bfb09b70bc75de3c974ae5002
+# SKIP-SINGLE b21539f6083bb7be6ce3b7d7701b270bc0bf384b
+# SKIP-SINGLE 1f2529df7d4663597d6ac72ac001def4cd049c1b
+# SKIP-SINGLE 25127da57f5de6ca42c90206f1bb7de0efb41ea0
+# SKIP-SINGLE 54e18532e7e731ec556e4039d677592215a78ac3
+# SKIP-SINGLE 5238cd1e6a9b3c310743fdb4497f8f16d965367e
+# SKIP-SINGLE 01442a9ac9c6e6a652b628cf18b90a7e30bff845
+# SKIP-SINGLE ffa59bb1611609879151b6dfa94772f9e2144849
+# SKIP-SINGLE 6696b561d4d37aebdbb42833d8b5a8d1f4e14482
+# SKIP-SINGLE 530faee2752c7b316fa21f2ac4d1266d3e7a38e6
+# SKIP-SINGLE 53f9bc6908a4da8f5c985e8f204a479c828c432d
+# SKIP-SINGLE c69c185109c90ecc486ab707ed32d7bb7aa467d5
+# SKIP-SINGLE 89cbff32e41771a64ba62e449ec797d55f86f15c
+# SKIP-SINGLE 3c5e3ca2badeda8637e84586eace6ba619f0110a
+# SKIP-SINGLE d5f6dc131b63d6bde096c03927c05a490c707c41
+# SKIP-SINGLE 9d8ce520f03217e5aaf08b3e252a1bb82c3fc641
+# SKIP-SINGLE 05f89e8ef4eb5fbcd04fcc9c0dcb92f90ad6b28c
+# SKIP-SINGLE 79483a5873a90bb28178af59acfdb00040c3d23d
+# SKIP-SINGLE bb0496e7e55a7fca89c51eb0b85dcfa6904ea3ec
+# SKIP-SINGLE 4acc4ac66753ff1556be907f2611b48ffc3fc79c
+# SKIP-SINGLE f7e10297d18b17f55b4a8442a3307db00605d46d
+# SKIP-SINGLE 73ced8c23ec3d5cdfa6d926af649235104707d85
+# SKIP-SINGLE 8cc8adb04d2861fb1b1bbb38e53feccf3a2fc1c5
+# SKIP-SINGLE f8b07ff4f318d799a471c9363903e3929fd5c844
+# SKIP-SINGLE eb1d22b136a3f7a49b4060553b79ee188f55a498
+# SKIP-SINGLE 6487d4ac5da92aab4d54b5702bba24a5a1ce8432
+# SKIP-SINGLE 1f3ba658fccdb0b35bdbbdfeb8591dba72ee983f
+# SKIP-SINGLE 43b6f05dfb46637a414520b27430fbe3b0f005fa
+# SKIP-SINGLE 65cc8efa333bbb66acd7b19f4b39c3138995e864
+# SKIP-SINGLE d432cbeb27c1f0a2e59c6853b61ecba3615f645e
+# SKIP-SINGLE 886ded1b70f24c52ee526f0c4a69ca06829fb2a3
+# SKIP-SINGLE c5ed3a72a8a70931ef9b0f9d69f73ff0fd40cadb
+# SKIP-SINGLE 208a11d3f0ede17b29da45c2491b703b6942a764
+# SKIP-SINGLE 1b809f378f6263bc099da45c5e4a42c89fef8d71
+# SKIP-SINGLE 5c890bfc191d0cf18dccbbf50ebdcde946a0d7fb
+# SKIP-SINGLE b16d553ecd1b0478ba28dca5d898fd22aa130fd8
+# SKIP-SINGLE 3568c5d86fc8d37d761245c19246f76803fb1f16
+# SKIP-SINGLE 1e09364d677b0fb57efd18369c55e8c2d0e826f5
+# SKIP-SINGLE de1b33f5a8c6ceee9be59285f70370c3cb2efd34
+# SKIP-SINGLE caf155c4638d4704b2a099657153c9abc115720b
+# SKIP-SINGLE 79e133da034cd2d7cccfc5a6eb7db340f2dc45a8
+# SKIP-SINGLE 7be160d80002cd000f33da38d3a2f7a2920c1bf5
+# SKIP-SINGLE f6d6ccc984ac241e1a5f61d770bf77c15f30ad07
+# SKIP-SINGLE b23daca20788ab6b54362c5bdb0470887de106fb
+# SKIP-SINGLE 0fc8671d10ccab52d78afdaeb715bcc9e52c0ac0
+# SKIP-SINGLE ba0a61d10a5aedaf4b7bb61aa3626f385d6aba12
+# SKIP-SINGLE c6f42387e32a4e99cd9ddd203ab51f3c5694054e
+# SKIP-SINGLE 46e7613ad3b88807d25cfab3d78bf46c9e2fe13e
+# SKIP-SINGLE 843b55f6822bc1e8b97b91222e7bc03b5caa9919
+# SKIP-SINGLE ed943db794987cb6fc87b55d68d6164190ba9a24
+# SKIP-SINGLE b799cc271d69fc494da1fe04ca8ec6c529a19a19
+# SKIP-SINGLE 289d6b2265e19822ed5ad44e5c62e9bf3750f606
+# SKIP-SINGLE b42df36757e7c86f33730090a8a0789e957f8fba
+# SKIP-SINGLE 527b8a807143253ed8e52de004fb3cc9a17123c0
+# SKIP-SINGLE 2e669305fca1d20e9224dfe0146cef8267c47071
+# SKIP-SINGLE 99f8a1c91733a8aaa47818e78dfe86c5635ce086
+# SKIP-SINGLE a8e3b29b2b73292c8497fee8932b04fa07a2c08a
+# SKIP-SINGLE 8264e8deaf6d67492964b63bb729ab6fcc350781
+# SKIP-SINGLE 50dd037338784381300f411c64d39a9fbaaa7f5a
+# SKIP-SINGLE a2323c7ccb0eab1b6395d5d1d7e18db617354e13
+# SKIP-SINGLE 91d539b0772d4b2a6bdc3fbccf92dc1fcc7f747a
+# SKIP-SINGLE 4ea90a711d11b14be728241a4454f8c5ee7b6478
+# SKIP-SINGLE c3b53559965a4c6f48274c3cbcb43eb6ef23ae14
+# SKIP-SINGLE 97267d2bf1fbb9279d32f75eda9dbcf0c4316edd
+# SKIP-SINGLE e704a6956d86ae394ecb029e066bf8d8c061baf3
+# SKIP-SINGLE 809934f0220e1d9a1780ab97d04fececf2b934eb
+# SKIP-SINGLE 31ec1a7d329cc9374b16c5831d30248c99e93dfb
+# SKIP-SINGLE d93bca019713e98228aca9f4d1a4838a72b1cf92
+# SKIP-SINGLE d168110a322389a9f991d7a5bdd1cf777642c990
+# SKIP-SINGLE fe7263803c37c836b3484861fbe13674a5063b4e
+# SKIP-SINGLE 29c7f8c915c3889dfd5b25878aa0692f826cd38f
+# SKIP-SINGLE 6e73e07a6f5cbdd1c5ae6e0f3fbd0f8f56813f1a
+# SKIP-SINGLE 3b9dad88e02f05773c599808266febf3e4128222
+# SKIP-SINGLE fddd63f8b854f6bfa91403f69ba694ccb54197bc
+# SKIP-SINGLE 97eec9db79443f99eecfd84af73e5249748b9796
+# SKIP-SINGLE 11e22452b0ab6f2ea7679665ed8e9abcbc03eae9
+# SKIP-SINGLE 79d585c2befb81ac5480a9577eaeb6e8915cae23
+# SKIP-SINGLE 59698d924e541b1768a61caafd0dfa40b5ed4b34
+# SKIP-SINGLE 77e194971c5370856a63cf02397d79f85d6b342b
+# SKIP-SINGLE abd8c9b4d71651b00552d3d5dea119f22adf3874
+# SKIP-SINGLE 69caa111c290eb1f02013c407f4ac2549b172c36
+# SKIP-SINGLE 8933cf86a1c64fc3302188629356084bcbfc65dc
+# SKIP-SINGLE 6e90768143ff47e96a70d91534344161a1d85f46
+# SKIP-SINGLE ffdb91c6b344b6b341e75ae981ebdb3e66b94130
+# SKIP-SINGLE 2601aa9105d935441ed25370feeeae3e717cc791
+# SKIP-SINGLE 8d5dfafab7dc40d4b74dc0b56d1b314fd8cac390
+# SKIP-SINGLE 4467073c50d2c7fbbb30530d1a0a25f8272ff56f
+# SKIP-SINGLE 4459dcc07865f6ae1f21f624fcb09cf8fdaecdb5
+# SKIP-SINGLE 21e475ea0c0d04ae7634f377ed64fe179388b133
+# SKIP-SINGLE c0d24d5316626a3d5e76f99a0f418463cb355459
+# SKIP-SINGLE df06cfe4a9859a00d7ea046be8f82f1b9e4564ec
+# SKIP-SINGLE 1ae8a18d949e3a3dc3f7a6f2284ecb35871416ca
+# SKIP-SINGLE 6e974130d709e9e8624dab5c24a6639c0331cb77
+# SKIP-SINGLE ca194ae5c9d63c032827af6c58132b066bce7fbd
+# SKIP-SINGLE 6927f237679e73343aea0d70e356fc247c05c4d6
+# SKIP-SINGLE 673d281b82886490707f3356a87b5a992d1dc0ed
+# SKIP-SINGLE a902af6c1b04abcac4d6d221a2b0086cc076bda1
+# SKIP-SINGLE e2613f41213c89bfd90d34a7a5fb120e7366ec6d
+# SKIP-SINGLE 3a964dc5c124d1b5402e7e5cf7a6b6f28310e67b
+# SKIP-SINGLE ac4dd5f244032148595fb787ff926882390b36b9
+# SKIP-SINGLE 952550258dcf06bc03662974aa6b6db9d792aedb
+# SKIP-SINGLE 667e002e91a26c20089c5843254a39b771b64ab7
+# SKIP-SINGLE efd80237ca6085f28497bded259a92a48bb6005e
+# SKIP-SINGLE 22910e71e5092250b2134dae07bd8e2a82e4f750
+# SKIP-SINGLE b9683230ecaada87f23bdba59ef044c4b0374216
+# SKIP-SINGLE da383aeb8e629f642b46e9c64b2ffcec9976c23f
+# SKIP-SINGLE 0689a4ac508a213f29c11ed6230596885d42f89b
+# SKIP-SINGLE 1fdbeffe3a65cb23abb43a4ea59df9553c9246f9
+# SKIP-SINGLE 40842f67afb2931de6789237a49570f99b70404f
+# SKIP-SINGLE 4e1f92feb3a861f93b7a285715d03be930b41b91
+# SKIP-SINGLE a0f060939456f3680823e34f430e482fcde2f5dd
+# SKIP-SINGLE 5dd2d50f3d5e65b85c87da86e2e8a6d087fe5767
+# SKIP-SINGLE 0776ac06803100e36d2ff7532744186f70bfcb56
+# SKIP-SINGLE e490ffcf953cd2a82aef86e05da24352db5d4568
+# SKIP-SINGLE 58de11fe1339a1248f9b0bccb3a3601a9d8f56c6
+# SKIP-SINGLE 515eb6989575dc1d8e8f996ec65494e637f24ffe
+# SKIP-SINGLE 9034dd053163d6fc383d1ea4223c0b4dd7e9fb39
+# SKIP-SINGLE 13824c44d28427931a7e3284adec9a3a38cd2323
+# SKIP-SINGLE 681faf9f0bc41972932b72ef34c026419b6eb54d
+# SKIP-SINGLE 63cbb54d7e163f74657dba46829262282ccda0df
+# SKIP-SINGLE 3478e64c88fe0187f49343ed778d7e9231cf5837
+# SKIP-SINGLE d1aacceae939318f419e0c265358e041c53f1eea
+# SKIP-SINGLE 164aac0a9919fb34896ddd824394a65802343a50
+# SKIP-SINGLE bf9ec3d91a79414deac039f7bf83352a9b0a9a85
+# SKIP-SINGLE dc94ca7b2b878c9a88be72fea118bf6557259ffd
+# SKIP-SINGLE 9fc1fdcbf330b0a85cd019bb75afcb8d36243524
+# SKIP-SINGLE 758753431af51f7ac79a55d426b915443e66a077
+# SKIP-SINGLE 49c748e336ee3c50e28d2aeda6396efc358d961b
+# SKIP-SINGLE 6fecf6ef2552a9b44c4311b7d5af3af0a5a54dbe
+# SKIP-SINGLE 71857d410635743d437ce1ee73dff69de50030d6
+# SKIP-SINGLE d4a6e42e92ee215659d09b0456032714aab73ca5
+# SKIP-SINGLE ceb9da3b7125fbdf0da04a3b158ac1e792c87f4f
+# SKIP-SINGLE 252d06dd5d177ad3d6d0464eb3e65dd6ce4cce79
+# SKIP-SINGLE 155dba943263236ba2c41926bae3cc45229b15bc
+# SKIP-SINGLE a602d548dfaa1dcd44c3af017ccbbcd3586ca023
+# SKIP-SINGLE dd3f6b13f673433e590c55b24232cf0a7e70de6e
+# SKIP-SINGLE c1e45419c7ad9679771718e91205502d30da6f2d
+# SKIP-SINGLE ec0527d8e9a7f12898c8fe9fdb6daec21c1d2ba8
+# SKIP-SINGLE b2164df86ba80cf4b7f3499596fbcf803395b6e7
+# SKIP-SINGLE 3d49ad73e5a93625629c96b6c0b921bb019ea9da
+# SKIP-SINGLE 89068554d7d0e9970a7269a0963e7a2bd0b1cc99
+# SKIP-SINGLE 483df14d5c4e04ff2a9fec18b68399c0ab2b56b4
+# SKIP-SINGLE 0934363c96ff774ce242b51529688bbfbb48ba02
+# SKIP-SINGLE 159dbd5eb211e36d98e200781f2eae93f0973aeb
+# SKIP-SINGLE 56254fb98c3369392dc2bd4383b7ff2ea24f2dc4
+# SKIP-SINGLE 4633e02726fbd683332eb64dee97b109aef4361f
+# SKIP-SINGLE 79eb840753edb2dd9e0bf1d4befb8e3e1275e009
+# SKIP-SINGLE aec08e609e6c672c6e85d91b84f45e38019ccc9e
+# SKIP-SINGLE 7d9d3951c6736d5606828e2727a7319856511ddb
+# SKIP-SINGLE e793a73fbea3167368bd173211c1995e07dcf913
+# SKIP-SINGLE 404023299429a2619c6e4bc5da80eb248d060ef9
+# SKIP-SINGLE 59ff342869062caba72af7834c00b36753fa7461
+# SKIP-SINGLE e4300777e8cc7559ea29faaeab6cafd3f7ebf3b7
+# SKIP-SINGLE e40f5a91eed69b5d6131671ba1699ce3ccb92f16
+# SKIP-SINGLE aa6cacd7138519aa8906c850950020d0546ae355
+# SKIP-SINGLE 2e595b3e8b887068e47e64116d5a910c1045a229
+# SKIP-SINGLE 91e7df281ee628eb56e7d016093a751f4e04366f
+# SKIP-SINGLE 0aa9f478e962e3e2d146871fa37267709404c52e
+# SKIP-SINGLE 2671ea0de8e90e20241fe0441f4f8b79eeccdb12
+# SKIP-SINGLE 958d6b4cf77af951d1ad40c02c5d5dcc28f31120
+# SKIP-SINGLE e36d3fc452735d1a1a2293e18b8e4ef944f8793d
+# SKIP-SINGLE c094b8c20a79c731cd36e86a3a6bc777606586bc
+# SKIP-SINGLE ae9bfaa891c4f3cacb118aef6e35432d5fbeb88d
+# SKIP-SINGLE 9d14e410dac11990cf0e95a1a77e83827323530d
+# SKIP-SINGLE 148b136651413d8eca0f805c786fb04b9c5878b8
+# SKIP-SINGLE 3c972723e44c9428ea990562033acfbd84ed29d9
+# SKIP-SINGLE 194c299470e087aeeff5c496c7dfc6400e1185a7
+# SKIP-SINGLE 8f5d2a3181d22f858ede3fb6a1452f99272901fe
+# SKIP-SINGLE d50e0bdbac8e6683c6af4efa172c1b801d250486
+# SKIP-SINGLE 1e8074f5ea9e61a6fba33ab2af0c79b9af7d7a24
+# SKIP-SINGLE 9e79575486fb6aeb0deb23e17cb2ce9ec02b5fd7
+# SKIP-SINGLE 3be2a6b8b4098e5cf118d196e4cba37054d8292b
+# SKIP-SINGLE 0fd79ee039de664bc06b0dbcaee786f88a2b079c
+# SKIP-SINGLE de477ec683482a5dd27d791d7fdcfc4021ed3cb7
+# SKIP-SINGLE 8df7f89af672f0592b6a31be9d1687b1369692f6
+# SKIP-SINGLE 19206fd1e764cfe89234ae9245bafa88ef1ec354
+# SKIP-SINGLE 92ffe44834b8f77ee3f4d37edfdb19f30a376869
+# SKIP-SINGLE 5e5cde55e5be6e2d388252c3ccb0d019aee6b89e
+# SKIP-SINGLE f6339412eebdc027b00263ae2b5c38a029e2f7b4
+# SKIP-SINGLE 32d12840e666d1d07c92cc31f0b12965451f7726
+# SKIP-SINGLE 895215854db66ee8017e5ad5c3215eb089d33e07
+# SKIP-SINGLE 469fe6a040d6df612c00ea169670c6d8d7e58563
+# SKIP-SINGLE 9e131f55d8d5a1eeb44e7c5a3a5e56804be60dba
+# SKIP-SINGLE 73d6b19024db10b65ba368bd079223157d73e737
+# SKIP-SINGLE f25ad39983cc3e89b007390bc0fd860f48379497
+# SKIP-SINGLE e0ca8f791c2e4396f1e40d86c136ae547b40185d
+# SKIP-SINGLE fc520f8b7090fb95e61a498b5b23be6041475bd3
+# SKIP-SINGLE cea0d61a69ef443924fdd4e4c429d7103b4acb9a
+# SKIP-SINGLE dd0727e1ec1f535b9b06be88173b4d3ccd55abcb
+# SKIP-SINGLE 3e6c69de9d1ae99ebb71eb2ed04bdb9ee42cbb80
+# SKIP-SINGLE 34e3ad5ae449f4801af09d1df89d57350d0dc579
+# SKIP-SINGLE e726a00381e0f2d8dbfa52a10c82116a8352adf0
+# SKIP-SINGLE 32b9b22f66b1afcc614d5f76860d56d5630c5bc4
+# SKIP-SINGLE 0b43e7a49327ce32c67648eb898551002f135ef5
+# SKIP-SINGLE 81b589518c2e574b084907c7d7fb8e6e5049800b
+# SKIP-SINGLE ed77d1a8c0f005d4f158b635d39db0d5d79fe1ee
+# SKIP-SINGLE bc60ce7ffdf39fc3288938337e7f6c0706b37082
+# SKIP-SINGLE 35dbc79cc3233129da90ae2f4916d73e189b63cc
+# SKIP-SINGLE 41b1d223c6ab7bca1b626a4c07a4f2dda2855feb
+# SKIP-SINGLE bf79dad3f20345ddf095325ce22c0f2a3408d3ba
+# SKIP-SINGLE c4dab6c179a78ae17d02becf66a098bd72a12233
+# SKIP-SINGLE 4c7faf33776c6566fdb374ae2b54960fc70c3228
+# SKIP-SINGLE c469efbd8361cffff72fb6a4aeaeea40c5adf110
+# SKIP-SINGLE 9ea5a915bd1b9458af1587d63170888346e8baec
+# SKIP-SINGLE a516ab79c300517d5c3ab68c45ff9c90bda6c67a
+# SKIP-SINGLE d45e72fe5a9205b2e146d27e8e26233ee8518331
+# SKIP-SINGLE aa6a05c146e94c0afc35b5354d68da55aecb2db7
+# SKIP-SINGLE e2494bdaeea309c6b270dc09beba34da5f193573
+# SKIP-SINGLE dfc7338828a8db6cf177633f942efcb0d7930aaa
+# SKIP-SINGLE 6927841ecba6494858cc3af7c0500e6cd3c4923a
+# SKIP-SINGLE 105c7562dc38de31cda6dfed00a1c260a6e72ea2
+# SKIP-SINGLE 4844aaac199de9af8da0a62b5ae92b1f5a7abb2c
+# SKIP-SINGLE 7fa11be2fae2b9fa5981e01da05cb618859d77ca
+# SKIP-SINGLE 2f6b519eaeb3be4ee6a912b40a21686be12d4d88
+# SKIP-SINGLE 3f98188b864fb4f16a7c2878a96c880ec55452dd
+# SKIP-SINGLE 7ca865dc52a31374c68dc870246353db5acc023c
+# SKIP-SINGLE 5db380abad0482ae74aa71761f0da2b2351ce97a
+# SKIP-SINGLE d353c08d2bf25ea8e42ae4664c3a276d549937b5
+# SKIP-SINGLE 20ab7e07afef7a878565bac97f63bafe5f9d6e04
+# SKIP-SINGLE 35075267a67b6474416e0e413d0d60c1f5f5fc36
+# SKIP-SINGLE d633db5189f335873a03544f9f41dcaf77c8e31d
+# SKIP-SINGLE 88e1f8b02086aaf652e3058b36b7612c073c04b3
+# SKIP-SINGLE c8ea3f09e09b18b909f5a6c5434185b8dbf2fa63
+# SKIP-SINGLE ecdda194a82c8c52bdb948160f55ebbabe733d79
+# SKIP-SINGLE 4765487d5d24fc8a2a06c329dc9cc3bed9803391
+# SKIP-SINGLE d5499e3eb2765ddf212e3f21fed7b356b8f0ec76
+# SKIP-SINGLE c274bd5c52fd64c888b1c713060da881bf72caa7
+# SKIP-SINGLE d96db7b2e8c35ec2970d12c96e2328b684626f24
+# SKIP-SINGLE 935cc42795686710f82b8928b6802f20be8f27c0
+# SKIP-SINGLE 52d5771e0a803f57b8cdd7675bf15f2f9b946039
+# SKIP-SINGLE 9e1186a73279f9e6416cc594171482be5a223820
+# SKIP-SINGLE 905fabe5904c9588bf0c5d0ae15ca0ed354b3656
+# SKIP-SINGLE ba0264e19153281bcf264e99c01c130c701151e2
+# SKIP-SINGLE c1fa5bd8ee3c7f37a9b9304eab6b522cf8718472
+# SKIP-SINGLE 4290f64dc9948264b5d9bdad2330ee15aafe6589
+# SKIP-SINGLE 5a10e6377c2b97420e5617f114bb374d67ec1a58
+# SKIP-SINGLE 2a2b3f583430df8495b566a1dfb1f41c4d61292f
+# SKIP-SINGLE 58398dea254dcfdab58d5439061a513b48cfe895
+# SKIP-SINGLE 5acf75cec1c2cef383a7c022171f5a1d195c09ca
+# SKIP-SINGLE aab5d7b3f3bb6fb82924aaabdfdd6e2a79ad3141
+# SKIP-SINGLE b3023de5431fc308e2a6db61ed4fdd18db785324
+# SKIP-SINGLE 02ae85e8aa735b0d9a312f811d03204bf8fdbd51
+# SKIP-SINGLE d1f315751d960f003317713a65cc480b3d0ee726
+# SKIP-SINGLE 760107639be7657c4a209c9c04b17c79fc19f2c6
+# SKIP-SINGLE 8b7aaf3e56c63cae7e2affc249179e5022451595
+# SKIP-SINGLE 56fb536e78f3e3019b85995ba1d788065c3ac415
+# SKIP-SINGLE 02ef00d89c64d713f29f4ed12dbcae9f8d31bb9a
+# SKIP-SINGLE 6dc4e3b95ca9589f24530979cdc83ea346d1ca45
+# SKIP-SINGLE ec464789dfc5179c72e6929ea99a72f508c562b6
+# SKIP-SINGLE 5ed566cae08d4f39920bea81fd6bf2160f38348f
+# SKIP-SINGLE be0cf9e2995df4d0ff504561afdefba00b49438f
+# SKIP-SINGLE 8c153047e78e078b2001be9cf16ef3bbaa375a39
+# SKIP-SINGLE f14f6180b78656eec2f4dad5b79eb5da20bd0b70
+# SKIP-SINGLE 3f746d44decf9f991ee2a0a0529a2bba9ad12988
+# SKIP-SINGLE a0524584e93a66278dcf7bb998398f7484f9e8b5
+# SKIP-SINGLE b2a5bf142fb25094ff623dc93d2ce916aee3d971
+# SKIP-SINGLE 2f68673a712508f70de20f485422c7e01b8ab21b
+# SKIP-SINGLE 45694a25948146e860738cb4e01de7e7e9aa91b0
+# SKIP-SINGLE 91bc24c46768aab4a851c87edaea05c7476ff779
+# SKIP-SINGLE d2e0d1452b976a51579cf044257326850804c562
+# SKIP-SINGLE 3294ad44ebcd024b4ada68d00bedca33acc52de6
+# SKIP-SINGLE 3933ece030150908c9189c11cf683bb3df9e4e18
+# SKIP-SINGLE 7fa37d7a1439bf8cd76b336ea95d3a1982b3ae03
+# SKIP-SINGLE b257a7894b6b8536ee16e6b334207c8f5c887280
+# SKIP-SINGLE cdbb02a597298b7812b456fca3d61e223dc40b7c
+# SKIP-SINGLE 41c09d347feb94b9070a9aa2c78ccf65be7fd268
+# SKIP-SINGLE c7f141d67829ccef64a5e4e961f098f09774afe2
+# SKIP-SINGLE de0b7af169345442852622bb337483398c583a9e
+# SKIP-SINGLE 6fbea946bfd0119cf517211d058ea277c9209a87
+# SKIP-SINGLE cd479aa8bd498da4d7980a7fe7a37e238761482f
+# SKIP-SINGLE 36af7004e2bf0db1d9c2fd1312215a931c1db3df
+# SKIP-SINGLE 3fd58ad37e12845fab905c00e87ae1d49755504a
+# SKIP-SINGLE 58965d91e7fb5a26a5422357f44d6e841f67db74
+# SKIP-SINGLE c50718dcfa54293b695f8a3fa5cd4d77848ee084
+# SKIP-SINGLE 5276519255c27e7dd01cbc3fea00d1c29f44d514
+# SKIP-SINGLE d9bd334ef367f3e16967ae2ed714ff419f2b5328
+# SKIP-SINGLE 3d6af11c42453065d5ace1223fe99228b7927318
+# SKIP-SINGLE b7f227ed8bece1a8fafd36ce5f0ee0d5913b6f8b
+# SKIP-SINGLE ee93a06b8b1922b31e12cfe60566779f185ddeba
+# SKIP-SINGLE db03eda6369a9d4af3c72a8ab6ec29e3cc58acc4
+# SKIP-SINGLE cdaa3b51f1500ca1d91452037efe68fa0f7808bc
+# SKIP-SINGLE c6029ed34ea83c7c0adbd723d63bd78ff0ec0796
+# SKIP-SINGLE 77882158b2aeff7f235c409d6572173ae4c3a38f
+# SKIP-SINGLE 67a218d33926931b20096edce3eaba2958283bde
+# SKIP-SINGLE d3c4833d1350e26a2ae35e00eaf2d6bef1724679
+# SKIP-SINGLE 2bab0f2db6fff3a99d3bc498d6139ee42aab96ea
+# SKIP-SINGLE 4313c695cd6370667ccf086cef0d9201fdf796ca
+# SKIP-SINGLE a25cd7f68aa5babb7cc9002d89ff02077937927b
+# SKIP-SINGLE cd41ce8c6c107901a499bf55dd2b0383befd37af
+# SKIP-SINGLE 280b8c96ccaeb95548adda78466ef2b1c3cf4546
+# SKIP-SINGLE 57a978fd74454392a041ac65a5abba8d012b88cc
+# SKIP-SINGLE fc53961c1df8bee07b6a1d461d31f449b66f1d65
+# SKIP-SINGLE 350e97d78e7803650c6dd2bf46fcfece8e2b4b32
+# SKIP-SINGLE 304e2a3a05feee6578aadfa0228dde734fe850cf
+# SKIP-SINGLE 874e2525035d45efa6fa374a2ebec3740ecc1457
+# SKIP-SINGLE e2df22fa016247dccc632b2cb4fc5b8ffb4c3c7c
+# SKIP-SINGLE 0069085be2d0e6c7d439372b06b866df4c669891
+# SKIP-SINGLE 72278f21e0ef0c79f756bca08577297d11e22518
+# SKIP-SINGLE 616da8fa8efa9023f56fa731072d877e2150afbc
+# SKIP-SINGLE 51f8e86374a57efe5b8e5c31d96078e63c023da4
+# SKIP-SINGLE a29a3ad55d650af6230e2cfe8ef1ef45b5feb133
+# SKIP-SINGLE 7a9f8ed6fba0d6728cbf185696bdc1a95b1acfea
+# SKIP-SINGLE 7f298bab5234073b1565a7008f63b89979a925d4
+# SKIP-SINGLE ad1baff0a12cb22c5c515e0ba3ed29d4b876451b
+# SKIP-SINGLE fe82c0743b3feecb9b80549ef4bb3dc8529891a8
+# SKIP-SINGLE 89c589bae47fa7faa7273a9df0f4be836e9da29b
+# SKIP-SINGLE 6d8638e5e494fb0ceafffe19bbf349fff643e12d
+# SKIP-SINGLE e89532c7c7c5098a77f3ec6fb5def98b1f9034a2
+# SKIP-SINGLE 15a9e73a1793a61b87d3f460e2e4bc5b7df1e6a8
+# SKIP-SINGLE 4e091c8ddf6bf421a4dd0210a3a4b77a3ecf24f5
+# SKIP-SINGLE e2b774e64a903e856356971c0fc3a3835d3883c1
+# SKIP-SINGLE 82b602dc2f52775a4082d24d64380867da051350
+# SKIP-SINGLE 8ae173a8373c12f17acc9d7b22910cd106c12b4b
+# SKIP-SINGLE cfb295f1e55e4d04beaad5d57ede494c436cf277
+# SKIP-SINGLE 9a9634dc725278a6a676fa4590f53543cada34b2
+# SKIP-SINGLE fdbe3362c5a72be7d4c930a614fe5853bf6eff1f
+# SKIP-SINGLE 72c7ee2e525d87b58a28aea8af8cef31f607d7c0
+# SKIP-SINGLE 85f1ad0c798b5556c37185f4930929d5aa386a5e
+# SKIP-SINGLE e1553142fefaf39d4742d1a161de2bce691204b2
+# SKIP-SINGLE 39aa623479128b465b01490845f0781c03eece8d
+# SKIP-SINGLE 286e308561d00a31e0321919ef36d9bc6dadbeb3
+# SKIP-SINGLE 8af91dee9a9031ac0d49848b16bd288685f1f370
+# SKIP-SINGLE 8783700b23e70874c4996908bf02c010ae6f3fe1
+# SKIP-SINGLE 344b48f490416cb1200e19b28d356e7fb5b04387
+# SKIP-SINGLE 409327ff68f9ccdc8099f6a2ba2fee76abaaab70
+# SKIP-SINGLE f25f4699d760c5409a1571dcfdf4ed0fdac9e0ec
+# SKIP-SINGLE 5cceb6d6acf6299f1347133aec7097b8771ff952
+# SKIP-SINGLE f5f296b0800de4cd459e41b4a7b1cb97673e8dbb
+# SKIP-SINGLE 9aef9e2cb6b547f62911d06e90081af32134de66
+# SKIP-SINGLE 43e9c8e9d28dcb659a43e58778e2745d1279051f
+# SKIP-SINGLE fbf2bfba0770b7f575d8ef06ca3a08cf1a38cc2d
+# SKIP-SINGLE 7ca456da7f72feeeec571ece3c373e2b3a3d327b
+# SKIP-SINGLE 0e7361a5ccce084613d54d6ba3954ffca6074817
+# SKIP-SINGLE 2a9797b422fe8a28bfaab49974ea2be21ae2502e
+# SKIP-SINGLE 5d73bc5c69f56ce1b22c950d19ef6406b662949f
+# SKIP-SINGLE 16986a9cc42ef4de580456f4acc5feba682ac8b1
+# SKIP-SINGLE 2d2cdb4741a3c1e42c8ed771303a878fd428911b
+# SKIP-SINGLE 4725c123f33eb9579b695748fa9f85c9af3eb01a
+# SKIP-SINGLE 0c7024d0d9172322052de2ee571ba64afff905f0
+# SKIP-SINGLE 20d44771201ef96fcfd6aebffe05aa50c5fa8074
+# SKIP-SINGLE 7a551e92005dc9964c1a74a2896b5dbf0ca231b9
+# SKIP-SINGLE c681f374788235cbaf1dca062450202e90fd2a86
+# SKIP-SINGLE b92a5174939fba17ffb5235dd926c7063c13b1d1
+# SKIP-SINGLE 6cabef8799eb053c593f0a5241503ccbfb616c8a
+# SKIP-SINGLE 3e5856b21a83a52dda8c0b3ab541d106d809d625
+# SKIP-SINGLE 86581698acc1a0991592e018c1ba749f3ded21be
+# SKIP-SINGLE baa39e48495e100af6704af9287b544e612c245a
+# SKIP-SINGLE 9c67e8e56d40926454e00b5652c2b519ae0b507b
+# SKIP-SINGLE e961a31507e6fba86a5d45fec7fa616e80028882
+# SKIP-SINGLE 65456668ab1048fe8d77dc76a9e4d84481c218a5
+# SKIP-SINGLE c96157c8f8290bc2049dc947b6d264564659a545
+# SKIP-SINGLE a7ed5071b70f07da4c99198126c48cc6b448090a
+# SKIP-SINGLE 1e624452004e17bec2070b0c0b9f5639f66df1f8
+# SKIP-SINGLE 3f25b22cadc9f73583e83b00f828ee00efa8764e
+# SKIP-SINGLE 938e68bb280c96eaf163bd932ab2582fbe27e780
+# SKIP-SINGLE 3069849bd4c1048a8f8c0467d26560fad939e791
+# SKIP-SINGLE d45253996670509e668d266d577f48deb9c7018f
+# SKIP-SINGLE 43f25120c9a2578df3df47491ed68a0566ff6f61
+# SKIP-SINGLE 9d266f2a6c0e51f184d55c8bba4551abdeca02bc
+# SKIP-SINGLE 76eb88df0243dd15492e71f068fd476be8efc800
+# SKIP-SINGLE 32870d2f207536bb7932beeb2e0ec9a4e0146560
+# SKIP-SINGLE 625ea08652053617034bf8ceee0d6cfae34f2dcc
+# SKIP-SINGLE 657947dc7cf01a13a4fa260691a6fa0147107950
+# SKIP-SINGLE 4fa13b2d838e11cbe3b713f3172721cb61d499f3
+# SKIP-SINGLE f17ca55a0a3c9de1061285763cbf0bd3754f6718
+# SKIP-SINGLE 4c5f1737c4815bd6d167108343a61da9a3882f32
+# SKIP-SINGLE ac9bc819bc438f21bd38a995812d756727ed8e2a
+# SKIP-SINGLE 7d7e9ef46a1b310fb3f481cdf8023082f5ec1618
+# SKIP-SINGLE d6362b632e3c76cb55a05248aa221e426c5adb5a
+# SKIP-SINGLE 00df4566af9dff0a27fd6da566ef1e53268a6d47
+# SKIP-SINGLE 655957087c8654577e7c59004f16be7abcc2c46c
+# SKIP-SINGLE e41af3971de8f71b5241698a8b29349905f1a969
+# SKIP-SINGLE 59eaa30b07e9a79a9b2bb6ade0be9aac846384e2
+# SKIP-SINGLE 5d77eb4b7c00d0652b190166c393efa16d0775a9
+# SKIP-SINGLE c6384e9bfbc765229ea9676ba1044b9db28fec2d
+# SKIP-SINGLE 409f0430b6a0c138836e5067141bf6b2a7beb6b3
+# SKIP-SINGLE 2f03053e568f38a1dce5ffe02ad1359069ef84c8
+# SKIP-SINGLE d5c6d69b4fea2d5a1167a0bcc0b9994a5939b97e
+# SKIP-SINGLE 28490cd65ba50ce4e1f411556e1faa36f1db84ec
+# SKIP-SINGLE d06127e5736b0564daf99a41c77c8c23d394e759
+# SKIP-SINGLE b440fa0a6b48a95323fa922b88e9a9a73d6c6360
+# SKIP-SINGLE 62e37ecc4020b3a5b18cfdcff9a7cb259fd8145a
+# SKIP-SINGLE ddbc33343cca8c66d841cc16eac77ea626e50e23
+# SKIP-SINGLE 902649a170ab651cffe2bbb421e1331b23c7ed01
+# SKIP-SINGLE 7bc615fd23c1304f8682f2443db235fbc37bfde9
+# SKIP-SINGLE 7f57d80846b5f674c49a717d6fc086c14f506415
+# SKIP-SINGLE 639821d49ab9497908d8d3bcd472aed558c251e1
+# SKIP-SINGLE 75b65b3f67eb9a4e5722780cb915b880e667d674
+# SKIP-SINGLE 306e49285a04c02f0a575a7d7b2f82eeb032c86b
+# SKIP-SINGLE d1ef0243eb6e7cd9720236eb0e900fe7163b3c2b
+# SKIP-SINGLE 162c3da7a0ae4cb5e1b0e34731621ec13ac01e43
+# SKIP-SINGLE ab70ab19be64902123b0e2c08191d5ebf70feb62
+# SKIP-SINGLE 8175497ccac1b3afc2208260be91423e2bca2d25
+# SKIP-SINGLE 63f8a838eccf201d6290d0dc8f83881f41785afb
+# SKIP-SINGLE e0760599b045a7ef3828ae4b624246b6beec2e75
+# SKIP-SINGLE 34e50dc4a23505dce0499f120477e2e1a1327432
+# SKIP-SINGLE 06db8015ea05cc17efb16684de23533ee315be61
+# SKIP-SINGLE ecb216fd93dc959bda283d27d759b253ee0e2798
+# SKIP-SINGLE 0d195584f20bba1c1de165fbc4162417737755c4
+# SKIP-SINGLE 829c7e3566ed425c0204067c654a58970af6d4fe
+# SKIP-SINGLE 7e9c2e295283b4dcf4f88cf25a094e37731543fc
+# SKIP-SINGLE 3a0c94ac0b5d5098f9140c5ab4231d6dd06ec393
+# SKIP-SINGLE 3a5c4bdc0c079f72bad98e01f70343ba9e9b0043
+# SKIP-SINGLE 908aab6144bf9f62dd5b2c2f1776ed177fa6d18f
+# SKIP-SINGLE c78dc25a5351b1a4191028ba252c892ae1dd2438
+# SKIP-SINGLE 67f9705fc0fc5ecc91172ab02df8c1f31fe654e2
+# SKIP-SINGLE 25c6bc7a3d3679b26406bbcac33954186db491f2
+# SKIP-SINGLE faf44e2c61734cfe2422498ed27b4f645635120d
+# SKIP-SINGLE e333f040e9f68bdce2b5735b4b9dd68944199056
+# SKIP-SINGLE 5cd3db73bed06e394ea8e7b0e332b1b1e5bd9571
+# SKIP-SINGLE 4489450f37deafb013b1f0fc00c89f0973fda14a
+# SKIP-SINGLE 98ed6db34f76cfe37d70d8ad82d29fcfa2a56e24
+# SKIP-SINGLE 2ec403f777adf39d3e972667513086f2053530dd
+# SKIP-SINGLE c5e3b99467dd07522f9522cc77cddbaa69222a7b
+# SKIP-SINGLE ab4edbf60eca767775e18d8d0e318c28a74792b3
+# SKIP-SINGLE a5a047a07f2d4f98fc67b40eb1f1a1d711905381
+# SKIP-SINGLE f5084ed197cfea8387ffa7dd72b72933905fe699
+# SKIP-SINGLE e06953b02a0e7b26b33c511a22896d0db4e5d63d
+# SKIP-SINGLE 77cb95c851edc338c94cb35effdc8c9ffc64a461
+# SKIP-SINGLE eecc2d45b94513ba95789dfe0ef58aeb8b029049
+# SKIP-SINGLE 663d768d44be150439a58cd858615cac3c1f572f
+# SKIP-SINGLE 838fc77254286de318b65602b31c6d3915594a8e
+# SKIP-SINGLE a7042fa051c69b8c647fce3ec52b74974b5ea2be
+# SKIP-SINGLE 2332c3eb55b2c8541ea83d4a847c56f888239f6a
+# SKIP-SINGLE 077c66405261381704da33e6858f4b6639763f5a
+# SKIP-SINGLE 2b4d46f99be3735823666c2a6d9f058cedeb031c
+# SKIP-SINGLE 5858921f409f6ee9d2e08dbdcd1719969a4f5544
+# SKIP-SINGLE 29418f954eb114bf3c108b6e03569036f854ae45
+# SKIP-SINGLE 07292b1344549a164eff9d548f819235a14a0b4e
+# SKIP-SINGLE 1bed1f0b8e9095d66f905ed7b409a397f1972262
+# SKIP-SINGLE 98f5b74808a54ad9093888b72b2c04e085f4b369
+# SKIP-SINGLE 1ae314dfda1a7746fb31957ac3eedefd70b3c1fe
+# SKIP-SINGLE 488a6efe323927a4064afc193b66cd11e2caf77c
+# SKIP-SINGLE 9fbbb2355298f75e8fd09b35306e843ce45b9e25
+# SKIP-SINGLE 076a25810127cb8c56ff0f5272a3d8b98192ee77
+# SKIP-SINGLE f847ecc40bc768d97ba57083fd669ca0104e500f
+# SKIP-SINGLE b471f7f6141b3db8fb00f62f12900846f59beb9a
+# SKIP-SINGLE 5fbb7a126d19b41848b57e7e012619fa13cfa4d2
+# SKIP-SINGLE d4e8c90b66b4aba66ff1a12a0894a33af91feb0e
+# SKIP-SINGLE 243ee7b244797aae460b9e2a7224f75599f3a9b8
+# SKIP-SINGLE 951dd2a4d98aafe88bf2c6c2f86901230e3f0cd2
+# SKIP-SINGLE c924b6afb6810d6b9585092fc5693e3c9efcd1cf
+# SKIP-SINGLE ce9e7204138261f71d0e1636036727d8b05ac81e
+# SKIP-SINGLE e0e3299c01d3ad7236a7a950f43f54a1bff548d8
+# SKIP-SINGLE 784f53a2152181b687f9543ddba9c393dda1c715
+# SKIP-SINGLE 673a55780d2194f74c5774de83d0dce5131e7a31
+# SKIP-SINGLE 8ad4c4009e1c7360df6f59175b1a701d7f4ecfae
+# SKIP-SINGLE d9d66764e2a02db9f19f5c76ce34ac7d8bc1edc6
+# SKIP-SINGLE f6dc55f516a88765bbd8b8c34f0ec663b8948373
+# SKIP-SINGLE b86deb617b109bcb40e9c95b10a033a209c1d8fd
+# SKIP-SINGLE c5f24f76eb1653d64c2ae90764e395cf6e050657
+# SKIP-SINGLE b028d4f7dfbd72790679423a8dcce9994b07834d
+# SKIP-SINGLE e3663d0e9c6ec32a70226947767850924b90bba7
+# SKIP-SINGLE f9f9b43df5bdadb54a1ba14e1624aa254d9f092d
+# SKIP-SINGLE 5416ae5990337f5fb2b3e0fbf9c4575508da808e
+# SKIP-SINGLE 99096528494a653d1ee9d7832ee3956a613aeb95
+# SKIP-SINGLE 6b91ea5a6159791d1d1e5006f8cbc384c0da1701
+# SKIP-SINGLE bd8e19e1e2ccfb76c1fccc4dff1f8774185cfea4
+# SKIP-SINGLE 88d54756d46101b97b7fde97b4bc3b62f7bd6c06
+# SKIP-SINGLE 32e87f09c8c2711c421363d0361693dcfbe5a688
+# SKIP-SINGLE 69ab588bb54178df0d3be6b4c04dabb49f5a2ac9
+# SKIP-SINGLE f331be1f074d68e7e5cdbac324419e07c186492a
+# SKIP-SINGLE 040991a4697b50ebcb54e498e7de54b8d0885101
+# SKIP-SINGLE 5070278539a8e47988cd9529c9c2e4ada8c92472
+# SKIP-SINGLE 0be9a639fca70c278d1b79fcea5d6beebdf7799c
+# SKIP-SINGLE 31f75430999b9021fc68739af231261608aac255
+# SKIP-SINGLE 77f1533ccbba1a5dc0824770046696181a2b7b6c
+# SKIP-SINGLE 57e37e9128b4f6f9a2aae0bc25de6c208d58e5d0
+# SKIP-SINGLE c6dce90d7e57486db687606bffd92d580a7d25ca
+# SKIP-SINGLE c88a1631e3f76926bf0fed49fa1b704d6eaf2155
+# SKIP-SINGLE 8607f018fd8bef7443415ff2e356d035843ad828
+# SKIP-SINGLE 1cd42bfb8a5ff2aade43f31b864a8d2cd643d5a3
+# SKIP-SINGLE f0e9085a17be8866c123b120e3252c52845ec38e
+# SKIP-SINGLE 9d3f8912b431ed5540d9d06d85b7e338732268c9
+# SKIP-SINGLE c8909fa3688aca164e4fd38f6293c4a201e148eb
+# SKIP-SINGLE 10f96a8c57b031b521ae8ba5a02413b94ece423b
+# SKIP-SINGLE c2ecb08775dc24618de507d2d1ce0f9b0debe17e
+# SKIP-SINGLE cb183f6467401fb5ed2b7fc98ca75be9d943cbe3
+# SKIP-SINGLE 76b86d98534da2c9e6cf8fd1c7edcbe53d84eb82
+# SKIP-SINGLE 85073998cb47567cb30fb41f12135bd799ad2588
+# SKIP-SINGLE f1e058d46b5a83ddd0423a3616aa50ac3ec7f551
+# SKIP-SINGLE f46eb3d3ca759ab3944cedda1339a6d1760298cd
+# SKIP-SINGLE 9fab83ed7a90209e3873039e7ae4993c667e2759
+# SKIP-SINGLE c957832cbf3e87e5a25f7c2bdb70abd959391d98
+# SKIP-SINGLE e5043db2f1f3d0ce6618eb45419e85f0d58fbf19
+# SKIP-SINGLE e8df6c311fcf59bf23d31b9db2bb8fec9d78fbe7
+# SKIP-SINGLE da87895df2d6b21468b187f5a4e2ca8710e35ee7
+# SKIP-SINGLE 6203b9db347d2d002c0cb660d5b4daeea54bf3ad
+# SKIP-SINGLE f6e92035a7c3c29aa980e1bebf9c48f1bb7264d8
+# SKIP-SINGLE 7ebbd4efc3d45403cf845d35c36c21756baeeba8
+# SKIP-SINGLE b584569014abb1fe9f59decd86ea097a189d9bb5
+# SKIP-SINGLE 17422c2cfcbf1670ba4dbe3ecdf3c5ff719201cc
+# SKIP-SINGLE 2349ecb3216bb9f7808ac58e5ce6abd6bcf90387
+# SKIP-SINGLE 6fb6cb075f05629a562275064851bef6b72d5dd2
+# SKIP-SINGLE 6a2399c55e9505be06cb98ffbe1a3878f9e96fb2
+# SKIP-SINGLE 4ba76224eaf5fade94438bf990bf5eb05912b530
+# SKIP-SINGLE 77e6a704ac819580b81400ff1d8503d142cb3905
+# SKIP-SINGLE 524d10c86b539ef6fe27f31ed3df2590d1849a83
+# SKIP-SINGLE baacad1771e3551ffdb1b88c41224fa1957e766c
+# SKIP-SINGLE 9ed53535f5543910f746662618927052dd718991
+# SKIP-SINGLE f6483526cd4b4b9ed7d830599add82ecb45009e6
+# SKIP-SINGLE c4122067d90857594508f6c00e8af87d91ddb7d4
+# SKIP-SINGLE 1bb7b43e1cfb911737bc4807671910238277470f
+# SKIP-SINGLE 5532ae81cff138a2f6d30c3541210311a4894ac1
+# SKIP-SINGLE ccd2509ed31f953408240357e9b84c3d3b3f6a2b
+# SKIP-SINGLE bc66ff98756fa28bbc733ef81103cac6730438fa
+# SKIP-SINGLE 9b5ecffeb00f22ca6663aa14e7807c9886ed1716
+# SKIP-SINGLE bb8376145abadd901b0d8f7f586bef658e2b333c
+# SKIP-SINGLE 092776c7ebf20b4d1208a0e0d860a1f3abd7d119
+# SKIP-SINGLE 434fc2a22e4fd65fd63018e9373cbf56b51f8ab2
+# SKIP-SINGLE 591759d508024a666a863cf918287744e72b1267
+# SKIP-SINGLE 75c8cc5eab51d1080424687167fec4feb34f68c1
+# SKIP-SINGLE f6e3de3f63616d7bd52c1390f9dea70fa33e49c2
+# SKIP-SINGLE bb8a46e559ec39437a1524b3e9746746768effcc
+# SKIP-SINGLE 52c8fdde1667ac4b5d7f2af5eff94d6512d83caa
+# SKIP-SINGLE 8bc6e31502244ca16bbf7b163a7a321ec9094882
+# SKIP-SINGLE 3a4406975338eb6dad9327b5d17f67a677114e6a
+# SKIP-SINGLE 02f78c09b0a97ba044a43682a366a9d7732b885d
+# SKIP-SINGLE 954b6e1dc3edb6a8260be810c3f02c335e90b6b8
+# SKIP-SINGLE 79ee266f13fa5c657b24dc45d5f573c393a671b6
+# SKIP-SINGLE c4179117afd37a03a7ba322e66b5bd6bae5637bd
+# SKIP-SINGLE 45b8204e09b7d399b792bb26c799efe48835c4a7
+# SKIP-SINGLE 2a762336da4d886a4f1b3ee463fd66393d739309
+# SKIP-SINGLE e45d8dbeea488ac14fe486e5582266980d29e82c
+# SKIP-SINGLE 253126bf339a16589e86acd51c0f96da07e658d9
+# SKIP-SINGLE e868955bff3b97bad88bd09b4401e87cab94011c
+# SKIP-SINGLE 6e60d464188994bdce97f1aef3b81fae3fd28583
+# SKIP-SINGLE 5868580e94ed93ce4f0ec88b03b232f5cd29178d
+# SKIP-SINGLE 18947103fabf8070738b3bd9c5a8d02f90988a3d
+# SKIP-SINGLE 3114eb807864e19cd8ffdc5d8f8e11366a619769
+# SKIP-SINGLE c352392420236d4fa7a8ac7f324f1a0358ad3584
+# SKIP-SINGLE a915d836fce238cd57233f67e8d2451a26d2fb6b
+# SKIP-SINGLE 5c1b9e65b9d1c73ccc4ce18842d10bc507cdee38
+# SKIP-SINGLE 57b904f4bab7aea7ddb9d3b36229008a47b32ff1
+# SKIP-SINGLE 2f6b017e3dc646d317b56fb453c90aaa44c27089
+# SKIP-SINGLE fa9bede36c18d063f6f599e102cd42f9d0afc071
+# SKIP-SINGLE 0c7a7df98e1fb0bc156707b379e4147fac97359a
+# SKIP-SINGLE 0480e9c445d59fd5ec9b38ebe3919fee2aabf8d2
+# SKIP-SINGLE 5a2c1a743b54f7d3355f9b1dc893bbe72e8df6bc
+# SKIP-SINGLE 629f222ba2abf5a149c381e27c89e88963f7466d
+# SKIP-SINGLE ef6e18a6b9ab103f3f076b35100d09cff1687396
+# SKIP-SINGLE 9e339415b4c068242e7cd785d2ac95420f1934ba
+# SKIP-SINGLE 8c385f05120bdf905a027fe99eab23a59d0f837e
+# SKIP-SINGLE c4ad36cd2daab764649db451c4a3f1a35c5f519a
+# SKIP-SINGLE b755f45f65090665dd40ed0f0dc4eb6f9e4923a0
+# SKIP-SINGLE 1ea503ed4b3a14b3dc0a597cfbfe57d73b871422
+# SKIP-SINGLE eba65824364474bde89bdce5f57a772d74a2c409
+# SKIP-SINGLE 17b65f52921b6a9314a2709f0e5c3ef88b37f2ab
+# SKIP-SINGLE 170924e945f4cceda12b5e1681391c3b828a3dec
+# SKIP-SINGLE cea1e95d386270e1e682719232f2cfad384fab91
+# SKIP-SINGLE b341864d9002fd081a8a6dfeb5a5a00373738a2f
+# SKIP-SINGLE 6cf2a9c55dbf8dfbc93409340065cf02881502b1
+# SKIP-SINGLE 50e33639fe190f0a1c47b8e4c0fcc4735cb60909
+# SKIP-SINGLE af288d813b3c31a528ddcbdce08f497855a56e94
+# SKIP-SINGLE 007d8c485906be46d40e74ddb8046e065c722786
+# SKIP-SINGLE 08a1c32d0bcaa9369a34e7f7d6d01c3885f62e21
+# SKIP-SINGLE ceb9591e5dcb5264573371a573433fd76320954e
+# SKIP-SINGLE 1787e651d376486909e736478b1be92c949a368d
+# SKIP-SINGLE 734df28368c7f7c21b1068a67d4ae89e64d4a3d3
+# SKIP-SINGLE c5147882a91e51b59c7da035e9ef38a4731b943d
+# SKIP-SINGLE 6b475da972d7e2ff7a2a3cafc1aea2a4937e64e9
+# SKIP-SINGLE 7e36fd64d2ce06b821e0f57f6d850ff4386608bf
+# SKIP-SINGLE c120b0ebdb20cfff73dd1d43541f1ba1bbc54b74
+# SKIP-SINGLE 0b3f785c4a272b909108108cf7931779ae48cfba
+# SKIP-SINGLE f071e61d106e6f3c17b660e3aa1a5b7890ea5d41
+# SKIP-SINGLE 6a3caeab580f61f88c4ad49ff32cdf74eea4fb97
+# SKIP-SINGLE 06b5ec4bbde119d14d866fc3713a4ed390d531f2
+# SKIP-SINGLE 795e01ac248d389a581589b13a02465a2f99202f
+# SKIP-SINGLE aaaa4ca77e440499ec852069efaea42410ebe30b
+# SKIP-SINGLE 6f28810f6ba112059c09bc3bfbb2ef8e5c3f15ee
+# SKIP-SINGLE 773cce640fc5d67cb1a64622defa073d7ec5fcc4
+# SKIP-SINGLE 260e47e9a3c9b3baecef81e69c218989dc0cd7a4
+# SKIP-SINGLE e504eabe88727141e70ae9793be71d4285f839a5
+# SKIP-SINGLE eeeae5e9ee34da5539046ff8dac4f4fffa19a5b9
+# SKIP-SINGLE 861e1fb595eb1f01ca5c137fb4830695f9c1e7d2
+# SKIP-SINGLE 7c5d4348330b206aff1f8e5bc4fd241d6a6dc0b5
+# SKIP-SINGLE 1575ee2eeb1ebb5b73b4b76fc7dc7f5702748540
+# SKIP-SINGLE ce5ae0117e3ea009ccdd8d8f4c1365301d24f90b
+# SKIP-SINGLE 851a8f65e9a6b00b51f6a41f4c8f2ec2a797862b
+# SKIP-SINGLE 5159789e55d64c7482dff3dc1a621d01f530f83c
+# SKIP-SINGLE 25cb49ad565c764c390a411661088970db1f2b22
+# SKIP-SINGLE 9c4dddad456e23892a80303da26774a13250b647
+# SKIP-SINGLE 4c328daf0130fc139e827a8a8d6689e2b15c73ea
+# SKIP-SINGLE 1ee7c3041ac84b6c6f3f4f5275c417d91727312e
+# SKIP-SINGLE c9df4cace0f88197e69ae45d18bfc1692eecca05
+# SKIP-SINGLE b49250ada978c7b21cb93177c874c81a27fa4fec
+# SKIP-SINGLE 377ee8158b2fab3efccb4e9b262e6129b51e28f8
+# SKIP-SINGLE bd13ce184bfaf43f905faff64c5306ff3518f892
+# SKIP-SINGLE 914f68da059d5aeed3459e3944769aa4370a4075
+# SKIP-SINGLE e7b09065dae0aa8018c959ad3c69626bbcce8f17
+# SKIP-SINGLE 9f7c359f4023570616c9961487069ba1122a5bb0
+# SKIP-SINGLE a3651d3237e91f788211e507d61c2dcf886c185f
+# SKIP-SINGLE 62c8c8e51a23540cd189d6b2a22dd1a1cdbbf2cb
+# SKIP-SINGLE 7a4380b9051ddd0bcc4d5c90abe0f826a9b922dc
+# SKIP-SINGLE 23bb724c922de95573f73b22ae311696ae08464e
+# SKIP-SINGLE ddae8d4a13d58720a3118355fabc225a9d907160
+# SKIP-SINGLE a31538ea5b006c3901ab85354725993b689a259d
+# SKIP-SINGLE 1cdb24fe35a9ff2e4f92c5acc93a5a5b0e70d93f
+# SKIP-SINGLE 7c750343be6309a78d3fd289959bca241d9daf5d
+# SKIP-SINGLE bde8e87cb7b3be0e0bc9e72c3634f108570cac3e
+# SKIP-SINGLE 013c7d6aaef5f90730b1cfe42a01534d891e895a
+# SKIP-SINGLE 85d0c11119fbd14d508d228f5edf4cf53fb4e4cb
+# SKIP-SINGLE 53584db07ed3411d659678425c4481997e56c834
+# SKIP-SINGLE bb0a427e9d3c29c17c1b03773697989328f53056
+# SKIP-SINGLE 4ef50ccd3f8bc177ef6dd7183a9268bb8057f064
+# SKIP-SINGLE 285f8c7cfecee0c91568cd850139c48ec3f21a28
+# SKIP-SINGLE 96d44c4321724556819e2f718f1d94470d753d07
+# SKIP-SINGLE 1f74e9112e28faa57a7bf56547a9ebf8f6618273
+# SKIP-SINGLE 3a784d1321487be4031555d19ace635598bba21c
+# SKIP-SINGLE 4552b01d8c8052f607dca2fcddcf7b2e270f1db6
+# SKIP-SINGLE b6568c1389128d47538b646d940427949ddf58d0
+# SKIP-SINGLE 6d5b34d9de7b2f1b346d9aff123ad20c942166dc
diff --git a/admin/notes/repo b/admin/notes/repo
index 97f02ab605..2be707db27 100644
--- a/admin/notes/repo
+++ b/admin/notes/repo
@@ -129,8 +129,12 @@ This is a semi-automated way to find the revision that 
introduced a bug.
 Browse 'git help bisect' for technical instructions.
 
 It is recommended to start a bisection with the admin/git-bisect-start
-script.  This script prunes the branches that are the result of
-merging external trees into the Emacs repository.
+script.  Using that script ensures that commits in branches that are
+the result of merging external trees into the Emacs repository, as
+well as certain commits on which Emacs fails to build, are skipped
+during the bisection process.  That script can also be executed
+automatically when 'git bisect start' is called, with the help of a
+wrapper script that is included in its commentary section.
 
 * Maintaining ChangeLog history
 
diff --git a/doc/lispref/files.texi b/doc/lispref/files.texi
index 4b45d89f9d..a767f9c28d 100644
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -895,10 +895,14 @@ permissions of the file itself.)
 If the file does not exist, or if there was trouble determining
 whether the file exists, this function returns @code{nil}.
 
-Directories are files, so @code{file-exists-p} can return @code{t} when
-given a directory.  However, because @code{file-exists-p} follows
-symbolic links, it returns @code{t} for a symbolic link
-name only if the target file exists.
+@cindex dangling symlinks, testing for existence
+Directories are files, so @code{file-exists-p} can return @code{t}
+when given a directory.  However, because @code{file-exists-p} follows
+symbolic links, it returns @code{t} for a symbolic link name only if
+the target of the link exists; if your Lisp program needs to consider
+@dfn{dangling symlinks} whose target doesn't exist as existing files,
+use @code{file-attributes} (@pxref{File Attributes}) instead of
+@code{file-exists-p}.
 @end defun
 
 @defun file-readable-p filename
@@ -3205,6 +3209,9 @@ This command creates a directory named @var{dirname}.  If
 @var{parents} is non-@code{nil}, as is always the case in an
 interactive call, that means to create the parent directories first,
 if they don't already exist.
+As a function, @code{make-directory} returns non-@code{nil} if @var{dirname}
+already exists as a directory and @var{parents} is non-@code{nil},
+and returns @code{nil} if it successfully created @var{dirname}.
 @code{mkdir} is an alias for this.
 @end deffn
 
@@ -3378,7 +3385,6 @@ first, before handlers for jobs such as remote file 
access.
 @code{load}, @code{lock-file},
 @code{make-auto-save-file-name},
 @code{make-directory},
-@code{make-directory-internal},
 @code{make-lock-file-name},
 @code{make-nearby-temp-file},
 @code{make-process},
@@ -3440,7 +3446,6 @@ first, before handlers for jobs such as remote file 
access.
 @code{load}, @code{lock-file},
 @code{make-auto-save-file-name},
 @code{make-direc@discretionary{}{}{}tory},
-@code{make-direc@discretionary{}{}{}tory-internal},
 @code{make-lock-file-name},
 @code{make-nearby-temp-file},
 @code{make-process},
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index 9ff9614a66..c44938f392 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -4967,12 +4967,22 @@ first child where parent is @code{argument_list}, use
 (match nil "argument_list" nil nil 0 0)
 @end example
 
+@item n-p-gp
+Short for ``node-parent-grandparent'', this matcher is a function of 3
+arguments: @var{node-type}, @var{parent-type}, and
+@var{grandparent-type}.  It returns a function that is called with 3
+arguments: @var{node}, @var{parent}, and @var{bol}, and returns
+non-@code{nil} if: (1) @var{node-type} matches @var{node}'s type, and
+(2) @var{parent-type} matches @var{parent}'s type, and (3)
+@var{grandparent-type} matches @var{parent}'s parent's type.  If any
+of @var{node-type}, @var{parent-type}, and @var{grandparent-type} is
+@code{nil}, this function doesn't check for it.
+
 @item comment-end
 This matcher is a function that is called with 3 arguments:
 @var{node}, @var{parent}, and @var{bol}, and returns non-@code{nil} if
 point is before a comment ending token.  Comment ending tokens are
-defined by regular expression @code{treesit-comment-end}
-(@pxref{Tree-sitter major modes, treesit-comment-end}).
+defined by regular expression @code{comment-end-skip}
 
 @item first-sibling
 This anchor is a function that is called with 3 arguments: @var{node},
@@ -5009,19 +5019,11 @@ This is useful as the beginning of the buffer is always 
at column 0.
 
 @item comment-start
 This anchor is a function that is called with 3 arguments: @var{node},
-@var{parent}, and @var{bol}, and returns the position right after the
+@var{parent}, and @var{bol}, and returns the position after the
 comment-start token.  Comment-start tokens are defined by regular
-expression @code{treesit-comment-start} (@pxref{Tree-sitter major
-modes, treesit-comment-start}).  This function assumes @var{parent} is
-the comment node.
+expression @code{comment-start-skip}.  This function assumes
+@var{parent} is the comment node.
 
-@item comment-start-skip
-This anchor is a function that is called with 3 arguments: @var{node},
-@var{parent}, and @var{bol}, and returns the position after the
-comment-start token and any whitespace characters following that
-token.  Comment-start tokens are defined by regular expression
-@code{treesit-comment-start}.  This function assumes @var{parent} is
-the comment node.
 @end ftable
 @end defvar
 
diff --git a/doc/lispref/parsing.texi b/doc/lispref/parsing.texi
index af7be2ebf3..adb4c5e6e0 100644
--- a/doc/lispref/parsing.texi
+++ b/doc/lispref/parsing.texi
@@ -1735,20 +1735,6 @@ For more information of these built-in tree-sitter 
features,
 For supporting mixing of multiple languages in a major mode,
 @pxref{Multiple Languages}.
 
-Setting the following local variables allows tree-sitter's indentation
-engine to correctly indent multi-line comments:
-
-@defvar treesit-comment-start
-This should be a regular expression matching an opening comment token.
-For example, it should match @samp{//}, @samp{////}, @samp{/*},
-@samp{/****}, etc., in C.
-@end defvar
-
-@defvar treesit-comment-end
-This should be a regular expression matching a closing comment token.
-For example, it should match @samp{*/}, @samp{****/}, etc., in C.
-@end defvar
-
 @node Tree-sitter C API
 @section Tree-sitter C API Correspondence
 
diff --git a/doc/lispref/variables.texi b/doc/lispref/variables.texi
index 750aeabf65..12dd58c85b 100644
--- a/doc/lispref/variables.texi
+++ b/doc/lispref/variables.texi
@@ -857,9 +857,10 @@ error is signaled.
 
 @defmac setopt [symbol form]@dots{}
 This is like @code{setq} (see above), but meant for user options.
-This macro uses the Customize machinery to set the variable(s).  In
-particular, @code{setopt} will run the setter function associated with
-the variable.  For instance, if you have:
+This macro uses the Customize machinery to set the variable(s)
+(@pxref{Variable Definitions}).  In particular, @code{setopt} will run
+the setter function associated with the variable.  For instance, if
+you have:
 
 @example
 @group
@@ -884,6 +885,12 @@ will also issue a message:
 option.  For instance, using @code{setopt} to set a user option
 defined with a @code{number} type to a string will signal an error.
 
+Unlike @code{defcustom} and related customization commands, such as
+@code{customize-variable}, @code{setopt} is meant for non-interactive
+use, in particular in the user init file.  For that reason, it doesn't
+record the standard, saved, and user-set values, and doesn't mark the
+variable as candidate for saving in the custom file.
+
 The @code{setopt} macro can be used on regular, non-user option
 variables, but is much less efficient than @code{setq}.  The main use
 case for this macro is setting user options in the user's init file.
diff --git a/doc/misc/org.org b/doc/misc/org.org
index 0b926e3cee..c6b8e73fd1 100644
--- a/doc/misc/org.org
+++ b/doc/misc/org.org
@@ -20021,11 +20021,16 @@ changes.
   | =nofnadjust= | Do not renumber and sort automatically.                |
 
   #+vindex: org-hide-block-startup
-  To hide blocks on startup, use these keywords.  The
-  corresponding variable is ~org-hide-block-startup~.
+  #+vindex: org-hide-drawer-startup
+  To hide blocks or drawers on startup, use these keywords.  The
+  corresponding variables are ~org-hide-block-startup~ and
+  ~org-hide-drawer-startup~.
+
+  | =hideblocks=    | Hide all begin/end blocks on startup. |
+  | =nohideblocks=  | Do not hide blocks on startup.        |
+  | =hidedrawers=   | Hide all begin/end blocks on startup. |
+  | =nohidedrawers= | Do not hide blocks on startup.        |
 
-  | =hideblocks=   | Hide all begin/end blocks on startup. |
-  | =nohideblocks= | Do not hide blocks on startup.        |
 
   #+vindex: org-pretty-entities
   The display of entities as UTF-8 characters is governed by the
diff --git a/etc/NEWS.29 b/etc/NEWS.29
index dd11b3c271..e1864e2117 100644
--- a/etc/NEWS.29
+++ b/etc/NEWS.29
@@ -31,15 +31,43 @@ in the Emacs tree should be natively compiled ahead of 
time.  (This is
 slow on most machines.)
 
 +++
-** Emacs can be built with the 'tree-sitter' parsing library.
+** Emacs can be built with the tree-sitter parsing library.
 This library, together with grammar libraries, provides incremental
 parsing capabilities for several popular programming languages and
 other formatted files.  Emacs built with this library offers major
 modes, described elsewhere in this file, that are based on the
-'tree-sitter's parsers.  If you have the 'tree-sitter' library
+tree-sitter's parsers.  If you have the tree-sitter library
 installed, the configure script will automatically include it in the
 build; use '--without-tree-sitter' at configure time to disable that.
 
+Emacs modes based on the tree-sitter library require an additional
+grammar library for each mode.  These grammar libraries provide the
+tree-sitter library with language-specific lexical analysis and
+parsing capabilities, and are developed separately from the
+tree-sitter library itself.  If you don't have a grammar library
+required by some Emacs major mode, and your distro doesn't provide it
+as an installable package, you can compile and install such a library
+yourself.  Many libraries can be downloaded from the tree-sitter site:
+
+    https://github.com/tree-sitter
+
+To compile such a library, compile the files "scanner.c" and "parser.c"
+(sometimes named "scanner.cc" and "parser.cc") in the "src" subdirectory
+of the library's source tree using the C or C++ compiler, then link
+these two files into a shared library named "libtree-sitter-LANG.so",
+where LANG is the name of the language supported by the grammar as it
+is expected by the Emacs major mode (for example, "c" for 'c-ts-mode',
+"cpp" for 'c++-ts-mode', "python" for 'python-ts-mode', etc.).  Then place
+the shared library you've built in the same directory where you keep
+the other shared libraries used by Emacs, or in the "tree-sitter"
+subdirectory of your 'user-emacs-directory', or in a directory
+mentioned in the variable 'treesit-extra-load-path'.
+
+You only need to install language grammar libraries required by the
+Emacs modes you will use, as Emacs loads these libraries only when the
+corresponding mode is turned on in some buffer for the first time in
+an Emacs session.
+
 +++
 ** Emacs can be built with built-in support for accessing SQLite databases.
 This uses the popular sqlite3 library, and can be disabled by using
@@ -2725,6 +2753,9 @@ project-dedicated or global) is specified by the new
 ---
 *** New user option 'ruby-toggle-block-space-before-parameters'.
 
+---
+*** Support for endless methods.
+
 ** Eshell
 
 +++
@@ -3023,6 +3054,29 @@ indentation, and navigation by defuns based on parsing 
the buffer text
 by a tree-sitter parser.  Some major modes also offer support for
 Imenu and 'which-func'.
 
+Where major modes already exist in Emacs for editing certain kinds of
+files, the new modes based on tree-sitter are for now entirely
+optional, and you must turn them on manually, or customize
+'auto-mode-alist' to turn them on automatically.
+
+Each major mode based on tree-sitter needs a language grammar library,
+usually named "libtree-sitter-LANG.so" ("libtree-sitter-LANG.dll" on
+MS-Windows), where LANG is the corresponding language name.  Emacs
+looks for these libraries in the following places:
+
+ . in the directories mentioned in the list 'treesit-extra-load-path'
+ . in the "tree-sitter" subdirectory of your 'user-emacs-directory'
+   (by default, "~/.emacs.d/tree-sitter")
+ . in the standard system directories where other shared libraries are
+   usually installed
+
+We recommend to install these libraries in one of the standard system
+locations (the last place in the above list).
+
+If a language grammar library required by a mode is not found in any
+of the above places, the mode will signal an error when you try to
+turn it on.
+
 *** New major mode 'typescript-ts-mode'.
 A major mode based on the tree-sitter library for editing programs
 in the TypeScript language.  This mode is auto-enabled for files with
@@ -3089,6 +3143,10 @@ the Go language.  It is auto-enabled for files with the 
".go" extension.
 A major mode based on the tree-sitter library for editing "go.mod"
 files.  It is auto-enabled for files which are named "go.mod".
 
+*** New major mode 'rust-ts-mode'.
+A major mode based on the tree-sitter library for editing programs in
+the Rust language.  It is auto-enabled for files with the ".rs" extension.
+
 
 * Incompatible Lisp Changes in Emacs 29.1
 
@@ -4472,6 +4530,15 @@ set is too big to transfer to Emacs every time a 
completion is
 needed.  The table uses new 'external' completion style exclusively
 and cannot work with regular styles such as 'basic' or 'flex'.
 
++++
+** Magic file name handlers for 'make-directory-internal' are no longer needed.
+Instead, Emacs uses the already-existing 'make-directory' handlers.
+
++++
+** '(make-directory DIR t)' returns non-nil if DIR already exists.
+This can let a caller know whether it created DIR.  Formerly,
+'make-directory's return value was unspecified.
+
 
 * Changes in Emacs 29.1 on Non-Free Operating Systems
 
diff --git a/lisp/cus-edit.el b/lisp/cus-edit.el
index 94a9165453..8af4618dbd 100644
--- a/lisp/cus-edit.el
+++ b/lisp/cus-edit.el
@@ -1073,7 +1073,7 @@ plain variables.  This means that `setopt' will execute 
any
   ;; Check that the type is correct.
   (when-let ((type (get variable 'custom-type)))
     (unless (widget-apply (widget-convert type) :match value)
-      (user-error "Value `%S' does not match type %s" value type)))
+      (warn "Value `%S' does not match type %s" value type)))
   (put variable 'custom-check-value (list value))
   (funcall (or (get variable 'custom-set) #'set-default) variable value))
 
diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el
index 7b562aaa53..2c306d892c 100644
--- a/lisp/emacs-lisp/comp.el
+++ b/lisp/emacs-lisp/comp.el
@@ -4005,8 +4005,11 @@ display a message."
                              :command (list
                                        (expand-file-name invocation-name
                                                          invocation-directory)
-                                       "-no-comp-spawn" "--batch" "-l"
-                                       temp-file)
+                                       "-no-comp-spawn" "--batch"
+                                       "--eval"
+                                       ;; Suppress Abort dialogs on MS-Windows
+                                       "(setq w32-disable-abort-dialog t)"
+                                       "-l" temp-file)
                              :sentinel
                              (lambda (process _event)
                                (run-hook-with-args
diff --git a/lisp/files.el b/lisp/files.el
index c74e7e808e..f352d3a9a7 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -6193,18 +6193,17 @@ instance of such commands."
       (rename-buffer (generate-new-buffer-name base-name))
       (force-mode-line-update))))
 
-(defun files--ensure-directory (dir)
-  "Make directory DIR if it is not already a directory.  Return nil."
+(defun files--ensure-directory (mkdir dir)
+  "Use function MKDIR to make directory DIR if it is not already a directory.
+Return non-nil if DIR is already a directory."
   (condition-case err
-      (make-directory-internal dir)
+      (funcall mkdir dir)
     (error
-     (unless (file-directory-p dir)
-       (signal (car err) (cdr err))))))
+     (or (file-directory-p dir)
+        (signal (car err) (cdr err))))))
 
 (defun make-directory (dir &optional parents)
   "Create the directory DIR and optionally any nonexistent parent dirs.
-If DIR already exists as a directory, signal an error, unless
-PARENTS is non-nil.
 
 Interactively, the default choice of directory to create is the
 current buffer's default directory.  That is useful when you have
@@ -6214,8 +6213,9 @@ Noninteractively, the second (optional) argument PARENTS, 
if
 non-nil, says whether to create parent directories that don't
 exist.  Interactively, this happens by default.
 
-If creating the directory or directories fail, an error will be
-raised."
+Return non-nil if PARENTS is non-nil and DIR already exists as a
+directory, and nil if DIR did not already exist but was created.
+Signal an error if unsuccessful."
   (interactive
    (list (read-file-name "Make directory: " default-directory default-directory
                         nil nil)
@@ -6223,25 +6223,32 @@ raised."
   ;; If default-directory is a remote directory,
   ;; make sure we find its make-directory handler.
   (setq dir (expand-file-name dir))
-  (let ((handler (find-file-name-handler dir 'make-directory)))
-    (if handler
-       (funcall handler 'make-directory dir parents)
-      (if (not parents)
-         (make-directory-internal dir)
-       (let ((dir (directory-file-name (expand-file-name dir)))
-             create-list parent)
-         (while (progn
-                  (setq parent (directory-file-name
-                                (file-name-directory dir)))
-                  (condition-case ()
-                      (files--ensure-directory dir)
-                    (file-missing
-                     ;; Do not loop if root does not exist (Bug#2309).
-                     (not (string= dir parent)))))
-           (setq create-list (cons dir create-list)
-                 dir parent))
-         (dolist (dir create-list)
-            (files--ensure-directory dir)))))))
+  (let ((mkdir (if-let ((handler (find-file-name-handler dir 'make-directory)))
+                  #'(lambda (dir)
+                      ;; Use 'ignore' since the handler might be designed for
+                      ;; Emacs 28-, so it might return an (undocumented)
+                      ;; non-nil value, whereas the Emacs 29+ convention is
+                      ;; to return nil here.
+                      (ignore (funcall handler 'make-directory dir)))
+                 #'make-directory-internal)))
+    (if (not parents)
+        (funcall mkdir dir)
+      (let ((dir (directory-file-name (expand-file-name dir)))
+            already-dir create-list parent)
+        (while (progn
+                 (setq parent (directory-file-name
+                               (file-name-directory dir)))
+                 (condition-case ()
+                     (ignore (setq already-dir
+                                   (files--ensure-directory mkdir dir)))
+                   (error
+                    ;; Do not loop if root does not exist (Bug#2309).
+                    (not (string= dir parent)))))
+          (setq create-list (cons dir create-list)
+                dir parent))
+        (dolist (dir create-list)
+          (setq already-dir (files--ensure-directory mkdir dir)))
+        already-dir))))
 
 (defun make-empty-file (filename &optional parents)
   "Create an empty file FILENAME.
@@ -6435,7 +6442,7 @@ into NEWNAME instead."
   ;; copy-directory handler.
   (let ((handler (or (find-file-name-handler directory 'copy-directory)
                     (find-file-name-handler newname 'copy-directory)))
-       (follow parents))
+       follow)
     (if handler
        (funcall handler 'copy-directory directory
                  newname keep-time parents copy-contents)
@@ -6455,19 +6462,24 @@ into NEWNAME instead."
                                    t)
              (make-symbolic-link target newname t)))
         ;; Else proceed to copy as a regular directory
-        (cond ((not (directory-name-p newname))
+       ;; first by creating the destination directory if needed,
+       ;; preparing to follow any symlink to a directory we did not create.
+       (setq follow
+           (if (not (directory-name-p newname))
               ;; If NEWNAME is not a directory name, create it;
               ;; that is where we will copy the files of DIRECTORY.
-              (make-directory newname parents))
+              (make-directory newname parents)
              ;; NEWNAME is a directory name.  If COPY-CONTENTS is non-nil,
              ;; create NEWNAME if it is not already a directory;
              ;; otherwise, create NEWNAME/[DIRECTORY-BASENAME].
-             ((if copy-contents
-                  (or parents (not (file-directory-p newname)))
+             (unless copy-contents
                 (setq newname (concat newname
                                       (file-name-nondirectory directory))))
-              (make-directory (directory-file-name newname) parents))
-             (t (setq follow t)))
+             (condition-case err
+                 (make-directory (directory-file-name newname) parents)
+               (error
+                (or (file-directory-p newname)
+                    (signal (car err) (cdr err)))))))
 
         ;; Copy recursively.
         (dolist (file
@@ -8467,14 +8479,6 @@ If the value is nil, Emacs uses a freedesktop.org-style 
trashcan."
 
 (declare-function system-move-file-to-trash "w32fns.c" (filename))
 
-(defun file-exists-in-trash-p (filename)
-  "Return non-nil if FILENAME exists in the trash.
-
-This is like `file-exists-p', but it also returns non-nil
-if FILENAME is a dangling symlink, to allow trashing such files."
-  (or (file-exists-p filename)
-      (file-symlink-p filename)))
-
 (defun move-file-to-trash (filename)
   "Move the file (or directory) named FILENAME to the trash.
 When `delete-by-moving-to-trash' is non-nil, this function is
@@ -8505,7 +8509,7 @@ Otherwise, trash FILENAME using the freedesktop.org 
conventions,
           (unless (file-directory-p trash-dir)
             (make-directory trash-dir t))
           ;; Ensure that the trashed file-name is unique.
-          (if (file-exists-in-trash-p new-fn)
+          (if (file-attributes new-fn)
               (let ((version-control t)
                     (backup-directory-alist nil))
                 (setq new-fn (car (find-backup-file-name new-fn)))))
@@ -8582,7 +8586,7 @@ Otherwise, trash FILENAME using the freedesktop.org 
conventions,
                  ;; We're checking further down whether the info file
                  ;; exists, but the file name may exist in the trash
                  ;; directory even if there is no info file for it.
-                 (when (file-exists-in-trash-p
+                 (when (file-attributes
                         (file-name-concat trash-files-dir files-base))
                    (setq overwrite t
                          files-base (file-name-nondirectory
@@ -8620,7 +8624,7 @@ Otherwise, trash FILENAME using the freedesktop.org 
conventions,
                 (let ((delete-by-moving-to-trash nil)
                       (new-fn (file-name-concat trash-files-dir files-base)))
                    (if (or (not is-directory)
-                           (not (file-exists-in-trash-p new-fn)))
+                           (not (file-attributes new-fn)))
                        (rename-file fn new-fn overwrite)
                      (copy-directory fn
                                      (file-name-as-directory new-fn)
diff --git a/lisp/gnus/nnmaildir.el b/lisp/gnus/nnmaildir.el
index faa288934d..3fb87f3a71 100644
--- a/lisp/gnus/nnmaildir.el
+++ b/lisp/gnus/nnmaildir.el
@@ -296,7 +296,7 @@ This variable is set by `nnmaildir-request-article'.")
      (if (file-attributes file) (delete-file file))))
 (defun nnmaildir--mkdir (dir)
   (or (file-exists-p (file-name-as-directory dir))
-      (make-directory-internal (directory-file-name dir))))
+      (make-directory (directory-file-name dir))))
 (defun nnmaildir--mkfile (file)
   (write-region "" nil file nil 'no-message))
 (defun nnmaildir--delete-dir-files (dir ls)
diff --git a/lisp/ido.el b/lisp/ido.el
index 77e4dd447d..92b4370cb4 100644
--- a/lisp/ido.el
+++ b/lisp/ido.el
@@ -2435,7 +2435,7 @@ If cursor is not at the end of the user input, move to 
end of input."
                                 filename))
              (ido-record-command method dirname)
              (ido-record-work-directory dirname)
-             (make-directory-internal dirname)
+             (make-directory dirname)
              (funcall method dirname))
             (t
              ;; put make-directory command on history
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index b30c32aaff..d63e05f5fa 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -80,9 +80,14 @@ commands consecutively.  Filled by
 
 (defvar rmail-summary-message-parents-vector nil
   "Vector that holds a list of indices of parents for each message.
-Message A is parent to message B if the id of A appear in the
-References or In-reply-to fields of B, or if A is the first
-message with the same subject as B.  First element is ignored.")
+Message A is parent of message B if the id of A appears in the
+\"References\" or \"In-reply-to\" fields of B, or if A is the first
+message with the same \"Subject\" as B.  First element is ignored.")
+
+(defvar rmail-summary-message-descendants-vector nil
+  "Vector that holds the direct descendants of each message.
+This is the antipode of `rmail-summary-message-parents-vector'.
+First element is ignored.")
 
 (defvar rmail-summary-font-lock-keywords
   '(("^ *[0-9]+D.*" . font-lock-string-face)                   ; Deleted.
@@ -318,11 +323,13 @@ message with the same subject as B.  First element is 
ignored.")
 (defun rmail-summary-fill-message-ids-hash-table ()
   "Fill `rmail-summary-message-ids-hash-table'."
   (with-current-buffer rmail-buffer
-    (setq rmail-summary-message-ids-hash-table (make-hash-table :test 'equal 
:size 1024))
+    (setq rmail-summary-message-ids-hash-table
+          (make-hash-table :test 'equal :size 1024))
     (let ((msgnum 1))
       (while (<= msgnum rmail-total-messages)
        (let ((id (rmail-get-header "Message-ID" msgnum)))
-         (puthash id (cons (cons id msgnum) (gethash id 
rmail-summary-message-ids-hash-table))
+         (puthash id (cons (cons id msgnum)
+                            (gethash id rmail-summary-message-ids-hash-table))
                   rmail-summary-message-ids-hash-table))
        (setq msgnum (1+ msgnum))))))
 
@@ -331,14 +338,18 @@ message with the same subject as B.  First element is 
ignored.")
     (if header
        (split-string header "[ \f\t\n\r\v,;]+"))))
 
-(defun rmail-summary-fill-message-parents-vector ()
-  "Fill `rmail-summary-message-parents-vector'."
+(defun rmail-summary-fill-message-parents-and-descs-vectors ()
+  "Fill parents and descendats vectors for messages.
+This populates `rmail-summary-message-parents-vector'
+and `rmail-summary-message-descendants-vector'."
   (with-current-buffer rmail-buffer
     (rmail-summary-fill-message-ids-hash-table)
     (setq rmail-summary-subjects-hash-table
           (make-hash-table :test 'equal :size 1024))
     (setq rmail-summary-message-parents-vector
           (make-vector (1+ rmail-total-messages) nil))
+    (setq rmail-summary-message-descendants-vector
+          (make-vector (1+ rmail-total-messages) nil))
     (let ((msgnum 1))
       (while (<= msgnum rmail-total-messages)
        (let* ((parents nil)
@@ -346,18 +357,27 @@ message with the same subject as B.  First element is 
ignored.")
               (subj-cell (gethash subject rmail-summary-subjects-hash-table))
               (subj-par (assoc subject subj-cell))
               (refs (rmail-summary--split-header-field "References" msgnum))
-              (reply-to (rmail-summary--split-header-field "In-reply-to"
+              (reply-tos (rmail-summary--split-header-field "In-reply-to"
                                                             msgnum)))
          (if subj-par
-             (setq parents (cons (cdr subj-par) parents))
+             (progn
+               (setq parents (cons (cdr subj-par) nil))
+               (aset rmail-summary-message-descendants-vector (cdr subj-par)
+                     (cons msgnum
+                            (aref rmail-summary-message-descendants-vector
+                                  (cdr subj-par)))))
            (puthash subject (cons (cons subject msgnum) subj-cell)
                     rmail-summary-subjects-hash-table))
-         (dolist (id (append refs reply-to))
+         (dolist (id (append refs reply-tos))
            (let ((ent
                    (assoc id
                           (gethash id rmail-summary-message-ids-hash-table))))
-             (if ent
-                 (setq parents (cons (cdr ent) parents)))))
+             (when ent
+               (setq parents (cons (cdr ent) parents))
+               (aset rmail-summary-message-descendants-vector (cdr ent)
+                     (cons msgnum
+                            (aref rmail-summary-message-descendants-vector
+                                  (cdr ent)))))))
          (aset rmail-summary-message-parents-vector msgnum parents)
          (setq msgnum (1+ msgnum)))))))
 
@@ -387,20 +407,6 @@ the messages that are displayed."
   (interactive)
   (rmail-new-summary "All" '(rmail-summary) nil))
 
-(defun rmail-summary-direct-descendants (msgnum encountered-msgs)
-  "Find all direct descendants of MSGNUM, ignoring ENCOUNTERED-MSGS.
-Assumes `rmail-summary-message-parents-vector' is filled.  Ignores messages
-already ticked in ENCOUNTERED-MSGS."
-  (let (desc
-       (msg 1))
-    (while (<= msg rmail-total-messages)
-      (when (and
-            (not (aref encountered-msgs msg))
-            (memq msgnum (aref rmail-summary-message-parents-vector msg)))
-       (setq desc (cons msg desc)))
-      (setq msg (1+ msg)))
-    desc))
-
 (defun rmail-summary--walk-thread-message-recursively (msgnum encountered-msgs)
   "Add parents and descendants of message MSGNUM to ENCOUNTERED-MSGS, 
recursively."
   (unless (aref encountered-msgs msgnum)
@@ -412,7 +418,7 @@ already ticked in ENCOUNTERED-MSGS."
       (mapc walk-thread-msg
             (aref rmail-summary-message-parents-vector msgnum))
       (mapc walk-thread-msg
-            (rmail-summary-direct-descendants msgnum encountered-msgs)))))
+            (aref rmail-summary-message-descendants-vector msgnum)))))
 
 ;;;###autoload
 (defun rmail-summary-by-thread (&optional msgnum)
@@ -430,7 +436,7 @@ headers of the messages."
     (unless (and rmail-summary-message-parents-vector
                 (= (length rmail-summary-message-parents-vector)
                    (1+ rmail-total-messages)))
-      (rmail-summary-fill-message-parents-vector))
+      (rmail-summary-fill-message-parents-and-descs-vectors))
     (let ((enc-msgs (make-bool-vector (1+ rmail-total-messages) nil)))
       (rmail-summary--walk-thread-message-recursively msgnum enc-msgs)
       (rmail-new-summary (format "thread containing message %d" msgnum)
diff --git a/lisp/net/tramp-archive.el b/lisp/net/tramp-archive.el
index 9c1e78d6b0..49b0c0bb6b 100644
--- a/lisp/net/tramp-archive.el
+++ b/lisp/net/tramp-archive.el
@@ -215,11 +215,18 @@ It must be supported by libarchive(3).")
 ;; In older Emacs (prior 27.1), `tramp-archive-autoload-file-name-regexp'
 ;; is not autoloaded.  So we cannot expect it to be known in
 ;; tramp-loaddefs.el.  But it exists, when tramp-archive.el is loaded.
+;; We must wrap it into `eval-when-compile'.  Otherwise, there could
+;; be an "Eager macro-expansion failure" when unloading/reloading Tramp.
 ;;;###tramp-autoload
 (defconst tramp-archive-file-name-regexp
-  (ignore-errors (tramp-archive-autoload-file-name-regexp))
+  (eval-when-compile (ignore-errors (tramp-archive-autoload-file-name-regexp)))
   "Regular expression matching archive file names.")
 
+;; The value above is nil for Emacs 26.  Set it now.
+(if (<= emacs-major-version 26)
+    (setq tramp-archive-file-name-regexp
+         (ignore-errors (tramp-archive-autoload-file-name-regexp))))
+
 ;;;###tramp-autoload
 (defconst tramp-archive-method "archive"
   "Method name for archives in GVFS.")
diff --git a/lisp/net/tramp-smb.el b/lisp/net/tramp-smb.el
index c720b33b5f..cd73b9b8ec 100644
--- a/lisp/net/tramp-smb.el
+++ b/lisp/net/tramp-smb.el
@@ -279,7 +279,7 @@ See `tramp-actions-before-shell' for more info.")
     (lock-file . tramp-handle-lock-file)
     (make-auto-save-file-name . tramp-handle-make-auto-save-file-name)
     (make-directory . tramp-smb-handle-make-directory)
-    (make-directory-internal . tramp-smb-handle-make-directory-internal)
+    (make-directory-internal . ignore)
     (make-lock-file-name . tramp-handle-make-lock-file-name)
     (make-nearby-temp-file . tramp-handle-make-nearby-temp-file)
     (make-process . ignore)
@@ -1186,12 +1186,21 @@ PRESERVE-UID-GID and PRESERVE-EXTENDED-ATTRIBUTES are 
completely ignored."
        (make-directory ldir parents))
       ;; Just do it.
       (when (file-directory-p ldir)
-       (make-directory-internal dir))
+       (tramp-smb-send-command
+        v (if (tramp-smb-get-cifs-capabilities v)
+              (format "posix_mkdir %s %o"
+                      (tramp-smb-shell-quote-localname v) (default-file-modes))
+            (format "mkdir %s" (tramp-smb-shell-quote-localname v))))
+       ;; We must also flush the cache of the directory, because
+       ;; `file-attributes' reads the values from there.
+       (tramp-flush-file-properties v localname))
       (unless (file-directory-p dir)
        (tramp-error v 'file-error "Couldn't make directory %s" dir)))))
 
+;; This is not used anymore.
 (defun tramp-smb-handle-make-directory-internal (directory)
   "Like `make-directory-internal' for Tramp files."
+  (declare (obsolete nil "29.1"))
   (setq directory (directory-file-name (expand-file-name directory)))
   (unless (file-name-absolute-p directory)
     (setq directory (expand-file-name directory default-directory)))
diff --git a/lisp/net/tramp.el b/lisp/net/tramp.el
index 9b7117cb87..ca8963fbf5 100644
--- a/lisp/net/tramp.el
+++ b/lisp/net/tramp.el
@@ -2605,12 +2605,14 @@ Must be handled by the callers."
              file-selinux-context file-symlink-p file-truename
              file-writable-p find-backup-file-name get-file-buffer
              insert-directory insert-file-contents load
-             make-directory make-directory-internal set-file-acl
-             set-file-modes set-file-selinux-context set-file-times
+             make-directory set-file-acl set-file-modes
+             set-file-selinux-context set-file-times
              substitute-in-file-name unhandled-file-name-directory
              vc-registered
              ;; Emacs 27+ only.
              file-system-info
+             ;; Emacs 28- only.
+             make-directory-internal
              ;; Emacs 28+ only.
              file-locked-p lock-file make-lock-file-name unlock-file
              ;; Emacs 29+ only.
diff --git a/lisp/org/ob-R.el b/lisp/org/ob-R.el
index f68b5b44e4..b7f96a179a 100644
--- a/lisp/org/ob-R.el
+++ b/lisp/org/ob-R.el
@@ -241,11 +241,11 @@ This function is called by `org-babel-execute-src-block'."
 (defun org-babel-R-assign-elisp (name value colnames-p rownames-p)
   "Construct R code assigning the elisp VALUE to a variable named NAME."
   (if (listp value)
-      (let* ((lengths (mapcar 'length (cl-remove-if-not 'sequencep value)))
+      (let* ((lengths (mapcar 'length (cl-remove-if-not 'listp value)))
             (max (if lengths (apply 'max lengths) 0))
             (min (if lengths (apply 'min lengths) 0)))
         ;; Ensure VALUE has an orgtbl structure (depth of at least 2).
-        (unless (listp (car value)) (setq value (list value)))
+        (unless (listp (car value)) (setq value (mapcar 'list value)))
        (let ((file (orgtbl-to-tsv value '(:fmt org-babel-R-quote-tsv-field)))
              (header (if (or (eq (nth 1 value) 'hline) colnames-p)
                          "TRUE" "FALSE"))
diff --git a/lisp/org/ob-octave.el b/lisp/org/ob-octave.el
index b0a7767ec3..8953b67513 100644
--- a/lisp/org/ob-octave.el
+++ b/lisp/org/ob-octave.el
@@ -91,7 +91,7 @@ end")
                                 (list
                                  "set (0, \"defaultfigurevisible\", \"off\");"
                                  full-body
-                                 (format "print -dpng %s" gfx-file))
+                                 (format "print -dpng %S\nans=%S" gfx-file 
gfx-file))
                                 "\n")
                    full-body)
                  result-type matlabp)))
diff --git a/lisp/org/org-element.el b/lisp/org/org-element.el
index 1f36775a7b..71c242ea65 100644
--- a/lisp/org/org-element.el
+++ b/lisp/org/org-element.el
@@ -5295,6 +5295,7 @@ indentation removed from its contents."
 ;; `org-element--cache-diagnostics-ring-size', 
`org-element--cache-map-statistics',
 ;; `org-element--cache-map-statistics-threshold'.
 
+;;;###autoload
 (defvar org-element-use-cache t
   "Non-nil when Org parser should cache its results.")
 
diff --git a/lisp/org/org-persist.el b/lisp/org/org-persist.el
index 9645dea7d9..6ccf357784 100644
--- a/lisp/org/org-persist.el
+++ b/lisp/org/org-persist.el
@@ -222,8 +222,11 @@ function will be called with a single argument - 
collection."
 (defconst org-persist-index-file "index"
   "File name used to store the data index.")
 
-(defvar org-persist-disable-when-emacs-Q t
-  "Disable persistence when Emacs is called with -Q command line arg.")
+(defvar org-persist--disable-when-emacs-Q t
+  "Disable persistence when Emacs is called with -Q command line arg.
+When non-nil, this sets `org-persist-directory' to temporary directory.
+
+This variable must be set before loading org-persist library.")
 
 (defvar org-persist-before-write-hook nil
   "Abnormal hook ran before saving data.
@@ -662,12 +665,13 @@ COLLECTION is the plist holding data collection."
              (file-copy (org-file-name-concat
                          org-persist-directory
                          (format "%s-%s.%s" persist-file (md5 path) ext))))
-        (unless (file-exists-p (file-name-directory file-copy))
-          (make-directory (file-name-directory file-copy) t))
-        (if (org--should-fetch-remote-resource-p path)
-            (url-copy-file path file-copy 'overwrite)
-          (error "The remote resource %S is considered unsafe, and will not be 
downloaded."
-                 path))
+        (unless (file-exists-p file-copy)
+          (unless (file-exists-p (file-name-directory file-copy))
+            (make-directory (file-name-directory file-copy) t))
+          (if (org--should-fetch-remote-resource-p path)
+              (url-copy-file path file-copy 'overwrite)
+            (error "The remote resource %S is considered unsafe, and will not 
be downloaded."
+                   path)))
         (format "%s-%s.%s" persist-file (md5 path) ext)))))
 
 (defun org-persist-write:index (container _)
@@ -771,43 +775,39 @@ ASSOCIATED can be a plist, a buffer, or a string.
 A buffer is treated as (:buffer ASSOCIATED).
 A string is treated as (:file ASSOCIATED).
 When LOAD? is non-nil, load the data instead of reading."
+  (unless org-persist--index (org-persist--load-index))
   (setq associated (org-persist--normalize-associated associated))
   (setq container (org-persist--normalize-container container))
-  (unless (and org-persist-disable-when-emacs-Q
-               ;; FIXME: This is relying on undocumented fact that
-               ;; Emacs sets `user-init-file' to nil when loaded with
-               ;; "-Q" argument.
-               (not user-init-file))
-    (let* ((collection (org-persist--find-index `(:container ,container 
:associated ,associated)))
-           (persist-file
-            (when collection
-              (org-file-name-concat
-               org-persist-directory
-               (plist-get collection :persist-file))))
-           (data nil))
-      (when (and collection
-                 (file-exists-p persist-file)
-                 (or (not (plist-get collection :expiry)) ; current session
-                     (not (org-persist--gc-expired-p
-                         (plist-get collection :expiry) collection)))
-                 (or (not hash-must-match)
-                     (and (plist-get associated :hash)
-                          (equal (plist-get associated :hash)
-                                 (plist-get (plist-get collection :associated) 
:hash)))))
-        (unless (seq-find (lambda (v)
-                            (run-hook-with-args-until-success 
'org-persist-before-read-hook v associated))
-                          (plist-get collection :container))
-          (setq data (or (gethash persist-file org-persist--write-cache)
-                         (org-persist--read-elisp-file persist-file)))
-          (when data
-            (cl-loop for container in (plist-get collection :container)
-                     with result = nil
-                     do
-                     (if load?
-                         (push (org-persist-load:generic container (alist-get 
container data nil nil #'equal) collection) result)
-                       (push (org-persist-read:generic container (alist-get 
container data nil nil #'equal) collection) result))
-                     (run-hook-with-args 'org-persist-after-read-hook 
container associated)
-                     finally return (if (= 1 (length result)) (car result) 
result))))))))
+  (let* ((collection (org-persist--find-index `(:container ,container 
:associated ,associated)))
+         (persist-file
+          (when collection
+            (org-file-name-concat
+             org-persist-directory
+             (plist-get collection :persist-file))))
+         (data nil))
+    (when (and collection
+               (file-exists-p persist-file)
+               (or (not (plist-get collection :expiry)) ; current session
+                   (not (org-persist--gc-expired-p
+                       (plist-get collection :expiry) collection)))
+               (or (not hash-must-match)
+                   (and (plist-get associated :hash)
+                        (equal (plist-get associated :hash)
+                               (plist-get (plist-get collection :associated) 
:hash)))))
+      (unless (seq-find (lambda (v)
+                          (run-hook-with-args-until-success 
'org-persist-before-read-hook v associated))
+                        (plist-get collection :container))
+        (setq data (or (gethash persist-file org-persist--write-cache)
+                       (org-persist--read-elisp-file persist-file)))
+        (when data
+          (cl-loop for container in (plist-get collection :container)
+                   with result = nil
+                   do
+                   (if load?
+                       (push (org-persist-load:generic container (alist-get 
container data nil nil #'equal) collection) result)
+                     (push (org-persist-read:generic container (alist-get 
container data nil nil #'equal) collection) result))
+                   (run-hook-with-args 'org-persist-after-read-hook container 
associated)
+                   finally return (if (= 1 (length result)) (car result) 
result)))))))
 
 (defun org-persist-load (container &optional associated hash-must-match)
   "Load CONTAINER data for ASSOCIATED.
@@ -843,62 +843,66 @@ The return value is nil when writing fails and the 
written value (as
 returned by `org-persist-read') on success.
 When IGNORE-RETURN is non-nil, just return t on success without calling
 `org-persist-read'."
-  (unless (and org-persist-disable-when-emacs-Q
-               ;; FIXME: This is relying on undocumented fact that
-               ;; Emacs sets `user-init-file' to nil when loaded with
-               ;; "-Q" argument.
-               (not user-init-file))
-    (setq associated (org-persist--normalize-associated associated))
-    ;; Update hash
-    (when (and (plist-get associated :file)
-               (plist-get associated :hash)
-               (get-file-buffer (plist-get associated :file)))
-      (setq associated (org-persist--normalize-associated (get-file-buffer 
(plist-get associated :file)))))
-    (let ((collection (org-persist--get-collection container associated)))
-      (setf collection (plist-put collection :associated associated))
-      (unless (or
-               ;; Prevent data leakage from encrypted files.
-               ;; We do it in somewhat paranoid manner and do not
-               ;; allow anything related to encrypted files to be
-               ;; written.
-               (and (plist-get associated :file)
-                    (string-match-p epa-file-name-regexp (plist-get associated 
:file)))
-               (seq-find (lambda (v)
-                           (run-hook-with-args-until-success 
'org-persist-before-write-hook v associated))
-                         (plist-get collection :container)))
-        (when (or (file-exists-p org-persist-directory) 
(org-persist--save-index))
-          (let ((file (org-file-name-concat org-persist-directory (plist-get 
collection :persist-file)))
-                (data (mapcar (lambda (c) (cons c (org-persist-write:generic c 
collection)))
-                              (plist-get collection :container))))
-            (puthash file data org-persist--write-cache)
-            (org-persist--write-elisp-file file data)
-            (or ignore-return (org-persist-read container associated))))))))
+  (setq associated (org-persist--normalize-associated associated))
+  ;; Update hash
+  (when (and (plist-get associated :file)
+             (plist-get associated :hash)
+             (get-file-buffer (plist-get associated :file)))
+    (setq associated (org-persist--normalize-associated (get-file-buffer 
(plist-get associated :file)))))
+  (let ((collection (org-persist--get-collection container associated)))
+    (setf collection (plist-put collection :associated associated))
+    (unless (or
+             ;; Prevent data leakage from encrypted files.
+             ;; We do it in somewhat paranoid manner and do not
+             ;; allow anything related to encrypted files to be
+             ;; written.
+             (and (plist-get associated :file)
+                  (string-match-p epa-file-name-regexp (plist-get associated 
:file)))
+             (seq-find (lambda (v)
+                         (run-hook-with-args-until-success 
'org-persist-before-write-hook v associated))
+                       (plist-get collection :container)))
+      (when (or (file-exists-p org-persist-directory) 
(org-persist--save-index))
+        (let ((file (org-file-name-concat org-persist-directory (plist-get 
collection :persist-file)))
+              (data (mapcar (lambda (c) (cons c (org-persist-write:generic c 
collection)))
+                            (plist-get collection :container))))
+          (puthash file data org-persist--write-cache)
+          (org-persist--write-elisp-file file data)
+          (or ignore-return (org-persist-read container associated)))))))
 
 (defun org-persist-write-all (&optional associated)
   "Save all the persistent data.
 When ASSOCIATED is non-nil, only save the matching data."
   (unless org-persist--index (org-persist--load-index))
   (setq associated (org-persist--normalize-associated associated))
-  (let (all-containers)
-    (dolist (collection org-persist--index)
-      (if associated
-          (when collection
-            (cl-pushnew (plist-get collection :container) all-containers :test 
#'equal))
-        (condition-case err
-            (org-persist-write (plist-get collection :container) (plist-get 
collection :associated) t)
-          (error
-           (message "%s. Deleting bad index entry." err)
-           (org-persist--remove-from-index collection)
-           nil))))
-    (dolist (container all-containers)
-      (let ((collection (org-persist--find-index `(:container ,container 
:associated ,associated))))
-        (when collection
+  (unless
+      (and (equal 1 (length org-persist--index))
+           ;; The single collection only contains a single container
+           ;; in the container list.
+           (equal 1 (length (plist-get (car org-persist--index) :container)))
+           ;; The container is an `index' container.
+           (eq 'index (caar (plist-get (car org-persist--index) :container)))
+           ;; No `org-persist-directory' exists yet.
+           (not (file-exists-p org-persist-directory)))
+    (let (all-containers)
+      (dolist (collection org-persist--index)
+        (if associated
+            (when collection
+              (cl-pushnew (plist-get collection :container) all-containers 
:test #'equal))
           (condition-case err
-              (org-persist-write container associated t)
+              (org-persist-write (plist-get collection :container) (plist-get 
collection :associated) t)
             (error
              (message "%s. Deleting bad index entry." err)
              (org-persist--remove-from-index collection)
-             nil)))))))
+             nil))))
+      (dolist (container all-containers)
+        (let ((collection (org-persist--find-index `(:container ,container 
:associated ,associated))))
+          (when collection
+            (condition-case err
+                (org-persist-write container associated t)
+              (error
+               (message "%s. Deleting bad index entry." err)
+               (org-persist--remove-from-index collection)
+               nil))))))))
 
 (defun org-persist-write-all-buffer ()
   "Call `org-persist-write-all' in current buffer.
@@ -931,45 +935,40 @@ Do nothing in an indirect buffer."
 (defun org-persist-gc ()
   "Remove expired or unregistered containers.
 Also, remove containers associated with non-existing files."
-  (unless (and org-persist-disable-when-emacs-Q
-               ;; FIXME: This is relying on undocumented fact that
-               ;; Emacs sets `user-init-file' to nil when loaded with
-               ;; "-Q" argument.
-               (not user-init-file))
-    (let (new-index (remote-files-num 0))
-      (dolist (collection org-persist--index)
-        (let* ((file (plist-get (plist-get collection :associated) :file))
-               (file-remote (when file (file-remote-p file)))
-               (persist-file (when (plist-get collection :persist-file)
-                               (org-file-name-concat
-                                org-persist-directory
-                                (plist-get collection :persist-file))))
-               (expired? (org-persist--gc-expired-p
-                          (plist-get collection :expiry) collection)))
-          (when persist-file
-            (when file
-              (when file-remote (cl-incf remote-files-num))
-              (unless (if (not file-remote)
-                          (file-exists-p file)
-                        (pcase org-persist-remote-files
-                          ('t t)
-                          ('check-existence
-                           (file-exists-p file))
-                          ((pred numberp)
-                           (<= org-persist-remote-files remote-files-num))
-                          (_ nil)))
-                (setq expired? t)))
-            (if expired?
-                (org-persist--gc-persist-file persist-file)
-              (push collection new-index)))))
-      (setq org-persist--index (nreverse new-index)))))
+  (let (new-index (remote-files-num 0))
+    (dolist (collection org-persist--index)
+      (let* ((file (plist-get (plist-get collection :associated) :file))
+             (file-remote (when file (file-remote-p file)))
+             (persist-file (when (plist-get collection :persist-file)
+                             (org-file-name-concat
+                              org-persist-directory
+                              (plist-get collection :persist-file))))
+             (expired? (org-persist--gc-expired-p
+                        (plist-get collection :expiry) collection)))
+        (when persist-file
+          (when file
+            (when file-remote (cl-incf remote-files-num))
+            (unless (if (not file-remote)
+                        (file-exists-p file)
+                      (pcase org-persist-remote-files
+                        ('t t)
+                        ('check-existence
+                         (file-exists-p file))
+                        ((pred numberp)
+                         (<= org-persist-remote-files remote-files-num))
+                        (_ nil)))
+              (setq expired? t)))
+          (if expired?
+              (org-persist--gc-persist-file persist-file)
+            (push collection new-index)))))
+    (setq org-persist--index (nreverse new-index))))
 
 ;; Automatically write the data, but only when we have write access.
 (let ((dir (directory-file-name
             (file-name-as-directory org-persist-directory))))
   (while (and (not (file-exists-p dir))
               (not (equal dir (setq dir (directory-file-name
-                                       (file-name-directory dir)))))))
+                                         (file-name-directory dir)))))))
   (if (not (file-writable-p dir))
       (message "Missing write access rights to org-persist-directory: %S"
                org-persist-directory)
@@ -978,6 +977,15 @@ Also, remove containers associated with non-existing 
files."
     ;; So we are adding the hook after `org-persist-write-all'.
     (add-hook 'kill-emacs-hook #'org-persist-gc)))
 
+;; Point to temp directory when `org-persist--disable-when-emacs-Q' is set.
+(if (and org-persist--disable-when-emacs-Q
+         ;; FIXME: This is relying on undocumented fact that
+         ;; Emacs sets `user-init-file' to nil when loaded with
+         ;; "-Q" argument.
+         (not user-init-file))
+    (setq org-persist-directory
+          (make-temp-file "org-persist-" 'dir)))
+
 (add-hook 'after-init-hook #'org-persist-load-all)
 
 (provide 'org-persist)
diff --git a/lisp/org/org-version.el b/lisp/org/org-version.el
index b9f8d5d66e..8de0d1a4a9 100644
--- a/lisp/org/org-version.el
+++ b/lisp/org/org-version.el
@@ -11,7 +11,7 @@ Inserted by installing Org mode or when a release is made."
 (defun org-git-version ()
   "The Git version of Org mode.
 Inserted by installing Org or when a release is made."
-   (let ((org-git-version "release_9.6-31-g954a95"))
+   (let ((org-git-version "release_9.6-49-g47d129"))
      org-git-version))
 
 (provide 'org-version)
diff --git a/lisp/org/org.el b/lisp/org/org.el
index 19f94c5e23..6aa2a16219 100644
--- a/lisp/org/org.el
+++ b/lisp/org/org.el
@@ -102,6 +102,7 @@
 
 (require 'org-cycle)
 (defvaralias 'org-hide-block-startup 'org-cycle-hide-block-startup)
+(defvaralias 'org-hide-drawer-startup 'org-cycle-hide-drawer-startup)
 (defvaralias 'org-pre-cycle-hook 'org-cycle-pre-hook)
 (defvaralias 'org-tab-first-hook 'org-cycle-tab-first-hook)
 (defalias 'org-global-cycle #'org-cycle-global)
@@ -4596,8 +4597,8 @@ is available.  This option applies only if FILE is a URL."
 This checks every pattern in `org-safe-remote-resources', and
 returns non-nil if any of them match."
   (let ((uri-patterns org-safe-remote-resources)
-        (file-uri (and buffer-file-name
-                       (concat "file://" (file-truename buffer-file-name))))
+        (file-uri (and (buffer-file-name (buffer-base-buffer))
+                       (concat "file://" (file-truename (buffer-file-name 
(buffer-base-buffer))))))
         match-p)
     (while (and (not match-p) uri-patterns)
       (setq match-p (or (string-match-p (car uri-patterns) uri)
@@ -4608,7 +4609,8 @@ returns non-nil if any of them match."
 (defun org--confirm-resource-safe (uri)
   "Ask the user if URI should be considered safe, returning non-nil if so."
   (unless noninteractive
-    (let ((current-file (and buffer-file-name (file-truename 
buffer-file-name)))
+    (let ((current-file (and (buffer-file-name (buffer-base-buffer))
+                             (file-truename (buffer-file-name 
(buffer-base-buffer)))))
           (domain (and (string-match
                         (rx (seq "http" (? "s") "://")
                             (optional (+ (not (any "@/\n"))) "@")
@@ -16399,6 +16401,10 @@ buffer boundaries with possible narrowing."
   "Remove inline-display overlay if a corresponding region is modified."
   (when (and ov after)
     (delete ov org-inline-image-overlays)
+    ;; Clear image from cache to avoid image not updating upon
+    ;; changing on disk.  See Emacs bug#59902.
+    (when (overlay-get ov 'org-image-overlay)
+      (image-flush (overlay-get ov 'display)))
     (delete-overlay ov)))
 
 (defun org-remove-inline-images (&optional beg end)
diff --git a/lisp/org/ox.el b/lisp/org/ox.el
index aed669ee87..737703f11d 100644
--- a/lisp/org/ox.el
+++ b/lisp/org/ox.el
@@ -4612,12 +4612,17 @@ If LINK refers to a remote resource, modify it to point 
to a local
 downloaded copy.  Otherwise, return unchanged LINK."
   (when (org-export-link-remote-p link)
     (let* ((local-path (org-export-link--remote-local-copy link)))
-      (setcdr link
-              (thread-first (cadr link)
-                            (plist-put :type "file")
-                            (plist-put :path local-path)
-                            (plist-put :raw-link (concat "file:" local-path))
-                            list))))
+      (if local-path
+          (setcdr link
+                  (thread-first (cadr link)
+                                (plist-put :type "file")
+                                (plist-put :path local-path)
+                                (plist-put :raw-link (concat "file:" 
local-path))
+                                list))
+        (display-warning
+         '(org export)
+         (format "unable to obtain local copy of %s"
+                 (org-element-property :raw-link link))))))
   link)
 
 ;;;; For References
@@ -4753,23 +4758,27 @@ objects of the same type."
      (let ((counter 0))
        ;; Increment counter until ELEMENT is found again.
        (org-element-map (plist-get info :parse-tree)
-          (or types (org-element-type element))
+          (or (and types (cons (org-element-type element) types))
+               (org-element-type element))
         (lambda (el)
            (let ((cached (org-element-property :org-export--counter el)))
             (cond
              ((eq element el) (1+ counter))
               ;; Use cached result.
-              ((and cached (equal predicate (car cached)))
-               (cdr cached))
+              ((and cached
+                    (equal predicate (car cached))
+                    (equal types (cadr cached)))
+               (setq counter (nth 2 cached))
+               nil)
              ((not predicate)
                (cl-incf counter)
                (org-element-put-property
-                el :org-export--counter (cons predicate counter))
+                el :org-export--counter (list predicate types counter))
                nil)
              ((funcall predicate el info)
                (cl-incf counter)
                (org-element-put-property
-                el :org-export--counter (cons predicate counter))
+                el :org-export--counter (list predicate types counter))
                nil))))
         info 'first-match)))))
 
diff --git a/lisp/progmodes/c-ts-mode.el b/lisp/progmodes/c-ts-mode.el
index c420386853..cf941236f8 100644
--- a/lisp/progmodes/c-ts-mode.el
+++ b/lisp/progmodes/c-ts-mode.el
@@ -103,7 +103,6 @@ MODE is either `c' or `cpp'."
            ((node-is "case") parent-bol 0)
            ((node-is "preproc_arg") no-indent)
            ((and (parent-is "comment") comment-end) comment-start -1)
-           ((parent-is "comment") comment-start-skip 0)
            ((node-is "labeled_statement") parent-bol 0)
            ((parent-is "labeled_statement") parent-bol c-ts-mode-indent-offset)
            ((match "preproc_ifdef" "compound_statement") point-min 0)
diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el
index 5b9277d73f..ce4ca4f3d9 100644
--- a/lisp/progmodes/eglot.el
+++ b/lisp/progmodes/eglot.el
@@ -182,7 +182,7 @@ chosen (interactively or automatically)."
                       when probe return (cons probe args)
                       finally (funcall err)))))))
 
-(defvar eglot-server-programs `((rust-mode . ,(eglot-alternatives 
'("rust-analyzer" "rls")))
+(defvar eglot-server-programs `(((rust-ts-mode rust-mode) . 
,(eglot-alternatives '("rust-analyzer" "rls")))
                                 ((cmake-mode cmake-ts-mode) . 
("cmake-language-server"))
                                 (vimrc-mode . ("vim-language-server" 
"--stdio"))
                                 ((python-mode python-ts-mode)
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index b8bfd5620d..cbcca81baa 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -3451,14 +3451,13 @@ This function is intended for use in 
`after-change-functions'."
        ((parent-is "statement_block") parent-bol js-indent-level)
 
        ;; JSX
-       ((parent-is "jsx_opening_element") parent js-indent-level)
-       ((match "<" "jsx_fragment") parent 0)
-       ((parent-is "jsx_fragment") parent js-indent-level)
+       ((node-is "jsx_fragment") parent typescript-ts-mode-indent-offset)
+       ((node-is "jsx_element") parent typescript-ts-mode-indent-offset)
+       ((node-is "jsx_expression") parent typescript-ts-mode-indent-offset)
+       ((node-is "jsx_self_closing_element") parent 
typescript-ts-mode-indent-offset)
        ((node-is "jsx_closing_element") parent 0)
-       ((node-is "jsx_text") parent js-indent-level)
-       ((parent-is "jsx_element") parent js-indent-level)
        ((node-is "/") parent 0)
-       ((parent-is "jsx_self_closing_element") parent js-indent-level)))))
+       ((node-is ">") parent 0)))))
 
 (defvar js--treesit-keywords
   '("as" "async" "await" "break" "case" "catch" "class" "const" "continue"
diff --git a/lisp/progmodes/ruby-mode.el b/lisp/progmodes/ruby-mode.el
index 4ac289d529..fa51597697 100644
--- a/lisp/progmodes/ruby-mode.el
+++ b/lisp/progmodes/ruby-mode.el
@@ -134,6 +134,13 @@ This should only be called after matching against 
`ruby-here-doc-beg-re'."
 (defconst ruby-symbol-re (concat "[" ruby-symbol-chars "]")
   "Regexp to match symbols.")
 
+(defconst ruby-endless-method-head-re
+  (format " *\\(%s+\\.\\)?%s+[?!]? *\\(([^()]*)\\)? +="
+          ruby-symbol-re ruby-symbol-re)
+  "Regexp to match the beginning of an endless method definition.
+
+It should match the part after \"def\" and until \"=\".")
+
 (defvar ruby-use-smie t)
 (make-obsolete-variable 'ruby-use-smie nil "28.1")
 
@@ -351,7 +358,8 @@ This only affects the output of the command 
`ruby-toggle-block'."
        (exp  (exp1) (exp "," exp) (exp "=" exp)
              (id " @ " exp))
        (exp1 (exp2) (exp2 "?" exp1 ":" exp1))
-       (exp2 (exp3) (exp3 "." exp3))
+       (exp2 (exp3) (exp3 "." exp3)
+             (exp3 "def=" exp3))
        (exp3 ("def" insts "end")
              ("begin" insts-rescue-insts "end")
              ("do" insts "end")
@@ -468,7 +476,7 @@ This only affects the output of the command 
`ruby-toggle-block'."
                                              "else" "elsif" "do" "end" "and")
                                            'symbols))))
          (memq (car (syntax-after pos)) '(7 15))
-         (looking-at "[([]\\|[-+!~:]\\(?:\\sw\\|\\s_\\)")))))
+         (looking-at "[([]\\|[-+!~:@$]\\(?:\\sw\\|\\s_\\)")))))
 
 (defun ruby-smie--before-method-name ()
   ;; Only need to be accurate when method has keyword name.
@@ -528,6 +536,9 @@ This only affects the output of the command 
`ruby-toggle-block'."
               (ruby-smie--forward-token)) ;Fully redundant.
              (t ";")))
            ((equal tok "&.") ".")
+           ((and (equal tok "def")
+                 (looking-at ruby-endless-method-head-re))
+            "def=")
            (t tok)))))))))
 
 (defun ruby-smie--backward-token ()
@@ -575,6 +586,9 @@ This only affects the output of the command 
`ruby-toggle-block'."
             (ruby-smie--backward-token)) ;Fully redundant.
            (t ";")))
          ((equal tok "&.") ".")
+         ((and (equal tok "def")
+               (looking-at (concat "def" ruby-endless-method-head-re)))
+          "def=")
          (t tok)))))))
 
 (defun ruby-smie--indent-to-stmt ()
@@ -629,6 +643,11 @@ This only affects the output of the command 
`ruby-toggle-block'."
                      (not (ruby-smie--bosp)))
            (forward-char -1))
          (smie-indent-virtual))
+        ((save-excursion
+           (and (smie-rule-parent-p " @ ")
+                (goto-char (nth 1 (smie-indent--parent)))
+                (smie-rule-prev-p "def=")
+                (cons 'column (- (current-column) 3)))))
         (t (smie-rule-parent))))))
     (`(:after . ,(or "(" "[" "{"))
      ;; FIXME: Shouldn't this be the default behavior of
@@ -672,6 +691,12 @@ This only affects the output of the command 
`ruby-toggle-block'."
      (and (smie-rule-parent-p ";" nil)
           (smie-indent--hanging-p)
           ruby-indent-level))
+    (`(:before . "=")
+     (save-excursion
+      (and (smie-rule-parent-p " @ ")
+           (goto-char (nth 1 (smie-indent--parent)))
+           (smie-rule-prev-p "def=")
+           (cons 'column (+ (current-column) ruby-indent-level -3)))))
     (`(:after . ,(or "?" ":")) ruby-indent-level)
     (`(:before . ,(guard (memq (intern-soft token) ruby-alignable-keywords)))
      (when (not (ruby--at-indentation-p))
@@ -1375,9 +1400,10 @@ With ARG, move backward multiple defuns.  Negative ARG 
means
 move forward."
   (interactive "p")
   (let (case-fold-search)
-    (and (re-search-backward (concat "^\\s *" ruby-defun-beg-re "\\_>")
-                             nil t (or arg 1))
-         (beginning-of-line))))
+    (when (re-search-backward (concat "^\\s *" ruby-defun-beg-re "\\_>")
+                              nil t (or arg 1))
+      (beginning-of-line)
+      t)))
 
 (defun ruby-end-of-defun ()
   "Move point to the end of the current defun.
@@ -1631,7 +1657,7 @@ See `add-log-current-defun-function'."
                   (while (and (re-search-backward definition-re nil t)
                               (if (if (string-equal "def" (match-string 1))
                                       ;; We're inside a method.
-                                      (if (ruby-block-contains-point start)
+                                      (if (ruby-block-contains-point (1- 
start))
                                           t
                                         ;; Try to match a method only once.
                                         (setq definition-re module-re)
diff --git a/lisp/progmodes/rust-ts-mode.el b/lisp/progmodes/rust-ts-mode.el
new file mode 100644
index 0000000000..8b2ed19101
--- /dev/null
+++ b/lisp/progmodes/rust-ts-mode.el
@@ -0,0 +1,371 @@
+;;; rust-ts-mode.el --- tree-sitter support for Rust  -*- lexical-binding: t; 
-*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author     : Randy Taylor <dev@rjt.dev>
+;; Maintainer : Randy Taylor <dev@rjt.dev>
+;; Created    : December 2022
+;; Keywords   : rust languages tree-sitter
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+
+;;; Code:
+
+(require 'treesit)
+(eval-when-compile (require 'rx))
+
+(declare-function treesit-parser-create "treesit.c")
+(declare-function treesit-induce-sparse-tree "treesit.c")
+(declare-function treesit-node-child "treesit.c")
+(declare-function treesit-node-child-by-field-name "treesit.c")
+(declare-function treesit-node-start "treesit.c")
+(declare-function treesit-node-type "treesit.c")
+
+(defcustom rust-ts-mode-indent-offset 4
+  "Number of spaces for each indentation step in `rust-ts-mode'."
+  :version "29.1"
+  :type 'integer
+  :safe 'integerp
+  :group 'rust)
+
+(defvar rust-ts-mode--syntax-table
+  (let ((table (make-syntax-table)))
+    (modify-syntax-entry ?+   "."      table)
+    (modify-syntax-entry ?-   "."      table)
+    (modify-syntax-entry ?=   "."      table)
+    (modify-syntax-entry ?%   "."      table)
+    (modify-syntax-entry ?&   "."      table)
+    (modify-syntax-entry ?|   "."      table)
+    (modify-syntax-entry ?^   "."      table)
+    (modify-syntax-entry ?!   "."      table)
+    (modify-syntax-entry ?@   "."      table)
+    (modify-syntax-entry ?~   "."      table)
+    (modify-syntax-entry ?<   "."      table)
+    (modify-syntax-entry ?>   "."      table)
+    (modify-syntax-entry ?/   ". 124b" table)
+    (modify-syntax-entry ?*   ". 23"   table)
+    (modify-syntax-entry ?\n  "> b"    table)
+    (modify-syntax-entry ?\^m "> b"    table)
+    table)
+  "Syntax table for `rust-ts-mode'.")
+
+(defvar rust-ts-mode--indent-rules
+  `((rust
+     ((node-is ")") parent-bol 0)
+     ((node-is "]") parent-bol 0)
+     ((node-is "}") (and parent parent-bol) 0)
+     ((parent-is "arguments") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "await_expression") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "array_expression") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "binary_expression") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "block") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "declaration_list") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "enum_variant_list") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "field_declaration_list") parent-bol 
rust-ts-mode-indent-offset)
+     ((parent-is "field_expression") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "field_initializer_list") parent-bol 
rust-ts-mode-indent-offset)
+     ((parent-is "let_declaration") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "macro_definition") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "parameters") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "token_tree") parent-bol rust-ts-mode-indent-offset)
+     ((parent-is "use_list") parent-bol rust-ts-mode-indent-offset)))
+  "Tree-sitter indent rules for `rust-ts-mode'.")
+
+(defvar rust-ts-mode--builtin-macros
+  '("concat_bytes" "concat_idents" "const_format_args"
+    "format_args_nl" "log_syntax" "trace_macros" "assert" "assert_eq"
+    "assert_ne" "cfg" "column" "compile_error" "concat" "dbg"
+    "debug_assert" "debug_assert_eq" "debug_assert_ne" "env" "eprint"
+    "eprintln" "file" "format" "format_args" "include" "include_bytes"
+    "include_str" "is_x86_feature_detected" "line" "matches"
+    "module_path" "option_env" "panic" "print" "println" "stringify"
+    "thread_local" "todo" "try" "unimplemented" "unreachable" "vec"
+    "write" "writeln")
+  "Rust built-in macros for tree-sitter font-locking.")
+
+(defvar rust-ts-mode--keywords
+  '("as" "async" "await" "break" "const" "continue" "dyn" "else"
+    "enum" "extern" "fn" "for" "if" "impl" "in" "let" "loop" "match"
+    "mod" "move" "pub" "ref" "return" "static" "struct" "trait" "type"
+    "union" "unsafe" "use" "where" "while" (crate) (self) (super)
+    (mutable_specifier))
+  "Rust keywords for tree-sitter font-locking.")
+
+(defvar rust-ts-mode--operators
+  '("!"  "!=" "%" "%=" "&" "&=" "&&" "*" "*=" "+" "+=" "," "-" "-="
+    "->" "."  ".."  "..=" "..."  "/" "/=" ":" ";" "<<" "<<=" "<" "<="
+    "=" "==" "=>" ">" ">=" ">>" ">>=" "@" "^" "^=" "|" "|=" "||" "?")
+  "Rust operators for tree-sitter font-locking.")
+
+(defvar rust-ts-mode--font-lock-settings
+  (treesit-font-lock-rules
+   :language 'rust
+   :feature 'attribute
+   '((attribute_item) @font-lock-constant-face
+     (inner_attribute_item) @font-lock-constant-face)
+
+   :language 'rust
+   :feature 'bracket
+   '((["(" ")" "[" "]" "{" "}"]) @font-lock-bracket-face)
+
+   :language 'rust
+   :feature 'builtin
+   `((macro_invocation
+      macro: ((identifier) @font-lock-builtin-face
+              (:match ,(rx-to-string
+                        `(seq bol
+                              (or ,@rust-ts-mode--builtin-macros)
+                              eol))
+                      @font-lock-builtin-face)))
+     ((identifier) @font-lock-type-face
+      (:match "^\\(:?Err\\|Ok\\|None\\|Some\\)$" @font-lock-type-face)))
+
+   :language 'rust
+   :feature 'comment
+   '(([(block_comment) (line_comment)]) @font-lock-comment-face)
+
+   :language 'rust
+   :feature 'constant
+   `((boolean_literal) @font-lock-constant-face
+     ((identifier) @font-lock-constant-face
+      (:match "^[A-Z][A-Z\\d_]*$" @font-lock-constant-face)))
+
+   :language 'rust
+   :feature 'delimiter
+   '((["," "." ";" ":" "::"]) @font-lock-delimiter-face)
+
+   :language 'rust
+   :feature 'function
+   '((call_expression
+      function:
+      [(identifier) @font-lock-function-name-face
+       (field_expression
+        field: (field_identifier) @font-lock-function-name-face)
+       (scoped_identifier
+        name: (identifier) @font-lock-function-name-face)])
+     (function_item (identifier) @font-lock-function-name-face)
+     (generic_function
+      function: [(identifier) @font-lock-function-name-face
+                 (field_expression
+                  field: (field_identifier) @font-lock-function-name-face)
+                 (scoped_identifier
+                  name: (identifier) @font-lock-function-name-face)])
+     (macro_definition "macro_rules!" @font-lock-constant-face)
+     (macro_definition (identifier) @font-lock-preprocessor-face)
+     (macro_invocation macro: (identifier) @font-lock-preprocessor-face))
+
+   :language 'rust
+   :feature 'keyword
+   `([,@rust-ts-mode--keywords] @font-lock-keyword-face)
+
+   :language 'rust
+   :feature 'number
+   '([(float_literal) (integer_literal)] @font-lock-number-face)
+
+   :language 'rust
+   :feature 'operator
+   `([,@rust-ts-mode--operators] @font-lock-operator-face)
+
+   :language 'rust
+   :feature 'string
+   '([(char_literal)
+      (raw_string_literal)
+      (string_literal)] @font-lock-string-face)
+
+   :language 'rust
+   :feature 'type
+   `((call_expression
+      function: (scoped_identifier
+                 path: (identifier) @font-lock-type-face))
+     (enum_variant name: (identifier) @font-lock-type-face)
+     (match_arm
+      pattern: (match_pattern (_ type: (identifier) @font-lock-type-face)))
+     (match_arm
+      pattern: (match_pattern
+                (_ type: (scoped_identifier
+                          path: (identifier) @font-lock-type-face))))
+     (mod_item name: (identifier) @font-lock-constant-face)
+     (primitive_type) @font-lock-type-face
+     (type_identifier) @font-lock-type-face
+     (scoped_identifier name: (identifier) @font-lock-type-face)
+     (scoped_identifier path: (identifier) @font-lock-constant-face)
+     (scoped_identifier
+      (scoped_identifier
+       path: (identifier) @font-lock-constant-face))
+     ((scoped_identifier
+       path: [(identifier) @font-lock-type-face
+              (scoped_identifier
+               name: (identifier) @font-lock-type-face)])
+      (:match "^[A-Z]" @font-lock-type-face))
+     (scoped_type_identifier path: (identifier) @font-lock-constant-face)
+     (scoped_use_list
+      path: [(identifier) @font-lock-constant-face
+             (scoped_identifier (identifier) @font-lock-constant-face)])
+     (type_identifier) @font-lock-type-face
+     (use_as_clause alias: (identifier) @font-lock-type-face)
+     (use_list (identifier) @font-lock-type-face))
+
+   :language 'rust
+   :feature 'variable
+   '((identifier) @font-lock-variable-name-face
+     ;; Everything in a token_tree is an identifier.
+     (token_tree (identifier) @default))
+
+   :language 'rust
+   :feature 'escape-sequence
+   :override t
+   '((escape_sequence) @font-lock-escape-face)
+
+   :language 'rust
+   :feature 'property
+   :override t
+   '((field_identifier) @font-lock-property-face
+     (shorthand_field_initializer (identifier) @font-lock-property-face))
+
+   :language 'rust
+   :feature 'error
+   :override t
+   '((ERROR) @font-lock-warning-face))
+  "Tree-sitter font-lock settings for `rust-ts-mode'.")
+
+(defun rust-ts-mode--imenu ()
+  "Return Imenu alist for the current buffer."
+  (let* ((node (treesit-buffer-root-node))
+         (enum-tree (treesit-induce-sparse-tree
+                     node "enum_item" nil))
+         (enum-index (rust-ts-mode--imenu-1 enum-tree))
+         (func-tree (treesit-induce-sparse-tree
+                     node "function_item" nil))
+         (func-index (rust-ts-mode--imenu-1 func-tree))
+         (impl-tree (treesit-induce-sparse-tree
+                     node "impl_item" nil))
+         (impl-index (rust-ts-mode--imenu-1 impl-tree))
+         (mod-tree (treesit-induce-sparse-tree
+                    node "mod_item" nil))
+         (mod-index (rust-ts-mode--imenu-1 mod-tree))
+         (struct-tree (treesit-induce-sparse-tree
+                       node "struct_item" nil))
+         (struct-index (rust-ts-mode--imenu-1 struct-tree))
+         (type-tree (treesit-induce-sparse-tree
+                     node "type_item" nil))
+         (type-index (rust-ts-mode--imenu-1 type-tree)))
+    (append
+     (when mod-index `(("Module" . ,mod-index)))
+     (when enum-index `(("Enum" . ,enum-index)))
+     (when impl-index `(("Impl" . ,impl-index)))
+     (when type-index `(("Type" . ,type-index)))
+     (when struct-index `(("Struct" . ,struct-index)))
+     (when func-index `(("Fn" . ,func-index))))))
+
+(defun rust-ts-mode--imenu-1 (node)
+  "Helper for `rust-ts-mode--imenu'.
+Find string representation for NODE and set marker, then recurse
+the subtrees."
+  (let* ((ts-node (car node))
+         (children (cdr node))
+         (subtrees (mapcan #'rust-ts-mode--imenu-1
+                           children))
+         (name (when ts-node
+                 (pcase (treesit-node-type ts-node)
+                   ("enum_item"
+                    (treesit-node-text
+                     (treesit-node-child-by-field-name ts-node "name") t))
+                   ("function_item"
+                    (treesit-node-text
+                     (treesit-node-child-by-field-name ts-node "name") t))
+                   ("impl_item"
+                    (let ((trait-node (treesit-node-child-by-field-name 
ts-node "trait")))
+                      (concat
+                       (treesit-node-text
+                        trait-node t)
+                       (when trait-node
+                         " for ")
+                       (treesit-node-text
+                        (treesit-node-child-by-field-name ts-node "type") t))))
+                   ("mod_item"
+                    (treesit-node-text
+                     (treesit-node-child-by-field-name ts-node "name") t))
+                   ("struct_item"
+                    (treesit-node-text
+                     (treesit-node-child-by-field-name ts-node "name") t))
+                   ("type_item"
+                    (treesit-node-text
+                     (treesit-node-child-by-field-name ts-node "name") t)))))
+         (marker (when ts-node
+                   (set-marker (make-marker)
+                               (treesit-node-start ts-node)))))
+    (cond
+     ((or (null ts-node) (null name)) subtrees)
+     (subtrees
+      `((,name ,(cons name marker) ,@subtrees)))
+     (t
+      `((,name . ,marker))))))
+
+;;;###autoload
+(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-ts-mode))
+
+;;;###autoload
+(define-derived-mode rust-ts-mode prog-mode "Rust"
+  "Major mode for editing Rust, powered by tree-sitter."
+  :group 'rust
+  :syntax-table rust-ts-mode--syntax-table
+
+  (when (treesit-ready-p 'rust)
+    (treesit-parser-create 'rust)
+
+    ;; Comments.
+    (setq-local comment-start "// ")
+    (setq-local comment-end "")
+    (setq-local comment-start-skip (rx (or (seq "/" (+ "/"))
+                                           (seq "/" (+ "*")))
+                                       (* (syntax whitespace))))
+    (setq-local comment-end-skip
+                (rx (* (syntax whitespace))
+                    (group (or (syntax comment-end)
+                               (seq (+ "*") "/")))))
+
+    ;; Font-lock.
+    (setq-local treesit-font-lock-settings rust-ts-mode--font-lock-settings)
+    (setq-local treesit-font-lock-feature-list
+                '(( comment)
+                  ( keyword string)
+                  ( attribute builtin constant escape-sequence
+                    function number property type variable)
+                  ( bracket delimiter error operator)))
+
+    ;; Imenu.
+    (setq-local imenu-create-index-function #'rust-ts-mode--imenu)
+    (setq-local which-func-functions nil)
+
+    ;; Indent.
+    (setq-local indent-tabs-mode nil
+                treesit-simple-indent-rules rust-ts-mode--indent-rules)
+
+    ;; Navigation.
+    (setq-local treesit-defun-type-regexp
+                (regexp-opt '("enum_item"
+                              "function_item"
+                              "impl_item"
+                              "struct_item")))
+
+    (treesit-major-mode-setup)))
+
+(provide 'rust-ts-mode)
+
+;;; rust-ts-mode.el ends here
diff --git a/lisp/progmodes/sql.el b/lisp/progmodes/sql.el
index e585799dc6..6a71da77a2 100644
--- a/lisp/progmodes/sql.el
+++ b/lisp/progmodes/sql.el
@@ -4526,7 +4526,8 @@ optionally is saved to the user's init file."
   "Run PRODUCT interpreter as an inferior process.
 
 If buffer `*SQL*' exists but no process is running, make a new process.
-If buffer exists and a process is running, just switch to buffer `*SQL*'.
+If buffer exists and a process is running, just make sure buffer `*SQL*'
+is displayed.
 
 To specify the SQL product, prefix the call with
 \\[universal-argument].  To set the buffer name as well, prefix
diff --git a/lisp/progmodes/typescript-ts-mode.el 
b/lisp/progmodes/typescript-ts-mode.el
index 171a379375..6ba1b9b12c 100644
--- a/lisp/progmodes/typescript-ts-mode.el
+++ b/lisp/progmodes/typescript-ts-mode.el
@@ -95,13 +95,13 @@ Argument LANGUAGE is either `typescript' or `tsx'."
      ((parent-is "binary_expression") parent-bol 
typescript-ts-mode-indent-offset)
 
      ,@(when (eq language 'tsx)
-         `(((parent-is "jsx_opening_element") parent 
typescript-ts-mode-indent-offset)
-           ((match "<" "jsx_fragment") parent 0)
-           ((parent-is "jsx_fragment") parent typescript-ts-mode-indent-offset)
+         `(((node-is "jsx_fragment") parent typescript-ts-mode-indent-offset)
+           ((node-is "jsx_element") parent typescript-ts-mode-indent-offset)
+           ((node-is "jsx_expression") parent typescript-ts-mode-indent-offset)
+           ((node-is "jsx_self_closing_element") parent 
typescript-ts-mode-indent-offset)
            ((node-is "jsx_closing_element") parent 0)
-           ((parent-is "jsx_element") parent typescript-ts-mode-indent-offset)
            ((node-is "/") parent 0)
-           ((parent-is "jsx_self_closing_element") parent 
typescript-ts-mode-indent-offset)))
+           ((node-is ">") parent 0)))
      (no-node parent-bol 0))))
 
 (defvar typescript-ts-mode--keywords
@@ -231,7 +231,7 @@ Argument LANGUAGE is either `typescript' or `tsx'."
      (arguments (identifier) @font-lock-variable-name-face)
 
      (parenthesized_expression (identifier) @font-lock-variable-name-face)
-     (parenthesized_expression (_ (identifier)) @font-lock-variable-name-face))
+     (parenthesized_expression (_ (identifier) @font-lock-variable-name-face)))
 
    :language language
    :override t
@@ -316,10 +316,7 @@ Argument LANGUAGE is either `typescript' or `tsx'."
    :language language
    :feature 'escape-sequence
    :override t
-   '((escape_sequence) @font-lock-escape-face)
-
-
-   ))
+   '((escape_sequence) @font-lock-escape-face)))
 
 ;;;###autoload
 (add-to-list 'auto-mode-alist '("\\.ts\\'" . typescript-ts-mode))
diff --git a/lisp/subr.el b/lisp/subr.el
index b21cce1669..e142eaa810 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -3956,9 +3956,10 @@ detailed description.
 (defun internal--with-narrowing (start end body &optional tag)
   "Helper function for `with-narrowing', which see."
   (save-restriction
-    (narrow-to-region start end)
-    (when tag (narrowing-lock tag))
-    (funcall body)))
+    (progn
+      (narrow-to-region start end)
+      (if tag (narrowing-lock tag))
+      (funcall body))))
 
 (defun find-tag-default-bounds ()
   "Determine the boundaries of the default tag, based on text at point.
diff --git a/lisp/treesit.el b/lisp/treesit.el
index 17a47fae35..1f366807ce 100644
--- a/lisp/treesit.el
+++ b/lisp/treesit.el
@@ -1047,7 +1047,6 @@ See `treesit-simple-indent-presets'.")
                        (or (null node-index-max)
                            (<= (treesit-node-index node)
                                node-index-max))))))
-        ;; TODO: Document if genuinely useful.
         (cons 'n-p-gp
               (lambda (node-t parent-t grand-parent-t)
                 (lambda (node parent &rest _)
@@ -1108,12 +1107,6 @@ See `treesit-simple-indent-presets'.")
                   (re-search-forward comment-start-skip)
                   (skip-syntax-backward "-")
                   (point))))
-        (cons 'comment-start-skip
-              (lambda (_n parent &rest _)
-                (save-excursion
-                  (goto-char (treesit-node-start parent))
-                  (re-search-forward comment-start-skip)
-                  (point))))
         ;; TODO: Document.
         (cons 'grand-parent
               (lambda (_n parent &rest _)
@@ -1188,6 +1181,10 @@ no-node
 
     Checks that NODE's type matches regexp TYPE.
 
+\(n-p-gp NODE-TYPE PARENT-TYPE GRANDPARENT-TYPE)
+
+    Checks that NODE, its parent, and its grandparent's type.
+
 \(query QUERY)
 
     Queries PARENT with QUERY, and checks if NODE is
@@ -1230,14 +1227,9 @@ point-min
 
 comment-start
 
-    Returns the position after a match for `treesit-comment-start'.
-    Assumes PARENT is a comment node.
-
-comment-start-skip
-
-    Goes to the position that comment-start would return, skips
-    whitespace after that, and returns the resulting position.
-    Assumes PARENT is a comment node.")
+    Goes to the position that `comment-start-skip' would return,
+    skips whitespace backwards, and returns the resulting
+    position.  Assumes PARENT is a comment node.")
 
 (defun treesit--simple-indent-eval (exp)
   "Evaluate EXP.
@@ -2046,8 +2038,8 @@ to the offending pattern and highlight the pattern."
              (goto-char (point-min))
              (insert (format "%s: %d\n" message start))
              (forward-char start)))
-         (pop-to-buffer buf)))))
-  (view-mode))
+         (pop-to-buffer buf)
+         (view-mode))))))
 
 ;;; Explorer
 
diff --git a/lisp/windmove.el b/lisp/windmove.el
index 00e76df0a0..4311f082de 100644
--- a/lisp/windmove.el
+++ b/lisp/windmove.el
@@ -776,7 +776,8 @@ Default value of MODIFIERS is `shift-super'."
 (defconst windmove--default-keybindings-type
   `(choice (const :tag "Don't bind" nil)
            (cons :tag "Bind using"
-                 (key-sequence :tag "Prefix")
+                 (choice (key-sequence :tag "Prefix")
+                         (const :tag "No Prefix" nil))
                  (set :tag "Modifier"
                       :greedy t
                       ;; See `(elisp) Keyboard Events'
diff --git a/lisp/window.el b/lisp/window.el
index 7d8ee48635..a4a8421881 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -2162,17 +2162,14 @@ the font."
     (let* ((window-width (window-body-width window t))
           (font-width (window-font-width window face))
           (ncols (- (/ window-width font-width)
-                     (ceiling (line-number-display-width 'columns)))))
+                     (ceiling (line-number-display-width 'columns))))
+           (fringes (window-fringes window))
+           (lfringe (car fringes))
+           (rfringe (nth 1 fringes)))
       (if (and (display-graphic-p)
               overflow-newline-into-fringe
-               (not
-                (or (eq left-fringe-width 0)
-                    (and (null left-fringe-width)
-                         (= (frame-parameter nil 'left-fringe) 0))))
-               (not
-                (or (eq right-fringe-width 0)
-                    (and (null right-fringe-width)
-                         (= (frame-parameter nil 'right-fringe) 0)))))
+               (not (eq lfringe 0))
+               (not (eq rfringe 0)))
          ncols
         ;; FIXME: This should remove 1 more column when there are no
         ;; fringes, lines are truncated, and the window is hscrolled,
diff --git a/src/fileio.c b/src/fileio.c
index 789f3d509e..e7c2af8142 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -2428,16 +2428,11 @@ DEFUN ("make-directory-internal", 
Fmake_directory_internal,
   (Lisp_Object directory)
 {
   const char *dir;
-  Lisp_Object handler;
   Lisp_Object encoded_dir;
 
   CHECK_STRING (directory);
   directory = Fexpand_file_name (directory, Qnil);
 
-  handler = Ffind_file_name_handler (directory, Qmake_directory_internal);
-  if (!NILP (handler))
-    return call2 (handler, Qmake_directory_internal, directory);
-
   encoded_dir = ENCODE_FILE (directory);
 
   dir = SSDATA (encoded_dir);
diff --git a/src/lread.c b/src/lread.c
index 51ea3e5b92..d838a18de5 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -5479,11 +5479,16 @@ to the specified file name if a suffix is allowed or 
required.  */);
 
   DEFVAR_LISP ("dynamic-library-suffixes", Vdynamic_library_suffixes,
               doc: /* A list of suffixes for loadable dynamic libraries.  */);
-  Vdynamic_library_suffixes =
-    Fcons (build_pure_c_string (DYNAMIC_LIB_SECONDARY_SUFFIX), Qnil);
-  Vdynamic_library_suffixes =
-    Fcons (build_pure_c_string (DYNAMIC_LIB_SUFFIX),
-          Vdynamic_library_suffixes);
+
+#ifndef MSDOS
+  Vdynamic_library_suffixes
+    = Fcons (build_pure_c_string (DYNAMIC_LIB_SECONDARY_SUFFIX), Qnil);
+  Vdynamic_library_suffixes
+    = Fcons (build_pure_c_string (DYNAMIC_LIB_SUFFIX),
+            Vdynamic_library_suffixes);
+#else
+  Vdynamic_library_suffixes = Qnil;
+#endif
 
   DEFVAR_LISP ("load-file-rep-suffixes", Vload_file_rep_suffixes,
               doc: /* List of suffixes that indicate representations of \
diff --git a/src/treesit.c b/src/treesit.c
index d361a3da93..c882d45513 100644
--- a/src/treesit.c
+++ b/src/treesit.c
@@ -52,7 +52,6 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #undef ts_node_named_descendant_for_byte_range
 #undef ts_node_next_named_sibling
 #undef ts_node_next_sibling
-#undef ts_node_parent
 #undef ts_node_prev_named_sibling
 #undef ts_node_prev_sibling
 #undef ts_node_start_byte
@@ -76,7 +75,9 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #undef ts_query_predicates_for_pattern
 #undef ts_query_string_value_for_id
 #undef ts_set_allocator
+#undef ts_tree_cursor_copy
 #undef ts_tree_cursor_current_node
+#undef ts_tree_cursor_delete
 #undef ts_tree_cursor_goto_first_child
 #undef ts_tree_cursor_goto_next_sibling
 #undef ts_tree_cursor_goto_parent
@@ -109,7 +110,6 @@ DEF_DLL_FN (TSNode, ts_node_named_descendant_for_byte_range,
            (TSNode, uint32_t, uint32_t));
 DEF_DLL_FN (TSNode, ts_node_next_named_sibling, (TSNode));
 DEF_DLL_FN (TSNode, ts_node_next_sibling, (TSNode));
-DEF_DLL_FN (TSNode, ts_node_parent, (TSNode));
 DEF_DLL_FN (TSNode, ts_node_prev_named_sibling, (TSNode));
 DEF_DLL_FN (TSNode, ts_node_prev_sibling, (TSNode));
 DEF_DLL_FN (uint32_t, ts_node_start_byte, (TSNode));
@@ -143,7 +143,9 @@ DEF_DLL_FN (const char *, ts_query_string_value_for_id,
            (const TSQuery *, uint32_t, uint32_t *));
 DEF_DLL_FN (void, ts_set_allocator,
            (void *(*)(size_t), void *(*)(size_t, size_t), void *(*)(void *, 
size_t), void (*)(void *)));
+DEF_DLL_FN (TSTreeCursor, ts_tree_cursor_copy, (const TSTreeCursor *));
 DEF_DLL_FN (TSNode, ts_tree_cursor_current_node, (const TSTreeCursor *));
+DEF_DLL_FN (void, ts_tree_cursor_delete, (const TSTreeCursor *));
 DEF_DLL_FN (bool, ts_tree_cursor_goto_first_child, (TSTreeCursor *));
 DEF_DLL_FN (bool, ts_tree_cursor_goto_next_sibling, (TSTreeCursor *));
 DEF_DLL_FN (bool, ts_tree_cursor_goto_parent, (TSTreeCursor *));
@@ -182,7 +184,6 @@ init_treesit_functions (void)
   LOAD_DLL_FN (library, ts_node_named_descendant_for_byte_range);
   LOAD_DLL_FN (library, ts_node_next_named_sibling);
   LOAD_DLL_FN (library, ts_node_next_sibling);
-  LOAD_DLL_FN (library, ts_node_parent);
   LOAD_DLL_FN (library, ts_node_prev_named_sibling);
   LOAD_DLL_FN (library, ts_node_prev_sibling);
   LOAD_DLL_FN (library, ts_node_start_byte);
@@ -206,7 +207,9 @@ init_treesit_functions (void)
   LOAD_DLL_FN (library, ts_query_predicates_for_pattern);
   LOAD_DLL_FN (library, ts_query_string_value_for_id);
   LOAD_DLL_FN (library, ts_set_allocator);
+  LOAD_DLL_FN (library, ts_tree_cursor_copy);
   LOAD_DLL_FN (library, ts_tree_cursor_current_node);
+  LOAD_DLL_FN (library, ts_tree_cursor_delete);
   LOAD_DLL_FN (library, ts_tree_cursor_goto_first_child);
   LOAD_DLL_FN (library, ts_tree_cursor_goto_next_sibling);
   LOAD_DLL_FN (library, ts_tree_cursor_goto_parent);
@@ -239,7 +242,6 @@ init_treesit_functions (void)
 #define ts_node_named_descendant_for_byte_range 
fn_ts_node_named_descendant_for_byte_range
 #define ts_node_next_named_sibling fn_ts_node_next_named_sibling
 #define ts_node_next_sibling fn_ts_node_next_sibling
-#define ts_node_parent fn_ts_node_parent
 #define ts_node_prev_named_sibling fn_ts_node_prev_named_sibling
 #define ts_node_prev_sibling fn_ts_node_prev_sibling
 #define ts_node_start_byte fn_ts_node_start_byte
@@ -263,7 +265,9 @@ init_treesit_functions (void)
 #define ts_query_predicates_for_pattern fn_ts_query_predicates_for_pattern
 #define ts_query_string_value_for_id fn_ts_query_string_value_for_id
 #define ts_set_allocator fn_ts_set_allocator
+#define ts_tree_cursor_copy fn_ts_tree_cursor_copy
 #define ts_tree_cursor_current_node fn_ts_tree_cursor_current_node
+#define ts_tree_cursor_delete fn_ts_tree_cursor_delete
 #define ts_tree_cursor_goto_first_child fn_ts_tree_cursor_goto_first_child
 #define ts_tree_cursor_goto_next_sibling fn_ts_tree_cursor_goto_next_sibling
 #define ts_tree_cursor_goto_parent fn_ts_tree_cursor_goto_parent
@@ -288,7 +292,7 @@ init_treesit_functions (void)
      slow enough to make insignificant any performance advantages from
      using the cursor.  Not exposing the cursor also minimizes the
      number of new types this adds to Emacs Lisp; currently, this adds
-     only the parser and node types.
+     only the parser, node, and compiled query types.
 
    - Because updating the change is handled on the C level as each
      change is made in the buffer, there is no way for Lisp to update
@@ -1758,6 +1762,8 @@ If NODE is nil, return nil.  */)
   return build_string (string);
 }
 
+static TSTreeCursor treesit_cursor_helper (TSNode, Lisp_Object);
+
 DEFUN ("treesit-node-parent",
        Ftreesit_node_parent, Streesit_node_parent, 1, 1, 0,
        doc: /* Return the immediate parent of NODE.
@@ -1768,13 +1774,18 @@ Return nil if NODE has no parent.  If NODE is nil, 
return nil.  */)
   treesit_check_node (node);
   treesit_initialize ();
 
-  TSNode treesit_node = XTS_NODE (node)->node;
-  TSNode parent = ts_node_parent (treesit_node);
-
-  if (ts_node_is_null (parent))
-    return Qnil;
+  Lisp_Object return_value = Qnil;
 
-  return make_treesit_node (XTS_NODE (node)->parser, parent);
+  TSNode treesit_node = XTS_NODE (node)->node;
+  Lisp_Object parser = XTS_NODE (node)->parser;
+  TSTreeCursor cursor = treesit_cursor_helper (treesit_node, parser);
+  if (ts_tree_cursor_goto_parent (&cursor))
+  {
+    TSNode parent = ts_tree_cursor_current_node (&cursor);
+    return_value = make_treesit_node (parser, parent);
+  }
+  ts_tree_cursor_delete (&cursor);
+  return return_value;
 }
 
 DEFUN ("treesit-node-child",
@@ -2620,63 +2631,210 @@ the query.  */)
 
 /*** Navigation */
 
-/* Return the next/previous named/unnamed sibling of NODE.  FORWARD
-   controls the direction and NAMED controls the nameness.  */
-static TSNode
-treesit_traverse_sibling_helper (TSNode node, bool forward, bool named)
+static inline void
+treesit_assume_true (bool val)
+{
+  eassert (val == true);
+}
+
+/* Create a TSTreeCursor pointing at NODE.  PARSER is the lisp parser
+   that produced NODE.
+
+   The reason we need this instead of simply using ts_tree_cursor_new
+   is that we have to create the cursor on the root node and traverse
+   down to NODE, in order to record the correct stack of parent nodes.
+   Otherwise going to sibling or parent of NODE wouldn't work.
+
+   (Wow perfect filling.)  */
+static TSTreeCursor
+treesit_cursor_helper (TSNode node, Lisp_Object parser)
+{
+  uint32_t end_pos = ts_node_end_byte (node);
+  TSNode root = ts_tree_root_node (XTS_PARSER (parser)->tree);
+  TSTreeCursor cursor = ts_tree_cursor_new (root);
+  TSNode cursor_node = ts_tree_cursor_current_node (&cursor);
+  /* This is like treesit-node-at.  We go down from the root node,
+     either to first child or next sibling, repeatedly, and finally
+     arrive at NODE.  */
+  while (!ts_node_eq (node, cursor_node))
+    {
+      treesit_assume_true (ts_tree_cursor_goto_first_child (&cursor));
+      cursor_node = ts_tree_cursor_current_node (&cursor);
+      /* ts_tree_cursor_goto_first_child_for_byte is not reliable, so
+        we just go through each sibling.  */
+      while (ts_node_is_missing (cursor_node)
+            || ts_node_end_byte (cursor_node) < end_pos)
+       {
+         /* A "missing" node has zero width, so it's possible that
+            its end = NODE.end but it's not NODE, so we skip them.
+            But we need to make sure this missing node is not the
+            node we are looking for before skipping it.  */
+         if (ts_node_is_missing (cursor_node)
+             && ts_node_eq (node, cursor_node))
+           return cursor;
+         treesit_assume_true (ts_tree_cursor_goto_next_sibling (&cursor));
+         cursor_node = ts_tree_cursor_current_node (&cursor);
+       }
+      /* Right now CURSOR.end >= NODE.end.  But what if CURSOR.end =
+        NODE.end, and there are missing nodes after CURSOR, and the
+        missing node after CURSOR is the NODE we are looking for??
+        Well, create a probe and look ahead.  (This is tested by
+        treesit-cursor-helper-with-missing-node.)  */
+      TSTreeCursor probe = ts_tree_cursor_copy (&cursor);
+      TSNode probe_node;
+      while (ts_tree_cursor_goto_next_sibling (&probe))
+       {
+         probe_node = ts_tree_cursor_current_node (&probe);
+         if (!ts_node_is_missing (probe_node))
+           break;
+         if (ts_node_eq (probe_node, node))
+           {
+             ts_tree_cursor_delete (&cursor);
+             return probe;
+           }
+       }
+      ts_tree_cursor_delete (&probe);
+    }
+  return cursor;
+}
+
+/* Move CURSOR to the next/previous sibling.  FORWARD controls the
+   direction.  NAMED controls the namedness.  If there is a valid
+   sibling, move CURSOR to it and return true, otherwise return false.
+   When false is returned, CURSOR points to a sibling node of the node
+   we started at, but exactly which is undefined.  */
+static bool
+treesit_traverse_sibling_helper (TSTreeCursor *cursor,
+                                bool forward, bool named)
 {
   if (forward)
     {
-      if (named)
-       return ts_node_next_named_sibling (node);
-      else
-       return ts_node_next_sibling (node);
+      if (!named)
+       return ts_tree_cursor_goto_next_sibling (cursor);
+      /* Else named...  */
+      while (ts_tree_cursor_goto_next_sibling (cursor))
+       {
+         if (ts_node_is_named (ts_tree_cursor_current_node (cursor)))
+           return true;
+       }
+      return false;
     }
-  else
+  else /* Backward.  */
     {
-      if (named)
-       return ts_node_prev_named_sibling (node);
-      else
-       return ts_node_prev_sibling (node);
+      /* Go to first child and go through each sibling, until we find
+        the one just before the starting node.  */
+      TSNode start = ts_tree_cursor_current_node (cursor);
+      if (!ts_tree_cursor_goto_parent (cursor))
+       return false;
+      treesit_assume_true (ts_tree_cursor_goto_first_child (cursor));
+
+      /* Now CURSOR is at the first child.  If we started at the first
+        child, then there is no further siblings.  */
+      TSNode first_child = ts_tree_cursor_current_node (cursor);
+      if (ts_node_eq (first_child, start))
+       return false;
+
+      /* PROBE is always DELTA siblings ahead of CURSOR. */
+      TSTreeCursor probe = ts_tree_cursor_copy (cursor);
+      /* This is position of PROBE minus position of CURSOR.  */
+      ptrdiff_t delta = 0;
+      TSNode probe_node;
+      TSNode cursor_node;
+      while (ts_tree_cursor_goto_next_sibling (&probe))
+       {
+         /* Move PROBE forward, if it equals to the starting node,
+            CURSOR points to the node we want (prev valid sibling of
+            the starting node).  */
+         delta++;
+         probe_node = ts_tree_cursor_current_node (&probe);
+
+         /* PROBE matched, depending on NAMED, return true/false.  */
+         if (ts_node_eq (probe_node, start))
+           {
+             ts_tree_cursor_delete (&probe);
+             cursor_node = ts_tree_cursor_current_node (cursor);
+             ts_tree_cursor_delete (&probe);
+             return (!named || (named && ts_node_is_named (cursor_node)));
+           }
+
+         /* PROBE didn't match, move CURSOR forward to PROBE's
+            position, but if we are looking for named nodes, only
+            move CURSOR to PROBE if PROBE is at a named node.  */
+         if (!named || (named && ts_node_is_named (probe_node)))
+           for (; delta > 0; delta--)
+             treesit_assume_true (ts_tree_cursor_goto_next_sibling (cursor));
+       }
+      ts_tree_cursor_delete (&probe);
+      return false;
     }
 }
 
-/* Return the first/last named/unnamed child of NODE.  FORWARD controls
-   the direction and NAMED controls the nameness.  */
-static TSNode
-treesit_traverse_child_helper (TSNode node, bool forward, bool named)
+/* Move CURSOR to the first/last child.  FORWARD controls the
+   direction.  NAMED controls the namedness.  If there is a valid
+   child, move CURSOR to it and return true, otherwise don't move
+   CURSOR and return false.  */
+static bool
+treesit_traverse_child_helper (TSTreeCursor *cursor,
+                              bool forward, bool named)
 {
   if (forward)
     {
-      if (named)
-       return ts_node_named_child (node, 0);
+      if (!named)
+       return ts_tree_cursor_goto_first_child (cursor);
       else
-       return ts_node_child (node, 0);
-    }
-  else
-    {
-      if (named)
        {
-         uint32_t count = ts_node_named_child_count (node);
-         uint32_t idx = count == 0 ? 0 : count - 1;
-         return ts_node_named_child (node, idx);
+         if (!ts_tree_cursor_goto_first_child (cursor))
+           return false;
+         /* After this point, if you return false, make sure to go
+            back to parent.  */
+         TSNode first_child = ts_tree_cursor_current_node (cursor);
+         if (ts_node_is_named (first_child))
+           return true;
+
+         if (treesit_traverse_sibling_helper (cursor, true, true))
+           return true;
+         else
+           {
+             treesit_assume_true (ts_tree_cursor_goto_parent (cursor));
+             return false;
+           }
        }
+    }
+  else /* Backward.  */
+    {
+      if (!ts_tree_cursor_goto_first_child (cursor))
+       return false;
+      /* After this point, if you return false, make sure to go
+        back to parent.  */
+
+      /* First go to the last child.  */
+      while (ts_tree_cursor_goto_next_sibling (cursor));
+
+      if (!named)
+       return true;
+      /* Else named... */
+      if (treesit_traverse_sibling_helper(cursor, false, true))
+       return true;
       else
        {
-         uint32_t count = ts_node_child_count (node);
-         uint32_t idx = count == 0 ? 0 : count - 1;
-         return ts_node_child (node, idx);
+         treesit_assume_true (ts_tree_cursor_goto_parent (cursor));
+         return false;
        }
     }
 }
 
-/* Return true if NODE matches PRED.  PRED can be a string or a
-   function.  This function assumes PRED is either a string or a
-   function.  */
+/* Return true if the node at CURSOR matches PRED.  PRED can be a
+   string or a function.  This function assumes PRED is either a
+   string or a function.  If NAMED is true, also check that the node
+   is named.  */
 static bool
-treesit_traverse_match_predicate (TSNode node, Lisp_Object pred,
-                                 Lisp_Object parser)
+treesit_traverse_match_predicate (TSTreeCursor *cursor, Lisp_Object pred,
+                                 Lisp_Object parser, bool named)
 {
+  TSNode node = ts_tree_cursor_current_node (cursor);
+  if (named && !ts_node_is_named (node))
+    return false;
+
   if (STRINGP (pred))
     {
       const char *type = ts_node_type (node);
@@ -2687,73 +2845,60 @@ treesit_traverse_match_predicate (TSNode node, 
Lisp_Object pred,
       Lisp_Object lisp_node = make_treesit_node (parser, node);
       return !NILP (CALLN (Ffuncall, pred, lisp_node));
     }
-
 }
 
-/* Traverse the parse tree starting from ROOT (but ROOT is not
-   matches against PRED).  PRED can be a function (takes a node and
-   returns nil/non-nil),or a string (treated as regexp matching the
-   node's type, ignores case, must be all single byte characters).  If
-   the node satisfies PRED , terminate, set ROOT to that node, and
-   return true.  If no node satisfies PRED, return FALSE.  PARSER is
-   the parser of ROOT.
+/* Traverse the parse tree starting from CURSOR.  PRED can be a
+   function (takes a node and returns nil/non-nil), or a string
+   (treated as regexp matching the node's type, must be all single
+   byte characters).  If the node satisfies PRED, leave CURSOR on that
+   node and return true.  If no node satisfies PRED, move CURSOR back
+   to starting position and return false.
 
    LIMIT is the number of levels we descend in the tree.  FORWARD
    controls the direction in which we traverse the tree, true means
-   forward, false backward.  If NAMED is true, only traverse named
-   nodes, if false, all nodes.  If SKIP_ROOT is true, don't match
-   ROOT.  */
+   forward, false backward.  If SKIP_ROOT is true, don't match ROOT.
+   */
 static bool
-treesit_search_dfs (TSNode *root, Lisp_Object pred, Lisp_Object parser,
-                   bool named, bool forward, ptrdiff_t limit,
+treesit_search_dfs (TSTreeCursor *cursor,
+                   Lisp_Object pred, Lisp_Object parser,
+                   bool forward, bool named, ptrdiff_t limit,
                    bool skip_root)
 {
-  /* TSTreeCursor doesn't allow us to move backward, so we can't use
-     it.  */
-  TSNode node = *root;
+  if (!skip_root
+      && treesit_traverse_match_predicate (cursor, pred, parser, named))
+    return true;
 
-  if (!skip_root && treesit_traverse_match_predicate (node, pred, parser))
-    {
-      *root = node;
-      return true;
-    }
+  if (limit == 0)
+    return false;
 
-  if (limit <= 0)
+  if (!treesit_traverse_child_helper (cursor, forward, named))
     return false;
-  else
+  /* After this point, if you return false, make sure to go back to
+     parent.  */
+
+  do /* Iterate through each child.  */
     {
-      int count = (named
-                  ? ts_node_named_child_count (node)
-                  : ts_node_child_count (node));
-      for (int offset = 0; offset < count; offset++)
-       {
-         uint32_t idx = forward ? offset : count - offset - 1;
-         TSNode child = (named
-                         ? ts_node_named_child (node, idx)
-                         : ts_node_child (node, idx));
-
-         if (!ts_node_is_null (child)
-             && treesit_search_dfs (&child, pred, parser, named,
-                                    forward, limit - 1, false))
-           {
-             *root = child;
-             return true;
-           }
-       }
-      return false;
+      if (treesit_search_dfs (cursor, pred, parser, forward,
+                             named, limit - 1, false))
+       return true;
     }
+  while (treesit_traverse_sibling_helper (cursor, forward, false));
+
+  /* No match in any child's subtree, go back to starting node.  */
+  treesit_assume_true (ts_tree_cursor_goto_parent (cursor));
+  return false;
 }
 
 /* Go through the whole tree linearly, leaf-first, starting from
    START.  PRED, PARSER, NAMED, FORWARD are the same as in
-   ts_search_subtre.  If UP_ONLY is true, never go to children, only
-   sibling and parents.  */
+   ts_search_subtree.  If a match is found, leave CURSOR at that node,
+   and return true, if no match is found, return false, and CURSOR's
+   position is undefined.  */
 static bool
-treesit_search_forward (TSNode *start, Lisp_Object pred, Lisp_Object parser,
-                       bool named, bool forward)
+treesit_search_forward (TSTreeCursor *cursor,
+                       Lisp_Object pred, Lisp_Object parser,
+                       bool forward, bool named)
 {
-  TSNode node = *start;
-
   /* We don't search for subtree and always search from the leaf
      nodes.  This way repeated call of this function traverses each
      node in the tree once and only once:
@@ -2763,39 +2908,26 @@ treesit_search_forward (TSNode *start, Lisp_Object 
pred, Lisp_Object parser,
   bool initial = true;
   while (true)
     {
-      if (!initial /* We don't match START.  */
-         && treesit_traverse_match_predicate (node, pred, parser))
-       {
-         *start = node;
-         return true;
-       }
+      if (!initial /* We don't match the starting node.  */
+         && treesit_traverse_match_predicate (cursor, pred, parser, named))
+       return true;
       initial = false;
 
-      TSNode next = treesit_traverse_sibling_helper (node, forward, named);
-      while (ts_node_is_null (next))
+      /* Try going to the next sibling, if there is no next sibling,
+        go to parent and try again.  */
+      while (!treesit_traverse_sibling_helper (cursor, forward, named))
        {
          /* There is no next sibling, go to parent.  */
-         node = ts_node_parent (node);
-         if (ts_node_is_null (node))
+         if (!ts_tree_cursor_goto_parent (cursor))
            return false;
 
-         if (treesit_traverse_match_predicate (node, pred, parser))
-           {
-             *start = node;
+         if (treesit_traverse_match_predicate (cursor, pred, parser, named))
              return true;
-           }
-         next = treesit_traverse_sibling_helper (node, forward, named);
        }
       /* We are at the next sibling, deep dive into the first leaf
         node.  */
-      TSNode next_next = treesit_traverse_child_helper (next, forward, named);
-      while (!ts_node_is_null (next_next))
-       {
-         next = next_next;
-         next_next = treesit_traverse_child_helper (next, forward, named);
-       }
-      /* At this point NEXT is a leaf node.  */
-      node = next;
+      while (treesit_traverse_child_helper (cursor, forward, false));
+      /* At this point CURSOR is at a leaf node.  */
     }
 }
 
@@ -2823,7 +2955,7 @@ Return the first matched node, or nil if none matches.  
*/)
   CHECK_SYMBOL (all);
   CHECK_SYMBOL (backward);
 
-  /* We use a default limit to 1000.  See bug#59426 for the
+  /* We use a default limit of 1000.  See bug#59426 for the
      discussion.  */
   ptrdiff_t the_limit = 1000;
   if (!NILP (limit))
@@ -2834,13 +2966,17 @@ Return the first matched node, or nil if none matches.  
*/)
 
   treesit_initialize ();
 
-  TSNode treesit_node = XTS_NODE (node)->node;
   Lisp_Object parser = XTS_NODE (node)->parser;
-  if (treesit_search_dfs (&treesit_node, predicate, parser, NILP (all),
-                         NILP (backward), the_limit, false))
-    return make_treesit_node (parser, treesit_node);
-  else
-    return Qnil;
+  Lisp_Object return_value = Qnil;
+  TSTreeCursor cursor = treesit_cursor_helper (XTS_NODE (node)->node, parser);
+  if (treesit_search_dfs (&cursor, predicate, parser, NILP (backward),
+                         NILP (all), the_limit, false))
+    {
+      TSNode node = ts_tree_cursor_current_node (&cursor);
+      return_value = make_treesit_node (parser, node);
+    }
+  ts_tree_cursor_delete (&cursor);
+  return return_value;
 }
 
 DEFUN ("treesit-search-forward",
@@ -2884,13 +3020,17 @@ always traverse leaf nodes first, then upwards.  */)
 
   treesit_initialize ();
 
-  TSNode treesit_start = XTS_NODE (start)->node;
   Lisp_Object parser = XTS_NODE (start)->parser;
-  if (treesit_search_forward (&treesit_start, predicate, parser, NILP (all),
-                             NILP (backward)))
-    return make_treesit_node (parser, treesit_start);
-  else
-    return Qnil;
+  Lisp_Object return_value = Qnil;
+  TSTreeCursor cursor = treesit_cursor_helper (XTS_NODE (start)->node, parser);
+  if (treesit_search_forward (&cursor, predicate, parser,
+                             NILP (backward), NILP (all)))
+    {
+      TSNode node = ts_tree_cursor_current_node (&cursor);
+      return_value = make_treesit_node (parser, node);
+    }
+  ts_tree_cursor_delete (&cursor);
+  return return_value;
 }
 
 /* Recursively traverse the tree under CURSOR, and append the result
@@ -2902,13 +3042,12 @@ treesit_build_sparse_tree (TSTreeCursor *cursor, 
Lisp_Object parent,
                           Lisp_Object pred, Lisp_Object process_fn,
                           ptrdiff_t limit, Lisp_Object parser)
 {
-
-  TSNode node = ts_tree_cursor_current_node (cursor);
-  bool match = treesit_traverse_match_predicate (node, pred, parser);
+  bool match = treesit_traverse_match_predicate (cursor, pred, parser, false);
   if (match)
     {
       /* If this node matches pred, add a new node to the parent's
         children list.  */
+      TSNode node = ts_tree_cursor_current_node (cursor);
       Lisp_Object lisp_node = make_treesit_node (parser, node);
       if (!NILP (process_fn))
        lisp_node = CALLN (Ffuncall, process_fn, lisp_node);
@@ -2989,7 +3128,7 @@ a regexp.  */)
   if (!NILP (process_fn))
     CHECK_TYPE (FUNCTIONP (process_fn), Qfunctionp, process_fn);
 
-  /* We use a default limit to 1000.  See bug#59426 for the
+  /* We use a default limit of 1000.  See bug#59426 for the
      discussion.  */
   ptrdiff_t the_limit = 1000;
   if (!NILP (limit))
@@ -3000,11 +3139,12 @@ a regexp.  */)
 
   treesit_initialize ();
 
-  TSTreeCursor cursor = ts_tree_cursor_new (XTS_NODE (root)->node);
   Lisp_Object parser = XTS_NODE (root)->parser;
   Lisp_Object parent = Fcons (Qnil, Qnil);
+  TSTreeCursor cursor = treesit_cursor_helper (XTS_NODE (root)->node, parser);
   treesit_build_sparse_tree (&cursor, parent, predicate, process_fn,
                             the_limit, parser);
+  ts_tree_cursor_delete (&cursor);
   Fsetcdr (parent, Fnreverse (Fcdr (parent)));
   if (NILP (Fcdr (parent)))
     return Qnil;
diff --git a/src/xdisp.c b/src/xdisp.c
index 66584e4d73..e8df230ef8 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -6281,13 +6281,16 @@ static ptrdiff_t
 string_buffer_position (Lisp_Object string, ptrdiff_t around_charpos)
 {
   const int MAX_DISTANCE = 1000;
+  ptrdiff_t forward_limit = min (around_charpos + MAX_DISTANCE, ZV);
   ptrdiff_t found = string_buffer_position_lim (string, around_charpos,
-                                               around_charpos + MAX_DISTANCE,
-                                               false);
+                                               forward_limit, false);
 
   if (!found)
-    found = string_buffer_position_lim (string, around_charpos,
-                                       around_charpos - MAX_DISTANCE, true);
+    {
+      ptrdiff_t backward_limit = max (around_charpos - MAX_DISTANCE, BEGV);
+      found = string_buffer_position_lim (string, around_charpos,
+                                         backward_limit, true);
+    }
   return found;
 }
 
@@ -19429,6 +19432,13 @@ redisplay_window (Lisp_Object window, bool 
just_this_one_p)
            blank_row (w, row, y);
          goto finish_scroll_bars;
        }
+      else if (minibuf_level >= 1)
+       {
+         /* We could have a message produced by set-minibuffer-message
+            displayed in the mini-window as an overlay, so resize the
+            mini-window if needed.  */
+         resize_mini_window (w, false);
+       }
 
       clear_glyph_matrix (w->desired_matrix);
     }
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 682b5cdb44..011bfa67cc 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -1038,17 +1038,6 @@ unquoted file names."
     (let ((default-directory nospecial-dir))
       (should-error (make-directory "dir")))))
 
-(ert-deftest files-tests-file-name-non-special-make-directory-internal ()
-  (files-tests--with-temp-non-special (tmpdir nospecial-dir t)
-    (let ((default-directory nospecial-dir))
-      (make-directory-internal "dir")
-      (should (file-directory-p "dir"))
-      (delete-directory "dir")))
-  (files-tests--with-temp-non-special-and-file-name-handler
-      (tmpdir nospecial-dir t)
-    (let ((default-directory nospecial-dir))
-      (should-error (make-directory-internal "dir")))))
-
 (ert-deftest files-tests-file-name-non-special-make-nearby-temp-file ()
   (let* ((default-directory (file-name-quote temporary-file-directory))
          (near-tmpfile (make-nearby-temp-file "file")))
@@ -1272,11 +1261,11 @@ works as expected if the default directory is quoted."
            (a/b (concat dirname "a/b")))
       (write-region "" nil file)
       (should-error (make-directory "/"))
-      (should-not (make-directory "/" t))
+      (should (make-directory "/" t))
       (should-error (make-directory dir))
-      (should-not (make-directory dir t))
+      (should (make-directory dir t))
       (should-error (make-directory dirname))
-      (should-not (make-directory dirname t))
+      (should (make-directory dirname t))
       (should-error (make-directory file))
       (should-error (make-directory file t))
       (should-not (make-directory subdir1))
@@ -1357,7 +1346,9 @@ name (Bug#28412)."
            (dest (concat dirname "dest/new/directory/"))
            (file (concat (file-name-as-directory source) "file"))
            (source2 (concat dirname "source2"))
-           (dest2 (concat dirname "dest/new2")))
+           (dest2 (concat dirname "dest/new2"))
+           (source3 (concat dirname "source3/d"))
+           (dest3 (concat dirname "dest3/d")))
       (make-directory source)
       (write-region "" nil file)
       (copy-directory source dest t t t)
@@ -1365,6 +1356,11 @@ name (Bug#28412)."
       (make-directory (concat (file-name-as-directory source2) "a") t)
       (copy-directory source2 dest2)
       (should (file-directory-p (concat (file-name-as-directory dest2) "a")))
+      (make-directory source3 t)
+      (write-region "x\n" nil (concat (file-name-as-directory source3) "file"))
+      (make-directory dest3 t)
+      (write-region "y\n" nil (concat (file-name-as-directory dest3) "file"))
+      (copy-directory source3 (file-name-directory dest3) t)
       (delete-directory dir 'recursive))))
 
 (ert-deftest files-tests-abbreviate-file-name-homedir ()
diff --git a/test/lisp/progmodes/ruby-mode-resources/ruby.rb 
b/test/lisp/progmodes/ruby-mode-resources/ruby.rb
index f39489071e..2451edaee2 100644
--- a/test/lisp/progmodes/ruby-mode-resources/ruby.rb
+++ b/test/lisp/progmodes/ruby-mode-resources/ruby.rb
@@ -174,6 +174,12 @@ qux :+,
     bar,
     :a
 
+zzz @abc,
+    4
+
+foo a = 5,
+    b
+
 b = $:
 c = ??
 
@@ -500,3 +506,35 @@ def resolve(**args)
 
   member.call(**args)
 end
+
+# Endless methods.
+class Bar
+  def foo(abc) = bar +
+                 baz
+
+  def self.bar =
+    123 +
+    4
+
+  def foo(...) = z
+
+  def request_params = {
+    headers: request_headers,
+    body: request_body
+  }
+
+  def self.foo(
+        baz,
+        bar
+      ) =
+    what
+
+  def foo=(
+        baz,
+        bar
+      )
+    def baz.full_name = "#{bar} 3"
+
+    baz
+  end
+end
diff --git a/test/lisp/progmodes/ruby-mode-tests.el 
b/test/lisp/progmodes/ruby-mode-tests.el
index e90a9e4075..9be01dc78f 100644
--- a/test/lisp/progmodes/ruby-mode-tests.el
+++ b/test/lisp/progmodes/ruby-mode-tests.el
@@ -605,6 +605,18 @@ VALUES-PLIST is a list with alternating index and value 
elements."
     (search-backward "FOO")
     (should (string= (ruby-add-log-current-method) "M::C"))))
 
+(ert-deftest ruby-add-log-current-method-after-endless-method ()
+  (ruby-with-temp-buffer (ruby-test-string
+                          "module M
+                          |  class C
+                          |    def foo =
+                          |      4_
+                          |  end
+                          |end")
+    (search-backward "_")
+    (delete-char 1)
+    (should (string= (ruby-add-log-current-method) "M::C#foo"))))
+
 (defvar ruby-block-test-example
   (ruby-test-string
    "class C
diff --git a/test/src/treesit-tests.el b/test/src/treesit-tests.el
index 3617264502..48b61cf3dc 100644
--- a/test/src/treesit-tests.el
+++ b/test/src/treesit-tests.el
@@ -198,6 +198,141 @@
       (kill-buffer base)
       (kill-buffer indirect))))
 
+;;; Tree traversal
+
+(ert-deftest treesit-search-subtree ()
+  "Test `treesit-search-subtree'."
+  (skip-unless (treesit-language-available-p 'json))
+  (with-temp-buffer
+    (let (parser root array)
+      (progn
+        (insert "[[1,2,3], [1,2,3], [1,2,3]]")
+        (setq parser (treesit-parser-create 'json))
+        (setq root (treesit-parser-root-node parser))
+        (setq array (treesit-node-child root 0)))
+      (dolist (subarray (treesit-node-children array t))
+        ;; Find named node forward.
+        (should (equal "1" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "number"))))
+        ;; Find named node backward.
+        (should (equal "3" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "number" t))))
+        ;; Find anonymous node forward.
+        (should (equal "[" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "\\[" nil t))))
+        ;; Find anonymous node backward.
+        (should (equal "]" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "\\]" t t))))
+        ;; If ALL=nil, it shouldn't find anonymous node.
+        (should (eq nil (treesit-node-text
+                         (treesit-search-subtree
+                          subarray "\\["))))
+        ;; If ALL=nil, searching for number should still find the
+        ;; numbers.
+        (should (equal "1" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "number" nil t))))
+        ;; Find named node backward.
+        (should (equal "3" (treesit-node-text
+                            (treesit-search-subtree
+                             subarray "number" t t))))
+        ))))
+
+(defmacro treesit--ert-search-setup (&rest body)
+  "Setup macro used by `treesit-search-forward' and friends.
+BODY is the test body."
+  `(with-temp-buffer
+     (let (parser root array)
+       (progn
+         (insert "[[1,2,3], [4,5,6], [7,8,9]]")
+         (setq parser (treesit-parser-create 'json))
+         (setq root (treesit-parser-root-node
+                     parser))
+         (setq array (treesit-node-child root 0))
+         ;; First bracket.
+         (setq cursor (treesit-node-child array 0)))
+       ,@body)))
+
+(ert-deftest treesit-search-forward ()
+  "Test `treesit-search-forward'."
+  (skip-unless (treesit-language-available-p 'json))
+  (treesit--ert-search-setup
+   (cl-loop for cursor = (treesit-node-child array 0)
+            then (treesit-search-forward cursor "" nil t)
+            for text in '("[" "[" "1" "," "2" "," "3" "]"
+                          "[1,2,3]" ","
+                          "[" "4" "," "5" "," "6" "]"
+                          "[4,5,6]" ","
+                          "[" "7" "," "8" "," "9" "]"
+                          "[7,8,9]" "]"
+                          "[[1,2,3], [4,5,6], [7,8,9]]")
+            while cursor
+            do (should (equal (treesit-node-text cursor)
+                              text)))))
+
+(ert-deftest treesit-search-forward-named-only ()
+  "Test `treesit-search-forward'."
+  (skip-unless (treesit-language-available-p 'json))
+  (treesit--ert-search-setup
+   (cl-loop for cursor = (treesit-node-child
+                          (treesit-node-child array 1) 1)
+            then (treesit-search-forward cursor "")
+            for text in '("1" "2"  "3" "[1,2,3]"
+                          "4" "5" "6" "[4,5,6]"
+                          "7" "8"  "9" "[7,8,9]"
+                          "[[1,2,3], [4,5,6], [7,8,9]]")
+            while cursor
+            do (should (equal (treesit-node-text cursor)
+                              text)))))
+
+(ert-deftest treesit-search-backward ()
+  "Test `treesit-search-forward'."
+  (skip-unless (treesit-language-available-p 'json))
+  (treesit--ert-search-setup
+   (cl-loop for cursor = (treesit-node-child array -1)
+            then (treesit-search-forward cursor "" t t)
+            for text in (reverse '("[[1,2,3], [4,5,6], [7,8,9]]"
+                                   "[" "[1,2,3]"
+                                   "[" "1" "," "2" "," "3" "]"
+                                   "," "[4,5,6]"
+                                   "[" "4" "," "5" "," "6" "]"
+                                   "," "[7,8,9]"
+                                   "[" "7" "," "8" "," "9" "]"
+                                   "]"))
+            while cursor
+            do (should (equal (treesit-node-text cursor)
+                              text)))))
+
+(ert-deftest treesit-search-backward-named-only ()
+  "Test `treesit-search-forward'."
+  (skip-unless (treesit-language-available-p 'json))
+  (treesit--ert-search-setup
+   (cl-loop for cursor = (treesit-node-child
+                          (treesit-node-child array -1 t) -1 t)
+            then (treesit-search-forward cursor "" t)
+            for text in (reverse '("[[1,2,3], [4,5,6], [7,8,9]]"
+                                   "[1,2,3]" "1" "2"  "3"
+                                   "[4,5,6]" "4" "5" "6"
+                                   "[7,8,9]" "7" "8"  "9"))
+            while cursor
+            do (should (equal (treesit-node-text cursor)
+                              text)))))
+
+(ert-deftest treesit-cursor-helper-with-missing-node ()
+  "Test treesit_cursor_helper with a missing node."
+  (skip-unless (treesit-language-available-p 'json))
+  (treesit--ert-search-setup
+   (delete-char -1)
+   (setq root (treesit-buffer-root-node))
+   (setq array (treesit-node-child root 0))
+   ;; If everything works, this should not hang.
+   (let ((missing-bracket (treesit-node-child array -1)))
+     (treesit-search-forward missing-bracket "" t))))
+
 ;;; Query
 
 (ert-deftest treesit-query-api ()



reply via email to

[Prev in Thread] Current Thread [Next in Thread]