Upstream version 8.36.169.0
[platform/framework/web/crosswalk.git] / src / third_party / libc++ / trunk / test / strings / basic.string / string.ops / string_compare / size_size_string_size_size.pass.cpp
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // <string>
11
12 // int compare(size_type pos1, size_type n1, const basic_string& str,
13 //             size_type pos2, size_type n2=npos) const;
14 //  the "=npos" was added in C++14
15
16 #include <string>
17 #include <stdexcept>
18 #include <cassert>
19
20 #include "min_allocator.h"
21
22 int sign(int x)
23 {
24     if (x == 0)
25         return 0;
26     if (x < 0)
27         return -1;
28     return 1;
29 }
30
31 template <class S>
32 void
33 test(const S& s, typename S::size_type pos1, typename S::size_type n1,
34      const S& str, typename S::size_type pos2, typename S::size_type n2, int x)
35 {
36     try
37     {
38         assert(sign(s.compare(pos1, n1, str, pos2, n2)) == sign(x));
39         assert(pos1 <= s.size());
40         assert(pos2 <= str.size());
41     }
42     catch (std::out_of_range&)
43     {
44         assert(pos1 > s.size() || pos2 > str.size());
45     }
46 }
47
48 template <class S>
49 void
50 test_npos(const S& s, typename S::size_type pos1, typename S::size_type n1,
51      const S& str, typename S::size_type pos2, int x)
52 {
53     try
54     {
55         assert(sign(s.compare(pos1, n1, str, pos2)) == sign(x));
56         assert(pos1 <= s.size());
57         assert(pos2 <= str.size());
58     }
59     catch (std::out_of_range&)
60     {
61         assert(pos1 > s.size() || pos2 > str.size());
62     }
63 }
64
65 template <class S>
66 void test0()
67 {
68     test(S(""), 0, 0, S(""), 0, 0, 0);
69     test(S(""), 0, 0, S(""), 0, 1, 0);
70     test(S(""), 0, 0, S(""), 1, 0, 0);
71     test(S(""), 0, 0, S("abcde"), 0, 0, 0);
72     test(S(""), 0, 0, S("abcde"), 0, 1, -1);
73     test(S(""), 0, 0, S("abcde"), 0, 2, -2);
74     test(S(""), 0, 0, S("abcde"), 0, 4, -4);
75     test(S(""), 0, 0, S("abcde"), 0, 5, -5);
76     test(S(""), 0, 0, S("abcde"), 0, 6, -5);
77     test(S(""), 0, 0, S("abcde"), 1, 0, 0);
78     test(S(""), 0, 0, S("abcde"), 1, 1, -1);
79     test(S(""), 0, 0, S("abcde"), 1, 2, -2);
80     test(S(""), 0, 0, S("abcde"), 1, 3, -3);
81     test(S(""), 0, 0, S("abcde"), 1, 4, -4);
82     test(S(""), 0, 0, S("abcde"), 1, 5, -4);
83     test(S(""), 0, 0, S("abcde"), 2, 0, 0);
84     test(S(""), 0, 0, S("abcde"), 2, 1, -1);
85     test(S(""), 0, 0, S("abcde"), 2, 2, -2);
86     test(S(""), 0, 0, S("abcde"), 2, 3, -3);
87     test(S(""), 0, 0, S("abcde"), 2, 4, -3);
88     test(S(""), 0, 0, S("abcde"), 4, 0, 0);
89     test(S(""), 0, 0, S("abcde"), 4, 1, -1);
90     test(S(""), 0, 0, S("abcde"), 4, 2, -1);
91     test(S(""), 0, 0, S("abcde"), 5, 0, 0);
92     test(S(""), 0, 0, S("abcde"), 5, 1, 0);
93     test(S(""), 0, 0, S("abcde"), 6, 0, 0);
94     test(S(""), 0, 0, S("abcdefghij"), 0, 0, 0);
95     test(S(""), 0, 0, S("abcdefghij"), 0, 1, -1);
96     test(S(""), 0, 0, S("abcdefghij"), 0, 5, -5);
97     test(S(""), 0, 0, S("abcdefghij"), 0, 9, -9);
98     test(S(""), 0, 0, S("abcdefghij"), 0, 10, -10);
99     test(S(""), 0, 0, S("abcdefghij"), 0, 11, -10);
100     test(S(""), 0, 0, S("abcdefghij"), 1, 0, 0);
101     test(S(""), 0, 0, S("abcdefghij"), 1, 1, -1);
102     test(S(""), 0, 0, S("abcdefghij"), 1, 4, -4);
103     test(S(""), 0, 0, S("abcdefghij"), 1, 8, -8);
104     test(S(""), 0, 0, S("abcdefghij"), 1, 9, -9);
105     test(S(""), 0, 0, S("abcdefghij"), 1, 10, -9);
106     test(S(""), 0, 0, S("abcdefghij"), 5, 0, 0);
107     test(S(""), 0, 0, S("abcdefghij"), 5, 1, -1);
108     test(S(""), 0, 0, S("abcdefghij"), 5, 2, -2);
109     test(S(""), 0, 0, S("abcdefghij"), 5, 4, -4);
110     test(S(""), 0, 0, S("abcdefghij"), 5, 5, -5);
111     test(S(""), 0, 0, S("abcdefghij"), 5, 6, -5);
112     test(S(""), 0, 0, S("abcdefghij"), 9, 0, 0);
113     test(S(""), 0, 0, S("abcdefghij"), 9, 1, -1);
114     test(S(""), 0, 0, S("abcdefghij"), 9, 2, -1);
115     test(S(""), 0, 0, S("abcdefghij"), 10, 0, 0);
116     test(S(""), 0, 0, S("abcdefghij"), 10, 1, 0);
117     test(S(""), 0, 0, S("abcdefghij"), 11, 0, 0);
118     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
119     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
120     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
121     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
122     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
123     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
124     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
125     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
126     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
127     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
128     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
129     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
130     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
131     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
132     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
133     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
134     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
135     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
136     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
137     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
138     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
139     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
140     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
141     test(S(""), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
142     test(S(""), 0, 1, S(""), 0, 0, 0);
143     test(S(""), 0, 1, S(""), 0, 1, 0);
144     test(S(""), 0, 1, S(""), 1, 0, 0);
145     test(S(""), 0, 1, S("abcde"), 0, 0, 0);
146     test(S(""), 0, 1, S("abcde"), 0, 1, -1);
147     test(S(""), 0, 1, S("abcde"), 0, 2, -2);
148     test(S(""), 0, 1, S("abcde"), 0, 4, -4);
149     test(S(""), 0, 1, S("abcde"), 0, 5, -5);
150     test(S(""), 0, 1, S("abcde"), 0, 6, -5);
151     test(S(""), 0, 1, S("abcde"), 1, 0, 0);
152     test(S(""), 0, 1, S("abcde"), 1, 1, -1);
153     test(S(""), 0, 1, S("abcde"), 1, 2, -2);
154     test(S(""), 0, 1, S("abcde"), 1, 3, -3);
155     test(S(""), 0, 1, S("abcde"), 1, 4, -4);
156     test(S(""), 0, 1, S("abcde"), 1, 5, -4);
157     test(S(""), 0, 1, S("abcde"), 2, 0, 0);
158     test(S(""), 0, 1, S("abcde"), 2, 1, -1);
159     test(S(""), 0, 1, S("abcde"), 2, 2, -2);
160     test(S(""), 0, 1, S("abcde"), 2, 3, -3);
161     test(S(""), 0, 1, S("abcde"), 2, 4, -3);
162     test(S(""), 0, 1, S("abcde"), 4, 0, 0);
163     test(S(""), 0, 1, S("abcde"), 4, 1, -1);
164     test(S(""), 0, 1, S("abcde"), 4, 2, -1);
165     test(S(""), 0, 1, S("abcde"), 5, 0, 0);
166     test(S(""), 0, 1, S("abcde"), 5, 1, 0);
167     test(S(""), 0, 1, S("abcde"), 6, 0, 0);
168 }
169
170 template <class S>
171 void test1()
172 {
173     test(S(""), 0, 1, S("abcdefghij"), 0, 0, 0);
174     test(S(""), 0, 1, S("abcdefghij"), 0, 1, -1);
175     test(S(""), 0, 1, S("abcdefghij"), 0, 5, -5);
176     test(S(""), 0, 1, S("abcdefghij"), 0, 9, -9);
177     test(S(""), 0, 1, S("abcdefghij"), 0, 10, -10);
178     test(S(""), 0, 1, S("abcdefghij"), 0, 11, -10);
179     test(S(""), 0, 1, S("abcdefghij"), 1, 0, 0);
180     test(S(""), 0, 1, S("abcdefghij"), 1, 1, -1);
181     test(S(""), 0, 1, S("abcdefghij"), 1, 4, -4);
182     test(S(""), 0, 1, S("abcdefghij"), 1, 8, -8);
183     test(S(""), 0, 1, S("abcdefghij"), 1, 9, -9);
184     test(S(""), 0, 1, S("abcdefghij"), 1, 10, -9);
185     test(S(""), 0, 1, S("abcdefghij"), 5, 0, 0);
186     test(S(""), 0, 1, S("abcdefghij"), 5, 1, -1);
187     test(S(""), 0, 1, S("abcdefghij"), 5, 2, -2);
188     test(S(""), 0, 1, S("abcdefghij"), 5, 4, -4);
189     test(S(""), 0, 1, S("abcdefghij"), 5, 5, -5);
190     test(S(""), 0, 1, S("abcdefghij"), 5, 6, -5);
191     test(S(""), 0, 1, S("abcdefghij"), 9, 0, 0);
192     test(S(""), 0, 1, S("abcdefghij"), 9, 1, -1);
193     test(S(""), 0, 1, S("abcdefghij"), 9, 2, -1);
194     test(S(""), 0, 1, S("abcdefghij"), 10, 0, 0);
195     test(S(""), 0, 1, S("abcdefghij"), 10, 1, 0);
196     test(S(""), 0, 1, S("abcdefghij"), 11, 0, 0);
197     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
198     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
199     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
200     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
201     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
202     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
203     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
204     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
205     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
206     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
207     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
208     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
209     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
210     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
211     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
212     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
213     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
214     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
215     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
216     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
217     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
218     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
219     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
220     test(S(""), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
221     test(S(""), 1, 0, S(""), 0, 0, 0);
222     test(S(""), 1, 0, S(""), 0, 1, 0);
223     test(S(""), 1, 0, S(""), 1, 0, 0);
224     test(S(""), 1, 0, S("abcde"), 0, 0, 0);
225     test(S(""), 1, 0, S("abcde"), 0, 1, 0);
226     test(S(""), 1, 0, S("abcde"), 0, 2, 0);
227     test(S(""), 1, 0, S("abcde"), 0, 4, 0);
228     test(S(""), 1, 0, S("abcde"), 0, 5, 0);
229     test(S(""), 1, 0, S("abcde"), 0, 6, 0);
230     test(S(""), 1, 0, S("abcde"), 1, 0, 0);
231     test(S(""), 1, 0, S("abcde"), 1, 1, 0);
232     test(S(""), 1, 0, S("abcde"), 1, 2, 0);
233     test(S(""), 1, 0, S("abcde"), 1, 3, 0);
234     test(S(""), 1, 0, S("abcde"), 1, 4, 0);
235     test(S(""), 1, 0, S("abcde"), 1, 5, 0);
236     test(S(""), 1, 0, S("abcde"), 2, 0, 0);
237     test(S(""), 1, 0, S("abcde"), 2, 1, 0);
238     test(S(""), 1, 0, S("abcde"), 2, 2, 0);
239     test(S(""), 1, 0, S("abcde"), 2, 3, 0);
240     test(S(""), 1, 0, S("abcde"), 2, 4, 0);
241     test(S(""), 1, 0, S("abcde"), 4, 0, 0);
242     test(S(""), 1, 0, S("abcde"), 4, 1, 0);
243     test(S(""), 1, 0, S("abcde"), 4, 2, 0);
244     test(S(""), 1, 0, S("abcde"), 5, 0, 0);
245     test(S(""), 1, 0, S("abcde"), 5, 1, 0);
246     test(S(""), 1, 0, S("abcde"), 6, 0, 0);
247     test(S(""), 1, 0, S("abcdefghij"), 0, 0, 0);
248     test(S(""), 1, 0, S("abcdefghij"), 0, 1, 0);
249     test(S(""), 1, 0, S("abcdefghij"), 0, 5, 0);
250     test(S(""), 1, 0, S("abcdefghij"), 0, 9, 0);
251     test(S(""), 1, 0, S("abcdefghij"), 0, 10, 0);
252     test(S(""), 1, 0, S("abcdefghij"), 0, 11, 0);
253     test(S(""), 1, 0, S("abcdefghij"), 1, 0, 0);
254     test(S(""), 1, 0, S("abcdefghij"), 1, 1, 0);
255     test(S(""), 1, 0, S("abcdefghij"), 1, 4, 0);
256     test(S(""), 1, 0, S("abcdefghij"), 1, 8, 0);
257     test(S(""), 1, 0, S("abcdefghij"), 1, 9, 0);
258     test(S(""), 1, 0, S("abcdefghij"), 1, 10, 0);
259     test(S(""), 1, 0, S("abcdefghij"), 5, 0, 0);
260     test(S(""), 1, 0, S("abcdefghij"), 5, 1, 0);
261     test(S(""), 1, 0, S("abcdefghij"), 5, 2, 0);
262     test(S(""), 1, 0, S("abcdefghij"), 5, 4, 0);
263     test(S(""), 1, 0, S("abcdefghij"), 5, 5, 0);
264     test(S(""), 1, 0, S("abcdefghij"), 5, 6, 0);
265     test(S(""), 1, 0, S("abcdefghij"), 9, 0, 0);
266     test(S(""), 1, 0, S("abcdefghij"), 9, 1, 0);
267     test(S(""), 1, 0, S("abcdefghij"), 9, 2, 0);
268     test(S(""), 1, 0, S("abcdefghij"), 10, 0, 0);
269     test(S(""), 1, 0, S("abcdefghij"), 10, 1, 0);
270     test(S(""), 1, 0, S("abcdefghij"), 11, 0, 0);
271     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
272     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
273 }
274
275 template <class S>
276 void test2()
277 {
278     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
279     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
280     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
281     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
282     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
283     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
284     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
285     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
286     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
287     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
288     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
289     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
290     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
291     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
292     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
293     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
294     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
295     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
296     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
297     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
298     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
299     test(S(""), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
300     test(S("abcde"), 0, 0, S(""), 0, 0, 0);
301     test(S("abcde"), 0, 0, S(""), 0, 1, 0);
302     test(S("abcde"), 0, 0, S(""), 1, 0, 0);
303     test(S("abcde"), 0, 0, S("abcde"), 0, 0, 0);
304     test(S("abcde"), 0, 0, S("abcde"), 0, 1, -1);
305     test(S("abcde"), 0, 0, S("abcde"), 0, 2, -2);
306     test(S("abcde"), 0, 0, S("abcde"), 0, 4, -4);
307     test(S("abcde"), 0, 0, S("abcde"), 0, 5, -5);
308     test(S("abcde"), 0, 0, S("abcde"), 0, 6, -5);
309     test(S("abcde"), 0, 0, S("abcde"), 1, 0, 0);
310     test(S("abcde"), 0, 0, S("abcde"), 1, 1, -1);
311     test(S("abcde"), 0, 0, S("abcde"), 1, 2, -2);
312     test(S("abcde"), 0, 0, S("abcde"), 1, 3, -3);
313     test(S("abcde"), 0, 0, S("abcde"), 1, 4, -4);
314     test(S("abcde"), 0, 0, S("abcde"), 1, 5, -4);
315     test(S("abcde"), 0, 0, S("abcde"), 2, 0, 0);
316     test(S("abcde"), 0, 0, S("abcde"), 2, 1, -1);
317     test(S("abcde"), 0, 0, S("abcde"), 2, 2, -2);
318     test(S("abcde"), 0, 0, S("abcde"), 2, 3, -3);
319     test(S("abcde"), 0, 0, S("abcde"), 2, 4, -3);
320     test(S("abcde"), 0, 0, S("abcde"), 4, 0, 0);
321     test(S("abcde"), 0, 0, S("abcde"), 4, 1, -1);
322     test(S("abcde"), 0, 0, S("abcde"), 4, 2, -1);
323     test(S("abcde"), 0, 0, S("abcde"), 5, 0, 0);
324     test(S("abcde"), 0, 0, S("abcde"), 5, 1, 0);
325     test(S("abcde"), 0, 0, S("abcde"), 6, 0, 0);
326     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 0, 0);
327     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 1, -1);
328     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 5, -5);
329     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 9, -9);
330     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 10, -10);
331     test(S("abcde"), 0, 0, S("abcdefghij"), 0, 11, -10);
332     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 0, 0);
333     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 1, -1);
334     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 4, -4);
335     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 8, -8);
336     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 9, -9);
337     test(S("abcde"), 0, 0, S("abcdefghij"), 1, 10, -9);
338     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 0, 0);
339     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 1, -1);
340     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 2, -2);
341     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 4, -4);
342     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 5, -5);
343     test(S("abcde"), 0, 0, S("abcdefghij"), 5, 6, -5);
344     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 0, 0);
345     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 1, -1);
346     test(S("abcde"), 0, 0, S("abcdefghij"), 9, 2, -1);
347     test(S("abcde"), 0, 0, S("abcdefghij"), 10, 0, 0);
348     test(S("abcde"), 0, 0, S("abcdefghij"), 10, 1, 0);
349     test(S("abcde"), 0, 0, S("abcdefghij"), 11, 0, 0);
350     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
351     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
352     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
353     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
354     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
355     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
356     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
357     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
358     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
359     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
360     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
361     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
362     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
363     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
364     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
365     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
366     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
367     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
368     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
369     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
370     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
371     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
372     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
373     test(S("abcde"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
374     test(S("abcde"), 0, 1, S(""), 0, 0, 1);
375     test(S("abcde"), 0, 1, S(""), 0, 1, 1);
376     test(S("abcde"), 0, 1, S(""), 1, 0, 0);
377     test(S("abcde"), 0, 1, S("abcde"), 0, 0, 1);
378 }
379
380 template <class S>
381 void test3()
382 {
383     test(S("abcde"), 0, 1, S("abcde"), 0, 1, 0);
384     test(S("abcde"), 0, 1, S("abcde"), 0, 2, -1);
385     test(S("abcde"), 0, 1, S("abcde"), 0, 4, -3);
386     test(S("abcde"), 0, 1, S("abcde"), 0, 5, -4);
387     test(S("abcde"), 0, 1, S("abcde"), 0, 6, -4);
388     test(S("abcde"), 0, 1, S("abcde"), 1, 0, 1);
389     test(S("abcde"), 0, 1, S("abcde"), 1, 1, -1);
390     test(S("abcde"), 0, 1, S("abcde"), 1, 2, -1);
391     test(S("abcde"), 0, 1, S("abcde"), 1, 3, -1);
392     test(S("abcde"), 0, 1, S("abcde"), 1, 4, -1);
393     test(S("abcde"), 0, 1, S("abcde"), 1, 5, -1);
394     test(S("abcde"), 0, 1, S("abcde"), 2, 0, 1);
395     test(S("abcde"), 0, 1, S("abcde"), 2, 1, -2);
396     test(S("abcde"), 0, 1, S("abcde"), 2, 2, -2);
397     test(S("abcde"), 0, 1, S("abcde"), 2, 3, -2);
398     test(S("abcde"), 0, 1, S("abcde"), 2, 4, -2);
399     test(S("abcde"), 0, 1, S("abcde"), 4, 0, 1);
400     test(S("abcde"), 0, 1, S("abcde"), 4, 1, -4);
401     test(S("abcde"), 0, 1, S("abcde"), 4, 2, -4);
402     test(S("abcde"), 0, 1, S("abcde"), 5, 0, 1);
403     test(S("abcde"), 0, 1, S("abcde"), 5, 1, 1);
404     test(S("abcde"), 0, 1, S("abcde"), 6, 0, 0);
405     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 0, 1);
406     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 1, 0);
407     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 5, -4);
408     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 9, -8);
409     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 10, -9);
410     test(S("abcde"), 0, 1, S("abcdefghij"), 0, 11, -9);
411     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 0, 1);
412     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 1, -1);
413     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 4, -1);
414     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 8, -1);
415     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 9, -1);
416     test(S("abcde"), 0, 1, S("abcdefghij"), 1, 10, -1);
417     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 0, 1);
418     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 1, -5);
419     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 2, -5);
420     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 4, -5);
421     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 5, -5);
422     test(S("abcde"), 0, 1, S("abcdefghij"), 5, 6, -5);
423     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 0, 1);
424     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 1, -9);
425     test(S("abcde"), 0, 1, S("abcdefghij"), 9, 2, -9);
426     test(S("abcde"), 0, 1, S("abcdefghij"), 10, 0, 1);
427     test(S("abcde"), 0, 1, S("abcdefghij"), 10, 1, 1);
428     test(S("abcde"), 0, 1, S("abcdefghij"), 11, 0, 0);
429     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
430     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
431     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
432     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
433     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
434     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
435     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
436     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
437     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
438     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
439     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
440     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
441     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
442     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
443     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
444     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
445     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
446     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
447     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
448     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
449     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
450     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
451     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
452     test(S("abcde"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
453     test(S("abcde"), 0, 2, S(""), 0, 0, 2);
454     test(S("abcde"), 0, 2, S(""), 0, 1, 2);
455     test(S("abcde"), 0, 2, S(""), 1, 0, 0);
456     test(S("abcde"), 0, 2, S("abcde"), 0, 0, 2);
457     test(S("abcde"), 0, 2, S("abcde"), 0, 1, 1);
458     test(S("abcde"), 0, 2, S("abcde"), 0, 2, 0);
459     test(S("abcde"), 0, 2, S("abcde"), 0, 4, -2);
460     test(S("abcde"), 0, 2, S("abcde"), 0, 5, -3);
461     test(S("abcde"), 0, 2, S("abcde"), 0, 6, -3);
462     test(S("abcde"), 0, 2, S("abcde"), 1, 0, 2);
463     test(S("abcde"), 0, 2, S("abcde"), 1, 1, -1);
464     test(S("abcde"), 0, 2, S("abcde"), 1, 2, -1);
465     test(S("abcde"), 0, 2, S("abcde"), 1, 3, -1);
466     test(S("abcde"), 0, 2, S("abcde"), 1, 4, -1);
467     test(S("abcde"), 0, 2, S("abcde"), 1, 5, -1);
468     test(S("abcde"), 0, 2, S("abcde"), 2, 0, 2);
469     test(S("abcde"), 0, 2, S("abcde"), 2, 1, -2);
470     test(S("abcde"), 0, 2, S("abcde"), 2, 2, -2);
471     test(S("abcde"), 0, 2, S("abcde"), 2, 3, -2);
472     test(S("abcde"), 0, 2, S("abcde"), 2, 4, -2);
473     test(S("abcde"), 0, 2, S("abcde"), 4, 0, 2);
474     test(S("abcde"), 0, 2, S("abcde"), 4, 1, -4);
475     test(S("abcde"), 0, 2, S("abcde"), 4, 2, -4);
476     test(S("abcde"), 0, 2, S("abcde"), 5, 0, 2);
477     test(S("abcde"), 0, 2, S("abcde"), 5, 1, 2);
478     test(S("abcde"), 0, 2, S("abcde"), 6, 0, 0);
479     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 0, 2);
480     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 1, 1);
481     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 5, -3);
482     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 9, -7);
483 }
484
485 template <class S>
486 void test4()
487 {
488     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 10, -8);
489     test(S("abcde"), 0, 2, S("abcdefghij"), 0, 11, -8);
490     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 0, 2);
491     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 1, -1);
492     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 4, -1);
493     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 8, -1);
494     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 9, -1);
495     test(S("abcde"), 0, 2, S("abcdefghij"), 1, 10, -1);
496     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 0, 2);
497     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 1, -5);
498     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 2, -5);
499     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 4, -5);
500     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 5, -5);
501     test(S("abcde"), 0, 2, S("abcdefghij"), 5, 6, -5);
502     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 0, 2);
503     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 1, -9);
504     test(S("abcde"), 0, 2, S("abcdefghij"), 9, 2, -9);
505     test(S("abcde"), 0, 2, S("abcdefghij"), 10, 0, 2);
506     test(S("abcde"), 0, 2, S("abcdefghij"), 10, 1, 2);
507     test(S("abcde"), 0, 2, S("abcdefghij"), 11, 0, 0);
508     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
509     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
510     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 10, -8);
511     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 19, -17);
512     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 20, -18);
513     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 0, 21, -18);
514     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
515     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 1, -1);
516     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 9, -1);
517     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 18, -1);
518     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 19, -1);
519     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 1, 20, -1);
520     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
521     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 1, -10);
522     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 5, -10);
523     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 9, -10);
524     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 10, -10);
525     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 10, 11, -10);
526     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
527     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 1, -19);
528     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 19, 2, -19);
529     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
530     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
531     test(S("abcde"), 0, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
532     test(S("abcde"), 0, 4, S(""), 0, 0, 4);
533     test(S("abcde"), 0, 4, S(""), 0, 1, 4);
534     test(S("abcde"), 0, 4, S(""), 1, 0, 0);
535     test(S("abcde"), 0, 4, S("abcde"), 0, 0, 4);
536     test(S("abcde"), 0, 4, S("abcde"), 0, 1, 3);
537     test(S("abcde"), 0, 4, S("abcde"), 0, 2, 2);
538     test(S("abcde"), 0, 4, S("abcde"), 0, 4, 0);
539     test(S("abcde"), 0, 4, S("abcde"), 0, 5, -1);
540     test(S("abcde"), 0, 4, S("abcde"), 0, 6, -1);
541     test(S("abcde"), 0, 4, S("abcde"), 1, 0, 4);
542     test(S("abcde"), 0, 4, S("abcde"), 1, 1, -1);
543     test(S("abcde"), 0, 4, S("abcde"), 1, 2, -1);
544     test(S("abcde"), 0, 4, S("abcde"), 1, 3, -1);
545     test(S("abcde"), 0, 4, S("abcde"), 1, 4, -1);
546     test(S("abcde"), 0, 4, S("abcde"), 1, 5, -1);
547     test(S("abcde"), 0, 4, S("abcde"), 2, 0, 4);
548     test(S("abcde"), 0, 4, S("abcde"), 2, 1, -2);
549     test(S("abcde"), 0, 4, S("abcde"), 2, 2, -2);
550     test(S("abcde"), 0, 4, S("abcde"), 2, 3, -2);
551     test(S("abcde"), 0, 4, S("abcde"), 2, 4, -2);
552     test(S("abcde"), 0, 4, S("abcde"), 4, 0, 4);
553     test(S("abcde"), 0, 4, S("abcde"), 4, 1, -4);
554     test(S("abcde"), 0, 4, S("abcde"), 4, 2, -4);
555     test(S("abcde"), 0, 4, S("abcde"), 5, 0, 4);
556     test(S("abcde"), 0, 4, S("abcde"), 5, 1, 4);
557     test(S("abcde"), 0, 4, S("abcde"), 6, 0, 0);
558     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 0, 4);
559     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 1, 3);
560     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 5, -1);
561     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 9, -5);
562     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 10, -6);
563     test(S("abcde"), 0, 4, S("abcdefghij"), 0, 11, -6);
564     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 0, 4);
565     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 1, -1);
566     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 4, -1);
567     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 8, -1);
568     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 9, -1);
569     test(S("abcde"), 0, 4, S("abcdefghij"), 1, 10, -1);
570     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 0, 4);
571     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 1, -5);
572     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 2, -5);
573     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 4, -5);
574     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 5, -5);
575     test(S("abcde"), 0, 4, S("abcdefghij"), 5, 6, -5);
576     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 0, 4);
577     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 1, -9);
578     test(S("abcde"), 0, 4, S("abcdefghij"), 9, 2, -9);
579     test(S("abcde"), 0, 4, S("abcdefghij"), 10, 0, 4);
580     test(S("abcde"), 0, 4, S("abcdefghij"), 10, 1, 4);
581     test(S("abcde"), 0, 4, S("abcdefghij"), 11, 0, 0);
582     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
583     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 1, 3);
584     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 10, -6);
585     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 19, -15);
586     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 20, -16);
587     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 0, 21, -16);
588 }
589
590 template <class S>
591 void test5()
592 {
593     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
594     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 1, -1);
595     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 9, -1);
596     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 18, -1);
597     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 19, -1);
598     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 1, 20, -1);
599     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
600     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 1, -10);
601     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 5, -10);
602     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 9, -10);
603     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 10, -10);
604     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 10, 11, -10);
605     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
606     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 1, -19);
607     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 19, 2, -19);
608     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
609     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
610     test(S("abcde"), 0, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
611     test(S("abcde"), 0, 5, S(""), 0, 0, 5);
612     test(S("abcde"), 0, 5, S(""), 0, 1, 5);
613     test(S("abcde"), 0, 5, S(""), 1, 0, 0);
614     test(S("abcde"), 0, 5, S("abcde"), 0, 0, 5);
615     test(S("abcde"), 0, 5, S("abcde"), 0, 1, 4);
616     test(S("abcde"), 0, 5, S("abcde"), 0, 2, 3);
617     test(S("abcde"), 0, 5, S("abcde"), 0, 4, 1);
618     test(S("abcde"), 0, 5, S("abcde"), 0, 5, 0);
619     test(S("abcde"), 0, 5, S("abcde"), 0, 6, 0);
620     test(S("abcde"), 0, 5, S("abcde"), 1, 0, 5);
621     test(S("abcde"), 0, 5, S("abcde"), 1, 1, -1);
622     test(S("abcde"), 0, 5, S("abcde"), 1, 2, -1);
623     test(S("abcde"), 0, 5, S("abcde"), 1, 3, -1);
624     test(S("abcde"), 0, 5, S("abcde"), 1, 4, -1);
625     test(S("abcde"), 0, 5, S("abcde"), 1, 5, -1);
626     test(S("abcde"), 0, 5, S("abcde"), 2, 0, 5);
627     test(S("abcde"), 0, 5, S("abcde"), 2, 1, -2);
628     test(S("abcde"), 0, 5, S("abcde"), 2, 2, -2);
629     test(S("abcde"), 0, 5, S("abcde"), 2, 3, -2);
630     test(S("abcde"), 0, 5, S("abcde"), 2, 4, -2);
631     test(S("abcde"), 0, 5, S("abcde"), 4, 0, 5);
632     test(S("abcde"), 0, 5, S("abcde"), 4, 1, -4);
633     test(S("abcde"), 0, 5, S("abcde"), 4, 2, -4);
634     test(S("abcde"), 0, 5, S("abcde"), 5, 0, 5);
635     test(S("abcde"), 0, 5, S("abcde"), 5, 1, 5);
636     test(S("abcde"), 0, 5, S("abcde"), 6, 0, 0);
637     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 0, 5);
638     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 1, 4);
639     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 5, 0);
640     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 9, -4);
641     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 10, -5);
642     test(S("abcde"), 0, 5, S("abcdefghij"), 0, 11, -5);
643     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 0, 5);
644     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 1, -1);
645     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 4, -1);
646     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 8, -1);
647     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 9, -1);
648     test(S("abcde"), 0, 5, S("abcdefghij"), 1, 10, -1);
649     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 0, 5);
650     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 1, -5);
651     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 2, -5);
652     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 4, -5);
653     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 5, -5);
654     test(S("abcde"), 0, 5, S("abcdefghij"), 5, 6, -5);
655     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 0, 5);
656     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 1, -9);
657     test(S("abcde"), 0, 5, S("abcdefghij"), 9, 2, -9);
658     test(S("abcde"), 0, 5, S("abcdefghij"), 10, 0, 5);
659     test(S("abcde"), 0, 5, S("abcdefghij"), 10, 1, 5);
660     test(S("abcde"), 0, 5, S("abcdefghij"), 11, 0, 0);
661     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
662     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
663     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
664     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
665     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
666     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
667     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
668     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
669     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
670     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
671     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
672     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
673     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
674     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
675     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
676     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
677     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
678     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
679     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
680     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
681     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
682     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
683     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
684     test(S("abcde"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
685     test(S("abcde"), 0, 6, S(""), 0, 0, 5);
686     test(S("abcde"), 0, 6, S(""), 0, 1, 5);
687     test(S("abcde"), 0, 6, S(""), 1, 0, 0);
688     test(S("abcde"), 0, 6, S("abcde"), 0, 0, 5);
689     test(S("abcde"), 0, 6, S("abcde"), 0, 1, 4);
690     test(S("abcde"), 0, 6, S("abcde"), 0, 2, 3);
691     test(S("abcde"), 0, 6, S("abcde"), 0, 4, 1);
692     test(S("abcde"), 0, 6, S("abcde"), 0, 5, 0);
693 }
694
695 template <class S>
696 void test6()
697 {
698     test(S("abcde"), 0, 6, S("abcde"), 0, 6, 0);
699     test(S("abcde"), 0, 6, S("abcde"), 1, 0, 5);
700     test(S("abcde"), 0, 6, S("abcde"), 1, 1, -1);
701     test(S("abcde"), 0, 6, S("abcde"), 1, 2, -1);
702     test(S("abcde"), 0, 6, S("abcde"), 1, 3, -1);
703     test(S("abcde"), 0, 6, S("abcde"), 1, 4, -1);
704     test(S("abcde"), 0, 6, S("abcde"), 1, 5, -1);
705     test(S("abcde"), 0, 6, S("abcde"), 2, 0, 5);
706     test(S("abcde"), 0, 6, S("abcde"), 2, 1, -2);
707     test(S("abcde"), 0, 6, S("abcde"), 2, 2, -2);
708     test(S("abcde"), 0, 6, S("abcde"), 2, 3, -2);
709     test(S("abcde"), 0, 6, S("abcde"), 2, 4, -2);
710     test(S("abcde"), 0, 6, S("abcde"), 4, 0, 5);
711     test(S("abcde"), 0, 6, S("abcde"), 4, 1, -4);
712     test(S("abcde"), 0, 6, S("abcde"), 4, 2, -4);
713     test(S("abcde"), 0, 6, S("abcde"), 5, 0, 5);
714     test(S("abcde"), 0, 6, S("abcde"), 5, 1, 5);
715     test(S("abcde"), 0, 6, S("abcde"), 6, 0, 0);
716     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 0, 5);
717     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 1, 4);
718     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 5, 0);
719     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 9, -4);
720     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 10, -5);
721     test(S("abcde"), 0, 6, S("abcdefghij"), 0, 11, -5);
722     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 0, 5);
723     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 1, -1);
724     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 4, -1);
725     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 8, -1);
726     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 9, -1);
727     test(S("abcde"), 0, 6, S("abcdefghij"), 1, 10, -1);
728     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 0, 5);
729     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 1, -5);
730     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 2, -5);
731     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 4, -5);
732     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 5, -5);
733     test(S("abcde"), 0, 6, S("abcdefghij"), 5, 6, -5);
734     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 0, 5);
735     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 1, -9);
736     test(S("abcde"), 0, 6, S("abcdefghij"), 9, 2, -9);
737     test(S("abcde"), 0, 6, S("abcdefghij"), 10, 0, 5);
738     test(S("abcde"), 0, 6, S("abcdefghij"), 10, 1, 5);
739     test(S("abcde"), 0, 6, S("abcdefghij"), 11, 0, 0);
740     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
741     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 1, 4);
742     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 10, -5);
743     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 19, -14);
744     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 20, -15);
745     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 0, 21, -15);
746     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
747     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 1, -1);
748     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 9, -1);
749     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 18, -1);
750     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 19, -1);
751     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 1, 20, -1);
752     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
753     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 1, -10);
754     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 5, -10);
755     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 9, -10);
756     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 10, -10);
757     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 10, 11, -10);
758     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
759     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 1, -19);
760     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 19, 2, -19);
761     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
762     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
763     test(S("abcde"), 0, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
764     test(S("abcde"), 1, 0, S(""), 0, 0, 0);
765     test(S("abcde"), 1, 0, S(""), 0, 1, 0);
766     test(S("abcde"), 1, 0, S(""), 1, 0, 0);
767     test(S("abcde"), 1, 0, S("abcde"), 0, 0, 0);
768     test(S("abcde"), 1, 0, S("abcde"), 0, 1, -1);
769     test(S("abcde"), 1, 0, S("abcde"), 0, 2, -2);
770     test(S("abcde"), 1, 0, S("abcde"), 0, 4, -4);
771     test(S("abcde"), 1, 0, S("abcde"), 0, 5, -5);
772     test(S("abcde"), 1, 0, S("abcde"), 0, 6, -5);
773     test(S("abcde"), 1, 0, S("abcde"), 1, 0, 0);
774     test(S("abcde"), 1, 0, S("abcde"), 1, 1, -1);
775     test(S("abcde"), 1, 0, S("abcde"), 1, 2, -2);
776     test(S("abcde"), 1, 0, S("abcde"), 1, 3, -3);
777     test(S("abcde"), 1, 0, S("abcde"), 1, 4, -4);
778     test(S("abcde"), 1, 0, S("abcde"), 1, 5, -4);
779     test(S("abcde"), 1, 0, S("abcde"), 2, 0, 0);
780     test(S("abcde"), 1, 0, S("abcde"), 2, 1, -1);
781     test(S("abcde"), 1, 0, S("abcde"), 2, 2, -2);
782     test(S("abcde"), 1, 0, S("abcde"), 2, 3, -3);
783     test(S("abcde"), 1, 0, S("abcde"), 2, 4, -3);
784     test(S("abcde"), 1, 0, S("abcde"), 4, 0, 0);
785     test(S("abcde"), 1, 0, S("abcde"), 4, 1, -1);
786     test(S("abcde"), 1, 0, S("abcde"), 4, 2, -1);
787     test(S("abcde"), 1, 0, S("abcde"), 5, 0, 0);
788     test(S("abcde"), 1, 0, S("abcde"), 5, 1, 0);
789     test(S("abcde"), 1, 0, S("abcde"), 6, 0, 0);
790     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 0, 0);
791     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 1, -1);
792     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 5, -5);
793     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 9, -9);
794     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 10, -10);
795     test(S("abcde"), 1, 0, S("abcdefghij"), 0, 11, -10);
796     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 0, 0);
797     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 1, -1);
798 }
799
800 template <class S>
801 void test7()
802 {
803     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 4, -4);
804     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 8, -8);
805     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 9, -9);
806     test(S("abcde"), 1, 0, S("abcdefghij"), 1, 10, -9);
807     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 0, 0);
808     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 1, -1);
809     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 2, -2);
810     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 4, -4);
811     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 5, -5);
812     test(S("abcde"), 1, 0, S("abcdefghij"), 5, 6, -5);
813     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 0, 0);
814     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 1, -1);
815     test(S("abcde"), 1, 0, S("abcdefghij"), 9, 2, -1);
816     test(S("abcde"), 1, 0, S("abcdefghij"), 10, 0, 0);
817     test(S("abcde"), 1, 0, S("abcdefghij"), 10, 1, 0);
818     test(S("abcde"), 1, 0, S("abcdefghij"), 11, 0, 0);
819     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
820     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
821     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
822     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
823     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
824     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
825     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
826     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
827     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
828     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
829     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
830     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
831     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
832     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
833     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
834     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
835     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
836     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
837     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
838     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
839     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
840     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
841     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
842     test(S("abcde"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
843     test(S("abcde"), 1, 1, S(""), 0, 0, 1);
844     test(S("abcde"), 1, 1, S(""), 0, 1, 1);
845     test(S("abcde"), 1, 1, S(""), 1, 0, 0);
846     test(S("abcde"), 1, 1, S("abcde"), 0, 0, 1);
847     test(S("abcde"), 1, 1, S("abcde"), 0, 1, 1);
848     test(S("abcde"), 1, 1, S("abcde"), 0, 2, 1);
849     test(S("abcde"), 1, 1, S("abcde"), 0, 4, 1);
850     test(S("abcde"), 1, 1, S("abcde"), 0, 5, 1);
851     test(S("abcde"), 1, 1, S("abcde"), 0, 6, 1);
852     test(S("abcde"), 1, 1, S("abcde"), 1, 0, 1);
853     test(S("abcde"), 1, 1, S("abcde"), 1, 1, 0);
854     test(S("abcde"), 1, 1, S("abcde"), 1, 2, -1);
855     test(S("abcde"), 1, 1, S("abcde"), 1, 3, -2);
856     test(S("abcde"), 1, 1, S("abcde"), 1, 4, -3);
857     test(S("abcde"), 1, 1, S("abcde"), 1, 5, -3);
858     test(S("abcde"), 1, 1, S("abcde"), 2, 0, 1);
859     test(S("abcde"), 1, 1, S("abcde"), 2, 1, -1);
860     test(S("abcde"), 1, 1, S("abcde"), 2, 2, -1);
861     test(S("abcde"), 1, 1, S("abcde"), 2, 3, -1);
862     test(S("abcde"), 1, 1, S("abcde"), 2, 4, -1);
863     test(S("abcde"), 1, 1, S("abcde"), 4, 0, 1);
864     test(S("abcde"), 1, 1, S("abcde"), 4, 1, -3);
865     test(S("abcde"), 1, 1, S("abcde"), 4, 2, -3);
866     test(S("abcde"), 1, 1, S("abcde"), 5, 0, 1);
867     test(S("abcde"), 1, 1, S("abcde"), 5, 1, 1);
868     test(S("abcde"), 1, 1, S("abcde"), 6, 0, 0);
869     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 0, 1);
870     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 1, 1);
871     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 5, 1);
872     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 9, 1);
873     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 10, 1);
874     test(S("abcde"), 1, 1, S("abcdefghij"), 0, 11, 1);
875     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 0, 1);
876     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 1, 0);
877     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 4, -3);
878     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 8, -7);
879     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 9, -8);
880     test(S("abcde"), 1, 1, S("abcdefghij"), 1, 10, -8);
881     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 0, 1);
882     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 1, -4);
883     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 2, -4);
884     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 4, -4);
885     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 5, -4);
886     test(S("abcde"), 1, 1, S("abcdefghij"), 5, 6, -4);
887     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 0, 1);
888     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 1, -8);
889     test(S("abcde"), 1, 1, S("abcdefghij"), 9, 2, -8);
890     test(S("abcde"), 1, 1, S("abcdefghij"), 10, 0, 1);
891     test(S("abcde"), 1, 1, S("abcdefghij"), 10, 1, 1);
892     test(S("abcde"), 1, 1, S("abcdefghij"), 11, 0, 0);
893     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
894     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
895     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
896     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
897     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
898     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
899     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
900     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
901     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
902     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
903 }
904
905 template <class S>
906 void test8()
907 {
908     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
909     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
910     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
911     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
912     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
913     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
914     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
915     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
916     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
917     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
918     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
919     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
920     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
921     test(S("abcde"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
922     test(S("abcde"), 1, 2, S(""), 0, 0, 2);
923     test(S("abcde"), 1, 2, S(""), 0, 1, 2);
924     test(S("abcde"), 1, 2, S(""), 1, 0, 0);
925     test(S("abcde"), 1, 2, S("abcde"), 0, 0, 2);
926     test(S("abcde"), 1, 2, S("abcde"), 0, 1, 1);
927     test(S("abcde"), 1, 2, S("abcde"), 0, 2, 1);
928     test(S("abcde"), 1, 2, S("abcde"), 0, 4, 1);
929     test(S("abcde"), 1, 2, S("abcde"), 0, 5, 1);
930     test(S("abcde"), 1, 2, S("abcde"), 0, 6, 1);
931     test(S("abcde"), 1, 2, S("abcde"), 1, 0, 2);
932     test(S("abcde"), 1, 2, S("abcde"), 1, 1, 1);
933     test(S("abcde"), 1, 2, S("abcde"), 1, 2, 0);
934     test(S("abcde"), 1, 2, S("abcde"), 1, 3, -1);
935     test(S("abcde"), 1, 2, S("abcde"), 1, 4, -2);
936     test(S("abcde"), 1, 2, S("abcde"), 1, 5, -2);
937     test(S("abcde"), 1, 2, S("abcde"), 2, 0, 2);
938     test(S("abcde"), 1, 2, S("abcde"), 2, 1, -1);
939     test(S("abcde"), 1, 2, S("abcde"), 2, 2, -1);
940     test(S("abcde"), 1, 2, S("abcde"), 2, 3, -1);
941     test(S("abcde"), 1, 2, S("abcde"), 2, 4, -1);
942     test(S("abcde"), 1, 2, S("abcde"), 4, 0, 2);
943     test(S("abcde"), 1, 2, S("abcde"), 4, 1, -3);
944     test(S("abcde"), 1, 2, S("abcde"), 4, 2, -3);
945     test(S("abcde"), 1, 2, S("abcde"), 5, 0, 2);
946     test(S("abcde"), 1, 2, S("abcde"), 5, 1, 2);
947     test(S("abcde"), 1, 2, S("abcde"), 6, 0, 0);
948     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 0, 2);
949     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 1, 1);
950     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 5, 1);
951     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 9, 1);
952     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 10, 1);
953     test(S("abcde"), 1, 2, S("abcdefghij"), 0, 11, 1);
954     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 0, 2);
955     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 1, 1);
956     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 4, -2);
957     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 8, -6);
958     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 9, -7);
959     test(S("abcde"), 1, 2, S("abcdefghij"), 1, 10, -7);
960     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 0, 2);
961     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 1, -4);
962     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 2, -4);
963     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 4, -4);
964     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 5, -4);
965     test(S("abcde"), 1, 2, S("abcdefghij"), 5, 6, -4);
966     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 0, 2);
967     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 1, -8);
968     test(S("abcde"), 1, 2, S("abcdefghij"), 9, 2, -8);
969     test(S("abcde"), 1, 2, S("abcdefghij"), 10, 0, 2);
970     test(S("abcde"), 1, 2, S("abcdefghij"), 10, 1, 2);
971     test(S("abcde"), 1, 2, S("abcdefghij"), 11, 0, 0);
972     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
973     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 1, 1);
974     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 10, 1);
975     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 19, 1);
976     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 20, 1);
977     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 0, 21, 1);
978     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
979     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
980     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 9, -7);
981     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 18, -16);
982     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 19, -17);
983     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 1, 20, -17);
984     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
985     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 1, -9);
986     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 5, -9);
987     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 9, -9);
988     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 10, -9);
989     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 10, 11, -9);
990     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
991     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 1, -18);
992     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 19, 2, -18);
993     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
994     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
995     test(S("abcde"), 1, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
996     test(S("abcde"), 1, 3, S(""), 0, 0, 3);
997     test(S("abcde"), 1, 3, S(""), 0, 1, 3);
998     test(S("abcde"), 1, 3, S(""), 1, 0, 0);
999     test(S("abcde"), 1, 3, S("abcde"), 0, 0, 3);
1000     test(S("abcde"), 1, 3, S("abcde"), 0, 1, 1);
1001     test(S("abcde"), 1, 3, S("abcde"), 0, 2, 1);
1002     test(S("abcde"), 1, 3, S("abcde"), 0, 4, 1);
1003     test(S("abcde"), 1, 3, S("abcde"), 0, 5, 1);
1004     test(S("abcde"), 1, 3, S("abcde"), 0, 6, 1);
1005     test(S("abcde"), 1, 3, S("abcde"), 1, 0, 3);
1006     test(S("abcde"), 1, 3, S("abcde"), 1, 1, 2);
1007     test(S("abcde"), 1, 3, S("abcde"), 1, 2, 1);
1008 }
1009
1010 template <class S>
1011 void test9()
1012 {
1013     test(S("abcde"), 1, 3, S("abcde"), 1, 3, 0);
1014     test(S("abcde"), 1, 3, S("abcde"), 1, 4, -1);
1015     test(S("abcde"), 1, 3, S("abcde"), 1, 5, -1);
1016     test(S("abcde"), 1, 3, S("abcde"), 2, 0, 3);
1017     test(S("abcde"), 1, 3, S("abcde"), 2, 1, -1);
1018     test(S("abcde"), 1, 3, S("abcde"), 2, 2, -1);
1019     test(S("abcde"), 1, 3, S("abcde"), 2, 3, -1);
1020     test(S("abcde"), 1, 3, S("abcde"), 2, 4, -1);
1021     test(S("abcde"), 1, 3, S("abcde"), 4, 0, 3);
1022     test(S("abcde"), 1, 3, S("abcde"), 4, 1, -3);
1023     test(S("abcde"), 1, 3, S("abcde"), 4, 2, -3);
1024     test(S("abcde"), 1, 3, S("abcde"), 5, 0, 3);
1025     test(S("abcde"), 1, 3, S("abcde"), 5, 1, 3);
1026     test(S("abcde"), 1, 3, S("abcde"), 6, 0, 0);
1027     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 0, 3);
1028     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 1, 1);
1029     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 5, 1);
1030     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 9, 1);
1031     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 10, 1);
1032     test(S("abcde"), 1, 3, S("abcdefghij"), 0, 11, 1);
1033     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 0, 3);
1034     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 1, 2);
1035     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 4, -1);
1036     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 8, -5);
1037     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 9, -6);
1038     test(S("abcde"), 1, 3, S("abcdefghij"), 1, 10, -6);
1039     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 0, 3);
1040     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 1, -4);
1041     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 2, -4);
1042     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 4, -4);
1043     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 5, -4);
1044     test(S("abcde"), 1, 3, S("abcdefghij"), 5, 6, -4);
1045     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 0, 3);
1046     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 1, -8);
1047     test(S("abcde"), 1, 3, S("abcdefghij"), 9, 2, -8);
1048     test(S("abcde"), 1, 3, S("abcdefghij"), 10, 0, 3);
1049     test(S("abcde"), 1, 3, S("abcdefghij"), 10, 1, 3);
1050     test(S("abcde"), 1, 3, S("abcdefghij"), 11, 0, 0);
1051     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1052     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 1, 1);
1053     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 10, 1);
1054     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 19, 1);
1055     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 20, 1);
1056     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 0, 21, 1);
1057     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1058     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 1, 2);
1059     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 9, -6);
1060     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 18, -15);
1061     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 19, -16);
1062     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 1, 20, -16);
1063     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1064     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 1, -9);
1065     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 5, -9);
1066     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 9, -9);
1067     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 10, -9);
1068     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 10, 11, -9);
1069     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1070     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 1, -18);
1071     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 19, 2, -18);
1072     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1073     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1074     test(S("abcde"), 1, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1075     test(S("abcde"), 1, 4, S(""), 0, 0, 4);
1076     test(S("abcde"), 1, 4, S(""), 0, 1, 4);
1077     test(S("abcde"), 1, 4, S(""), 1, 0, 0);
1078     test(S("abcde"), 1, 4, S("abcde"), 0, 0, 4);
1079     test(S("abcde"), 1, 4, S("abcde"), 0, 1, 1);
1080     test(S("abcde"), 1, 4, S("abcde"), 0, 2, 1);
1081     test(S("abcde"), 1, 4, S("abcde"), 0, 4, 1);
1082     test(S("abcde"), 1, 4, S("abcde"), 0, 5, 1);
1083     test(S("abcde"), 1, 4, S("abcde"), 0, 6, 1);
1084     test(S("abcde"), 1, 4, S("abcde"), 1, 0, 4);
1085     test(S("abcde"), 1, 4, S("abcde"), 1, 1, 3);
1086     test(S("abcde"), 1, 4, S("abcde"), 1, 2, 2);
1087     test(S("abcde"), 1, 4, S("abcde"), 1, 3, 1);
1088     test(S("abcde"), 1, 4, S("abcde"), 1, 4, 0);
1089     test(S("abcde"), 1, 4, S("abcde"), 1, 5, 0);
1090     test(S("abcde"), 1, 4, S("abcde"), 2, 0, 4);
1091     test(S("abcde"), 1, 4, S("abcde"), 2, 1, -1);
1092     test(S("abcde"), 1, 4, S("abcde"), 2, 2, -1);
1093     test(S("abcde"), 1, 4, S("abcde"), 2, 3, -1);
1094     test(S("abcde"), 1, 4, S("abcde"), 2, 4, -1);
1095     test(S("abcde"), 1, 4, S("abcde"), 4, 0, 4);
1096     test(S("abcde"), 1, 4, S("abcde"), 4, 1, -3);
1097     test(S("abcde"), 1, 4, S("abcde"), 4, 2, -3);
1098     test(S("abcde"), 1, 4, S("abcde"), 5, 0, 4);
1099     test(S("abcde"), 1, 4, S("abcde"), 5, 1, 4);
1100     test(S("abcde"), 1, 4, S("abcde"), 6, 0, 0);
1101     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 0, 4);
1102     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 1, 1);
1103     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 5, 1);
1104     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 9, 1);
1105     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 10, 1);
1106     test(S("abcde"), 1, 4, S("abcdefghij"), 0, 11, 1);
1107     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 0, 4);
1108     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 1, 3);
1109     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 4, 0);
1110     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 8, -4);
1111     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 9, -5);
1112     test(S("abcde"), 1, 4, S("abcdefghij"), 1, 10, -5);
1113 }
1114
1115 template <class S>
1116 void test10()
1117 {
1118     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 0, 4);
1119     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 1, -4);
1120     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 2, -4);
1121     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 4, -4);
1122     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 5, -4);
1123     test(S("abcde"), 1, 4, S("abcdefghij"), 5, 6, -4);
1124     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 0, 4);
1125     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 1, -8);
1126     test(S("abcde"), 1, 4, S("abcdefghij"), 9, 2, -8);
1127     test(S("abcde"), 1, 4, S("abcdefghij"), 10, 0, 4);
1128     test(S("abcde"), 1, 4, S("abcdefghij"), 10, 1, 4);
1129     test(S("abcde"), 1, 4, S("abcdefghij"), 11, 0, 0);
1130     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
1131     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
1132     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
1133     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
1134     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
1135     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
1136     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
1137     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
1138     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
1139     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
1140     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
1141     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
1142     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
1143     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
1144     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
1145     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
1146     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
1147     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
1148     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
1149     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
1150     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
1151     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
1152     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
1153     test(S("abcde"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1154     test(S("abcde"), 1, 5, S(""), 0, 0, 4);
1155     test(S("abcde"), 1, 5, S(""), 0, 1, 4);
1156     test(S("abcde"), 1, 5, S(""), 1, 0, 0);
1157     test(S("abcde"), 1, 5, S("abcde"), 0, 0, 4);
1158     test(S("abcde"), 1, 5, S("abcde"), 0, 1, 1);
1159     test(S("abcde"), 1, 5, S("abcde"), 0, 2, 1);
1160     test(S("abcde"), 1, 5, S("abcde"), 0, 4, 1);
1161     test(S("abcde"), 1, 5, S("abcde"), 0, 5, 1);
1162     test(S("abcde"), 1, 5, S("abcde"), 0, 6, 1);
1163     test(S("abcde"), 1, 5, S("abcde"), 1, 0, 4);
1164     test(S("abcde"), 1, 5, S("abcde"), 1, 1, 3);
1165     test(S("abcde"), 1, 5, S("abcde"), 1, 2, 2);
1166     test(S("abcde"), 1, 5, S("abcde"), 1, 3, 1);
1167     test(S("abcde"), 1, 5, S("abcde"), 1, 4, 0);
1168     test(S("abcde"), 1, 5, S("abcde"), 1, 5, 0);
1169     test(S("abcde"), 1, 5, S("abcde"), 2, 0, 4);
1170     test(S("abcde"), 1, 5, S("abcde"), 2, 1, -1);
1171     test(S("abcde"), 1, 5, S("abcde"), 2, 2, -1);
1172     test(S("abcde"), 1, 5, S("abcde"), 2, 3, -1);
1173     test(S("abcde"), 1, 5, S("abcde"), 2, 4, -1);
1174     test(S("abcde"), 1, 5, S("abcde"), 4, 0, 4);
1175     test(S("abcde"), 1, 5, S("abcde"), 4, 1, -3);
1176     test(S("abcde"), 1, 5, S("abcde"), 4, 2, -3);
1177     test(S("abcde"), 1, 5, S("abcde"), 5, 0, 4);
1178     test(S("abcde"), 1, 5, S("abcde"), 5, 1, 4);
1179     test(S("abcde"), 1, 5, S("abcde"), 6, 0, 0);
1180     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 0, 4);
1181     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 1, 1);
1182     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 5, 1);
1183     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 9, 1);
1184     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 10, 1);
1185     test(S("abcde"), 1, 5, S("abcdefghij"), 0, 11, 1);
1186     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 0, 4);
1187     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 1, 3);
1188     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 4, 0);
1189     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 8, -4);
1190     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 9, -5);
1191     test(S("abcde"), 1, 5, S("abcdefghij"), 1, 10, -5);
1192     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 0, 4);
1193     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 1, -4);
1194     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 2, -4);
1195     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 4, -4);
1196     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 5, -4);
1197     test(S("abcde"), 1, 5, S("abcdefghij"), 5, 6, -4);
1198     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 0, 4);
1199     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 1, -8);
1200     test(S("abcde"), 1, 5, S("abcdefghij"), 9, 2, -8);
1201     test(S("abcde"), 1, 5, S("abcdefghij"), 10, 0, 4);
1202     test(S("abcde"), 1, 5, S("abcdefghij"), 10, 1, 4);
1203     test(S("abcde"), 1, 5, S("abcdefghij"), 11, 0, 0);
1204     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 0, 4);
1205     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 1, 1);
1206     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 10, 1);
1207     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 19, 1);
1208     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 20, 1);
1209     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 0, 21, 1);
1210     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 0, 4);
1211     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 1, 3);
1212     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 9, -5);
1213     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 18, -14);
1214     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 19, -15);
1215     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 1, 20, -15);
1216     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 0, 4);
1217     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 1, -9);
1218 }
1219
1220 template <class S>
1221 void test11()
1222 {
1223     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 5, -9);
1224     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 9, -9);
1225     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 10, -9);
1226     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 10, 11, -9);
1227     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 0, 4);
1228     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 1, -18);
1229     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 19, 2, -18);
1230     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 0, 4);
1231     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 20, 1, 4);
1232     test(S("abcde"), 1, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
1233     test(S("abcde"), 2, 0, S(""), 0, 0, 0);
1234     test(S("abcde"), 2, 0, S(""), 0, 1, 0);
1235     test(S("abcde"), 2, 0, S(""), 1, 0, 0);
1236     test(S("abcde"), 2, 0, S("abcde"), 0, 0, 0);
1237     test(S("abcde"), 2, 0, S("abcde"), 0, 1, -1);
1238     test(S("abcde"), 2, 0, S("abcde"), 0, 2, -2);
1239     test(S("abcde"), 2, 0, S("abcde"), 0, 4, -4);
1240     test(S("abcde"), 2, 0, S("abcde"), 0, 5, -5);
1241     test(S("abcde"), 2, 0, S("abcde"), 0, 6, -5);
1242     test(S("abcde"), 2, 0, S("abcde"), 1, 0, 0);
1243     test(S("abcde"), 2, 0, S("abcde"), 1, 1, -1);
1244     test(S("abcde"), 2, 0, S("abcde"), 1, 2, -2);
1245     test(S("abcde"), 2, 0, S("abcde"), 1, 3, -3);
1246     test(S("abcde"), 2, 0, S("abcde"), 1, 4, -4);
1247     test(S("abcde"), 2, 0, S("abcde"), 1, 5, -4);
1248     test(S("abcde"), 2, 0, S("abcde"), 2, 0, 0);
1249     test(S("abcde"), 2, 0, S("abcde"), 2, 1, -1);
1250     test(S("abcde"), 2, 0, S("abcde"), 2, 2, -2);
1251     test(S("abcde"), 2, 0, S("abcde"), 2, 3, -3);
1252     test(S("abcde"), 2, 0, S("abcde"), 2, 4, -3);
1253     test(S("abcde"), 2, 0, S("abcde"), 4, 0, 0);
1254     test(S("abcde"), 2, 0, S("abcde"), 4, 1, -1);
1255     test(S("abcde"), 2, 0, S("abcde"), 4, 2, -1);
1256     test(S("abcde"), 2, 0, S("abcde"), 5, 0, 0);
1257     test(S("abcde"), 2, 0, S("abcde"), 5, 1, 0);
1258     test(S("abcde"), 2, 0, S("abcde"), 6, 0, 0);
1259     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 0, 0);
1260     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 1, -1);
1261     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 5, -5);
1262     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 9, -9);
1263     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 10, -10);
1264     test(S("abcde"), 2, 0, S("abcdefghij"), 0, 11, -10);
1265     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 0, 0);
1266     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 1, -1);
1267     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 4, -4);
1268     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 8, -8);
1269     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 9, -9);
1270     test(S("abcde"), 2, 0, S("abcdefghij"), 1, 10, -9);
1271     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 0, 0);
1272     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 1, -1);
1273     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 2, -2);
1274     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 4, -4);
1275     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 5, -5);
1276     test(S("abcde"), 2, 0, S("abcdefghij"), 5, 6, -5);
1277     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 0, 0);
1278     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 1, -1);
1279     test(S("abcde"), 2, 0, S("abcdefghij"), 9, 2, -1);
1280     test(S("abcde"), 2, 0, S("abcdefghij"), 10, 0, 0);
1281     test(S("abcde"), 2, 0, S("abcdefghij"), 10, 1, 0);
1282     test(S("abcde"), 2, 0, S("abcdefghij"), 11, 0, 0);
1283     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1284     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1285     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1286     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1287     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1288     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1289     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1290     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1291     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1292     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1293     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1294     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1295     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1296     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1297     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1298     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1299     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1300     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1301     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1302     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1303     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1304     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1305     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1306     test(S("abcde"), 2, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1307     test(S("abcde"), 2, 1, S(""), 0, 0, 1);
1308     test(S("abcde"), 2, 1, S(""), 0, 1, 1);
1309     test(S("abcde"), 2, 1, S(""), 1, 0, 0);
1310     test(S("abcde"), 2, 1, S("abcde"), 0, 0, 1);
1311     test(S("abcde"), 2, 1, S("abcde"), 0, 1, 2);
1312     test(S("abcde"), 2, 1, S("abcde"), 0, 2, 2);
1313     test(S("abcde"), 2, 1, S("abcde"), 0, 4, 2);
1314     test(S("abcde"), 2, 1, S("abcde"), 0, 5, 2);
1315     test(S("abcde"), 2, 1, S("abcde"), 0, 6, 2);
1316     test(S("abcde"), 2, 1, S("abcde"), 1, 0, 1);
1317     test(S("abcde"), 2, 1, S("abcde"), 1, 1, 1);
1318     test(S("abcde"), 2, 1, S("abcde"), 1, 2, 1);
1319     test(S("abcde"), 2, 1, S("abcde"), 1, 3, 1);
1320     test(S("abcde"), 2, 1, S("abcde"), 1, 4, 1);
1321     test(S("abcde"), 2, 1, S("abcde"), 1, 5, 1);
1322     test(S("abcde"), 2, 1, S("abcde"), 2, 0, 1);
1323 }
1324
1325 template <class S>
1326 void test12()
1327 {
1328     test(S("abcde"), 2, 1, S("abcde"), 2, 1, 0);
1329     test(S("abcde"), 2, 1, S("abcde"), 2, 2, -1);
1330     test(S("abcde"), 2, 1, S("abcde"), 2, 3, -2);
1331     test(S("abcde"), 2, 1, S("abcde"), 2, 4, -2);
1332     test(S("abcde"), 2, 1, S("abcde"), 4, 0, 1);
1333     test(S("abcde"), 2, 1, S("abcde"), 4, 1, -2);
1334     test(S("abcde"), 2, 1, S("abcde"), 4, 2, -2);
1335     test(S("abcde"), 2, 1, S("abcde"), 5, 0, 1);
1336     test(S("abcde"), 2, 1, S("abcde"), 5, 1, 1);
1337     test(S("abcde"), 2, 1, S("abcde"), 6, 0, 0);
1338     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 0, 1);
1339     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 1, 2);
1340     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 5, 2);
1341     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 9, 2);
1342     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 10, 2);
1343     test(S("abcde"), 2, 1, S("abcdefghij"), 0, 11, 2);
1344     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 0, 1);
1345     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 1, 1);
1346     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 4, 1);
1347     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 8, 1);
1348     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 9, 1);
1349     test(S("abcde"), 2, 1, S("abcdefghij"), 1, 10, 1);
1350     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 0, 1);
1351     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 1, -3);
1352     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 2, -3);
1353     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 4, -3);
1354     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 5, -3);
1355     test(S("abcde"), 2, 1, S("abcdefghij"), 5, 6, -3);
1356     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 0, 1);
1357     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 1, -7);
1358     test(S("abcde"), 2, 1, S("abcdefghij"), 9, 2, -7);
1359     test(S("abcde"), 2, 1, S("abcdefghij"), 10, 0, 1);
1360     test(S("abcde"), 2, 1, S("abcdefghij"), 10, 1, 1);
1361     test(S("abcde"), 2, 1, S("abcdefghij"), 11, 0, 0);
1362     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1363     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 1, 2);
1364     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 10, 2);
1365     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 19, 2);
1366     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 20, 2);
1367     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 0, 21, 2);
1368     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1369     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 1, 1);
1370     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 9, 1);
1371     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 18, 1);
1372     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 19, 1);
1373     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 1, 20, 1);
1374     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1375     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 1, -8);
1376     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 5, -8);
1377     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
1378     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 10, -8);
1379     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 10, 11, -8);
1380     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1381     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 1, -17);
1382     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 19, 2, -17);
1383     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1384     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1385     test(S("abcde"), 2, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1386     test(S("abcde"), 2, 2, S(""), 0, 0, 2);
1387     test(S("abcde"), 2, 2, S(""), 0, 1, 2);
1388     test(S("abcde"), 2, 2, S(""), 1, 0, 0);
1389     test(S("abcde"), 2, 2, S("abcde"), 0, 0, 2);
1390     test(S("abcde"), 2, 2, S("abcde"), 0, 1, 2);
1391     test(S("abcde"), 2, 2, S("abcde"), 0, 2, 2);
1392     test(S("abcde"), 2, 2, S("abcde"), 0, 4, 2);
1393     test(S("abcde"), 2, 2, S("abcde"), 0, 5, 2);
1394     test(S("abcde"), 2, 2, S("abcde"), 0, 6, 2);
1395     test(S("abcde"), 2, 2, S("abcde"), 1, 0, 2);
1396     test(S("abcde"), 2, 2, S("abcde"), 1, 1, 1);
1397     test(S("abcde"), 2, 2, S("abcde"), 1, 2, 1);
1398     test(S("abcde"), 2, 2, S("abcde"), 1, 3, 1);
1399     test(S("abcde"), 2, 2, S("abcde"), 1, 4, 1);
1400     test(S("abcde"), 2, 2, S("abcde"), 1, 5, 1);
1401     test(S("abcde"), 2, 2, S("abcde"), 2, 0, 2);
1402     test(S("abcde"), 2, 2, S("abcde"), 2, 1, 1);
1403     test(S("abcde"), 2, 2, S("abcde"), 2, 2, 0);
1404     test(S("abcde"), 2, 2, S("abcde"), 2, 3, -1);
1405     test(S("abcde"), 2, 2, S("abcde"), 2, 4, -1);
1406     test(S("abcde"), 2, 2, S("abcde"), 4, 0, 2);
1407     test(S("abcde"), 2, 2, S("abcde"), 4, 1, -2);
1408     test(S("abcde"), 2, 2, S("abcde"), 4, 2, -2);
1409     test(S("abcde"), 2, 2, S("abcde"), 5, 0, 2);
1410     test(S("abcde"), 2, 2, S("abcde"), 5, 1, 2);
1411     test(S("abcde"), 2, 2, S("abcde"), 6, 0, 0);
1412     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 0, 2);
1413     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 1, 2);
1414     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 5, 2);
1415     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 9, 2);
1416     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 10, 2);
1417     test(S("abcde"), 2, 2, S("abcdefghij"), 0, 11, 2);
1418     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 0, 2);
1419     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 1, 1);
1420     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 4, 1);
1421     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 8, 1);
1422     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 9, 1);
1423     test(S("abcde"), 2, 2, S("abcdefghij"), 1, 10, 1);
1424     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 0, 2);
1425     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 1, -3);
1426     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 2, -3);
1427     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 4, -3);
1428 }
1429
1430 template <class S>
1431 void test13()
1432 {
1433     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 5, -3);
1434     test(S("abcde"), 2, 2, S("abcdefghij"), 5, 6, -3);
1435     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 0, 2);
1436     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 1, -7);
1437     test(S("abcde"), 2, 2, S("abcdefghij"), 9, 2, -7);
1438     test(S("abcde"), 2, 2, S("abcdefghij"), 10, 0, 2);
1439     test(S("abcde"), 2, 2, S("abcdefghij"), 10, 1, 2);
1440     test(S("abcde"), 2, 2, S("abcdefghij"), 11, 0, 0);
1441     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
1442     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 1, 2);
1443     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 10, 2);
1444     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 19, 2);
1445     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 20, 2);
1446     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 0, 21, 2);
1447     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
1448     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 1, 1);
1449     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 9, 1);
1450     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 18, 1);
1451     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 19, 1);
1452     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 1, 20, 1);
1453     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
1454     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 1, -8);
1455     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 5, -8);
1456     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 9, -8);
1457     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 10, -8);
1458     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 10, 11, -8);
1459     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
1460     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 1, -17);
1461     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 19, 2, -17);
1462     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
1463     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
1464     test(S("abcde"), 2, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1465     test(S("abcde"), 2, 3, S(""), 0, 0, 3);
1466     test(S("abcde"), 2, 3, S(""), 0, 1, 3);
1467     test(S("abcde"), 2, 3, S(""), 1, 0, 0);
1468     test(S("abcde"), 2, 3, S("abcde"), 0, 0, 3);
1469     test(S("abcde"), 2, 3, S("abcde"), 0, 1, 2);
1470     test(S("abcde"), 2, 3, S("abcde"), 0, 2, 2);
1471     test(S("abcde"), 2, 3, S("abcde"), 0, 4, 2);
1472     test(S("abcde"), 2, 3, S("abcde"), 0, 5, 2);
1473     test(S("abcde"), 2, 3, S("abcde"), 0, 6, 2);
1474     test(S("abcde"), 2, 3, S("abcde"), 1, 0, 3);
1475     test(S("abcde"), 2, 3, S("abcde"), 1, 1, 1);
1476     test(S("abcde"), 2, 3, S("abcde"), 1, 2, 1);
1477     test(S("abcde"), 2, 3, S("abcde"), 1, 3, 1);
1478     test(S("abcde"), 2, 3, S("abcde"), 1, 4, 1);
1479     test(S("abcde"), 2, 3, S("abcde"), 1, 5, 1);
1480     test(S("abcde"), 2, 3, S("abcde"), 2, 0, 3);
1481     test(S("abcde"), 2, 3, S("abcde"), 2, 1, 2);
1482     test(S("abcde"), 2, 3, S("abcde"), 2, 2, 1);
1483     test(S("abcde"), 2, 3, S("abcde"), 2, 3, 0);
1484     test(S("abcde"), 2, 3, S("abcde"), 2, 4, 0);
1485     test(S("abcde"), 2, 3, S("abcde"), 4, 0, 3);
1486     test(S("abcde"), 2, 3, S("abcde"), 4, 1, -2);
1487     test(S("abcde"), 2, 3, S("abcde"), 4, 2, -2);
1488     test(S("abcde"), 2, 3, S("abcde"), 5, 0, 3);
1489     test(S("abcde"), 2, 3, S("abcde"), 5, 1, 3);
1490     test(S("abcde"), 2, 3, S("abcde"), 6, 0, 0);
1491     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 0, 3);
1492     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 1, 2);
1493     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 5, 2);
1494     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 9, 2);
1495     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 10, 2);
1496     test(S("abcde"), 2, 3, S("abcdefghij"), 0, 11, 2);
1497     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 0, 3);
1498     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 1, 1);
1499     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 4, 1);
1500     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 8, 1);
1501     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 9, 1);
1502     test(S("abcde"), 2, 3, S("abcdefghij"), 1, 10, 1);
1503     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 0, 3);
1504     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 1, -3);
1505     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 2, -3);
1506     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 4, -3);
1507     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 5, -3);
1508     test(S("abcde"), 2, 3, S("abcdefghij"), 5, 6, -3);
1509     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 0, 3);
1510     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 1, -7);
1511     test(S("abcde"), 2, 3, S("abcdefghij"), 9, 2, -7);
1512     test(S("abcde"), 2, 3, S("abcdefghij"), 10, 0, 3);
1513     test(S("abcde"), 2, 3, S("abcdefghij"), 10, 1, 3);
1514     test(S("abcde"), 2, 3, S("abcdefghij"), 11, 0, 0);
1515     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 0, 3);
1516     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 1, 2);
1517     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 10, 2);
1518     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 19, 2);
1519     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 20, 2);
1520     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 0, 21, 2);
1521     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 0, 3);
1522     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 1, 1);
1523     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 9, 1);
1524     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 18, 1);
1525     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 19, 1);
1526     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 1, 20, 1);
1527     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 0, 3);
1528     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 1, -8);
1529     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 5, -8);
1530     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 9, -8);
1531     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 10, -8);
1532     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 10, 11, -8);
1533 }
1534
1535 template <class S>
1536 void test14()
1537 {
1538     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 0, 3);
1539     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 1, -17);
1540     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 19, 2, -17);
1541     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 0, 3);
1542     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 20, 1, 3);
1543     test(S("abcde"), 2, 3, S("abcdefghijklmnopqrst"), 21, 0, 0);
1544     test(S("abcde"), 2, 4, S(""), 0, 0, 3);
1545     test(S("abcde"), 2, 4, S(""), 0, 1, 3);
1546     test(S("abcde"), 2, 4, S(""), 1, 0, 0);
1547     test(S("abcde"), 2, 4, S("abcde"), 0, 0, 3);
1548     test(S("abcde"), 2, 4, S("abcde"), 0, 1, 2);
1549     test(S("abcde"), 2, 4, S("abcde"), 0, 2, 2);
1550     test(S("abcde"), 2, 4, S("abcde"), 0, 4, 2);
1551     test(S("abcde"), 2, 4, S("abcde"), 0, 5, 2);
1552     test(S("abcde"), 2, 4, S("abcde"), 0, 6, 2);
1553     test(S("abcde"), 2, 4, S("abcde"), 1, 0, 3);
1554     test(S("abcde"), 2, 4, S("abcde"), 1, 1, 1);
1555     test(S("abcde"), 2, 4, S("abcde"), 1, 2, 1);
1556     test(S("abcde"), 2, 4, S("abcde"), 1, 3, 1);
1557     test(S("abcde"), 2, 4, S("abcde"), 1, 4, 1);
1558     test(S("abcde"), 2, 4, S("abcde"), 1, 5, 1);
1559     test(S("abcde"), 2, 4, S("abcde"), 2, 0, 3);
1560     test(S("abcde"), 2, 4, S("abcde"), 2, 1, 2);
1561     test(S("abcde"), 2, 4, S("abcde"), 2, 2, 1);
1562     test(S("abcde"), 2, 4, S("abcde"), 2, 3, 0);
1563     test(S("abcde"), 2, 4, S("abcde"), 2, 4, 0);
1564     test(S("abcde"), 2, 4, S("abcde"), 4, 0, 3);
1565     test(S("abcde"), 2, 4, S("abcde"), 4, 1, -2);
1566     test(S("abcde"), 2, 4, S("abcde"), 4, 2, -2);
1567     test(S("abcde"), 2, 4, S("abcde"), 5, 0, 3);
1568     test(S("abcde"), 2, 4, S("abcde"), 5, 1, 3);
1569     test(S("abcde"), 2, 4, S("abcde"), 6, 0, 0);
1570     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 0, 3);
1571     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 1, 2);
1572     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 5, 2);
1573     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 9, 2);
1574     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 10, 2);
1575     test(S("abcde"), 2, 4, S("abcdefghij"), 0, 11, 2);
1576     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 0, 3);
1577     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 1, 1);
1578     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 4, 1);
1579     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 8, 1);
1580     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 9, 1);
1581     test(S("abcde"), 2, 4, S("abcdefghij"), 1, 10, 1);
1582     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 0, 3);
1583     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 1, -3);
1584     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 2, -3);
1585     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 4, -3);
1586     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 5, -3);
1587     test(S("abcde"), 2, 4, S("abcdefghij"), 5, 6, -3);
1588     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 0, 3);
1589     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 1, -7);
1590     test(S("abcde"), 2, 4, S("abcdefghij"), 9, 2, -7);
1591     test(S("abcde"), 2, 4, S("abcdefghij"), 10, 0, 3);
1592     test(S("abcde"), 2, 4, S("abcdefghij"), 10, 1, 3);
1593     test(S("abcde"), 2, 4, S("abcdefghij"), 11, 0, 0);
1594     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 0, 3);
1595     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 1, 2);
1596     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 10, 2);
1597     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 19, 2);
1598     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 20, 2);
1599     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 0, 21, 2);
1600     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 0, 3);
1601     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 1, 1);
1602     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 9, 1);
1603     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 18, 1);
1604     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 19, 1);
1605     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 1, 20, 1);
1606     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 0, 3);
1607     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 1, -8);
1608     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 5, -8);
1609     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 9, -8);
1610     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 10, -8);
1611     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 10, 11, -8);
1612     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 0, 3);
1613     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 1, -17);
1614     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 19, 2, -17);
1615     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 0, 3);
1616     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 20, 1, 3);
1617     test(S("abcde"), 2, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
1618     test(S("abcde"), 4, 0, S(""), 0, 0, 0);
1619     test(S("abcde"), 4, 0, S(""), 0, 1, 0);
1620     test(S("abcde"), 4, 0, S(""), 1, 0, 0);
1621     test(S("abcde"), 4, 0, S("abcde"), 0, 0, 0);
1622     test(S("abcde"), 4, 0, S("abcde"), 0, 1, -1);
1623     test(S("abcde"), 4, 0, S("abcde"), 0, 2, -2);
1624     test(S("abcde"), 4, 0, S("abcde"), 0, 4, -4);
1625     test(S("abcde"), 4, 0, S("abcde"), 0, 5, -5);
1626     test(S("abcde"), 4, 0, S("abcde"), 0, 6, -5);
1627     test(S("abcde"), 4, 0, S("abcde"), 1, 0, 0);
1628     test(S("abcde"), 4, 0, S("abcde"), 1, 1, -1);
1629     test(S("abcde"), 4, 0, S("abcde"), 1, 2, -2);
1630     test(S("abcde"), 4, 0, S("abcde"), 1, 3, -3);
1631     test(S("abcde"), 4, 0, S("abcde"), 1, 4, -4);
1632     test(S("abcde"), 4, 0, S("abcde"), 1, 5, -4);
1633     test(S("abcde"), 4, 0, S("abcde"), 2, 0, 0);
1634     test(S("abcde"), 4, 0, S("abcde"), 2, 1, -1);
1635     test(S("abcde"), 4, 0, S("abcde"), 2, 2, -2);
1636     test(S("abcde"), 4, 0, S("abcde"), 2, 3, -3);
1637     test(S("abcde"), 4, 0, S("abcde"), 2, 4, -3);
1638 }
1639
1640 template <class S>
1641 void test15()
1642 {
1643     test(S("abcde"), 4, 0, S("abcde"), 4, 0, 0);
1644     test(S("abcde"), 4, 0, S("abcde"), 4, 1, -1);
1645     test(S("abcde"), 4, 0, S("abcde"), 4, 2, -1);
1646     test(S("abcde"), 4, 0, S("abcde"), 5, 0, 0);
1647     test(S("abcde"), 4, 0, S("abcde"), 5, 1, 0);
1648     test(S("abcde"), 4, 0, S("abcde"), 6, 0, 0);
1649     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 0, 0);
1650     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 1, -1);
1651     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 5, -5);
1652     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 9, -9);
1653     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 10, -10);
1654     test(S("abcde"), 4, 0, S("abcdefghij"), 0, 11, -10);
1655     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 0, 0);
1656     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 1, -1);
1657     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 4, -4);
1658     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 8, -8);
1659     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 9, -9);
1660     test(S("abcde"), 4, 0, S("abcdefghij"), 1, 10, -9);
1661     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 0, 0);
1662     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 1, -1);
1663     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 2, -2);
1664     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 4, -4);
1665     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 5, -5);
1666     test(S("abcde"), 4, 0, S("abcdefghij"), 5, 6, -5);
1667     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 0, 0);
1668     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 1, -1);
1669     test(S("abcde"), 4, 0, S("abcdefghij"), 9, 2, -1);
1670     test(S("abcde"), 4, 0, S("abcdefghij"), 10, 0, 0);
1671     test(S("abcde"), 4, 0, S("abcdefghij"), 10, 1, 0);
1672     test(S("abcde"), 4, 0, S("abcdefghij"), 11, 0, 0);
1673     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1674     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1675     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1676     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1677     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1678     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1679     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1680     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1681     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1682     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1683     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1684     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1685     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1686     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1687     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1688     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1689     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1690     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1691     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1692     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1693     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1694     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1695     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1696     test(S("abcde"), 4, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1697     test(S("abcde"), 4, 1, S(""), 0, 0, 1);
1698     test(S("abcde"), 4, 1, S(""), 0, 1, 1);
1699     test(S("abcde"), 4, 1, S(""), 1, 0, 0);
1700     test(S("abcde"), 4, 1, S("abcde"), 0, 0, 1);
1701     test(S("abcde"), 4, 1, S("abcde"), 0, 1, 4);
1702     test(S("abcde"), 4, 1, S("abcde"), 0, 2, 4);
1703     test(S("abcde"), 4, 1, S("abcde"), 0, 4, 4);
1704     test(S("abcde"), 4, 1, S("abcde"), 0, 5, 4);
1705     test(S("abcde"), 4, 1, S("abcde"), 0, 6, 4);
1706     test(S("abcde"), 4, 1, S("abcde"), 1, 0, 1);
1707     test(S("abcde"), 4, 1, S("abcde"), 1, 1, 3);
1708     test(S("abcde"), 4, 1, S("abcde"), 1, 2, 3);
1709     test(S("abcde"), 4, 1, S("abcde"), 1, 3, 3);
1710     test(S("abcde"), 4, 1, S("abcde"), 1, 4, 3);
1711     test(S("abcde"), 4, 1, S("abcde"), 1, 5, 3);
1712     test(S("abcde"), 4, 1, S("abcde"), 2, 0, 1);
1713     test(S("abcde"), 4, 1, S("abcde"), 2, 1, 2);
1714     test(S("abcde"), 4, 1, S("abcde"), 2, 2, 2);
1715     test(S("abcde"), 4, 1, S("abcde"), 2, 3, 2);
1716     test(S("abcde"), 4, 1, S("abcde"), 2, 4, 2);
1717     test(S("abcde"), 4, 1, S("abcde"), 4, 0, 1);
1718     test(S("abcde"), 4, 1, S("abcde"), 4, 1, 0);
1719     test(S("abcde"), 4, 1, S("abcde"), 4, 2, 0);
1720     test(S("abcde"), 4, 1, S("abcde"), 5, 0, 1);
1721     test(S("abcde"), 4, 1, S("abcde"), 5, 1, 1);
1722     test(S("abcde"), 4, 1, S("abcde"), 6, 0, 0);
1723     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 0, 1);
1724     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 1, 4);
1725     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 5, 4);
1726     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 9, 4);
1727     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 10, 4);
1728     test(S("abcde"), 4, 1, S("abcdefghij"), 0, 11, 4);
1729     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 0, 1);
1730     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 1, 3);
1731     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 4, 3);
1732     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 8, 3);
1733     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 9, 3);
1734     test(S("abcde"), 4, 1, S("abcdefghij"), 1, 10, 3);
1735     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 0, 1);
1736     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 1, -1);
1737     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 2, -1);
1738     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 4, -1);
1739     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 5, -1);
1740     test(S("abcde"), 4, 1, S("abcdefghij"), 5, 6, -1);
1741     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 0, 1);
1742     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 1, -5);
1743 }
1744
1745 template <class S>
1746 void test16()
1747 {
1748     test(S("abcde"), 4, 1, S("abcdefghij"), 9, 2, -5);
1749     test(S("abcde"), 4, 1, S("abcdefghij"), 10, 0, 1);
1750     test(S("abcde"), 4, 1, S("abcdefghij"), 10, 1, 1);
1751     test(S("abcde"), 4, 1, S("abcdefghij"), 11, 0, 0);
1752     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
1753     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 1, 4);
1754     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 10, 4);
1755     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 19, 4);
1756     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 20, 4);
1757     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 0, 21, 4);
1758     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
1759     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 1, 3);
1760     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 9, 3);
1761     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 18, 3);
1762     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 19, 3);
1763     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 1, 20, 3);
1764     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
1765     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 1, -6);
1766     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 5, -6);
1767     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 9, -6);
1768     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 10, -6);
1769     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 10, 11, -6);
1770     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
1771     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 1, -15);
1772     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 19, 2, -15);
1773     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
1774     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
1775     test(S("abcde"), 4, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
1776     test(S("abcde"), 4, 2, S(""), 0, 0, 1);
1777     test(S("abcde"), 4, 2, S(""), 0, 1, 1);
1778     test(S("abcde"), 4, 2, S(""), 1, 0, 0);
1779     test(S("abcde"), 4, 2, S("abcde"), 0, 0, 1);
1780     test(S("abcde"), 4, 2, S("abcde"), 0, 1, 4);
1781     test(S("abcde"), 4, 2, S("abcde"), 0, 2, 4);
1782     test(S("abcde"), 4, 2, S("abcde"), 0, 4, 4);
1783     test(S("abcde"), 4, 2, S("abcde"), 0, 5, 4);
1784     test(S("abcde"), 4, 2, S("abcde"), 0, 6, 4);
1785     test(S("abcde"), 4, 2, S("abcde"), 1, 0, 1);
1786     test(S("abcde"), 4, 2, S("abcde"), 1, 1, 3);
1787     test(S("abcde"), 4, 2, S("abcde"), 1, 2, 3);
1788     test(S("abcde"), 4, 2, S("abcde"), 1, 3, 3);
1789     test(S("abcde"), 4, 2, S("abcde"), 1, 4, 3);
1790     test(S("abcde"), 4, 2, S("abcde"), 1, 5, 3);
1791     test(S("abcde"), 4, 2, S("abcde"), 2, 0, 1);
1792     test(S("abcde"), 4, 2, S("abcde"), 2, 1, 2);
1793     test(S("abcde"), 4, 2, S("abcde"), 2, 2, 2);
1794     test(S("abcde"), 4, 2, S("abcde"), 2, 3, 2);
1795     test(S("abcde"), 4, 2, S("abcde"), 2, 4, 2);
1796     test(S("abcde"), 4, 2, S("abcde"), 4, 0, 1);
1797     test(S("abcde"), 4, 2, S("abcde"), 4, 1, 0);
1798     test(S("abcde"), 4, 2, S("abcde"), 4, 2, 0);
1799     test(S("abcde"), 4, 2, S("abcde"), 5, 0, 1);
1800     test(S("abcde"), 4, 2, S("abcde"), 5, 1, 1);
1801     test(S("abcde"), 4, 2, S("abcde"), 6, 0, 0);
1802     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 0, 1);
1803     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 1, 4);
1804     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 5, 4);
1805     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 9, 4);
1806     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 10, 4);
1807     test(S("abcde"), 4, 2, S("abcdefghij"), 0, 11, 4);
1808     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 0, 1);
1809     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 1, 3);
1810     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 4, 3);
1811     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 8, 3);
1812     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 9, 3);
1813     test(S("abcde"), 4, 2, S("abcdefghij"), 1, 10, 3);
1814     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 0, 1);
1815     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 1, -1);
1816     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 2, -1);
1817     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 4, -1);
1818     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 5, -1);
1819     test(S("abcde"), 4, 2, S("abcdefghij"), 5, 6, -1);
1820     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 0, 1);
1821     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 1, -5);
1822     test(S("abcde"), 4, 2, S("abcdefghij"), 9, 2, -5);
1823     test(S("abcde"), 4, 2, S("abcdefghij"), 10, 0, 1);
1824     test(S("abcde"), 4, 2, S("abcdefghij"), 10, 1, 1);
1825     test(S("abcde"), 4, 2, S("abcdefghij"), 11, 0, 0);
1826     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
1827     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 1, 4);
1828     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 10, 4);
1829     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 19, 4);
1830     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 20, 4);
1831     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 0, 21, 4);
1832     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
1833     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 1, 3);
1834     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 9, 3);
1835     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 18, 3);
1836     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 19, 3);
1837     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 1, 20, 3);
1838     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
1839     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 1, -6);
1840     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 5, -6);
1841     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 9, -6);
1842     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 10, -6);
1843     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 10, 11, -6);
1844     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
1845     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 1, -15);
1846     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 19, 2, -15);
1847     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
1848 }
1849
1850 template <class S>
1851 void test17()
1852 {
1853     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
1854     test(S("abcde"), 4, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
1855     test(S("abcde"), 5, 0, S(""), 0, 0, 0);
1856     test(S("abcde"), 5, 0, S(""), 0, 1, 0);
1857     test(S("abcde"), 5, 0, S(""), 1, 0, 0);
1858     test(S("abcde"), 5, 0, S("abcde"), 0, 0, 0);
1859     test(S("abcde"), 5, 0, S("abcde"), 0, 1, -1);
1860     test(S("abcde"), 5, 0, S("abcde"), 0, 2, -2);
1861     test(S("abcde"), 5, 0, S("abcde"), 0, 4, -4);
1862     test(S("abcde"), 5, 0, S("abcde"), 0, 5, -5);
1863     test(S("abcde"), 5, 0, S("abcde"), 0, 6, -5);
1864     test(S("abcde"), 5, 0, S("abcde"), 1, 0, 0);
1865     test(S("abcde"), 5, 0, S("abcde"), 1, 1, -1);
1866     test(S("abcde"), 5, 0, S("abcde"), 1, 2, -2);
1867     test(S("abcde"), 5, 0, S("abcde"), 1, 3, -3);
1868     test(S("abcde"), 5, 0, S("abcde"), 1, 4, -4);
1869     test(S("abcde"), 5, 0, S("abcde"), 1, 5, -4);
1870     test(S("abcde"), 5, 0, S("abcde"), 2, 0, 0);
1871     test(S("abcde"), 5, 0, S("abcde"), 2, 1, -1);
1872     test(S("abcde"), 5, 0, S("abcde"), 2, 2, -2);
1873     test(S("abcde"), 5, 0, S("abcde"), 2, 3, -3);
1874     test(S("abcde"), 5, 0, S("abcde"), 2, 4, -3);
1875     test(S("abcde"), 5, 0, S("abcde"), 4, 0, 0);
1876     test(S("abcde"), 5, 0, S("abcde"), 4, 1, -1);
1877     test(S("abcde"), 5, 0, S("abcde"), 4, 2, -1);
1878     test(S("abcde"), 5, 0, S("abcde"), 5, 0, 0);
1879     test(S("abcde"), 5, 0, S("abcde"), 5, 1, 0);
1880     test(S("abcde"), 5, 0, S("abcde"), 6, 0, 0);
1881     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 0, 0);
1882     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 1, -1);
1883     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 5, -5);
1884     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 9, -9);
1885     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 10, -10);
1886     test(S("abcde"), 5, 0, S("abcdefghij"), 0, 11, -10);
1887     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 0, 0);
1888     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 1, -1);
1889     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 4, -4);
1890     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 8, -8);
1891     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 9, -9);
1892     test(S("abcde"), 5, 0, S("abcdefghij"), 1, 10, -9);
1893     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 0, 0);
1894     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 1, -1);
1895     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 2, -2);
1896     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 4, -4);
1897     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 5, -5);
1898     test(S("abcde"), 5, 0, S("abcdefghij"), 5, 6, -5);
1899     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 0, 0);
1900     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 1, -1);
1901     test(S("abcde"), 5, 0, S("abcdefghij"), 9, 2, -1);
1902     test(S("abcde"), 5, 0, S("abcdefghij"), 10, 0, 0);
1903     test(S("abcde"), 5, 0, S("abcdefghij"), 10, 1, 0);
1904     test(S("abcde"), 5, 0, S("abcdefghij"), 11, 0, 0);
1905     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
1906     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
1907     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
1908     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
1909     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
1910     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
1911     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
1912     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
1913     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
1914     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
1915     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
1916     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
1917     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
1918     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
1919     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
1920     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
1921     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
1922     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
1923     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
1924     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
1925     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
1926     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
1927     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
1928     test(S("abcde"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
1929     test(S("abcde"), 5, 1, S(""), 0, 0, 0);
1930     test(S("abcde"), 5, 1, S(""), 0, 1, 0);
1931     test(S("abcde"), 5, 1, S(""), 1, 0, 0);
1932     test(S("abcde"), 5, 1, S("abcde"), 0, 0, 0);
1933     test(S("abcde"), 5, 1, S("abcde"), 0, 1, -1);
1934     test(S("abcde"), 5, 1, S("abcde"), 0, 2, -2);
1935     test(S("abcde"), 5, 1, S("abcde"), 0, 4, -4);
1936     test(S("abcde"), 5, 1, S("abcde"), 0, 5, -5);
1937     test(S("abcde"), 5, 1, S("abcde"), 0, 6, -5);
1938     test(S("abcde"), 5, 1, S("abcde"), 1, 0, 0);
1939     test(S("abcde"), 5, 1, S("abcde"), 1, 1, -1);
1940     test(S("abcde"), 5, 1, S("abcde"), 1, 2, -2);
1941     test(S("abcde"), 5, 1, S("abcde"), 1, 3, -3);
1942     test(S("abcde"), 5, 1, S("abcde"), 1, 4, -4);
1943     test(S("abcde"), 5, 1, S("abcde"), 1, 5, -4);
1944     test(S("abcde"), 5, 1, S("abcde"), 2, 0, 0);
1945     test(S("abcde"), 5, 1, S("abcde"), 2, 1, -1);
1946     test(S("abcde"), 5, 1, S("abcde"), 2, 2, -2);
1947     test(S("abcde"), 5, 1, S("abcde"), 2, 3, -3);
1948     test(S("abcde"), 5, 1, S("abcde"), 2, 4, -3);
1949     test(S("abcde"), 5, 1, S("abcde"), 4, 0, 0);
1950     test(S("abcde"), 5, 1, S("abcde"), 4, 1, -1);
1951     test(S("abcde"), 5, 1, S("abcde"), 4, 2, -1);
1952     test(S("abcde"), 5, 1, S("abcde"), 5, 0, 0);
1953 }
1954
1955 template <class S>
1956 void test18()
1957 {
1958     test(S("abcde"), 5, 1, S("abcde"), 5, 1, 0);
1959     test(S("abcde"), 5, 1, S("abcde"), 6, 0, 0);
1960     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 0, 0);
1961     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 1, -1);
1962     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 5, -5);
1963     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 9, -9);
1964     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 10, -10);
1965     test(S("abcde"), 5, 1, S("abcdefghij"), 0, 11, -10);
1966     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 0, 0);
1967     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 1, -1);
1968     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 4, -4);
1969     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 8, -8);
1970     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 9, -9);
1971     test(S("abcde"), 5, 1, S("abcdefghij"), 1, 10, -9);
1972     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 0, 0);
1973     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 1, -1);
1974     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 2, -2);
1975     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 4, -4);
1976     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 5, -5);
1977     test(S("abcde"), 5, 1, S("abcdefghij"), 5, 6, -5);
1978     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 0, 0);
1979     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 1, -1);
1980     test(S("abcde"), 5, 1, S("abcdefghij"), 9, 2, -1);
1981     test(S("abcde"), 5, 1, S("abcdefghij"), 10, 0, 0);
1982     test(S("abcde"), 5, 1, S("abcdefghij"), 10, 1, 0);
1983     test(S("abcde"), 5, 1, S("abcdefghij"), 11, 0, 0);
1984     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
1985     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
1986     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
1987     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
1988     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
1989     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
1990     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
1991     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
1992     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
1993     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
1994     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
1995     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
1996     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
1997     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
1998     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
1999     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2000     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2001     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2002     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
2003     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
2004     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
2005     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
2006     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
2007     test(S("abcde"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2008     test(S("abcde"), 6, 0, S(""), 0, 0, 0);
2009     test(S("abcde"), 6, 0, S(""), 0, 1, 0);
2010     test(S("abcde"), 6, 0, S(""), 1, 0, 0);
2011     test(S("abcde"), 6, 0, S("abcde"), 0, 0, 0);
2012     test(S("abcde"), 6, 0, S("abcde"), 0, 1, 0);
2013     test(S("abcde"), 6, 0, S("abcde"), 0, 2, 0);
2014     test(S("abcde"), 6, 0, S("abcde"), 0, 4, 0);
2015     test(S("abcde"), 6, 0, S("abcde"), 0, 5, 0);
2016     test(S("abcde"), 6, 0, S("abcde"), 0, 6, 0);
2017     test(S("abcde"), 6, 0, S("abcde"), 1, 0, 0);
2018     test(S("abcde"), 6, 0, S("abcde"), 1, 1, 0);
2019     test(S("abcde"), 6, 0, S("abcde"), 1, 2, 0);
2020     test(S("abcde"), 6, 0, S("abcde"), 1, 3, 0);
2021     test(S("abcde"), 6, 0, S("abcde"), 1, 4, 0);
2022     test(S("abcde"), 6, 0, S("abcde"), 1, 5, 0);
2023     test(S("abcde"), 6, 0, S("abcde"), 2, 0, 0);
2024     test(S("abcde"), 6, 0, S("abcde"), 2, 1, 0);
2025     test(S("abcde"), 6, 0, S("abcde"), 2, 2, 0);
2026     test(S("abcde"), 6, 0, S("abcde"), 2, 3, 0);
2027     test(S("abcde"), 6, 0, S("abcde"), 2, 4, 0);
2028     test(S("abcde"), 6, 0, S("abcde"), 4, 0, 0);
2029     test(S("abcde"), 6, 0, S("abcde"), 4, 1, 0);
2030     test(S("abcde"), 6, 0, S("abcde"), 4, 2, 0);
2031     test(S("abcde"), 6, 0, S("abcde"), 5, 0, 0);
2032     test(S("abcde"), 6, 0, S("abcde"), 5, 1, 0);
2033     test(S("abcde"), 6, 0, S("abcde"), 6, 0, 0);
2034     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 0, 0);
2035     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 1, 0);
2036     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 5, 0);
2037     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 9, 0);
2038     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 10, 0);
2039     test(S("abcde"), 6, 0, S("abcdefghij"), 0, 11, 0);
2040     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 0, 0);
2041     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 1, 0);
2042     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 4, 0);
2043     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 8, 0);
2044     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 9, 0);
2045     test(S("abcde"), 6, 0, S("abcdefghij"), 1, 10, 0);
2046     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 0, 0);
2047     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 1, 0);
2048     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 2, 0);
2049     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 4, 0);
2050     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 5, 0);
2051     test(S("abcde"), 6, 0, S("abcdefghij"), 5, 6, 0);
2052     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 0, 0);
2053     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 1, 0);
2054     test(S("abcde"), 6, 0, S("abcdefghij"), 9, 2, 0);
2055     test(S("abcde"), 6, 0, S("abcdefghij"), 10, 0, 0);
2056     test(S("abcde"), 6, 0, S("abcdefghij"), 10, 1, 0);
2057     test(S("abcde"), 6, 0, S("abcdefghij"), 11, 0, 0);
2058 }
2059
2060 template <class S>
2061 void test19()
2062 {
2063     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2064     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
2065     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
2066     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
2067     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
2068     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
2069     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2070     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
2071     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
2072     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
2073     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
2074     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
2075     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2076     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
2077     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
2078     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
2079     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
2080     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
2081     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2082     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
2083     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
2084     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2085     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2086     test(S("abcde"), 6, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2087     test(S("abcdefghij"), 0, 0, S(""), 0, 0, 0);
2088     test(S("abcdefghij"), 0, 0, S(""), 0, 1, 0);
2089     test(S("abcdefghij"), 0, 0, S(""), 1, 0, 0);
2090     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 0, 0);
2091     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 1, -1);
2092     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 2, -2);
2093     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 4, -4);
2094     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 5, -5);
2095     test(S("abcdefghij"), 0, 0, S("abcde"), 0, 6, -5);
2096     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 0, 0);
2097     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 1, -1);
2098     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 2, -2);
2099     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 3, -3);
2100     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 4, -4);
2101     test(S("abcdefghij"), 0, 0, S("abcde"), 1, 5, -4);
2102     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 0, 0);
2103     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 1, -1);
2104     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 2, -2);
2105     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 3, -3);
2106     test(S("abcdefghij"), 0, 0, S("abcde"), 2, 4, -3);
2107     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 0, 0);
2108     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 1, -1);
2109     test(S("abcdefghij"), 0, 0, S("abcde"), 4, 2, -1);
2110     test(S("abcdefghij"), 0, 0, S("abcde"), 5, 0, 0);
2111     test(S("abcdefghij"), 0, 0, S("abcde"), 5, 1, 0);
2112     test(S("abcdefghij"), 0, 0, S("abcde"), 6, 0, 0);
2113     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 0, 0);
2114     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 1, -1);
2115     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 5, -5);
2116     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 9, -9);
2117     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 10, -10);
2118     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 0, 11, -10);
2119     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 0, 0);
2120     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 1, -1);
2121     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 4, -4);
2122     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 8, -8);
2123     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 9, -9);
2124     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 1, 10, -9);
2125     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 0, 0);
2126     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 1, -1);
2127     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 2, -2);
2128     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 4, -4);
2129     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 5, -5);
2130     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 5, 6, -5);
2131     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 0, 0);
2132     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 1, -1);
2133     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 9, 2, -1);
2134     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 0, 0);
2135     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 10, 1, 0);
2136     test(S("abcdefghij"), 0, 0, S("abcdefghij"), 11, 0, 0);
2137     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2138     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2139     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2140     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2141     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2142     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2143     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2144     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2145     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2146     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2147     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2148     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2149     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2150     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2151     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2152     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2153     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2154     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2155     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2156     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2157     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2158     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2159     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2160     test(S("abcdefghij"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2161     test(S("abcdefghij"), 0, 1, S(""), 0, 0, 1);
2162     test(S("abcdefghij"), 0, 1, S(""), 0, 1, 1);
2163 }
2164
2165 template <class S>
2166 void test20()
2167 {
2168     test(S("abcdefghij"), 0, 1, S(""), 1, 0, 0);
2169     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 0, 1);
2170     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 1, 0);
2171     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 2, -1);
2172     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 4, -3);
2173     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 5, -4);
2174     test(S("abcdefghij"), 0, 1, S("abcde"), 0, 6, -4);
2175     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 0, 1);
2176     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 1, -1);
2177     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 2, -1);
2178     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 3, -1);
2179     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 4, -1);
2180     test(S("abcdefghij"), 0, 1, S("abcde"), 1, 5, -1);
2181     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 0, 1);
2182     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 1, -2);
2183     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 2, -2);
2184     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 3, -2);
2185     test(S("abcdefghij"), 0, 1, S("abcde"), 2, 4, -2);
2186     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 0, 1);
2187     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 1, -4);
2188     test(S("abcdefghij"), 0, 1, S("abcde"), 4, 2, -4);
2189     test(S("abcdefghij"), 0, 1, S("abcde"), 5, 0, 1);
2190     test(S("abcdefghij"), 0, 1, S("abcde"), 5, 1, 1);
2191     test(S("abcdefghij"), 0, 1, S("abcde"), 6, 0, 0);
2192     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 0, 1);
2193     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 1, 0);
2194     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 5, -4);
2195     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 9, -8);
2196     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 10, -9);
2197     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 0, 11, -9);
2198     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 0, 1);
2199     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 1, -1);
2200     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 4, -1);
2201     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 8, -1);
2202     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 9, -1);
2203     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 1, 10, -1);
2204     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 0, 1);
2205     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 1, -5);
2206     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 2, -5);
2207     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 4, -5);
2208     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 5, -5);
2209     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 5, 6, -5);
2210     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 0, 1);
2211     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 1, -9);
2212     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 9, 2, -9);
2213     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 0, 1);
2214     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 10, 1, 1);
2215     test(S("abcdefghij"), 0, 1, S("abcdefghij"), 11, 0, 0);
2216     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2217     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
2218     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
2219     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
2220     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
2221     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
2222     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2223     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
2224     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
2225     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
2226     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
2227     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
2228     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2229     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
2230     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
2231     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
2232     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
2233     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
2234     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2235     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
2236     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
2237     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2238     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2239     test(S("abcdefghij"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2240     test(S("abcdefghij"), 0, 5, S(""), 0, 0, 5);
2241     test(S("abcdefghij"), 0, 5, S(""), 0, 1, 5);
2242     test(S("abcdefghij"), 0, 5, S(""), 1, 0, 0);
2243     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 0, 5);
2244     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 1, 4);
2245     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 2, 3);
2246     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 4, 1);
2247     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 5, 0);
2248     test(S("abcdefghij"), 0, 5, S("abcde"), 0, 6, 0);
2249     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 0, 5);
2250     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 1, -1);
2251     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 2, -1);
2252     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 3, -1);
2253     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 4, -1);
2254     test(S("abcdefghij"), 0, 5, S("abcde"), 1, 5, -1);
2255     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 0, 5);
2256     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 1, -2);
2257     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 2, -2);
2258     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 3, -2);
2259     test(S("abcdefghij"), 0, 5, S("abcde"), 2, 4, -2);
2260     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 0, 5);
2261     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 1, -4);
2262     test(S("abcdefghij"), 0, 5, S("abcde"), 4, 2, -4);
2263     test(S("abcdefghij"), 0, 5, S("abcde"), 5, 0, 5);
2264     test(S("abcdefghij"), 0, 5, S("abcde"), 5, 1, 5);
2265     test(S("abcdefghij"), 0, 5, S("abcde"), 6, 0, 0);
2266     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 0, 5);
2267     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 1, 4);
2268 }
2269
2270 template <class S>
2271 void test21()
2272 {
2273     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 5, 0);
2274     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 9, -4);
2275     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 10, -5);
2276     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 0, 11, -5);
2277     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 0, 5);
2278     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 1, -1);
2279     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 4, -1);
2280     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 8, -1);
2281     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 9, -1);
2282     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 1, 10, -1);
2283     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 0, 5);
2284     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 1, -5);
2285     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 2, -5);
2286     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 4, -5);
2287     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 5, -5);
2288     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 5, 6, -5);
2289     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 0, 5);
2290     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 1, -9);
2291     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 9, 2, -9);
2292     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 0, 5);
2293     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 10, 1, 5);
2294     test(S("abcdefghij"), 0, 5, S("abcdefghij"), 11, 0, 0);
2295     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
2296     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 1, 4);
2297     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 10, -5);
2298     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 19, -14);
2299     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 20, -15);
2300     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 0, 21, -15);
2301     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
2302     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 1, -1);
2303     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 9, -1);
2304     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 18, -1);
2305     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 19, -1);
2306     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 1, 20, -1);
2307     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
2308     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 1, -10);
2309     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 5, -10);
2310     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 9, -10);
2311     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 10, -10);
2312     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 10, 11, -10);
2313     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
2314     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 1, -19);
2315     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 19, 2, -19);
2316     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
2317     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
2318     test(S("abcdefghij"), 0, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
2319     test(S("abcdefghij"), 0, 9, S(""), 0, 0, 9);
2320     test(S("abcdefghij"), 0, 9, S(""), 0, 1, 9);
2321     test(S("abcdefghij"), 0, 9, S(""), 1, 0, 0);
2322     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 0, 9);
2323     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 1, 8);
2324     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 2, 7);
2325     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 4, 5);
2326     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 5, 4);
2327     test(S("abcdefghij"), 0, 9, S("abcde"), 0, 6, 4);
2328     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 0, 9);
2329     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 1, -1);
2330     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 2, -1);
2331     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 3, -1);
2332     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 4, -1);
2333     test(S("abcdefghij"), 0, 9, S("abcde"), 1, 5, -1);
2334     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 0, 9);
2335     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 1, -2);
2336     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 2, -2);
2337     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 3, -2);
2338     test(S("abcdefghij"), 0, 9, S("abcde"), 2, 4, -2);
2339     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 0, 9);
2340     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 1, -4);
2341     test(S("abcdefghij"), 0, 9, S("abcde"), 4, 2, -4);
2342     test(S("abcdefghij"), 0, 9, S("abcde"), 5, 0, 9);
2343     test(S("abcdefghij"), 0, 9, S("abcde"), 5, 1, 9);
2344     test(S("abcdefghij"), 0, 9, S("abcde"), 6, 0, 0);
2345     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 0, 9);
2346     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 1, 8);
2347     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 5, 4);
2348     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 9, 0);
2349     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 10, -1);
2350     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 0, 11, -1);
2351     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 0, 9);
2352     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 1, -1);
2353     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 4, -1);
2354     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 8, -1);
2355     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 9, -1);
2356     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 1, 10, -1);
2357     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 0, 9);
2358     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 1, -5);
2359     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 2, -5);
2360     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 4, -5);
2361     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 5, -5);
2362     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 5, 6, -5);
2363     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 0, 9);
2364     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 1, -9);
2365     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 9, 2, -9);
2366     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 0, 9);
2367     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 10, 1, 9);
2368     test(S("abcdefghij"), 0, 9, S("abcdefghij"), 11, 0, 0);
2369     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2370     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 1, 8);
2371     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 10, -1);
2372     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 19, -10);
2373 }
2374
2375 template <class S>
2376 void test22()
2377 {
2378     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 20, -11);
2379     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 0, 21, -11);
2380     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2381     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 1, -1);
2382     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 9, -1);
2383     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 18, -1);
2384     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 19, -1);
2385     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 1, 20, -1);
2386     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2387     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 1, -10);
2388     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 5, -10);
2389     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 9, -10);
2390     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 10, -10);
2391     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 10, 11, -10);
2392     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2393     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 1, -19);
2394     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 19, 2, -19);
2395     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2396     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2397     test(S("abcdefghij"), 0, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2398     test(S("abcdefghij"), 0, 10, S(""), 0, 0, 10);
2399     test(S("abcdefghij"), 0, 10, S(""), 0, 1, 10);
2400     test(S("abcdefghij"), 0, 10, S(""), 1, 0, 0);
2401     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 0, 10);
2402     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 1, 9);
2403     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 2, 8);
2404     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 4, 6);
2405     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 5, 5);
2406     test(S("abcdefghij"), 0, 10, S("abcde"), 0, 6, 5);
2407     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 0, 10);
2408     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 1, -1);
2409     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 2, -1);
2410     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 3, -1);
2411     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 4, -1);
2412     test(S("abcdefghij"), 0, 10, S("abcde"), 1, 5, -1);
2413     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 0, 10);
2414     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 1, -2);
2415     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 2, -2);
2416     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 3, -2);
2417     test(S("abcdefghij"), 0, 10, S("abcde"), 2, 4, -2);
2418     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 0, 10);
2419     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 1, -4);
2420     test(S("abcdefghij"), 0, 10, S("abcde"), 4, 2, -4);
2421     test(S("abcdefghij"), 0, 10, S("abcde"), 5, 0, 10);
2422     test(S("abcdefghij"), 0, 10, S("abcde"), 5, 1, 10);
2423     test(S("abcdefghij"), 0, 10, S("abcde"), 6, 0, 0);
2424     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 0, 10);
2425     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 1, 9);
2426     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 5, 5);
2427     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 9, 1);
2428     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 10, 0);
2429     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 0, 11, 0);
2430     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 0, 10);
2431     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 1, -1);
2432     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 4, -1);
2433     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 8, -1);
2434     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 9, -1);
2435     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 1, 10, -1);
2436     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 0, 10);
2437     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 1, -5);
2438     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 2, -5);
2439     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 4, -5);
2440     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 5, -5);
2441     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 5, 6, -5);
2442     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 0, 10);
2443     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 1, -9);
2444     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 9, 2, -9);
2445     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 0, 10);
2446     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 10, 1, 10);
2447     test(S("abcdefghij"), 0, 10, S("abcdefghij"), 11, 0, 0);
2448     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
2449     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
2450     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
2451     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
2452     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
2453     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
2454     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
2455     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
2456     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
2457     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
2458     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
2459     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
2460     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
2461     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
2462     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
2463     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
2464     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
2465     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
2466     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
2467     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
2468     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
2469     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
2470     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
2471     test(S("abcdefghij"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
2472     test(S("abcdefghij"), 0, 11, S(""), 0, 0, 10);
2473     test(S("abcdefghij"), 0, 11, S(""), 0, 1, 10);
2474     test(S("abcdefghij"), 0, 11, S(""), 1, 0, 0);
2475     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 0, 10);
2476     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 1, 9);
2477     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 2, 8);
2478 }
2479
2480 template <class S>
2481 void test23()
2482 {
2483     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 4, 6);
2484     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 5, 5);
2485     test(S("abcdefghij"), 0, 11, S("abcde"), 0, 6, 5);
2486     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 0, 10);
2487     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 1, -1);
2488     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 2, -1);
2489     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 3, -1);
2490     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 4, -1);
2491     test(S("abcdefghij"), 0, 11, S("abcde"), 1, 5, -1);
2492     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 0, 10);
2493     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 1, -2);
2494     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 2, -2);
2495     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 3, -2);
2496     test(S("abcdefghij"), 0, 11, S("abcde"), 2, 4, -2);
2497     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 0, 10);
2498     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 1, -4);
2499     test(S("abcdefghij"), 0, 11, S("abcde"), 4, 2, -4);
2500     test(S("abcdefghij"), 0, 11, S("abcde"), 5, 0, 10);
2501     test(S("abcdefghij"), 0, 11, S("abcde"), 5, 1, 10);
2502     test(S("abcdefghij"), 0, 11, S("abcde"), 6, 0, 0);
2503     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 0, 10);
2504     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 1, 9);
2505     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 5, 5);
2506     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 9, 1);
2507     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 10, 0);
2508     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 0, 11, 0);
2509     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 0, 10);
2510     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 1, -1);
2511     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 4, -1);
2512     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 8, -1);
2513     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 9, -1);
2514     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 1, 10, -1);
2515     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 0, 10);
2516     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 1, -5);
2517     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 2, -5);
2518     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 4, -5);
2519     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 5, -5);
2520     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 5, 6, -5);
2521     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 0, 10);
2522     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 1, -9);
2523     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 9, 2, -9);
2524     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 0, 10);
2525     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 10, 1, 10);
2526     test(S("abcdefghij"), 0, 11, S("abcdefghij"), 11, 0, 0);
2527     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
2528     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 1, 9);
2529     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 10, 0);
2530     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 19, -9);
2531     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 20, -10);
2532     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 0, 21, -10);
2533     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
2534     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 1, -1);
2535     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 9, -1);
2536     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 18, -1);
2537     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 19, -1);
2538     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 1, 20, -1);
2539     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
2540     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 1, -10);
2541     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 5, -10);
2542     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 9, -10);
2543     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 10, -10);
2544     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 10, 11, -10);
2545     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
2546     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 1, -19);
2547     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 19, 2, -19);
2548     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
2549     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
2550     test(S("abcdefghij"), 0, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
2551     test(S("abcdefghij"), 1, 0, S(""), 0, 0, 0);
2552     test(S("abcdefghij"), 1, 0, S(""), 0, 1, 0);
2553     test(S("abcdefghij"), 1, 0, S(""), 1, 0, 0);
2554     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 0, 0);
2555     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 1, -1);
2556     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 2, -2);
2557     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 4, -4);
2558     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 5, -5);
2559     test(S("abcdefghij"), 1, 0, S("abcde"), 0, 6, -5);
2560     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 0, 0);
2561     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 1, -1);
2562     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 2, -2);
2563     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 3, -3);
2564     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 4, -4);
2565     test(S("abcdefghij"), 1, 0, S("abcde"), 1, 5, -4);
2566     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 0, 0);
2567     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 1, -1);
2568     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 2, -2);
2569     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 3, -3);
2570     test(S("abcdefghij"), 1, 0, S("abcde"), 2, 4, -3);
2571     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 0, 0);
2572     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 1, -1);
2573     test(S("abcdefghij"), 1, 0, S("abcde"), 4, 2, -1);
2574     test(S("abcdefghij"), 1, 0, S("abcde"), 5, 0, 0);
2575     test(S("abcdefghij"), 1, 0, S("abcde"), 5, 1, 0);
2576     test(S("abcdefghij"), 1, 0, S("abcde"), 6, 0, 0);
2577     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 0, 0);
2578     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 1, -1);
2579     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 5, -5);
2580     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 9, -9);
2581     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 10, -10);
2582     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 0, 11, -10);
2583 }
2584
2585 template <class S>
2586 void test24()
2587 {
2588     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 0, 0);
2589     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 1, -1);
2590     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 4, -4);
2591     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 8, -8);
2592     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 9, -9);
2593     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 1, 10, -9);
2594     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 0, 0);
2595     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 1, -1);
2596     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 2, -2);
2597     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 4, -4);
2598     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 5, -5);
2599     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 5, 6, -5);
2600     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 0, 0);
2601     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 1, -1);
2602     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 9, 2, -1);
2603     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 0, 0);
2604     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 10, 1, 0);
2605     test(S("abcdefghij"), 1, 0, S("abcdefghij"), 11, 0, 0);
2606     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
2607     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
2608     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
2609     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
2610     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
2611     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
2612     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
2613     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
2614     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
2615     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
2616     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
2617     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
2618     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
2619     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
2620     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
2621     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
2622     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
2623     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
2624     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
2625     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
2626     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
2627     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
2628     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
2629     test(S("abcdefghij"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
2630     test(S("abcdefghij"), 1, 1, S(""), 0, 0, 1);
2631     test(S("abcdefghij"), 1, 1, S(""), 0, 1, 1);
2632     test(S("abcdefghij"), 1, 1, S(""), 1, 0, 0);
2633     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 0, 1);
2634     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 1, 1);
2635     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 2, 1);
2636     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 4, 1);
2637     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 5, 1);
2638     test(S("abcdefghij"), 1, 1, S("abcde"), 0, 6, 1);
2639     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 0, 1);
2640     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 1, 0);
2641     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 2, -1);
2642     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 3, -2);
2643     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 4, -3);
2644     test(S("abcdefghij"), 1, 1, S("abcde"), 1, 5, -3);
2645     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 0, 1);
2646     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 1, -1);
2647     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 2, -1);
2648     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 3, -1);
2649     test(S("abcdefghij"), 1, 1, S("abcde"), 2, 4, -1);
2650     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 0, 1);
2651     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 1, -3);
2652     test(S("abcdefghij"), 1, 1, S("abcde"), 4, 2, -3);
2653     test(S("abcdefghij"), 1, 1, S("abcde"), 5, 0, 1);
2654     test(S("abcdefghij"), 1, 1, S("abcde"), 5, 1, 1);
2655     test(S("abcdefghij"), 1, 1, S("abcde"), 6, 0, 0);
2656     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 0, 1);
2657     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 1, 1);
2658     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 5, 1);
2659     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 9, 1);
2660     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 10, 1);
2661     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 0, 11, 1);
2662     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 0, 1);
2663     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 1, 0);
2664     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 4, -3);
2665     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 8, -7);
2666     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 9, -8);
2667     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 1, 10, -8);
2668     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 0, 1);
2669     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 1, -4);
2670     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 2, -4);
2671     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 4, -4);
2672     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 5, -4);
2673     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 5, 6, -4);
2674     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 0, 1);
2675     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 1, -8);
2676     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 9, 2, -8);
2677     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 0, 1);
2678     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 10, 1, 1);
2679     test(S("abcdefghij"), 1, 1, S("abcdefghij"), 11, 0, 0);
2680     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
2681     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
2682     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
2683     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
2684     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
2685     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
2686     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
2687     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
2688 }
2689
2690 template <class S>
2691 void test25()
2692 {
2693     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
2694     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
2695     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
2696     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
2697     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
2698     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
2699     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
2700     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
2701     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
2702     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
2703     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
2704     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
2705     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
2706     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
2707     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
2708     test(S("abcdefghij"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
2709     test(S("abcdefghij"), 1, 4, S(""), 0, 0, 4);
2710     test(S("abcdefghij"), 1, 4, S(""), 0, 1, 4);
2711     test(S("abcdefghij"), 1, 4, S(""), 1, 0, 0);
2712     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 0, 4);
2713     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 1, 1);
2714     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 2, 1);
2715     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 4, 1);
2716     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 5, 1);
2717     test(S("abcdefghij"), 1, 4, S("abcde"), 0, 6, 1);
2718     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 0, 4);
2719     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 1, 3);
2720     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 2, 2);
2721     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 3, 1);
2722     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 4, 0);
2723     test(S("abcdefghij"), 1, 4, S("abcde"), 1, 5, 0);
2724     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 0, 4);
2725     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 1, -1);
2726     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 2, -1);
2727     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 3, -1);
2728     test(S("abcdefghij"), 1, 4, S("abcde"), 2, 4, -1);
2729     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 0, 4);
2730     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 1, -3);
2731     test(S("abcdefghij"), 1, 4, S("abcde"), 4, 2, -3);
2732     test(S("abcdefghij"), 1, 4, S("abcde"), 5, 0, 4);
2733     test(S("abcdefghij"), 1, 4, S("abcde"), 5, 1, 4);
2734     test(S("abcdefghij"), 1, 4, S("abcde"), 6, 0, 0);
2735     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 0, 4);
2736     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 1, 1);
2737     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 5, 1);
2738     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 9, 1);
2739     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 10, 1);
2740     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 0, 11, 1);
2741     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 0, 4);
2742     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 1, 3);
2743     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 4, 0);
2744     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 8, -4);
2745     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 9, -5);
2746     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 1, 10, -5);
2747     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 0, 4);
2748     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 1, -4);
2749     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 2, -4);
2750     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 4, -4);
2751     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 5, -4);
2752     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 5, 6, -4);
2753     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 0, 4);
2754     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 1, -8);
2755     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 9, 2, -8);
2756     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 0, 4);
2757     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 10, 1, 4);
2758     test(S("abcdefghij"), 1, 4, S("abcdefghij"), 11, 0, 0);
2759     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
2760     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 1, 1);
2761     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 10, 1);
2762     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 19, 1);
2763     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 20, 1);
2764     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 0, 21, 1);
2765     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
2766     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 1, 3);
2767     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 9, -5);
2768     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 18, -14);
2769     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 19, -15);
2770     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 1, 20, -15);
2771     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
2772     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 1, -9);
2773     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 5, -9);
2774     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 9, -9);
2775     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 10, -9);
2776     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 10, 11, -9);
2777     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
2778     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 1, -18);
2779     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 19, 2, -18);
2780     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
2781     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
2782     test(S("abcdefghij"), 1, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
2783     test(S("abcdefghij"), 1, 8, S(""), 0, 0, 8);
2784     test(S("abcdefghij"), 1, 8, S(""), 0, 1, 8);
2785     test(S("abcdefghij"), 1, 8, S(""), 1, 0, 0);
2786     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 0, 8);
2787     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 1, 1);
2788     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 2, 1);
2789     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 4, 1);
2790     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 5, 1);
2791     test(S("abcdefghij"), 1, 8, S("abcde"), 0, 6, 1);
2792     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 0, 8);
2793 }
2794
2795 template <class S>
2796 void test26()
2797 {
2798     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 1, 7);
2799     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 2, 6);
2800     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 3, 5);
2801     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 4, 4);
2802     test(S("abcdefghij"), 1, 8, S("abcde"), 1, 5, 4);
2803     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 0, 8);
2804     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 1, -1);
2805     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 2, -1);
2806     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 3, -1);
2807     test(S("abcdefghij"), 1, 8, S("abcde"), 2, 4, -1);
2808     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 0, 8);
2809     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 1, -3);
2810     test(S("abcdefghij"), 1, 8, S("abcde"), 4, 2, -3);
2811     test(S("abcdefghij"), 1, 8, S("abcde"), 5, 0, 8);
2812     test(S("abcdefghij"), 1, 8, S("abcde"), 5, 1, 8);
2813     test(S("abcdefghij"), 1, 8, S("abcde"), 6, 0, 0);
2814     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 0, 8);
2815     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 1, 1);
2816     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 5, 1);
2817     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 9, 1);
2818     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 10, 1);
2819     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 0, 11, 1);
2820     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 0, 8);
2821     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 1, 7);
2822     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 4, 4);
2823     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 8, 0);
2824     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 9, -1);
2825     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 1, 10, -1);
2826     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 0, 8);
2827     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 1, -4);
2828     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 2, -4);
2829     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 4, -4);
2830     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 5, -4);
2831     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 5, 6, -4);
2832     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 0, 8);
2833     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 1, -8);
2834     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 9, 2, -8);
2835     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 0, 8);
2836     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 10, 1, 8);
2837     test(S("abcdefghij"), 1, 8, S("abcdefghij"), 11, 0, 0);
2838     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 0, 8);
2839     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 1, 1);
2840     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 10, 1);
2841     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 19, 1);
2842     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 20, 1);
2843     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 0, 21, 1);
2844     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 0, 8);
2845     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 1, 7);
2846     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 9, -1);
2847     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 18, -10);
2848     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 19, -11);
2849     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 1, 20, -11);
2850     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 0, 8);
2851     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 1, -9);
2852     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 5, -9);
2853     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 9, -9);
2854     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 10, -9);
2855     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 10, 11, -9);
2856     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 0, 8);
2857     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 1, -18);
2858     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 19, 2, -18);
2859     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 0, 8);
2860     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 20, 1, 8);
2861     test(S("abcdefghij"), 1, 8, S("abcdefghijklmnopqrst"), 21, 0, 0);
2862     test(S("abcdefghij"), 1, 9, S(""), 0, 0, 9);
2863     test(S("abcdefghij"), 1, 9, S(""), 0, 1, 9);
2864     test(S("abcdefghij"), 1, 9, S(""), 1, 0, 0);
2865     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 0, 9);
2866     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 1, 1);
2867     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 2, 1);
2868     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 4, 1);
2869     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 5, 1);
2870     test(S("abcdefghij"), 1, 9, S("abcde"), 0, 6, 1);
2871     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 0, 9);
2872     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 1, 8);
2873     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 2, 7);
2874     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 3, 6);
2875     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 4, 5);
2876     test(S("abcdefghij"), 1, 9, S("abcde"), 1, 5, 5);
2877     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 0, 9);
2878     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 1, -1);
2879     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 2, -1);
2880     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 3, -1);
2881     test(S("abcdefghij"), 1, 9, S("abcde"), 2, 4, -1);
2882     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 0, 9);
2883     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 1, -3);
2884     test(S("abcdefghij"), 1, 9, S("abcde"), 4, 2, -3);
2885     test(S("abcdefghij"), 1, 9, S("abcde"), 5, 0, 9);
2886     test(S("abcdefghij"), 1, 9, S("abcde"), 5, 1, 9);
2887     test(S("abcdefghij"), 1, 9, S("abcde"), 6, 0, 0);
2888     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 0, 9);
2889     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 1, 1);
2890     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 5, 1);
2891     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 9, 1);
2892     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 10, 1);
2893     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 0, 11, 1);
2894     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 0, 9);
2895     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 1, 8);
2896     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 4, 5);
2897     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 8, 1);
2898 }
2899
2900 template <class S>
2901 void test27()
2902 {
2903     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 9, 0);
2904     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 1, 10, 0);
2905     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 0, 9);
2906     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 1, -4);
2907     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 2, -4);
2908     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 4, -4);
2909     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 5, -4);
2910     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 5, 6, -4);
2911     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 0, 9);
2912     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 1, -8);
2913     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 9, 2, -8);
2914     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 0, 9);
2915     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 10, 1, 9);
2916     test(S("abcdefghij"), 1, 9, S("abcdefghij"), 11, 0, 0);
2917     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
2918     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
2919     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
2920     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
2921     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
2922     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
2923     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
2924     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
2925     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
2926     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
2927     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
2928     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
2929     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
2930     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
2931     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
2932     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
2933     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
2934     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
2935     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
2936     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
2937     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
2938     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
2939     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
2940     test(S("abcdefghij"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
2941     test(S("abcdefghij"), 1, 10, S(""), 0, 0, 9);
2942     test(S("abcdefghij"), 1, 10, S(""), 0, 1, 9);
2943     test(S("abcdefghij"), 1, 10, S(""), 1, 0, 0);
2944     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 0, 9);
2945     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 1, 1);
2946     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 2, 1);
2947     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 4, 1);
2948     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 5, 1);
2949     test(S("abcdefghij"), 1, 10, S("abcde"), 0, 6, 1);
2950     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 0, 9);
2951     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 1, 8);
2952     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 2, 7);
2953     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 3, 6);
2954     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 4, 5);
2955     test(S("abcdefghij"), 1, 10, S("abcde"), 1, 5, 5);
2956     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 0, 9);
2957     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 1, -1);
2958     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 2, -1);
2959     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 3, -1);
2960     test(S("abcdefghij"), 1, 10, S("abcde"), 2, 4, -1);
2961     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 0, 9);
2962     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 1, -3);
2963     test(S("abcdefghij"), 1, 10, S("abcde"), 4, 2, -3);
2964     test(S("abcdefghij"), 1, 10, S("abcde"), 5, 0, 9);
2965     test(S("abcdefghij"), 1, 10, S("abcde"), 5, 1, 9);
2966     test(S("abcdefghij"), 1, 10, S("abcde"), 6, 0, 0);
2967     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 0, 9);
2968     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 1, 1);
2969     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 5, 1);
2970     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 9, 1);
2971     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 10, 1);
2972     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 0, 11, 1);
2973     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 0, 9);
2974     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 1, 8);
2975     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 4, 5);
2976     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 8, 1);
2977     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 9, 0);
2978     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 1, 10, 0);
2979     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 0, 9);
2980     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 1, -4);
2981     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 2, -4);
2982     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 4, -4);
2983     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 5, -4);
2984     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 5, 6, -4);
2985     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 0, 9);
2986     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 1, -8);
2987     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 9, 2, -8);
2988     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 0, 9);
2989     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 10, 1, 9);
2990     test(S("abcdefghij"), 1, 10, S("abcdefghij"), 11, 0, 0);
2991     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 0, 9);
2992     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 1, 1);
2993     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 10, 1);
2994     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 19, 1);
2995     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 20, 1);
2996     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 0, 21, 1);
2997     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 0, 9);
2998     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 1, 8);
2999     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 9, 0);
3000     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 18, -9);
3001     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 19, -10);
3002     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 1, 20, -10);
3003 }
3004
3005 template <class S>
3006 void test28()
3007 {
3008     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 0, 9);
3009     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 1, -9);
3010     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 5, -9);
3011     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 9, -9);
3012     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 10, -9);
3013     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 10, 11, -9);
3014     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 0, 9);
3015     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 1, -18);
3016     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 19, 2, -18);
3017     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 0, 9);
3018     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 20, 1, 9);
3019     test(S("abcdefghij"), 1, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
3020     test(S("abcdefghij"), 5, 0, S(""), 0, 0, 0);
3021     test(S("abcdefghij"), 5, 0, S(""), 0, 1, 0);
3022     test(S("abcdefghij"), 5, 0, S(""), 1, 0, 0);
3023     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 0, 0);
3024     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 1, -1);
3025     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 2, -2);
3026     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 4, -4);
3027     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 5, -5);
3028     test(S("abcdefghij"), 5, 0, S("abcde"), 0, 6, -5);
3029     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 0, 0);
3030     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 1, -1);
3031     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 2, -2);
3032     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 3, -3);
3033     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 4, -4);
3034     test(S("abcdefghij"), 5, 0, S("abcde"), 1, 5, -4);
3035     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 0, 0);
3036     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 1, -1);
3037     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 2, -2);
3038     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 3, -3);
3039     test(S("abcdefghij"), 5, 0, S("abcde"), 2, 4, -3);
3040     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 0, 0);
3041     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 1, -1);
3042     test(S("abcdefghij"), 5, 0, S("abcde"), 4, 2, -1);
3043     test(S("abcdefghij"), 5, 0, S("abcde"), 5, 0, 0);
3044     test(S("abcdefghij"), 5, 0, S("abcde"), 5, 1, 0);
3045     test(S("abcdefghij"), 5, 0, S("abcde"), 6, 0, 0);
3046     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 0, 0);
3047     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 1, -1);
3048     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 5, -5);
3049     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 9, -9);
3050     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 10, -10);
3051     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 0, 11, -10);
3052     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 0, 0);
3053     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 1, -1);
3054     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 4, -4);
3055     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 8, -8);
3056     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 9, -9);
3057     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 1, 10, -9);
3058     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 0, 0);
3059     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 1, -1);
3060     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 2, -2);
3061     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 4, -4);
3062     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 5, -5);
3063     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 5, 6, -5);
3064     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 0, 0);
3065     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 1, -1);
3066     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 9, 2, -1);
3067     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 0, 0);
3068     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 10, 1, 0);
3069     test(S("abcdefghij"), 5, 0, S("abcdefghij"), 11, 0, 0);
3070     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3071     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3072     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3073     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3074     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3075     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3076     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3077     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3078     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3079     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3080     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3081     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3082     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3083     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3084     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3085     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3086     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3087     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3088     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3089     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3090     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3091     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3092     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3093     test(S("abcdefghij"), 5, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3094     test(S("abcdefghij"), 5, 1, S(""), 0, 0, 1);
3095     test(S("abcdefghij"), 5, 1, S(""), 0, 1, 1);
3096     test(S("abcdefghij"), 5, 1, S(""), 1, 0, 0);
3097     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 0, 1);
3098     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 1, 5);
3099     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 2, 5);
3100     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 4, 5);
3101     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 5, 5);
3102     test(S("abcdefghij"), 5, 1, S("abcde"), 0, 6, 5);
3103     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 0, 1);
3104     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 1, 4);
3105     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 2, 4);
3106     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 3, 4);
3107     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 4, 4);
3108 }
3109
3110 template <class S>
3111 void test29()
3112 {
3113     test(S("abcdefghij"), 5, 1, S("abcde"), 1, 5, 4);
3114     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 0, 1);
3115     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 1, 3);
3116     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 2, 3);
3117     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 3, 3);
3118     test(S("abcdefghij"), 5, 1, S("abcde"), 2, 4, 3);
3119     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 0, 1);
3120     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 1, 1);
3121     test(S("abcdefghij"), 5, 1, S("abcde"), 4, 2, 1);
3122     test(S("abcdefghij"), 5, 1, S("abcde"), 5, 0, 1);
3123     test(S("abcdefghij"), 5, 1, S("abcde"), 5, 1, 1);
3124     test(S("abcdefghij"), 5, 1, S("abcde"), 6, 0, 0);
3125     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 0, 1);
3126     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 1, 5);
3127     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 5, 5);
3128     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 9, 5);
3129     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 10, 5);
3130     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 0, 11, 5);
3131     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 0, 1);
3132     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 1, 4);
3133     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 4, 4);
3134     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 8, 4);
3135     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 9, 4);
3136     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 1, 10, 4);
3137     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 0, 1);
3138     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 1, 0);
3139     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 2, -1);
3140     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 4, -3);
3141     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 5, -4);
3142     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 5, 6, -4);
3143     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 0, 1);
3144     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 1, -4);
3145     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 9, 2, -4);
3146     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 0, 1);
3147     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 10, 1, 1);
3148     test(S("abcdefghij"), 5, 1, S("abcdefghij"), 11, 0, 0);
3149     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3150     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 1, 5);
3151     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 10, 5);
3152     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 19, 5);
3153     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 20, 5);
3154     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 0, 21, 5);
3155     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3156     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 1, 4);
3157     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 9, 4);
3158     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 18, 4);
3159     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 19, 4);
3160     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 1, 20, 4);
3161     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3162     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 1, -5);
3163     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3164     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 9, -5);
3165     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 10, -5);
3166     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 10, 11, -5);
3167     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3168     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 1, -14);
3169     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 19, 2, -14);
3170     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3171     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3172     test(S("abcdefghij"), 5, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3173     test(S("abcdefghij"), 5, 2, S(""), 0, 0, 2);
3174     test(S("abcdefghij"), 5, 2, S(""), 0, 1, 2);
3175     test(S("abcdefghij"), 5, 2, S(""), 1, 0, 0);
3176     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 0, 2);
3177     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 1, 5);
3178     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 2, 5);
3179     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 4, 5);
3180     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 5, 5);
3181     test(S("abcdefghij"), 5, 2, S("abcde"), 0, 6, 5);
3182     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 0, 2);
3183     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 1, 4);
3184     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 2, 4);
3185     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 3, 4);
3186     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 4, 4);
3187     test(S("abcdefghij"), 5, 2, S("abcde"), 1, 5, 4);
3188     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 0, 2);
3189     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 1, 3);
3190     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 2, 3);
3191     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 3, 3);
3192     test(S("abcdefghij"), 5, 2, S("abcde"), 2, 4, 3);
3193     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 0, 2);
3194     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 1, 1);
3195     test(S("abcdefghij"), 5, 2, S("abcde"), 4, 2, 1);
3196     test(S("abcdefghij"), 5, 2, S("abcde"), 5, 0, 2);
3197     test(S("abcdefghij"), 5, 2, S("abcde"), 5, 1, 2);
3198     test(S("abcdefghij"), 5, 2, S("abcde"), 6, 0, 0);
3199     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 0, 2);
3200     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 1, 5);
3201     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 5, 5);
3202     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 9, 5);
3203     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 10, 5);
3204     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 0, 11, 5);
3205     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 0, 2);
3206     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 1, 4);
3207     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 4, 4);
3208     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 8, 4);
3209     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 9, 4);
3210     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 1, 10, 4);
3211     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 0, 2);
3212     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 1, 1);
3213 }
3214
3215 template <class S>
3216 void test30()
3217 {
3218     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 2, 0);
3219     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 4, -2);
3220     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 5, -3);
3221     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 5, 6, -3);
3222     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 0, 2);
3223     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 1, -4);
3224     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 9, 2, -4);
3225     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 0, 2);
3226     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 10, 1, 2);
3227     test(S("abcdefghij"), 5, 2, S("abcdefghij"), 11, 0, 0);
3228     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 0, 2);
3229     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 1, 5);
3230     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 10, 5);
3231     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 19, 5);
3232     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 20, 5);
3233     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 0, 21, 5);
3234     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 0, 2);
3235     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 1, 4);
3236     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 9, 4);
3237     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 18, 4);
3238     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 19, 4);
3239     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 1, 20, 4);
3240     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 0, 2);
3241     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 1, -5);
3242     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 5, -5);
3243     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 9, -5);
3244     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 10, -5);
3245     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 10, 11, -5);
3246     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 0, 2);
3247     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 1, -14);
3248     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 19, 2, -14);
3249     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 0, 2);
3250     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 20, 1, 2);
3251     test(S("abcdefghij"), 5, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3252     test(S("abcdefghij"), 5, 4, S(""), 0, 0, 4);
3253     test(S("abcdefghij"), 5, 4, S(""), 0, 1, 4);
3254     test(S("abcdefghij"), 5, 4, S(""), 1, 0, 0);
3255     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 0, 4);
3256     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 1, 5);
3257     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 2, 5);
3258     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 4, 5);
3259     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 5, 5);
3260     test(S("abcdefghij"), 5, 4, S("abcde"), 0, 6, 5);
3261     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 0, 4);
3262     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 1, 4);
3263     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 2, 4);
3264     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 3, 4);
3265     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 4, 4);
3266     test(S("abcdefghij"), 5, 4, S("abcde"), 1, 5, 4);
3267     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 0, 4);
3268     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 1, 3);
3269     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 2, 3);
3270     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 3, 3);
3271     test(S("abcdefghij"), 5, 4, S("abcde"), 2, 4, 3);
3272     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 0, 4);
3273     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 1, 1);
3274     test(S("abcdefghij"), 5, 4, S("abcde"), 4, 2, 1);
3275     test(S("abcdefghij"), 5, 4, S("abcde"), 5, 0, 4);
3276     test(S("abcdefghij"), 5, 4, S("abcde"), 5, 1, 4);
3277     test(S("abcdefghij"), 5, 4, S("abcde"), 6, 0, 0);
3278     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 0, 4);
3279     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 1, 5);
3280     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 5, 5);
3281     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 9, 5);
3282     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 10, 5);
3283     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 0, 11, 5);
3284     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 0, 4);
3285     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 1, 4);
3286     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 4, 4);
3287     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 8, 4);
3288     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 9, 4);
3289     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 1, 10, 4);
3290     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 0, 4);
3291     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 1, 3);
3292     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 2, 2);
3293     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 4, 0);
3294     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 5, -1);
3295     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 5, 6, -1);
3296     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 0, 4);
3297     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 1, -4);
3298     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 9, 2, -4);
3299     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 0, 4);
3300     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 10, 1, 4);
3301     test(S("abcdefghij"), 5, 4, S("abcdefghij"), 11, 0, 0);
3302     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 0, 4);
3303     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 1, 5);
3304     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 10, 5);
3305     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 19, 5);
3306     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 20, 5);
3307     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 0, 21, 5);
3308     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 0, 4);
3309     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 1, 4);
3310     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 9, 4);
3311     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 18, 4);
3312     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 19, 4);
3313     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 1, 20, 4);
3314     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 0, 4);
3315     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 1, -5);
3316     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 5, -5);
3317     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 9, -5);
3318 }
3319
3320 template <class S>
3321 void test31()
3322 {
3323     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 10, -5);
3324     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 10, 11, -5);
3325     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 0, 4);
3326     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 1, -14);
3327     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 19, 2, -14);
3328     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 0, 4);
3329     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 20, 1, 4);
3330     test(S("abcdefghij"), 5, 4, S("abcdefghijklmnopqrst"), 21, 0, 0);
3331     test(S("abcdefghij"), 5, 5, S(""), 0, 0, 5);
3332     test(S("abcdefghij"), 5, 5, S(""), 0, 1, 5);
3333     test(S("abcdefghij"), 5, 5, S(""), 1, 0, 0);
3334     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 0, 5);
3335     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 1, 5);
3336     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 2, 5);
3337     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 4, 5);
3338     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 5, 5);
3339     test(S("abcdefghij"), 5, 5, S("abcde"), 0, 6, 5);
3340     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 0, 5);
3341     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 1, 4);
3342     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 2, 4);
3343     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 3, 4);
3344     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 4, 4);
3345     test(S("abcdefghij"), 5, 5, S("abcde"), 1, 5, 4);
3346     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 0, 5);
3347     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 1, 3);
3348     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 2, 3);
3349     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 3, 3);
3350     test(S("abcdefghij"), 5, 5, S("abcde"), 2, 4, 3);
3351     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 0, 5);
3352     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 1, 1);
3353     test(S("abcdefghij"), 5, 5, S("abcde"), 4, 2, 1);
3354     test(S("abcdefghij"), 5, 5, S("abcde"), 5, 0, 5);
3355     test(S("abcdefghij"), 5, 5, S("abcde"), 5, 1, 5);
3356     test(S("abcdefghij"), 5, 5, S("abcde"), 6, 0, 0);
3357     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 0, 5);
3358     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 1, 5);
3359     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 5, 5);
3360     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 9, 5);
3361     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 10, 5);
3362     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 0, 11, 5);
3363     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 0, 5);
3364     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 1, 4);
3365     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 4, 4);
3366     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 8, 4);
3367     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 9, 4);
3368     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 1, 10, 4);
3369     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 0, 5);
3370     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 1, 4);
3371     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 2, 3);
3372     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 4, 1);
3373     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 5, 0);
3374     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 5, 6, 0);
3375     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 0, 5);
3376     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 1, -4);
3377     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 9, 2, -4);
3378     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 0, 5);
3379     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 10, 1, 5);
3380     test(S("abcdefghij"), 5, 5, S("abcdefghij"), 11, 0, 0);
3381     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
3382     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 1, 5);
3383     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 10, 5);
3384     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 19, 5);
3385     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 20, 5);
3386     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 0, 21, 5);
3387     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
3388     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 1, 4);
3389     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 9, 4);
3390     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 18, 4);
3391     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 19, 4);
3392     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 1, 20, 4);
3393     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
3394     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 1, -5);
3395     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 5, -5);
3396     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 9, -5);
3397     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
3398     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
3399     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
3400     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 1, -14);
3401     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 19, 2, -14);
3402     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
3403     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
3404     test(S("abcdefghij"), 5, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
3405     test(S("abcdefghij"), 5, 6, S(""), 0, 0, 5);
3406     test(S("abcdefghij"), 5, 6, S(""), 0, 1, 5);
3407     test(S("abcdefghij"), 5, 6, S(""), 1, 0, 0);
3408     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 0, 5);
3409     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 1, 5);
3410     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 2, 5);
3411     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 4, 5);
3412     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 5, 5);
3413     test(S("abcdefghij"), 5, 6, S("abcde"), 0, 6, 5);
3414     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 0, 5);
3415     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 1, 4);
3416     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 2, 4);
3417     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 3, 4);
3418     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 4, 4);
3419     test(S("abcdefghij"), 5, 6, S("abcde"), 1, 5, 4);
3420     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 0, 5);
3421     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 1, 3);
3422     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 2, 3);
3423 }
3424
3425 template <class S>
3426 void test32()
3427 {
3428     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 3, 3);
3429     test(S("abcdefghij"), 5, 6, S("abcde"), 2, 4, 3);
3430     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 0, 5);
3431     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 1, 1);
3432     test(S("abcdefghij"), 5, 6, S("abcde"), 4, 2, 1);
3433     test(S("abcdefghij"), 5, 6, S("abcde"), 5, 0, 5);
3434     test(S("abcdefghij"), 5, 6, S("abcde"), 5, 1, 5);
3435     test(S("abcdefghij"), 5, 6, S("abcde"), 6, 0, 0);
3436     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 0, 5);
3437     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 1, 5);
3438     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 5, 5);
3439     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 9, 5);
3440     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 10, 5);
3441     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 0, 11, 5);
3442     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 0, 5);
3443     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 1, 4);
3444     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 4, 4);
3445     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 8, 4);
3446     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 9, 4);
3447     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 1, 10, 4);
3448     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 0, 5);
3449     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 1, 4);
3450     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 2, 3);
3451     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 4, 1);
3452     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 5, 0);
3453     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 5, 6, 0);
3454     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 0, 5);
3455     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 1, -4);
3456     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 9, 2, -4);
3457     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 0, 5);
3458     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 10, 1, 5);
3459     test(S("abcdefghij"), 5, 6, S("abcdefghij"), 11, 0, 0);
3460     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 0, 5);
3461     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 1, 5);
3462     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 10, 5);
3463     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 19, 5);
3464     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 20, 5);
3465     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 0, 21, 5);
3466     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 0, 5);
3467     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 1, 4);
3468     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 9, 4);
3469     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 18, 4);
3470     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 19, 4);
3471     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 1, 20, 4);
3472     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 0, 5);
3473     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 1, -5);
3474     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 5, -5);
3475     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 9, -5);
3476     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 10, -5);
3477     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 10, 11, -5);
3478     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 0, 5);
3479     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 1, -14);
3480     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 19, 2, -14);
3481     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 0, 5);
3482     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 20, 1, 5);
3483     test(S("abcdefghij"), 5, 6, S("abcdefghijklmnopqrst"), 21, 0, 0);
3484     test(S("abcdefghij"), 9, 0, S(""), 0, 0, 0);
3485     test(S("abcdefghij"), 9, 0, S(""), 0, 1, 0);
3486     test(S("abcdefghij"), 9, 0, S(""), 1, 0, 0);
3487     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 0, 0);
3488     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 1, -1);
3489     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 2, -2);
3490     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 4, -4);
3491     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 5, -5);
3492     test(S("abcdefghij"), 9, 0, S("abcde"), 0, 6, -5);
3493     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 0, 0);
3494     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 1, -1);
3495     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 2, -2);
3496     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 3, -3);
3497     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 4, -4);
3498     test(S("abcdefghij"), 9, 0, S("abcde"), 1, 5, -4);
3499     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 0, 0);
3500     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 1, -1);
3501     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 2, -2);
3502     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 3, -3);
3503     test(S("abcdefghij"), 9, 0, S("abcde"), 2, 4, -3);
3504     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 0, 0);
3505     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 1, -1);
3506     test(S("abcdefghij"), 9, 0, S("abcde"), 4, 2, -1);
3507     test(S("abcdefghij"), 9, 0, S("abcde"), 5, 0, 0);
3508     test(S("abcdefghij"), 9, 0, S("abcde"), 5, 1, 0);
3509     test(S("abcdefghij"), 9, 0, S("abcde"), 6, 0, 0);
3510     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 0, 0);
3511     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 1, -1);
3512     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 5, -5);
3513     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 9, -9);
3514     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 10, -10);
3515     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 0, 11, -10);
3516     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 0, 0);
3517     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 1, -1);
3518     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 4, -4);
3519     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 8, -8);
3520     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 9, -9);
3521     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 1, 10, -9);
3522     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 0, 0);
3523     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 1, -1);
3524     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 2, -2);
3525     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 4, -4);
3526     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 5, -5);
3527     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 5, 6, -5);
3528 }
3529
3530 template <class S>
3531 void test33()
3532 {
3533     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 0, 0);
3534     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 1, -1);
3535     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 9, 2, -1);
3536     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 0, 0);
3537     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 10, 1, 0);
3538     test(S("abcdefghij"), 9, 0, S("abcdefghij"), 11, 0, 0);
3539     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3540     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3541     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3542     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3543     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3544     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3545     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3546     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3547     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3548     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3549     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3550     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3551     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3552     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3553     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3554     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3555     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3556     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3557     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3558     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3559     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3560     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3561     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3562     test(S("abcdefghij"), 9, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3563     test(S("abcdefghij"), 9, 1, S(""), 0, 0, 1);
3564     test(S("abcdefghij"), 9, 1, S(""), 0, 1, 1);
3565     test(S("abcdefghij"), 9, 1, S(""), 1, 0, 0);
3566     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 0, 1);
3567     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 1, 9);
3568     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 2, 9);
3569     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 4, 9);
3570     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 5, 9);
3571     test(S("abcdefghij"), 9, 1, S("abcde"), 0, 6, 9);
3572     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 0, 1);
3573     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 1, 8);
3574     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 2, 8);
3575     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 3, 8);
3576     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 4, 8);
3577     test(S("abcdefghij"), 9, 1, S("abcde"), 1, 5, 8);
3578     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 0, 1);
3579     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 1, 7);
3580     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 2, 7);
3581     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 3, 7);
3582     test(S("abcdefghij"), 9, 1, S("abcde"), 2, 4, 7);
3583     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 0, 1);
3584     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 1, 5);
3585     test(S("abcdefghij"), 9, 1, S("abcde"), 4, 2, 5);
3586     test(S("abcdefghij"), 9, 1, S("abcde"), 5, 0, 1);
3587     test(S("abcdefghij"), 9, 1, S("abcde"), 5, 1, 1);
3588     test(S("abcdefghij"), 9, 1, S("abcde"), 6, 0, 0);
3589     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 0, 1);
3590     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 1, 9);
3591     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 5, 9);
3592     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 9, 9);
3593     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 10, 9);
3594     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 0, 11, 9);
3595     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 0, 1);
3596     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 1, 8);
3597     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 4, 8);
3598     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 8, 8);
3599     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 9, 8);
3600     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 1, 10, 8);
3601     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 0, 1);
3602     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 1, 4);
3603     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 2, 4);
3604     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 4, 4);
3605     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 5, 4);
3606     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 5, 6, 4);
3607     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 0, 1);
3608     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 1, 0);
3609     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 9, 2, 0);
3610     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 0, 1);
3611     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 10, 1, 1);
3612     test(S("abcdefghij"), 9, 1, S("abcdefghij"), 11, 0, 0);
3613     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
3614     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 1, 9);
3615     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 10, 9);
3616     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 19, 9);
3617     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 20, 9);
3618     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 0, 21, 9);
3619     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
3620     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 1, 8);
3621     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 9, 8);
3622     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 18, 8);
3623     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 19, 8);
3624     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 1, 20, 8);
3625     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
3626     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3627     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 5, -1);
3628     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 9, -1);
3629     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 10, -1);
3630     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 10, 11, -1);
3631     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
3632     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 1, -10);
3633 }
3634
3635 template <class S>
3636 void test34()
3637 {
3638     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 19, 2, -10);
3639     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
3640     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
3641     test(S("abcdefghij"), 9, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3642     test(S("abcdefghij"), 9, 2, S(""), 0, 0, 1);
3643     test(S("abcdefghij"), 9, 2, S(""), 0, 1, 1);
3644     test(S("abcdefghij"), 9, 2, S(""), 1, 0, 0);
3645     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 0, 1);
3646     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 1, 9);
3647     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 2, 9);
3648     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 4, 9);
3649     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 5, 9);
3650     test(S("abcdefghij"), 9, 2, S("abcde"), 0, 6, 9);
3651     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 0, 1);
3652     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 1, 8);
3653     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 2, 8);
3654     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 3, 8);
3655     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 4, 8);
3656     test(S("abcdefghij"), 9, 2, S("abcde"), 1, 5, 8);
3657     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 0, 1);
3658     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 1, 7);
3659     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 2, 7);
3660     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 3, 7);
3661     test(S("abcdefghij"), 9, 2, S("abcde"), 2, 4, 7);
3662     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 0, 1);
3663     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 1, 5);
3664     test(S("abcdefghij"), 9, 2, S("abcde"), 4, 2, 5);
3665     test(S("abcdefghij"), 9, 2, S("abcde"), 5, 0, 1);
3666     test(S("abcdefghij"), 9, 2, S("abcde"), 5, 1, 1);
3667     test(S("abcdefghij"), 9, 2, S("abcde"), 6, 0, 0);
3668     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 0, 1);
3669     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 1, 9);
3670     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 5, 9);
3671     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 9, 9);
3672     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 10, 9);
3673     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 0, 11, 9);
3674     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 0, 1);
3675     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 1, 8);
3676     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 4, 8);
3677     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 8, 8);
3678     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 9, 8);
3679     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 1, 10, 8);
3680     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 0, 1);
3681     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 1, 4);
3682     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 2, 4);
3683     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 4, 4);
3684     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 5, 4);
3685     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 5, 6, 4);
3686     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 0, 1);
3687     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 1, 0);
3688     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 9, 2, 0);
3689     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 0, 1);
3690     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 10, 1, 1);
3691     test(S("abcdefghij"), 9, 2, S("abcdefghij"), 11, 0, 0);
3692     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
3693     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 1, 9);
3694     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 10, 9);
3695     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 19, 9);
3696     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 20, 9);
3697     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 0, 21, 9);
3698     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
3699     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 1, 8);
3700     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 9, 8);
3701     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 18, 8);
3702     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 19, 8);
3703     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 1, 20, 8);
3704     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
3705     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 1, -1);
3706     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 5, -1);
3707     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 9, -1);
3708     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 10, -1);
3709     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 10, 11, -1);
3710     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
3711     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 1, -10);
3712     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 19, 2, -10);
3713     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
3714     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
3715     test(S("abcdefghij"), 9, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
3716     test(S("abcdefghij"), 10, 0, S(""), 0, 0, 0);
3717     test(S("abcdefghij"), 10, 0, S(""), 0, 1, 0);
3718     test(S("abcdefghij"), 10, 0, S(""), 1, 0, 0);
3719     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 0, 0);
3720     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 1, -1);
3721     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 2, -2);
3722     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 4, -4);
3723     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 5, -5);
3724     test(S("abcdefghij"), 10, 0, S("abcde"), 0, 6, -5);
3725     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 0, 0);
3726     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 1, -1);
3727     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 2, -2);
3728     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 3, -3);
3729     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 4, -4);
3730     test(S("abcdefghij"), 10, 0, S("abcde"), 1, 5, -4);
3731     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 0, 0);
3732     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 1, -1);
3733     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 2, -2);
3734     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 3, -3);
3735     test(S("abcdefghij"), 10, 0, S("abcde"), 2, 4, -3);
3736     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 0, 0);
3737     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 1, -1);
3738 }
3739
3740 template <class S>
3741 void test35()
3742 {
3743     test(S("abcdefghij"), 10, 0, S("abcde"), 4, 2, -1);
3744     test(S("abcdefghij"), 10, 0, S("abcde"), 5, 0, 0);
3745     test(S("abcdefghij"), 10, 0, S("abcde"), 5, 1, 0);
3746     test(S("abcdefghij"), 10, 0, S("abcde"), 6, 0, 0);
3747     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 0, 0);
3748     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 1, -1);
3749     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 5, -5);
3750     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 9, -9);
3751     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 10, -10);
3752     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 0, 11, -10);
3753     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 0, 0);
3754     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 1, -1);
3755     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 4, -4);
3756     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 8, -8);
3757     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 9, -9);
3758     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 1, 10, -9);
3759     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 0, 0);
3760     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 1, -1);
3761     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 2, -2);
3762     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 4, -4);
3763     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 5, -5);
3764     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 5, 6, -5);
3765     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 0, 0);
3766     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 1, -1);
3767     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 9, 2, -1);
3768     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 0, 0);
3769     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 10, 1, 0);
3770     test(S("abcdefghij"), 10, 0, S("abcdefghij"), 11, 0, 0);
3771     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3772     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
3773     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
3774     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
3775     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
3776     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
3777     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3778     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
3779     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
3780     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
3781     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
3782     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
3783     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3784     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
3785     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
3786     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
3787     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
3788     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
3789     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3790     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
3791     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
3792     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3793     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3794     test(S("abcdefghij"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3795     test(S("abcdefghij"), 10, 1, S(""), 0, 0, 0);
3796     test(S("abcdefghij"), 10, 1, S(""), 0, 1, 0);
3797     test(S("abcdefghij"), 10, 1, S(""), 1, 0, 0);
3798     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 0, 0);
3799     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 1, -1);
3800     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 2, -2);
3801     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 4, -4);
3802     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 5, -5);
3803     test(S("abcdefghij"), 10, 1, S("abcde"), 0, 6, -5);
3804     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 0, 0);
3805     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 1, -1);
3806     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 2, -2);
3807     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 3, -3);
3808     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 4, -4);
3809     test(S("abcdefghij"), 10, 1, S("abcde"), 1, 5, -4);
3810     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 0, 0);
3811     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 1, -1);
3812     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 2, -2);
3813     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 3, -3);
3814     test(S("abcdefghij"), 10, 1, S("abcde"), 2, 4, -3);
3815     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 0, 0);
3816     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 1, -1);
3817     test(S("abcdefghij"), 10, 1, S("abcde"), 4, 2, -1);
3818     test(S("abcdefghij"), 10, 1, S("abcde"), 5, 0, 0);
3819     test(S("abcdefghij"), 10, 1, S("abcde"), 5, 1, 0);
3820     test(S("abcdefghij"), 10, 1, S("abcde"), 6, 0, 0);
3821     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 0, 0);
3822     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 1, -1);
3823     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 5, -5);
3824     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 9, -9);
3825     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 10, -10);
3826     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 0, 11, -10);
3827     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 0, 0);
3828     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 1, -1);
3829     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 4, -4);
3830     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 8, -8);
3831     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 9, -9);
3832     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 1, 10, -9);
3833     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 0, 0);
3834     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 1, -1);
3835     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 2, -2);
3836     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 4, -4);
3837     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 5, -5);
3838     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 5, 6, -5);
3839     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 0, 0);
3840     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 1, -1);
3841     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 9, 2, -1);
3842     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 0, 0);
3843 }
3844
3845 template <class S>
3846 void test36()
3847 {
3848     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 10, 1, 0);
3849     test(S("abcdefghij"), 10, 1, S("abcdefghij"), 11, 0, 0);
3850     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
3851     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
3852     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
3853     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
3854     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
3855     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
3856     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
3857     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
3858     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
3859     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
3860     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
3861     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
3862     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
3863     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
3864     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
3865     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
3866     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
3867     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
3868     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
3869     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
3870     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
3871     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
3872     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
3873     test(S("abcdefghij"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
3874     test(S("abcdefghij"), 11, 0, S(""), 0, 0, 0);
3875     test(S("abcdefghij"), 11, 0, S(""), 0, 1, 0);
3876     test(S("abcdefghij"), 11, 0, S(""), 1, 0, 0);
3877     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 0, 0);
3878     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 1, 0);
3879     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 2, 0);
3880     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 4, 0);
3881     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 5, 0);
3882     test(S("abcdefghij"), 11, 0, S("abcde"), 0, 6, 0);
3883     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 0, 0);
3884     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 1, 0);
3885     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 2, 0);
3886     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 3, 0);
3887     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 4, 0);
3888     test(S("abcdefghij"), 11, 0, S("abcde"), 1, 5, 0);
3889     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 0, 0);
3890     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 1, 0);
3891     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 2, 0);
3892     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 3, 0);
3893     test(S("abcdefghij"), 11, 0, S("abcde"), 2, 4, 0);
3894     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 0, 0);
3895     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 1, 0);
3896     test(S("abcdefghij"), 11, 0, S("abcde"), 4, 2, 0);
3897     test(S("abcdefghij"), 11, 0, S("abcde"), 5, 0, 0);
3898     test(S("abcdefghij"), 11, 0, S("abcde"), 5, 1, 0);
3899     test(S("abcdefghij"), 11, 0, S("abcde"), 6, 0, 0);
3900     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 0, 0);
3901     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 1, 0);
3902     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 5, 0);
3903     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 9, 0);
3904     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 10, 0);
3905     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 0, 11, 0);
3906     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 0, 0);
3907     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 1, 0);
3908     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 4, 0);
3909     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 8, 0);
3910     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 9, 0);
3911     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 1, 10, 0);
3912     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 0, 0);
3913     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 1, 0);
3914     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 2, 0);
3915     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 4, 0);
3916     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 5, 0);
3917     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 5, 6, 0);
3918     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 0, 0);
3919     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 1, 0);
3920     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 9, 2, 0);
3921     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 0, 0);
3922     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 10, 1, 0);
3923     test(S("abcdefghij"), 11, 0, S("abcdefghij"), 11, 0, 0);
3924     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
3925     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
3926     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
3927     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
3928     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
3929     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
3930     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
3931     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
3932     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
3933     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
3934     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
3935     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
3936     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
3937     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
3938     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
3939     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
3940     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
3941     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
3942     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
3943     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
3944     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
3945     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
3946     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
3947     test(S("abcdefghij"), 11, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
3948 }
3949
3950 template <class S>
3951 void test37()
3952 {
3953     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 0, 0);
3954     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 0, 1, 0);
3955     test(S("abcdefghijklmnopqrst"), 0, 0, S(""), 1, 0, 0);
3956     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 0, 0);
3957     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 1, -1);
3958     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 2, -2);
3959     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 4, -4);
3960     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 5, -5);
3961     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 0, 6, -5);
3962     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 0, 0);
3963     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 1, -1);
3964     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 2, -2);
3965     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 3, -3);
3966     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 4, -4);
3967     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 1, 5, -4);
3968     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 0, 0);
3969     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 1, -1);
3970     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 2, -2);
3971     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 3, -3);
3972     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 2, 4, -3);
3973     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 0, 0);
3974     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 1, -1);
3975     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 4, 2, -1);
3976     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 0, 0);
3977     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 5, 1, 0);
3978     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcde"), 6, 0, 0);
3979     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 0, 0);
3980     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 1, -1);
3981     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 5, -5);
3982     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 9, -9);
3983     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 10, -10);
3984     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 0, 11, -10);
3985     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 0, 0);
3986     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 1, -1);
3987     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 4, -4);
3988     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 8, -8);
3989     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 9, -9);
3990     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 1, 10, -9);
3991     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 0, 0);
3992     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 1, -1);
3993     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 2, -2);
3994     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 4, -4);
3995     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 5, -5);
3996     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 5, 6, -5);
3997     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 0, 0);
3998     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 1, -1);
3999     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 9, 2, -1);
4000     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 0, 0);
4001     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 10, 1, 0);
4002     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghij"), 11, 0, 0);
4003     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4004     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4005     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4006     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4007     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4008     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4009     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4010     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4011     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4012     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4013     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4014     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4015     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4016     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4017     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4018     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4019     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4020     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4021     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4022     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4023     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4024     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4025     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4026     test(S("abcdefghijklmnopqrst"), 0, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4027     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 0, 1);
4028     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 0, 1, 1);
4029     test(S("abcdefghijklmnopqrst"), 0, 1, S(""), 1, 0, 0);
4030     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 0, 1);
4031     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 1, 0);
4032     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 2, -1);
4033     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 4, -3);
4034     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 5, -4);
4035     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 0, 6, -4);
4036     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 0, 1);
4037     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 1, -1);
4038     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 2, -1);
4039     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 3, -1);
4040     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 4, -1);
4041     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 1, 5, -1);
4042     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 0, 1);
4043     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 1, -2);
4044     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 2, -2);
4045     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 3, -2);
4046     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 2, 4, -2);
4047     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 0, 1);
4048     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 1, -4);
4049     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 4, 2, -4);
4050     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 0, 1);
4051     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 5, 1, 1);
4052     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcde"), 6, 0, 0);
4053 }
4054
4055 template <class S>
4056 void test38()
4057 {
4058     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 0, 1);
4059     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 1, 0);
4060     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 5, -4);
4061     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 9, -8);
4062     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 10, -9);
4063     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 0, 11, -9);
4064     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 0, 1);
4065     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 1, -1);
4066     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 4, -1);
4067     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 8, -1);
4068     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 9, -1);
4069     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 1, 10, -1);
4070     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 0, 1);
4071     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 1, -5);
4072     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 2, -5);
4073     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 4, -5);
4074     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 5, -5);
4075     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 5, 6, -5);
4076     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 0, 1);
4077     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 1, -9);
4078     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 9, 2, -9);
4079     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 0, 1);
4080     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 10, 1, 1);
4081     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghij"), 11, 0, 0);
4082     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4083     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 1, 0);
4084     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 10, -9);
4085     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 19, -18);
4086     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 20, -19);
4087     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 0, 21, -19);
4088     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4089     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
4090     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 9, -1);
4091     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 18, -1);
4092     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 19, -1);
4093     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 1, 20, -1);
4094     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4095     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 1, -10);
4096     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 5, -10);
4097     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 9, -10);
4098     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
4099     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
4100     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4101     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 1, -19);
4102     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 19, 2, -19);
4103     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4104     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4105     test(S("abcdefghijklmnopqrst"), 0, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4106     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 0, 10);
4107     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 0, 1, 10);
4108     test(S("abcdefghijklmnopqrst"), 0, 10, S(""), 1, 0, 0);
4109     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 0, 10);
4110     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 1, 9);
4111     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 2, 8);
4112     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 4, 6);
4113     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 5, 5);
4114     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 0, 6, 5);
4115     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 0, 10);
4116     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 1, -1);
4117     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 2, -1);
4118     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 3, -1);
4119     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 4, -1);
4120     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 1, 5, -1);
4121     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 0, 10);
4122     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 1, -2);
4123     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 2, -2);
4124     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 3, -2);
4125     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 2, 4, -2);
4126     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 0, 10);
4127     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 1, -4);
4128     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 4, 2, -4);
4129     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 0, 10);
4130     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 5, 1, 10);
4131     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcde"), 6, 0, 0);
4132     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 0, 10);
4133     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 1, 9);
4134     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 5, 5);
4135     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 9, 1);
4136     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 10, 0);
4137     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 0, 11, 0);
4138     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 0, 10);
4139     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 1, -1);
4140     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 4, -1);
4141     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 8, -1);
4142     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 9, -1);
4143     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 1, 10, -1);
4144     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 0, 10);
4145     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 1, -5);
4146     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 2, -5);
4147     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 4, -5);
4148     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 5, -5);
4149     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 5, 6, -5);
4150     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 0, 10);
4151     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 1, -9);
4152     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 9, 2, -9);
4153     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 0, 10);
4154     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 10, 1, 10);
4155     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghij"), 11, 0, 0);
4156     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
4157     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 1, 9);
4158 }
4159
4160 template <class S>
4161 void test39()
4162 {
4163     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 10, 0);
4164     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 19, -9);
4165     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 20, -10);
4166     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 0, 21, -10);
4167     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
4168     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 1, -1);
4169     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 9, -1);
4170     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 18, -1);
4171     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 19, -1);
4172     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 1, 20, -1);
4173     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
4174     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 1, -10);
4175     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 5, -10);
4176     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 9, -10);
4177     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 10, -10);
4178     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 10, 11, -10);
4179     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
4180     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 1, -19);
4181     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 19, 2, -19);
4182     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
4183     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
4184     test(S("abcdefghijklmnopqrst"), 0, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
4185     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 0, 19);
4186     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 0, 1, 19);
4187     test(S("abcdefghijklmnopqrst"), 0, 19, S(""), 1, 0, 0);
4188     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 0, 19);
4189     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 1, 18);
4190     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 2, 17);
4191     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 4, 15);
4192     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 5, 14);
4193     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 0, 6, 14);
4194     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 0, 19);
4195     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 1, -1);
4196     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 2, -1);
4197     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 3, -1);
4198     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 4, -1);
4199     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 1, 5, -1);
4200     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 0, 19);
4201     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 1, -2);
4202     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 2, -2);
4203     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 3, -2);
4204     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 2, 4, -2);
4205     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 0, 19);
4206     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 1, -4);
4207     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 4, 2, -4);
4208     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 0, 19);
4209     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 5, 1, 19);
4210     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcde"), 6, 0, 0);
4211     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 0, 19);
4212     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 1, 18);
4213     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 5, 14);
4214     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 9, 10);
4215     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 10, 9);
4216     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 0, 11, 9);
4217     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 0, 19);
4218     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 1, -1);
4219     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 4, -1);
4220     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 8, -1);
4221     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 9, -1);
4222     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 1, 10, -1);
4223     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 0, 19);
4224     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 1, -5);
4225     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 2, -5);
4226     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 4, -5);
4227     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 5, -5);
4228     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 5, 6, -5);
4229     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 0, 19);
4230     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 1, -9);
4231     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 9, 2, -9);
4232     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 0, 19);
4233     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 10, 1, 19);
4234     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghij"), 11, 0, 0);
4235     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4236     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 1, 18);
4237     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 10, 9);
4238     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 19, 0);
4239     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 20, -1);
4240     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 0, 21, -1);
4241     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4242     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 1, -1);
4243     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 9, -1);
4244     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 18, -1);
4245     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 19, -1);
4246     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 1, 20, -1);
4247     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4248     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 1, -10);
4249     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 5, -10);
4250     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 9, -10);
4251     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 10, -10);
4252     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 10, 11, -10);
4253     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4254     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 1, -19);
4255     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 19, 2, -19);
4256     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4257     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4258     test(S("abcdefghijklmnopqrst"), 0, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4259     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 0, 20);
4260     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 0, 1, 20);
4261     test(S("abcdefghijklmnopqrst"), 0, 20, S(""), 1, 0, 0);
4262     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 0, 20);
4263 }
4264
4265 template <class S>
4266 void test40()
4267 {
4268     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 1, 19);
4269     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 2, 18);
4270     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 4, 16);
4271     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 5, 15);
4272     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 0, 6, 15);
4273     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 0, 20);
4274     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 1, -1);
4275     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 2, -1);
4276     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 3, -1);
4277     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 4, -1);
4278     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 1, 5, -1);
4279     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 0, 20);
4280     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 1, -2);
4281     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 2, -2);
4282     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 3, -2);
4283     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 2, 4, -2);
4284     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 0, 20);
4285     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 1, -4);
4286     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 4, 2, -4);
4287     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 0, 20);
4288     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 5, 1, 20);
4289     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcde"), 6, 0, 0);
4290     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 0, 20);
4291     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 1, 19);
4292     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 5, 15);
4293     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 9, 11);
4294     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 10, 10);
4295     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 0, 11, 10);
4296     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 0, 20);
4297     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 1, -1);
4298     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 4, -1);
4299     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 8, -1);
4300     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 9, -1);
4301     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 1, 10, -1);
4302     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 0, 20);
4303     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 1, -5);
4304     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 2, -5);
4305     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 4, -5);
4306     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 5, -5);
4307     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 5, 6, -5);
4308     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 0, 20);
4309     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 1, -9);
4310     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 9, 2, -9);
4311     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 0, 20);
4312     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 10, 1, 20);
4313     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghij"), 11, 0, 0);
4314     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 0, 20);
4315     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 1, 19);
4316     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 10, 10);
4317     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4318     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 20, 0);
4319     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 0, 21, 0);
4320     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 0, 20);
4321     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 1, -1);
4322     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 9, -1);
4323     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 18, -1);
4324     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 19, -1);
4325     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 1, 20, -1);
4326     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 0, 20);
4327     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 1, -10);
4328     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 5, -10);
4329     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 9, -10);
4330     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 10, -10);
4331     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 10, 11, -10);
4332     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 0, 20);
4333     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 1, -19);
4334     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 19, 2, -19);
4335     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 0, 20);
4336     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 20, 1, 20);
4337     test(S("abcdefghijklmnopqrst"), 0, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4338     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 0, 20);
4339     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 0, 1, 20);
4340     test(S("abcdefghijklmnopqrst"), 0, 21, S(""), 1, 0, 0);
4341     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 0, 20);
4342     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 1, 19);
4343     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 2, 18);
4344     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 4, 16);
4345     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 5, 15);
4346     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 0, 6, 15);
4347     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 0, 20);
4348     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 1, -1);
4349     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 2, -1);
4350     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 3, -1);
4351     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 4, -1);
4352     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 1, 5, -1);
4353     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 0, 20);
4354     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 1, -2);
4355     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 2, -2);
4356     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 3, -2);
4357     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 2, 4, -2);
4358     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 0, 20);
4359     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 1, -4);
4360     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 4, 2, -4);
4361     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 0, 20);
4362     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 5, 1, 20);
4363     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcde"), 6, 0, 0);
4364     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 0, 20);
4365     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 1, 19);
4366     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 5, 15);
4367     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 9, 11);
4368 }
4369
4370 template <class S>
4371 void test41()
4372 {
4373     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 10, 10);
4374     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 0, 11, 10);
4375     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 0, 20);
4376     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 1, -1);
4377     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 4, -1);
4378     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 8, -1);
4379     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 9, -1);
4380     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 1, 10, -1);
4381     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 0, 20);
4382     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 1, -5);
4383     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 2, -5);
4384     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 4, -5);
4385     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 5, -5);
4386     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 5, 6, -5);
4387     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 0, 20);
4388     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 1, -9);
4389     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 9, 2, -9);
4390     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 0, 20);
4391     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 10, 1, 20);
4392     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghij"), 11, 0, 0);
4393     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 0, 20);
4394     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 1, 19);
4395     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 10, 10);
4396     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 19, 1);
4397     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 20, 0);
4398     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 0, 21, 0);
4399     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 0, 20);
4400     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 1, -1);
4401     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 9, -1);
4402     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 18, -1);
4403     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 19, -1);
4404     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 1, 20, -1);
4405     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 0, 20);
4406     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 1, -10);
4407     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 5, -10);
4408     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 9, -10);
4409     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 10, -10);
4410     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 10, 11, -10);
4411     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 0, 20);
4412     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 1, -19);
4413     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 19, 2, -19);
4414     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 0, 20);
4415     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 20, 1, 20);
4416     test(S("abcdefghijklmnopqrst"), 0, 21, S("abcdefghijklmnopqrst"), 21, 0, 0);
4417     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 0, 0);
4418     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 0, 1, 0);
4419     test(S("abcdefghijklmnopqrst"), 1, 0, S(""), 1, 0, 0);
4420     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 0, 0);
4421     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 1, -1);
4422     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 2, -2);
4423     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 4, -4);
4424     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 5, -5);
4425     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 0, 6, -5);
4426     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 0, 0);
4427     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 1, -1);
4428     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 2, -2);
4429     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 3, -3);
4430     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 4, -4);
4431     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 1, 5, -4);
4432     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 0, 0);
4433     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 1, -1);
4434     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 2, -2);
4435     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 3, -3);
4436     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 2, 4, -3);
4437     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 0, 0);
4438     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 1, -1);
4439     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 4, 2, -1);
4440     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 0, 0);
4441     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 5, 1, 0);
4442     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcde"), 6, 0, 0);
4443     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 0, 0);
4444     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 1, -1);
4445     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 5, -5);
4446     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 9, -9);
4447     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 10, -10);
4448     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 0, 11, -10);
4449     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 0, 0);
4450     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 1, -1);
4451     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 4, -4);
4452     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 8, -8);
4453     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 9, -9);
4454     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 1, 10, -9);
4455     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 0, 0);
4456     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 1, -1);
4457     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 2, -2);
4458     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 4, -4);
4459     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 5, -5);
4460     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 5, 6, -5);
4461     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 0, 0);
4462     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 1, -1);
4463     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 9, 2, -1);
4464     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 0, 0);
4465     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 10, 1, 0);
4466     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghij"), 11, 0, 0);
4467     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4468     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4469     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4470     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4471     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4472     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4473 }
4474
4475 template <class S>
4476 void test42()
4477 {
4478     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4479     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4480     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4481     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4482     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4483     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4484     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4485     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4486     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4487     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4488     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4489     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4490     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4491     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4492     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4493     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4494     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4495     test(S("abcdefghijklmnopqrst"), 1, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4496     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 0, 1);
4497     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 0, 1, 1);
4498     test(S("abcdefghijklmnopqrst"), 1, 1, S(""), 1, 0, 0);
4499     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 0, 1);
4500     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 1, 1);
4501     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 2, 1);
4502     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 4, 1);
4503     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 5, 1);
4504     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 0, 6, 1);
4505     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 0, 1);
4506     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 1, 0);
4507     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 2, -1);
4508     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 3, -2);
4509     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 4, -3);
4510     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 1, 5, -3);
4511     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 0, 1);
4512     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 1, -1);
4513     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 2, -1);
4514     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 3, -1);
4515     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 2, 4, -1);
4516     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 0, 1);
4517     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 1, -3);
4518     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 4, 2, -3);
4519     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 0, 1);
4520     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 5, 1, 1);
4521     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcde"), 6, 0, 0);
4522     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 0, 1);
4523     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 1, 1);
4524     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 5, 1);
4525     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 9, 1);
4526     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 10, 1);
4527     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 0, 11, 1);
4528     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 0, 1);
4529     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 1, 0);
4530     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 4, -3);
4531     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 8, -7);
4532     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 9, -8);
4533     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 1, 10, -8);
4534     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 0, 1);
4535     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 1, -4);
4536     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 2, -4);
4537     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 4, -4);
4538     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 5, -4);
4539     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 5, 6, -4);
4540     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 0, 1);
4541     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 1, -8);
4542     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 9, 2, -8);
4543     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 0, 1);
4544     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 10, 1, 1);
4545     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghij"), 11, 0, 0);
4546     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
4547     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 1, 1);
4548     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 10, 1);
4549     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 19, 1);
4550     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 20, 1);
4551     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 0, 21, 1);
4552     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
4553     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 1, 0);
4554     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 9, -8);
4555     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 18, -17);
4556     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 19, -18);
4557     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 1, 20, -18);
4558     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
4559     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 1, -9);
4560     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 5, -9);
4561     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
4562     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
4563     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
4564     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
4565     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 1, -18);
4566     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 19, 2, -18);
4567     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
4568     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
4569     test(S("abcdefghijklmnopqrst"), 1, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
4570     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 0, 9);
4571     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 0, 1, 9);
4572     test(S("abcdefghijklmnopqrst"), 1, 9, S(""), 1, 0, 0);
4573     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 0, 9);
4574     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 1, 1);
4575     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 2, 1);
4576     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 4, 1);
4577     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 5, 1);
4578 }
4579
4580 template <class S>
4581 void test43()
4582 {
4583     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 0, 6, 1);
4584     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 0, 9);
4585     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 1, 8);
4586     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 2, 7);
4587     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 3, 6);
4588     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 4, 5);
4589     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 1, 5, 5);
4590     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 0, 9);
4591     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 1, -1);
4592     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 2, -1);
4593     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 3, -1);
4594     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 2, 4, -1);
4595     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 0, 9);
4596     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 1, -3);
4597     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 4, 2, -3);
4598     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 0, 9);
4599     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 5, 1, 9);
4600     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcde"), 6, 0, 0);
4601     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 0, 9);
4602     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 1, 1);
4603     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 5, 1);
4604     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 9, 1);
4605     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 10, 1);
4606     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 0, 11, 1);
4607     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 0, 9);
4608     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 1, 8);
4609     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 4, 5);
4610     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 8, 1);
4611     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 9, 0);
4612     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 1, 10, 0);
4613     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 0, 9);
4614     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 1, -4);
4615     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 2, -4);
4616     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 4, -4);
4617     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 5, -4);
4618     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 5, 6, -4);
4619     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 0, 9);
4620     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 1, -8);
4621     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 9, 2, -8);
4622     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 0, 9);
4623     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 10, 1, 9);
4624     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghij"), 11, 0, 0);
4625     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
4626     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 1, 1);
4627     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 10, 1);
4628     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 19, 1);
4629     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 20, 1);
4630     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 0, 21, 1);
4631     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
4632     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 1, 8);
4633     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 9, 0);
4634     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 18, -9);
4635     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 19, -10);
4636     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 1, 20, -10);
4637     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
4638     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 1, -9);
4639     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 5, -9);
4640     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 9, -9);
4641     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 10, -9);
4642     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 10, 11, -9);
4643     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
4644     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 1, -18);
4645     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 19, 2, -18);
4646     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
4647     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
4648     test(S("abcdefghijklmnopqrst"), 1, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
4649     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 0, 18);
4650     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 0, 1, 18);
4651     test(S("abcdefghijklmnopqrst"), 1, 18, S(""), 1, 0, 0);
4652     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 0, 18);
4653     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 1, 1);
4654     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 2, 1);
4655     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 4, 1);
4656     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 5, 1);
4657     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 0, 6, 1);
4658     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 0, 18);
4659     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 1, 17);
4660     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 2, 16);
4661     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 3, 15);
4662     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 4, 14);
4663     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 1, 5, 14);
4664     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 0, 18);
4665     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 1, -1);
4666     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 2, -1);
4667     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 3, -1);
4668     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 2, 4, -1);
4669     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 0, 18);
4670     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 1, -3);
4671     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 4, 2, -3);
4672     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 0, 18);
4673     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 5, 1, 18);
4674     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcde"), 6, 0, 0);
4675     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 0, 18);
4676     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 1, 1);
4677     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 5, 1);
4678     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 9, 1);
4679     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 10, 1);
4680     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 0, 11, 1);
4681     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 0, 18);
4682     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 1, 17);
4683 }
4684
4685 template <class S>
4686 void test44()
4687 {
4688     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 4, 14);
4689     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 8, 10);
4690     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 9, 9);
4691     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 1, 10, 9);
4692     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 0, 18);
4693     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 1, -4);
4694     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 2, -4);
4695     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 4, -4);
4696     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 5, -4);
4697     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 5, 6, -4);
4698     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 0, 18);
4699     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 1, -8);
4700     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 9, 2, -8);
4701     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 0, 18);
4702     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 10, 1, 18);
4703     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghij"), 11, 0, 0);
4704     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 0, 18);
4705     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 1, 1);
4706     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 10, 1);
4707     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 19, 1);
4708     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 20, 1);
4709     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 0, 21, 1);
4710     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 0, 18);
4711     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 1, 17);
4712     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 9, 9);
4713     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 18, 0);
4714     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 19, -1);
4715     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 1, 20, -1);
4716     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 0, 18);
4717     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 1, -9);
4718     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 5, -9);
4719     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 9, -9);
4720     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 10, -9);
4721     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 10, 11, -9);
4722     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 0, 18);
4723     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 1, -18);
4724     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 19, 2, -18);
4725     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 0, 18);
4726     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 20, 1, 18);
4727     test(S("abcdefghijklmnopqrst"), 1, 18, S("abcdefghijklmnopqrst"), 21, 0, 0);
4728     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 0, 19);
4729     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 0, 1, 19);
4730     test(S("abcdefghijklmnopqrst"), 1, 19, S(""), 1, 0, 0);
4731     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 0, 19);
4732     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 1, 1);
4733     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 2, 1);
4734     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 4, 1);
4735     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 5, 1);
4736     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 0, 6, 1);
4737     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 0, 19);
4738     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 1, 18);
4739     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 2, 17);
4740     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 3, 16);
4741     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 4, 15);
4742     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 1, 5, 15);
4743     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 0, 19);
4744     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 1, -1);
4745     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 2, -1);
4746     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 3, -1);
4747     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 2, 4, -1);
4748     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 0, 19);
4749     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 1, -3);
4750     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 4, 2, -3);
4751     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 0, 19);
4752     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 5, 1, 19);
4753     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcde"), 6, 0, 0);
4754     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 0, 19);
4755     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 1, 1);
4756     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 5, 1);
4757     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 9, 1);
4758     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 10, 1);
4759     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 0, 11, 1);
4760     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 0, 19);
4761     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 1, 18);
4762     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 4, 15);
4763     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 8, 11);
4764     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 9, 10);
4765     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 1, 10, 10);
4766     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 0, 19);
4767     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 1, -4);
4768     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 2, -4);
4769     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 4, -4);
4770     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 5, -4);
4771     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 5, 6, -4);
4772     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 0, 19);
4773     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 1, -8);
4774     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 9, 2, -8);
4775     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 0, 19);
4776     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 10, 1, 19);
4777     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghij"), 11, 0, 0);
4778     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 0, 19);
4779     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 1, 1);
4780     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 10, 1);
4781     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 19, 1);
4782     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 20, 1);
4783     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 0, 21, 1);
4784     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 0, 19);
4785     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 1, 18);
4786     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 9, 10);
4787     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 18, 1);
4788 }
4789
4790 template <class S>
4791 void test45()
4792 {
4793     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 19, 0);
4794     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 1, 20, 0);
4795     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 0, 19);
4796     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 1, -9);
4797     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 5, -9);
4798     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 9, -9);
4799     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 10, -9);
4800     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 10, 11, -9);
4801     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 0, 19);
4802     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 1, -18);
4803     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 19, 2, -18);
4804     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 0, 19);
4805     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 20, 1, 19);
4806     test(S("abcdefghijklmnopqrst"), 1, 19, S("abcdefghijklmnopqrst"), 21, 0, 0);
4807     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 0, 19);
4808     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 0, 1, 19);
4809     test(S("abcdefghijklmnopqrst"), 1, 20, S(""), 1, 0, 0);
4810     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 0, 19);
4811     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 1, 1);
4812     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 2, 1);
4813     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 4, 1);
4814     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 5, 1);
4815     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 0, 6, 1);
4816     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 0, 19);
4817     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 1, 18);
4818     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 2, 17);
4819     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 3, 16);
4820     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 4, 15);
4821     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 1, 5, 15);
4822     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 0, 19);
4823     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 1, -1);
4824     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 2, -1);
4825     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 3, -1);
4826     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 2, 4, -1);
4827     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 0, 19);
4828     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 1, -3);
4829     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 4, 2, -3);
4830     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 0, 19);
4831     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 5, 1, 19);
4832     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcde"), 6, 0, 0);
4833     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 0, 19);
4834     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 1, 1);
4835     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 5, 1);
4836     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 9, 1);
4837     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 10, 1);
4838     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 0, 11, 1);
4839     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 0, 19);
4840     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 1, 18);
4841     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 4, 15);
4842     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 8, 11);
4843     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 9, 10);
4844     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 1, 10, 10);
4845     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 0, 19);
4846     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 1, -4);
4847     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 2, -4);
4848     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 4, -4);
4849     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 5, -4);
4850     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 5, 6, -4);
4851     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 0, 19);
4852     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 1, -8);
4853     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 9, 2, -8);
4854     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 0, 19);
4855     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 10, 1, 19);
4856     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghij"), 11, 0, 0);
4857     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 0, 19);
4858     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 1, 1);
4859     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 10, 1);
4860     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 19, 1);
4861     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 20, 1);
4862     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 0, 21, 1);
4863     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 0, 19);
4864     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 1, 18);
4865     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 9, 10);
4866     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 18, 1);
4867     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 19, 0);
4868     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 1, 20, 0);
4869     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 0, 19);
4870     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 1, -9);
4871     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 5, -9);
4872     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 9, -9);
4873     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 10, -9);
4874     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 10, 11, -9);
4875     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 0, 19);
4876     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 1, -18);
4877     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 19, 2, -18);
4878     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 0, 19);
4879     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 20, 1, 19);
4880     test(S("abcdefghijklmnopqrst"), 1, 20, S("abcdefghijklmnopqrst"), 21, 0, 0);
4881     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 0, 0);
4882     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 0, 1, 0);
4883     test(S("abcdefghijklmnopqrst"), 10, 0, S(""), 1, 0, 0);
4884     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 0, 0);
4885     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 1, -1);
4886     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 2, -2);
4887     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 4, -4);
4888     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 5, -5);
4889     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 0, 6, -5);
4890     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 0, 0);
4891     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 1, -1);
4892     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 2, -2);
4893 }
4894
4895 template <class S>
4896 void test46()
4897 {
4898     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 3, -3);
4899     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 4, -4);
4900     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 1, 5, -4);
4901     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 0, 0);
4902     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 1, -1);
4903     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 2, -2);
4904     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 3, -3);
4905     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 2, 4, -3);
4906     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 0, 0);
4907     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 1, -1);
4908     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 4, 2, -1);
4909     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 0, 0);
4910     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 5, 1, 0);
4911     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcde"), 6, 0, 0);
4912     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 0, 0);
4913     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 1, -1);
4914     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 5, -5);
4915     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 9, -9);
4916     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 10, -10);
4917     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 0, 11, -10);
4918     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 0, 0);
4919     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 1, -1);
4920     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 4, -4);
4921     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 8, -8);
4922     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 9, -9);
4923     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 1, 10, -9);
4924     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 0, 0);
4925     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 1, -1);
4926     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 2, -2);
4927     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 4, -4);
4928     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 5, -5);
4929     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 5, 6, -5);
4930     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 0, 0);
4931     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 1, -1);
4932     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 9, 2, -1);
4933     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 0, 0);
4934     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 10, 1, 0);
4935     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghij"), 11, 0, 0);
4936     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
4937     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
4938     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
4939     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
4940     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
4941     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
4942     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
4943     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
4944     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
4945     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
4946     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
4947     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
4948     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
4949     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
4950     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
4951     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
4952     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
4953     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
4954     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
4955     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
4956     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
4957     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
4958     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
4959     test(S("abcdefghijklmnopqrst"), 10, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
4960     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 0, 1);
4961     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 0, 1, 1);
4962     test(S("abcdefghijklmnopqrst"), 10, 1, S(""), 1, 0, 0);
4963     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 0, 1);
4964     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 1, 10);
4965     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 2, 10);
4966     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 4, 10);
4967     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 5, 10);
4968     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 0, 6, 10);
4969     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 0, 1);
4970     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 1, 9);
4971     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 2, 9);
4972     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 3, 9);
4973     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 4, 9);
4974     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 1, 5, 9);
4975     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 0, 1);
4976     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 1, 8);
4977     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 2, 8);
4978     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 3, 8);
4979     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 2, 4, 8);
4980     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 0, 1);
4981     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 1, 6);
4982     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 4, 2, 6);
4983     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 0, 1);
4984     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 5, 1, 1);
4985     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcde"), 6, 0, 0);
4986     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 0, 1);
4987     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 1, 10);
4988     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 5, 10);
4989     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 9, 10);
4990     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 10, 10);
4991     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 0, 11, 10);
4992     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 0, 1);
4993     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 1, 9);
4994     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 4, 9);
4995     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 8, 9);
4996     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 9, 9);
4997     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 1, 10, 9);
4998 }
4999
5000 template <class S>
5001 void test47()
5002 {
5003     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 0, 1);
5004     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 1, 5);
5005     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 2, 5);
5006     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 4, 5);
5007     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 5, 5);
5008     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 5, 6, 5);
5009     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 0, 1);
5010     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 1, 1);
5011     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 9, 2, 1);
5012     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 0, 1);
5013     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 10, 1, 1);
5014     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghij"), 11, 0, 0);
5015     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5016     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 1, 10);
5017     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 10, 10);
5018     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 19, 10);
5019     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 20, 10);
5020     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 0, 21, 10);
5021     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5022     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 1, 9);
5023     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 9, 9);
5024     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 18, 9);
5025     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 19, 9);
5026     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 1, 20, 9);
5027     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5028     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 1, 0);
5029     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 5, -4);
5030     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 9, -8);
5031     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 10, -9);
5032     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 10, 11, -9);
5033     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5034     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 1, -9);
5035     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 19, 2, -9);
5036     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5037     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5038     test(S("abcdefghijklmnopqrst"), 10, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5039     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 0, 5);
5040     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 0, 1, 5);
5041     test(S("abcdefghijklmnopqrst"), 10, 5, S(""), 1, 0, 0);
5042     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 0, 5);
5043     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 1, 10);
5044     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 2, 10);
5045     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 4, 10);
5046     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 5, 10);
5047     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 0, 6, 10);
5048     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 0, 5);
5049     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 1, 9);
5050     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 2, 9);
5051     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 3, 9);
5052     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 4, 9);
5053     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 1, 5, 9);
5054     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 0, 5);
5055     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 1, 8);
5056     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 2, 8);
5057     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 3, 8);
5058     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 2, 4, 8);
5059     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 0, 5);
5060     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 1, 6);
5061     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 4, 2, 6);
5062     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 0, 5);
5063     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 5, 1, 5);
5064     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcde"), 6, 0, 0);
5065     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 0, 5);
5066     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 1, 10);
5067     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 5, 10);
5068     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 9, 10);
5069     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 10, 10);
5070     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 0, 11, 10);
5071     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 0, 5);
5072     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 1, 9);
5073     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 4, 9);
5074     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 8, 9);
5075     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 9, 9);
5076     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 1, 10, 9);
5077     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 0, 5);
5078     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 1, 5);
5079     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 2, 5);
5080     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 4, 5);
5081     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 5, 5);
5082     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 5, 6, 5);
5083     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 0, 5);
5084     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 1, 1);
5085     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 9, 2, 1);
5086     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 0, 5);
5087     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 10, 1, 5);
5088     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghij"), 11, 0, 0);
5089     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 0, 5);
5090     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 1, 10);
5091     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 10, 10);
5092     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 19, 10);
5093     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 20, 10);
5094     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 0, 21, 10);
5095     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 0, 5);
5096     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 1, 9);
5097     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 9, 9);
5098     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 18, 9);
5099     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 19, 9);
5100     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 1, 20, 9);
5101     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 0, 5);
5102     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 1, 4);
5103 }
5104
5105 template <class S>
5106 void test48()
5107 {
5108     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 5, 0);
5109     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 9, -4);
5110     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 10, -5);
5111     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 10, 11, -5);
5112     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 0, 5);
5113     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 1, -9);
5114     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 19, 2, -9);
5115     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 0, 5);
5116     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 20, 1, 5);
5117     test(S("abcdefghijklmnopqrst"), 10, 5, S("abcdefghijklmnopqrst"), 21, 0, 0);
5118     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 0, 9);
5119     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 0, 1, 9);
5120     test(S("abcdefghijklmnopqrst"), 10, 9, S(""), 1, 0, 0);
5121     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 0, 9);
5122     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 1, 10);
5123     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 2, 10);
5124     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 4, 10);
5125     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 5, 10);
5126     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 0, 6, 10);
5127     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 0, 9);
5128     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 1, 9);
5129     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 2, 9);
5130     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 3, 9);
5131     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 4, 9);
5132     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 1, 5, 9);
5133     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 0, 9);
5134     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 1, 8);
5135     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 2, 8);
5136     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 3, 8);
5137     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 2, 4, 8);
5138     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 0, 9);
5139     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 1, 6);
5140     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 4, 2, 6);
5141     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 0, 9);
5142     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 5, 1, 9);
5143     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcde"), 6, 0, 0);
5144     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 0, 9);
5145     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 1, 10);
5146     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 5, 10);
5147     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 9, 10);
5148     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 10, 10);
5149     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 0, 11, 10);
5150     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 0, 9);
5151     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 1, 9);
5152     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 4, 9);
5153     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 8, 9);
5154     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 9, 9);
5155     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 1, 10, 9);
5156     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 0, 9);
5157     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 1, 5);
5158     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 2, 5);
5159     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 4, 5);
5160     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 5, 5);
5161     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 5, 6, 5);
5162     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 0, 9);
5163     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 1, 1);
5164     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 9, 2, 1);
5165     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 0, 9);
5166     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 10, 1, 9);
5167     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghij"), 11, 0, 0);
5168     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 0, 9);
5169     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 1, 10);
5170     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 10, 10);
5171     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 19, 10);
5172     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 20, 10);
5173     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 0, 21, 10);
5174     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 0, 9);
5175     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 1, 9);
5176     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 9, 9);
5177     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 18, 9);
5178     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 19, 9);
5179     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 1, 20, 9);
5180     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 0, 9);
5181     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 1, 8);
5182     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 5, 4);
5183     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 9, 0);
5184     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 10, -1);
5185     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 10, 11, -1);
5186     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 0, 9);
5187     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 1, -9);
5188     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 19, 2, -9);
5189     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 0, 9);
5190     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 20, 1, 9);
5191     test(S("abcdefghijklmnopqrst"), 10, 9, S("abcdefghijklmnopqrst"), 21, 0, 0);
5192     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 0, 10);
5193     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 0, 1, 10);
5194     test(S("abcdefghijklmnopqrst"), 10, 10, S(""), 1, 0, 0);
5195     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 0, 10);
5196     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 1, 10);
5197     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 2, 10);
5198     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 4, 10);
5199     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 5, 10);
5200     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 0, 6, 10);
5201     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 0, 10);
5202     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 1, 9);
5203     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 2, 9);
5204     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 3, 9);
5205     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 4, 9);
5206     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 1, 5, 9);
5207     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 0, 10);
5208 }
5209
5210 template <class S>
5211 void test49()
5212 {
5213     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 1, 8);
5214     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 2, 8);
5215     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 3, 8);
5216     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 2, 4, 8);
5217     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 0, 10);
5218     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 1, 6);
5219     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 4, 2, 6);
5220     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 0, 10);
5221     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 5, 1, 10);
5222     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcde"), 6, 0, 0);
5223     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 0, 10);
5224     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 1, 10);
5225     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 5, 10);
5226     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 9, 10);
5227     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 10, 10);
5228     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 0, 11, 10);
5229     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 0, 10);
5230     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 1, 9);
5231     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 4, 9);
5232     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 8, 9);
5233     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 9, 9);
5234     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 1, 10, 9);
5235     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 0, 10);
5236     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 1, 5);
5237     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 2, 5);
5238     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 4, 5);
5239     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 5, 5);
5240     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 5, 6, 5);
5241     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 0, 10);
5242     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 1, 1);
5243     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 9, 2, 1);
5244     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 0, 10);
5245     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 10, 1, 10);
5246     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghij"), 11, 0, 0);
5247     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 0, 10);
5248     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 1, 10);
5249     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 10, 10);
5250     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 19, 10);
5251     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 20, 10);
5252     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 0, 21, 10);
5253     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 0, 10);
5254     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 1, 9);
5255     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 9, 9);
5256     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 18, 9);
5257     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 19, 9);
5258     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 1, 20, 9);
5259     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 0, 10);
5260     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 1, 9);
5261     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 5, 5);
5262     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 9, 1);
5263     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 10, 0);
5264     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 10, 11, 0);
5265     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 0, 10);
5266     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 1, -9);
5267     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 19, 2, -9);
5268     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 0, 10);
5269     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 20, 1, 10);
5270     test(S("abcdefghijklmnopqrst"), 10, 10, S("abcdefghijklmnopqrst"), 21, 0, 0);
5271     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 0, 10);
5272     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 0, 1, 10);
5273     test(S("abcdefghijklmnopqrst"), 10, 11, S(""), 1, 0, 0);
5274     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 0, 10);
5275     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 1, 10);
5276     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 2, 10);
5277     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 4, 10);
5278     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 5, 10);
5279     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 0, 6, 10);
5280     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 0, 10);
5281     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 1, 9);
5282     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 2, 9);
5283     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 3, 9);
5284     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 4, 9);
5285     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 1, 5, 9);
5286     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 0, 10);
5287     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 1, 8);
5288     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 2, 8);
5289     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 3, 8);
5290     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 2, 4, 8);
5291     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 0, 10);
5292     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 1, 6);
5293     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 4, 2, 6);
5294     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 0, 10);
5295     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 5, 1, 10);
5296     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcde"), 6, 0, 0);
5297     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 0, 10);
5298     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 1, 10);
5299     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 5, 10);
5300     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 9, 10);
5301     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 10, 10);
5302     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 0, 11, 10);
5303     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 0, 10);
5304     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 1, 9);
5305     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 4, 9);
5306     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 8, 9);
5307     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 9, 9);
5308     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 1, 10, 9);
5309     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 0, 10);
5310     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 1, 5);
5311     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 2, 5);
5312     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 4, 5);
5313 }
5314
5315 template <class S>
5316 void test50()
5317 {
5318     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 5, 5);
5319     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 5, 6, 5);
5320     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 0, 10);
5321     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 1, 1);
5322     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 9, 2, 1);
5323     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 0, 10);
5324     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 10, 1, 10);
5325     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghij"), 11, 0, 0);
5326     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 0, 10);
5327     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 1, 10);
5328     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 10, 10);
5329     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 19, 10);
5330     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 20, 10);
5331     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 0, 21, 10);
5332     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 0, 10);
5333     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 1, 9);
5334     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 9, 9);
5335     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 18, 9);
5336     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 19, 9);
5337     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 1, 20, 9);
5338     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 0, 10);
5339     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 1, 9);
5340     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 5, 5);
5341     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 9, 1);
5342     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 10, 0);
5343     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 10, 11, 0);
5344     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 0, 10);
5345     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 1, -9);
5346     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 19, 2, -9);
5347     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 0, 10);
5348     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 20, 1, 10);
5349     test(S("abcdefghijklmnopqrst"), 10, 11, S("abcdefghijklmnopqrst"), 21, 0, 0);
5350     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 0, 0);
5351     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 0, 1, 0);
5352     test(S("abcdefghijklmnopqrst"), 19, 0, S(""), 1, 0, 0);
5353     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 0, 0);
5354     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 1, -1);
5355     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 2, -2);
5356     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 4, -4);
5357     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 5, -5);
5358     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 0, 6, -5);
5359     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 0, 0);
5360     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 1, -1);
5361     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 2, -2);
5362     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 3, -3);
5363     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 4, -4);
5364     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 1, 5, -4);
5365     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 0, 0);
5366     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 1, -1);
5367     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 2, -2);
5368     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 3, -3);
5369     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 2, 4, -3);
5370     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 0, 0);
5371     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 1, -1);
5372     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 4, 2, -1);
5373     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 0, 0);
5374     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 5, 1, 0);
5375     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcde"), 6, 0, 0);
5376     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 0, 0);
5377     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 1, -1);
5378     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 5, -5);
5379     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 9, -9);
5380     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 10, -10);
5381     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 0, 11, -10);
5382     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 0, 0);
5383     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 1, -1);
5384     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 4, -4);
5385     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 8, -8);
5386     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 9, -9);
5387     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 1, 10, -9);
5388     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 0, 0);
5389     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 1, -1);
5390     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 2, -2);
5391     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 4, -4);
5392     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 5, -5);
5393     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 5, 6, -5);
5394     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 0, 0);
5395     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 1, -1);
5396     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 9, 2, -1);
5397     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 0, 0);
5398     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 10, 1, 0);
5399     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghij"), 11, 0, 0);
5400     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5401     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5402     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5403     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5404     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5405     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5406     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5407     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5408     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5409     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5410     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5411     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5412     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5413     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5414     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5415     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5416     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5417     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5418 }
5419
5420 template <class S>
5421 void test51()
5422 {
5423     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5424     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5425     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5426     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5427     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5428     test(S("abcdefghijklmnopqrst"), 19, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5429     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 0, 1);
5430     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 0, 1, 1);
5431     test(S("abcdefghijklmnopqrst"), 19, 1, S(""), 1, 0, 0);
5432     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 0, 1);
5433     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 1, 19);
5434     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 2, 19);
5435     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 4, 19);
5436     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 5, 19);
5437     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 0, 6, 19);
5438     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 0, 1);
5439     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 1, 18);
5440     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 2, 18);
5441     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 3, 18);
5442     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 4, 18);
5443     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 1, 5, 18);
5444     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 0, 1);
5445     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 1, 17);
5446     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 2, 17);
5447     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 3, 17);
5448     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 2, 4, 17);
5449     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 0, 1);
5450     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 1, 15);
5451     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 4, 2, 15);
5452     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 0, 1);
5453     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 5, 1, 1);
5454     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcde"), 6, 0, 0);
5455     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 0, 1);
5456     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 1, 19);
5457     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 5, 19);
5458     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 9, 19);
5459     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 10, 19);
5460     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 0, 11, 19);
5461     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 0, 1);
5462     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 1, 18);
5463     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 4, 18);
5464     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 8, 18);
5465     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 9, 18);
5466     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 1, 10, 18);
5467     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 0, 1);
5468     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 1, 14);
5469     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 2, 14);
5470     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 4, 14);
5471     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 5, 14);
5472     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 5, 6, 14);
5473     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 0, 1);
5474     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 1, 10);
5475     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 9, 2, 10);
5476     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 0, 1);
5477     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 10, 1, 1);
5478     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghij"), 11, 0, 0);
5479     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 0, 1);
5480     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 1, 19);
5481     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 10, 19);
5482     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 19, 19);
5483     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 20, 19);
5484     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 0, 21, 19);
5485     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 0, 1);
5486     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 1, 18);
5487     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 9, 18);
5488     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 18, 18);
5489     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 19, 18);
5490     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 1, 20, 18);
5491     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 0, 1);
5492     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 1, 9);
5493     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 5, 9);
5494     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 9, 9);
5495     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 10, 9);
5496     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 10, 11, 9);
5497     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 0, 1);
5498     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 1, 0);
5499     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 19, 2, 0);
5500     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 0, 1);
5501     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 20, 1, 1);
5502     test(S("abcdefghijklmnopqrst"), 19, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5503     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 0, 1);
5504     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 0, 1, 1);
5505     test(S("abcdefghijklmnopqrst"), 19, 2, S(""), 1, 0, 0);
5506     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 0, 1);
5507     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 1, 19);
5508     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 2, 19);
5509     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 4, 19);
5510     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 5, 19);
5511     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 0, 6, 19);
5512     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 0, 1);
5513     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 1, 18);
5514     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 2, 18);
5515     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 3, 18);
5516     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 4, 18);
5517     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 1, 5, 18);
5518     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 0, 1);
5519     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 1, 17);
5520     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 2, 17);
5521     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 3, 17);
5522     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 2, 4, 17);
5523 }
5524
5525 template <class S>
5526 void test52()
5527 {
5528     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 0, 1);
5529     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 1, 15);
5530     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 4, 2, 15);
5531     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 0, 1);
5532     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 5, 1, 1);
5533     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcde"), 6, 0, 0);
5534     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 0, 1);
5535     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 1, 19);
5536     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 5, 19);
5537     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 9, 19);
5538     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 10, 19);
5539     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 0, 11, 19);
5540     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 0, 1);
5541     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 1, 18);
5542     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 4, 18);
5543     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 8, 18);
5544     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 9, 18);
5545     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 1, 10, 18);
5546     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 0, 1);
5547     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 1, 14);
5548     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 2, 14);
5549     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 4, 14);
5550     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 5, 14);
5551     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 5, 6, 14);
5552     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 0, 1);
5553     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 1, 10);
5554     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 9, 2, 10);
5555     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 0, 1);
5556     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 10, 1, 1);
5557     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghij"), 11, 0, 0);
5558     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 0, 1);
5559     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 1, 19);
5560     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 10, 19);
5561     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 19, 19);
5562     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 20, 19);
5563     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 0, 21, 19);
5564     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 0, 1);
5565     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 1, 18);
5566     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 9, 18);
5567     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 18, 18);
5568     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 19, 18);
5569     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 1, 20, 18);
5570     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 0, 1);
5571     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 1, 9);
5572     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 5, 9);
5573     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 9, 9);
5574     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 10, 9);
5575     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 10, 11, 9);
5576     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 0, 1);
5577     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 1, 0);
5578     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 19, 2, 0);
5579     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 0, 1);
5580     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 20, 1, 1);
5581     test(S("abcdefghijklmnopqrst"), 19, 2, S("abcdefghijklmnopqrst"), 21, 0, 0);
5582     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 0, 0);
5583     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 0, 1, 0);
5584     test(S("abcdefghijklmnopqrst"), 20, 0, S(""), 1, 0, 0);
5585     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 0, 0);
5586     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 1, -1);
5587     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 2, -2);
5588     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 4, -4);
5589     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 5, -5);
5590     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 0, 6, -5);
5591     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 0, 0);
5592     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 1, -1);
5593     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 2, -2);
5594     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 3, -3);
5595     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 4, -4);
5596     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 1, 5, -4);
5597     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 0, 0);
5598     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 1, -1);
5599     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 2, -2);
5600     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 3, -3);
5601     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 2, 4, -3);
5602     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 0, 0);
5603     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 1, -1);
5604     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 4, 2, -1);
5605     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 0, 0);
5606     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 5, 1, 0);
5607     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcde"), 6, 0, 0);
5608     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 0, 0);
5609     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 1, -1);
5610     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 5, -5);
5611     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 9, -9);
5612     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 10, -10);
5613     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 0, 11, -10);
5614     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 0, 0);
5615     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 1, -1);
5616     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 4, -4);
5617     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 8, -8);
5618     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 9, -9);
5619     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 1, 10, -9);
5620     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 0, 0);
5621     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 1, -1);
5622     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 2, -2);
5623     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 4, -4);
5624     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 5, -5);
5625     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 5, 6, -5);
5626     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 0, 0);
5627     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 1, -1);
5628 }
5629
5630 template <class S>
5631 void test53()
5632 {
5633     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 9, 2, -1);
5634     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 0, 0);
5635     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 10, 1, 0);
5636     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghij"), 11, 0, 0);
5637     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5638     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 1, -1);
5639     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 10, -10);
5640     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 19, -19);
5641     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 20, -20);
5642     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 0, 21, -20);
5643     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5644     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 1, -1);
5645     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 9, -9);
5646     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 18, -18);
5647     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 19, -19);
5648     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 1, 20, -19);
5649     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5650     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 1, -1);
5651     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 5, -5);
5652     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 9, -9);
5653     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 10, -10);
5654     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 10, 11, -10);
5655     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5656     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 1, -1);
5657     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 19, 2, -1);
5658     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5659     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5660     test(S("abcdefghijklmnopqrst"), 20, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5661     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 0, 0);
5662     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 0, 1, 0);
5663     test(S("abcdefghijklmnopqrst"), 20, 1, S(""), 1, 0, 0);
5664     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 0, 0);
5665     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 1, -1);
5666     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 2, -2);
5667     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 4, -4);
5668     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 5, -5);
5669     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 0, 6, -5);
5670     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 0, 0);
5671     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 1, -1);
5672     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 2, -2);
5673     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 3, -3);
5674     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 4, -4);
5675     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 1, 5, -4);
5676     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 0, 0);
5677     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 1, -1);
5678     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 2, -2);
5679     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 3, -3);
5680     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 2, 4, -3);
5681     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 0, 0);
5682     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 1, -1);
5683     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 4, 2, -1);
5684     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 0, 0);
5685     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 5, 1, 0);
5686     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcde"), 6, 0, 0);
5687     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 0, 0);
5688     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 1, -1);
5689     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 5, -5);
5690     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 9, -9);
5691     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 10, -10);
5692     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 0, 11, -10);
5693     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 0, 0);
5694     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 1, -1);
5695     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 4, -4);
5696     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 8, -8);
5697     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 9, -9);
5698     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 1, 10, -9);
5699     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 0, 0);
5700     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 1, -1);
5701     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 2, -2);
5702     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 4, -4);
5703     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 5, -5);
5704     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 5, 6, -5);
5705     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 0, 0);
5706     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 1, -1);
5707     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 9, 2, -1);
5708     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 0, 0);
5709     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 10, 1, 0);
5710     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghij"), 11, 0, 0);
5711     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 0, 0);
5712     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 1, -1);
5713     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 10, -10);
5714     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 19, -19);
5715     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 20, -20);
5716     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 0, 21, -20);
5717     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 0, 0);
5718     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 1, -1);
5719     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 9, -9);
5720     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 18, -18);
5721     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 19, -19);
5722     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 1, 20, -19);
5723     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 0, 0);
5724     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 1, -1);
5725     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 5, -5);
5726     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 9, -9);
5727     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 10, -10);
5728     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 10, 11, -10);
5729     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 0, 0);
5730     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 1, -1);
5731     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 19, 2, -1);
5732     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 0, 0);
5733 }
5734
5735 template <class S>
5736 void test54()
5737 {
5738     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 20, 1, 0);
5739     test(S("abcdefghijklmnopqrst"), 20, 1, S("abcdefghijklmnopqrst"), 21, 0, 0);
5740     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 0, 0);
5741     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 0, 1, 0);
5742     test(S("abcdefghijklmnopqrst"), 21, 0, S(""), 1, 0, 0);
5743     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 0, 0);
5744     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 1, 0);
5745     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 2, 0);
5746     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 4, 0);
5747     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 5, 0);
5748     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 0, 6, 0);
5749     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 0, 0);
5750     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 1, 0);
5751     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 2, 0);
5752     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 3, 0);
5753     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 4, 0);
5754     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 1, 5, 0);
5755     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 0, 0);
5756     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 1, 0);
5757     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 2, 0);
5758     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 3, 0);
5759     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 2, 4, 0);
5760     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 0, 0);
5761     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 1, 0);
5762     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 4, 2, 0);
5763     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 0, 0);
5764     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 5, 1, 0);
5765     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcde"), 6, 0, 0);
5766     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 0, 0);
5767     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 1, 0);
5768     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 5, 0);
5769     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 9, 0);
5770     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 10, 0);
5771     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 0, 11, 0);
5772     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 0, 0);
5773     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 1, 0);
5774     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 4, 0);
5775     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 8, 0);
5776     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 9, 0);
5777     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 1, 10, 0);
5778     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 0, 0);
5779     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 1, 0);
5780     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 2, 0);
5781     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 4, 0);
5782     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 5, 0);
5783     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 5, 6, 0);
5784     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 0, 0);
5785     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 1, 0);
5786     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 9, 2, 0);
5787     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 0, 0);
5788     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 10, 1, 0);
5789     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghij"), 11, 0, 0);
5790     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 0, 0);
5791     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 1, 0);
5792     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 10, 0);
5793     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 19, 0);
5794     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 20, 0);
5795     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 0, 21, 0);
5796     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 0, 0);
5797     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 1, 0);
5798     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 9, 0);
5799     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 18, 0);
5800     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 19, 0);
5801     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 1, 20, 0);
5802     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 0, 0);
5803     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 1, 0);
5804     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 5, 0);
5805     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 9, 0);
5806     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 10, 0);
5807     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 10, 11, 0);
5808     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 0, 0);
5809     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 1, 0);
5810     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 19, 2, 0);
5811     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 0, 0);
5812     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 20, 1, 0);
5813     test(S("abcdefghijklmnopqrst"), 21, 0, S("abcdefghijklmnopqrst"), 21, 0, 0);
5814 }
5815
5816 template<class S>
5817 void test55()
5818 {
5819     test_npos(S(""), 0, 0, S(""), 0, 0);
5820     test_npos(S(""), 0, 0, S("abcde"), 0, -5);
5821     test_npos(S("abcde"), 0, 0, S("abcdefghij"), 0, -10);
5822     test_npos(S("abcde"), 0, 0, S("abcdefghij"), 1, -9);
5823     test_npos(S("abcde"), 0, 0, S("abcdefghij"), 5, -5);
5824 }
5825
5826 int main()
5827 {
5828     {
5829     typedef std::string S;
5830     test0<S>();
5831     test1<S>();
5832     test2<S>();
5833     test3<S>();
5834     test4<S>();
5835     test5<S>();
5836     test6<S>();
5837     test7<S>();
5838     test8<S>();
5839     test9<S>();
5840     test10<S>();
5841     test11<S>();
5842     test12<S>();
5843     test13<S>();
5844     test14<S>();
5845     test15<S>();
5846     test16<S>();
5847     test17<S>();
5848     test18<S>();
5849     test19<S>();
5850     test20<S>();
5851     test21<S>();
5852     test22<S>();
5853     test23<S>();
5854     test24<S>();
5855     test25<S>();
5856     test26<S>();
5857     test27<S>();
5858     test28<S>();
5859     test29<S>();
5860     test30<S>();
5861     test31<S>();
5862     test32<S>();
5863     test33<S>();
5864     test34<S>();
5865     test35<S>();
5866     test36<S>();
5867     test37<S>();
5868     test38<S>();
5869     test39<S>();
5870     test40<S>();
5871     test41<S>();
5872     test42<S>();
5873     test43<S>();
5874     test44<S>();
5875     test45<S>();
5876     test46<S>();
5877     test47<S>();
5878     test48<S>();
5879     test49<S>();
5880     test50<S>();
5881     test51<S>();
5882     test52<S>();
5883     test53<S>();
5884     test54<S>();
5885     test55<S>();
5886     }
5887 #if __cplusplus >= 201103L
5888     {
5889     typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
5890     test0<S>();
5891     test1<S>();
5892     test2<S>();
5893     test3<S>();
5894     test4<S>();
5895     test5<S>();
5896     test6<S>();
5897     test7<S>();
5898     test8<S>();
5899     test9<S>();
5900     test10<S>();
5901     test11<S>();
5902     test12<S>();
5903     test13<S>();
5904     test14<S>();
5905     test15<S>();
5906     test16<S>();
5907     test17<S>();
5908     test18<S>();
5909     test19<S>();
5910     test20<S>();
5911     test21<S>();
5912     test22<S>();
5913     test23<S>();
5914     test24<S>();
5915     test25<S>();
5916     test26<S>();
5917     test27<S>();
5918     test28<S>();
5919     test29<S>();
5920     test30<S>();
5921     test31<S>();
5922     test32<S>();
5923     test33<S>();
5924     test34<S>();
5925     test35<S>();
5926     test36<S>();
5927     test37<S>();
5928     test38<S>();
5929     test39<S>();
5930     test40<S>();
5931     test41<S>();
5932     test42<S>();
5933     test43<S>();
5934     test44<S>();
5935     test45<S>();
5936     test46<S>();
5937     test47<S>();
5938     test48<S>();
5939     test49<S>();
5940     test50<S>();
5941     test51<S>();
5942     test52<S>();
5943     test53<S>();
5944     test54<S>();
5945     test55<S>();
5946     }
5947 #endif
5948 }