/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

List mode:
Size: 4
[L16][L27][L38][L49]
[L16][L27][L38][L49]

Iterator mode:
[L16][L27][L38][L49]
[L16(L16, L27, L38, L49)][L27(L16, L27, L38, L49)][L38(L16, L27, L38, L49)][L49(L16, L27, L38, L49)]
[L16][L27][L38][L49]

Iterator mode changes to list mode:
[L16]/4[L27]/4[L38]/4[L49]/4
[L16][L27][L38][L49]

Iterator mode changes to list mode 2:
[L16][L27][L38][L49]
[L16]/4[L27]/4[L38]/4[L49]/4

List mode with embedded iteration:
[L16(L16, L27, L38, L49)][L27(L16, L27, L38, L49)][L38(L16, L27, L38, L49)][L49(L16, L27, L38, L49)]

Entire input match:
- M: L16
    - G: L16
    - G: 1
    - G: 6
- M: L27
    - G: L27
    - G: 2
    - G: 7
- M: L38
    - G: L38
    - G: 3
    - G: 8
- M: L49
    - G: L49
    - G: 4
    - G: 9
firstGS was: L16, 1, 6

Entire input match 2:
Matches: true
- G: x12
- G: 1
- G: 2
As list:
- M: x12
    - G: x12
    - G: 1
    - G: 2
Groups again:
- G: x12
- G: 1
- G: 2

Entire input match 3:
Matches: false

Entire input match 4:
Matches: true
- G: x12
- G: 1
- G: 2

Substring match nested into entire input match:
- G: x12 ([x12{x12, 1, 2}])
- G: 1 ([x12{x12, 1, 2}])
- G: 2 ([x12{x12, 1, 2}])

Different entire input and substring matches:
123, 123
- M: 1 (Gs: 1, 1)
- M: 2 (Gs: 2, 2)
- M: 3 (Gs: 3, 3)

Different entire input and substring matches 2:
123
- M: 1 (Gs: 1)
- M: 2 (Gs: 2)
- M: 3 (Gs: 3)
