aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/edit.c2
-rw-r--r--src/nvim/eval.c45
-rw-r--r--src/nvim/ex_docmd.c11
-rw-r--r--src/nvim/memline.c7
-rw-r--r--src/nvim/regexp.c26
-rw-r--r--src/nvim/regexp_nfa.c23
-rw-r--r--src/nvim/testdir/test_alot.vim2
-rw-r--r--src/nvim/testdir/test_cmdline.vim120
-rw-r--r--src/nvim/testdir/test_popup.vim30
-rw-r--r--src/nvim/version.c601
10 files changed, 832 insertions, 35 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 03ef41f849..98ec9ae280 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -2385,6 +2385,7 @@ void set_completion(colnr_T startcol, list_T *list)
} else {
ins_complete(Ctrl_N, false);
}
+ compl_enter_selects = compl_no_insert;
// Lazily show the popup menu, unless we got interrupted.
if (!compl_interrupted) {
@@ -3989,6 +3990,7 @@ static void ins_compl_insert(void)
dict_add_nr_str(dict, "info", 0L,
EMPTY_IF_NULL(compl_shown_match->cp_text[CPT_INFO]));
set_vim_var_dict(VV_COMPLETED_ITEM, dict);
+ compl_curr_match = compl_shown_match;
}
/*
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 7deb1c1bbb..a5333d74be 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6791,6 +6791,7 @@ static struct fst {
{ "getcmdpos", 0, 0, f_getcmdpos },
{ "getcmdtype", 0, 0, f_getcmdtype },
{ "getcmdwintype", 0, 0, f_getcmdwintype },
+ { "getcompletion", 2, 2, f_getcompletion },
{ "getcurpos", 0, 0, f_getcurpos },
{ "getcwd", 0, 2, f_getcwd },
{ "getfontname", 0, 1, f_getfontname },
@@ -9983,6 +9984,50 @@ static void f_getcmdwintype(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string[0] = cmdwin_type;
}
+// "getcompletion()" function
+static void f_getcompletion(typval_T *argvars, typval_T *rettv)
+{
+ char_u *pat;
+ expand_T xpc;
+ int options = WILD_KEEP_ALL | WILD_SILENT | WILD_USE_NL
+ | WILD_LIST_NOTFOUND | WILD_NO_BEEP;
+
+ if (p_wic) {
+ options |= WILD_ICASE;
+ }
+
+ ExpandInit(&xpc);
+ xpc.xp_pattern = get_tv_string(&argvars[0]);
+ xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
+ xpc.xp_context = cmdcomplete_str_to_type(get_tv_string(&argvars[1]));
+ if (xpc.xp_context == EXPAND_NOTHING) {
+ if (argvars[1].v_type == VAR_STRING) {
+ EMSG2(_(e_invarg2), argvars[1].vval.v_string);
+ } else {
+ EMSG(_(e_invarg));
+ }
+ return;
+ }
+
+ if (xpc.xp_context == EXPAND_MENUS) {
+ set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, false);
+ xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
+ }
+
+ pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
+ if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL)) {
+ int i;
+
+ ExpandOne(&xpc, pat, NULL, options, WILD_ALL_KEEP);
+
+ for (i = 0; i < xpc.xp_numfiles; i++) {
+ list_append_string(rettv->vval.v_list, xpc.xp_files[i], -1);
+ }
+ }
+ xfree(pat);
+ ExpandCleanup(&xpc);
+}
+
/// `getcwd([{win}[, {tab}]])` function
///
/// Every scope not specified implies the currently selected scope object.
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 9bc7ec39da..8bae817211 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -5597,6 +5597,17 @@ int parse_compl_arg(char_u *value, int vallen, int *complp,
return OK;
}
+int cmdcomplete_str_to_type(char_u *complete_str)
+{
+ for (int i = 0; command_complete[i].expand != 0; i++) {
+ if (STRCMP(complete_str, command_complete[i].name) == 0) {
+ return command_complete[i].expand;
+ }
+ }
+
+ return EXPAND_NOTHING;
+}
+
static void ex_colorscheme(exarg_T *eap)
{
if (*eap->arg == NUL) {
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index 673205f08f..08e82071d7 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -3165,9 +3165,10 @@ attention_message (
}
/* Some of these messages are long to allow translation to
* other languages. */
- MSG_PUTS(_(
- "\n(1) Another program may be editing the same file. If this is the case,\n be careful not to end up with two different instances of the same\n file when making changes."));
- MSG_PUTS(_(" Quit, or continue with caution.\n"));
+ MSG_PUTS(_("\n(1) Another program may be editing the same file. If this is"
+ " the case,\n be careful not to end up with two different"
+ " instances of the same\n file when making changes."
+ " Quit, or continue with caution.\n"));
MSG_PUTS(_("(2) An edit session for this file crashed.\n"));
MSG_PUTS(_(" If this is the case, use \":recover\" or \"vim -r "));
msg_outtrans(buf->b_fname);
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 886a48e7c5..f8fd7d4ef8 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -1389,6 +1389,10 @@ int vim_regcomp_had_eol(void)
return had_eol;
}
+// variables for parsing reginput
+static int at_start; // True when on the first character
+static int prev_at_start; // True when on the second character
+
/*
* Parse regular expression, i.e. main body or parenthesized thing.
*
@@ -1768,6 +1772,7 @@ static char_u *regatom(int *flagp)
int c;
char_u *p;
int extra = 0;
+ int save_prev_at_start = prev_at_start;
*flagp = WORST; /* Tentatively. */
@@ -2143,17 +2148,21 @@ static char_u *regatom(int *flagp)
}
break;
} else if (c == 'l' || c == 'c' || c == 'v') {
- if (c == 'l')
+ if (c == 'l') {
ret = regnode(RE_LNUM);
- else if (c == 'c')
+ if (save_prev_at_start) {
+ at_start = true;
+ }
+ } else if (c == 'c') {
ret = regnode(RE_COL);
- else
+ } else {
ret = regnode(RE_VCOL);
- if (ret == JUST_CALC_SIZE)
+ }
+ if (ret == JUST_CALC_SIZE) {
regsize += 5;
- else {
- /* put the number and the optional
- * comparator after the opcode */
+ } else {
+ // put the number and the optional
+ // comparator after the opcode
regcode = re_put_uint32(regcode, n);
*regcode++ = cmp;
}
@@ -2679,9 +2688,6 @@ static void regoptail(char_u *p, char_u *val)
* Functions for getting characters from the regexp input.
*/
-static int at_start; /* True when on the first character */
-static int prev_at_start; /* True when on the second character */
-
/*
* Start parsing at "str".
*/
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index f97dce9e0d..92dbd693ea 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -1096,6 +1096,7 @@ static int nfa_regatom(void)
int startc = -1;
int endc = -1;
int oldstartc = -1;
+ int save_prev_at_start = prev_at_start;
c = getchr();
switch (c) {
@@ -1412,18 +1413,22 @@ static int nfa_regatom(void)
c = getchr();
}
if (c == 'l' || c == 'c' || c == 'v') {
- if (c == 'l')
- /* \%{n}l \%{n}<l \%{n}>l */
+ if (c == 'l') {
+ // \%{n}l \%{n}<l \%{n}>l
EMIT(cmp == '<' ? NFA_LNUM_LT :
- cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
- else if (c == 'c')
- /* \%{n}c \%{n}<c \%{n}>c */
+ cmp == '>' ? NFA_LNUM_GT : NFA_LNUM);
+ if (save_prev_at_start) {
+ at_start = true;
+ }
+ } else if (c == 'c') {
+ // \%{n}c \%{n}<c \%{n}>c
EMIT(cmp == '<' ? NFA_COL_LT :
- cmp == '>' ? NFA_COL_GT : NFA_COL);
- else
- /* \%{n}v \%{n}<v \%{n}>v */
+ cmp == '>' ? NFA_COL_GT : NFA_COL);
+ } else {
+ // \%{n}v \%{n}<v \%{n}>v
EMIT(cmp == '<' ? NFA_VCOL_LT :
- cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
+ cmp == '>' ? NFA_VCOL_GT : NFA_VCOL);
+ }
EMIT(n);
break;
} else if (c == '\'' && n == 0) {
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
index ad9b2cce8b..30b8a9ceb8 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -3,5 +3,7 @@
source test_assign.vim
source test_cursor_func.vim
+source test_cmdline.vim
source test_menu.vim
+source test_popup.vim
source test_unlet.vim
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
new file mode 100644
index 0000000000..438b20cc5e
--- /dev/null
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -0,0 +1,120 @@
+" Tests for editing the command line.
+
+func Test_complete_tab()
+ call writefile(['testfile'], 'Xtestfile')
+ call feedkeys(":e Xtest\t\r", "tx")
+ call assert_equal('testfile', getline(1))
+ call delete('Xtestfile')
+endfunc
+
+func Test_complete_list()
+ " We can't see the output, but at least we check the code runs properly.
+ call feedkeys(":e test\<C-D>\r", "tx")
+ call assert_equal('test', expand('%:t'))
+endfunc
+
+func Test_complete_wildmenu()
+ call writefile(['testfile1'], 'Xtestfile1')
+ call writefile(['testfile2'], 'Xtestfile2')
+ set wildmenu
+ call feedkeys(":e Xtest\t\t\r", "tx")
+ call assert_equal('testfile2', getline(1))
+
+ call delete('Xtestfile1')
+ call delete('Xtestfile2')
+ set nowildmenu
+endfunc
+
+func Test_getcompletion()
+ if !has('cmdline_compl')
+ return
+ endif
+ let groupcount = len(getcompletion('', 'event'))
+ call assert_true(groupcount > 0)
+ let matchcount = len(getcompletion('File', 'event'))
+ call assert_true(matchcount > 0)
+ call assert_true(groupcount > matchcount)
+
+ if has('menu')
+ source $VIMRUNTIME/menu.vim
+ let matchcount = len(getcompletion('', 'menu'))
+ call assert_true(matchcount > 0)
+ call assert_equal(['File.'], getcompletion('File', 'menu'))
+ call assert_true(matchcount > 0)
+ let matchcount = len(getcompletion('File.', 'menu'))
+ call assert_true(matchcount > 0)
+ endif
+
+ let l = getcompletion('v:n', 'var')
+ call assert_true(index(l, 'v:null') >= 0)
+
+ let l = getcompletion('', 'augroup')
+ call assert_true(index(l, 'END') >= 0)
+
+ let l = getcompletion('', 'behave')
+ call assert_true(index(l, 'mswin') >= 0)
+
+ let l = getcompletion('', 'color')
+ call assert_true(index(l, 'default') >= 0)
+
+ let l = getcompletion('', 'command')
+ call assert_true(index(l, 'sleep') >= 0)
+
+ let l = getcompletion('', 'dir')
+ call assert_true(index(l, 'sautest') >= 0)
+
+ let l = getcompletion('exe', 'expression')
+ call assert_true(index(l, 'executable(') >= 0)
+
+ let l = getcompletion('tag', 'function')
+ call assert_true(index(l, 'taglist(') >= 0)
+
+ let l = getcompletion('run', 'file')
+ call assert_true(index(l, 'runtest.vim') >= 0)
+
+ let l = getcompletion('ha', 'filetype')
+ call assert_true(index(l, 'hamster') >= 0)
+
+ let l = getcompletion('z', 'syntax')
+ call assert_true(index(l, 'zimbu') >= 0)
+
+ let l = getcompletion('jikes', 'compiler')
+ call assert_true(index(l, 'jikes') >= 0)
+
+ let l = getcompletion('time', 'option')
+ call assert_true(index(l, 'timeoutlen') >= 0)
+
+ let l = getcompletion('er', 'highlight')
+ call assert_true(index(l, 'ErrorMsg') >= 0)
+
+ " For others test if the name is recognized.
+ let names = ['buffer', 'environment', 'file_in_path',
+ \ 'mapping', 'shellcmd', 'tag', 'tag_listfiles', 'user']
+ if has('cscope')
+ call add(names, 'cscope')
+ endif
+ if has('cmdline_hist')
+ call add(names, 'history')
+ endif
+ if has('gettext')
+ call add(names, 'locale')
+ endif
+ if has('profile')
+ call add(names, 'syntime')
+ endif
+ if has('signs')
+ call add(names, 'sign')
+ endif
+
+ set tags=Xtags
+ call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", "word\tfile\tcmd"], 'Xtags')
+
+ for name in names
+ let matchcount = len(getcompletion('', name))
+ call assert_true(matchcount >= 0, 'No matches for ' . name)
+ endfor
+
+ call delete('Xtags')
+
+ call assert_fails('call getcompletion("", "burp")', 'E475:')
+endfunc
diff --git a/src/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim
new file mode 100644
index 0000000000..78fc81e3d2
--- /dev/null
+++ b/src/nvim/testdir/test_popup.vim
@@ -0,0 +1,30 @@
+" Test for completion menu
+
+function! ComplTest() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+endfunction
+
+function! Test() abort
+ call complete(1, ['source', 'soundfold'])
+ return ''
+endfunction
+
+func Test_noinsert_complete()
+ new
+ set completeopt+=noinsert
+ inoremap <F5> <C-R>=ComplTest()<CR>
+ call feedkeys("i\<F5>soun\<CR>\<CR>\<ESC>.", 'tx')
+ call assert_equal('soundfold', getline(1))
+ call assert_equal('soundfold', getline(2))
+ bwipe!
+
+ new
+ inoremap <F5> <C-R>=Test()<CR>
+ call feedkeys("i\<F5>\<CR>\<ESC>", 'tx')
+ call assert_equal('source', getline(1))
+ bwipe!
+
+ set completeopt-=noinsert
+ iunmap <F5>
+endfunc
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 4a17660cd5..d6b051a511 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -75,32 +75,608 @@ static char *features[] = {
// clang-format off
static int included_patches[] = {
+ // 2200,
+ // 2199,
+ // 2198,
+ // 2197,
+ // 2196,
+ // 2195,
+ // 2194,
+ // 2193,
+ // 2192,
+ // 2191,
+ // 2190,
+ // 2189,
+ // 2188,
+ // 2187,
+ // 2186,
+ // 2185,
+ // 2184,
+ // 2183,
+ // 2182,
+ // 2181,
+ // 2180,
+ // 2179,
+ // 2178,
+ // 2177,
+ // 2176,
+ // 2175,
+ // 2174,
+ // 2173,
+ // 2172,
+ // 2171,
+ // 2170,
+ // 2169,
+ // 2168,
+ // 2167,
+ // 2166,
+ // 2165,
+ // 2164,
+ // 2163,
+ // 2162,
+ // 2161,
+ // 2160,
+ // 2159,
+ // 2158,
+ // 2157,
+ // 2156,
+ // 2155,
+ // 2154,
+ // 2153,
+ // 2152,
+ // 2151,
+ // 2150,
+ // 2149,
+ // 2148,
+ // 2147,
+ // 2146,
+ // 2145,
+ // 2144,
+ // 2143,
+ // 2142,
+ // 2141,
+ // 2140,
+ // 2139,
+ // 2138,
+ // 2137,
+ // 2136,
+ // 2135,
+ // 2134,
+ // 2133,
+ // 2132,
+ // 2131,
+ // 2130,
+ // 2129,
+ // 2128,
+ // 2127,
+ // 2126,
+ // 2125,
+ // 2124,
+ // 2123,
+ // 2122,
+ // 2121,
+ // 2120,
+ // 2119,
+ // 2118,
+ // 2117,
+ // 2116,
+ // 2115,
+ // 2114,
+ // 2113,
+ // 2112,
+ // 2111,
+ // 2110,
+ // 2109,
+ // 2108,
+ // 2107,
+ // 2106,
+ // 2105 NA
+ // 2104,
+ // 2103,
+ // 2102 NA
+ // 2101,
+ // 2100,
+ // 2099,
+ // 2098,
+ // 2097,
+ // 2096,
+ // 2095,
+ // 2094,
+ // 2093,
+ // 2092 NA
+ // 2091 NA
+ // 2090,
+ // 2089 NA
+ // 2088,
+ // 2087,
+ // 2086,
+ // 2085,
+ // 2084,
+ // 2083,
+ // 2082,
+ // 2081,
+ // 2080,
+ // 2079 NA
+ // 2078 NA
+ // 2077,
+ // 2076,
+ // 2075,
+ // 2074,
+ // 2073,
+ // 2072,
+ // 2071,
+ // 2070 NA
+ // 2069,
+ // 2068,
+ // 2067,
+ 2066,
+ // 2065,
+ // 2064,
+ // 2063 NA
+ // 2062,
+ // 2061,
+ // 2060 NA
+ // 2059 NA
+ // 2058,
+ // 2057 NA
+ // 2056 NA
+ // 2055 NA
+ // 2054 NA
+ // 2053 NA
+ // 2052 NA
+ // 2051,
+ // 2050,
+ // 2049,
+ // 2048 NA
+ // 2047,
+ // 2046,
+ // 2045 NA
+ // 2044,
+ // 2043,
+ // 2042 NA
+ // 2041 NA
+ // 2040 NA
+ // 2039 NA
+ // 2038 NA
+ // 2037 NA
+ // 2036,
+ // 2035 NA
+ // 2034 NA
+ // 2033,
+ // 2032 NA
+ // 2031,
+ // 2030 NA
+ // 2029,
+ // 2028,
+ // 2027 NA
+ // 2026 NA
+ // 2025 NA
+ // 2024,
+ // 2023,
+ // 2022,
+ // 2021,
+ // 2020 NA
+ // 2019,
+ // 2018,
+ // 2017,
+ // 2016 NA
+ // 2015,
+ 2014,
+ 2013,
+ 2012,
+ 2011,
+ // 2010,
+ // 2009,
+ // 2008,
+ // 2007,
+ // 2006,
+ // 2005,
+ // 2004 NA
+ // 2003 NA
+ // 2002,
+ // 2001 NA
+ // 2000,
+ // 1999,
+ // 1998 NA
+ // 1997,
+ // 1996,
+ // 1995 NA
+ // 1994,
+ // 1993,
+ // 1992,
+ // 1991,
+ // 1990,
+ // 1989,
+ // 1988 NA
+ // 1987 NA
+ // 1986,
+ // 1985 NA
+ // 1984,
+ // 1983 NA
+ // 1982 NA
+ // 1981,
+ // 1980,
+ // 1979,
+ // 1978,
+ // 1977,
+ // 1976,
+ // 1975,
+ // 1974 NA
1973,
+ // 1972,
+ // 1971,
+ // 1970,
+ // 1969 NA
+ // 1968,
+ // 1967,
+ // 1966,
+ // 1965 NA
+ // 1964,
+ // 1963 NA
+ // 1962,
+ // 1961,
1960,
+ // 1959 NA
+ // 1958 NA
+ // 1957 NA
+ // 1956,
+ // 1955,
+ // 1954,
+ // 1953,
+ // 1952,
+ // 1951 NA
+ // 1950,
+ // 1949,
+ // 1948,
+ // 1947 NA
+ // 1946 NA
+ // 1945,
+ // 1944 NA
+ // 1943 NA
+ // 1942 NA
+ // 1941,
+ // 1940,
+ // 1939 NA
+ // 1938 NA
+ // 1937,
+ // 1936,
+ // 1935 NA
+ // 1934 NA
+ // 1933 NA
+ // 1932 NA
+ // 1931 NA
+ // 1930 NA
+ // 1929 NA
+ // 1928,
+ // 1927 NA
+ // 1926 NA
+ // 1925 NA
+ // 1924 NA
+ // 1923,
+ // 1922 NA
+ // 1921 NA
+ // 1920 NA
+ // 1919 NA
+ // 1918 NA
+ // 1917 NA
+ // 1916 NA
+ // 1915 NA
+ // 1914,
+ // 1913,
+ // 1912,
+ // 1911,
+ // 1910,
+ // 1909,
+ // 1908 NA
+ // 1907,
+ // 1906 NA
+ // 1905,
+ // 1904,
+ // 1903,
+ // 1902 NA
+ // 1901 NA
+ // 1900,
+ // 1899 NA
+ // 1898,
+ // 1897,
+ // 1896,
+ // 1895,
+ // 1894 NA
+ // 1893,
+ // 1892 NA
+ // 1891 NA
+ // 1890 NA
+ // 1889,
+ // 1888,
+ // 1887 NA
+ // 1886 NA
+ // 1885 NA
+ // 1884,
+ // 1883 NA
+ // 1882,
+ // 1881,
+ // 1880 NA
+ // 1879 NA
+ // 1878 NA
+ // 1877 NA
+ // 1876,
+ // 1875,
+ // 1874 NA
+ // 1873 NA
+ // 1872 NA
+ // 1871,
+ // 1870 NA
+ // 1869 NA
+ // 1868,
+ // 1867,
+ // 1866,
+ // 1865 NA
+ // 1864 NA
+ // 1863 NA
+ // 1862,
+ // 1861,
+ // 1860 NA
+ // 1859 NA
+ // 1858 NA
+ // 1857 NA
+ // 1856 NA
+ // 1855 NA
+ // 1854 NA
+ // 1853 NA
+ // 1852 NA
+ // 1851,
+ // 1850 NA
+ // 1849 NA
+ // 1848 NA
+ // 1847,
+ // 1846 NA
+ // 1845 NA
+ // 1844,
+ // 1843 NA
+ // 1842,
+ // 1841,
1840,
+ // 1839,
+ // 1838,
+ // 1837,
+ // 1836,
+ // 1835,
+ // 1834,
+ // 1833,
1832,
1831,
+ // 1830 NA
+ // 1829 NA
+ // 1828 NA
+ // 1827 NA
+ // 1826 NA
+ // 1825 NA
+ // 1824 NA
+ // 1823,
+ // 1822 NA
+ // 1821,
+ // 1820,
+ // 1819 NA
+ // 1818,
+ // 1817 NA
+ // 1816,
+ // 1815,
+ // 1814 NA
+ // 1813,
+ // 1812,
+ // 1811,
+ // 1810 NA
1809,
1808,
+ // 1807 NA
1806,
+ // 1805,
+ // 1804,
+ // 1803 NA
+ // 1802,
+ // 1801 NA
+ // 1800 NA
1799,
+ // 1798 NA
+ // 1797 NA
+ // 1796 NA
+ // 1795 NA
+ // 1794,
+ // 1793,
+ // 1792 NA
+ // 1791 NA
+ // 1790 NA
+ // 1789 NA
+ // 1789 NA
+ // 1788 NA
+ // 1787 NA
+ // 1786 NA
+ // 1785,
+ // 1784 NA
+ // 1783,
+ // 1782,
+ // 1781,
+ // 1780,
+ // 1779,
+ // 1778 NA
+ // 1777 NA
+ // 1776 NA
+ // 1775 NA
+ // 1774 NA
+ // 1773 NA
+ // 1772 NA
+ // 1771 NA
+ // 1770,
+ // 1769,
+ // 1768,
+ // 1767 NA
+ // 1766 NA
+ // 1765,
+ // 1764 NA
+ // 1763,
+ // 1762,
+ // 1761,
+ // 1760 NA
+ // 1759,
+ // 1758,
1757,
+ // 1756 NA
1755,
+ // 1754,
1753,
+ // 1753,
+ // 1752,
+ // 1751,
+ // 1750,
+ // 1749 NA
+ // 1748,
+ // 1747 NA
+ // 1746 NA
+ // 1745 NA
+ // 1744 NA
+ // 1743 NA
+ // 1742,
+ // 1741,
+ // 1740,
+ // 1739,
+ // 1738,
+ // 1737 NA
+ // 1736 NA
+ // 1735,
+ // 1734,
+ // 1733 NA
+ 1732,
+ // 1731,
+ // 1730,
+ // 1729 NA
1728,
+ // 1727,
+ // 1726 NA
+ // 1725 NA
+ // 1724 NA
+ // 1723,
+ // 1722 NA
+ // 1721 NA
+ // 1720,
+ // 1719,
+ // 1718,
+ // 1717 NA
1716,
+ // 1715,
+ // 1714,
+ // 1713 NA
1712,
+ // 1711,
+ // 1710,
+ // 1709 NA
+ // 1708,
+ // 1707,
+ // 1706 NA
+ // 1705 NA
+ // 1704,
1703,
+ // 1702,
+ // 1701,
+ // 1700,
+ // 1699,
+ // 1698 NA
+ // 1697,
+ // 1696,
1695,
+ // 1694 NA
+ // 1693 NA
+ // 1692,
+ // 1691,
+ // 1690 NA
+ // 1689 NA
+ // 1688 NA
+ // 1687 NA
+ // 1686,
+ // 1685,
+ // 1684 NA
+ // 1683 NA
1682,
+ // 1681,
+ // 1680 NA
+ // 1679,
+ // 1678 NA
+ // 1677 NA
+ 1676,
+ 1675,
+ // 1674 NA
+ // 1673,
+ // 1672 NA
+ // 1671,
+ // 1670,
+ // 1669 NA
+ // 1668 NA
+ // 1667 NA
+ // 1666 NA
+ // 1665 NA
+ // 1664,
1663,
+ // 1662 NA
+ // 1661 NA
+ // 1660,
+ // 1659 NA
+ // 1658,
+ // 1657 NA
+ // 1656,
+ // 1655 NA
1654,
+ // 1653,
1652,
+ // 1651 NA
+ // 1650,
1649,
+ // 1648,
+ // 1647,
+ // 1646 NA
+ // 1645,
+ // 1644,
1643,
+ // 1642,
1641,
+ // 1640,
+ // 1639,
+ // 1638,
+ // 1637 NA
+ // 1636 NA
+ // 1635 NA
+ // 1634,
+ // 1633 NA
+ // 1632 NA
+ // 1631 NA
+ // 1630,
+ // 1629,
+ // 1628 NA
+ // 1627 NA
+ // 1626 NA
+ // 1625 NA
// 1624 NA
-
+ // 1623 NA
+ // 1622 NA
+ // 1621 NA
+ // 1620,
+ // 1619,
+ // 1618 NA
+ // 1617 NA
+ // 1616 NA
+ // 1615 NA
+ // 1614,
+ // 1613 NA
+ // 1612 NA
+ // 1611 NA
+ // 1610 NA
+ // 1609 NA
+ // 1608,
+ // 1607,
+ // 1606,
+ // 1605,
+ // 1604,
+ // 1603,
+ // 1602 NA
+ // 1601 NA
// 1600 NA
// 1599 NA
// 1598 NA
@@ -120,7 +696,6 @@ static int included_patches[] = {
// 1584 NA
// 1583 NA
// 1582,
-
// 1581,
// 1580,
// 1579 NA
@@ -246,7 +821,7 @@ static int included_patches[] = {
// 1459 NA
// 1458 NA
// 1457 NA
- // 1456,
+ // 1456 NA
// 1455 NA
// 1454 NA
// 1453 NA
@@ -397,7 +972,7 @@ static int included_patches[] = {
// 1308 NA
// 1307 NA
// 1306 NA
- // 1305,
+ 1305,
1304,
// 1303 NA
// 1302 NA
@@ -429,7 +1004,7 @@ static int included_patches[] = {
1276,
// 1275 NA
// 1274 NA
- // 1273,
+ // 1273 NA
// 1272 NA
1271,
// 1270 NA
@@ -465,7 +1040,7 @@ static int included_patches[] = {
// 1240 NA
// 1239 NA
// 1238 NA
- // 1237,
+ 1237,
1236,
// 1235 NA
// 1234 NA
@@ -628,7 +1203,7 @@ static int included_patches[] = {
// 1077 NA
1076,
1075,
- // 1074 NA,
+ // 1074 NA
// 1073 NA
1072,
1071,
@@ -671,7 +1246,7 @@ static int included_patches[] = {
1034,
// 1033 NA
1032,
- // 1031 NA,
+ // 1031 NA
1030,
1029,
// 1028 NA
@@ -692,15 +1267,15 @@ static int included_patches[] = {
1013,
// 1012 NA
// 1011 NA
- // 1010 NA,
+ // 1010 NA
// 1009 NA
// 1008 NA
1007,
1006,
- // 1005 NA,
- // 1004 NA,
- // 1003 NA,
- // 1002 NA,
+ // 1005 NA
+ // 1004 NA
+ // 1003 NA
+ // 1002 NA
1001,
1000,
// 999 NA