1contract C {
2    bytes s = "bcdef";
3
4    function f(bytes memory a) public returns (bytes memory) {
5        return bytes.concat(a, "bcdef");
6    }
7    function g(bytes calldata a) public returns (bytes memory) {
8        return bytes.concat(a, "abcdefghabcdefghabcdefghabcdefghab");
9    }
10    function h(bytes calldata a) public returns (bytes memory) {
11        return bytes.concat(a, s);
12    }
13    function j(bytes calldata a) public returns (bytes memory) {
14        bytes storage ref = s;
15        return bytes.concat(a, ref, s);
16    }
17    function k(bytes calldata a, string memory b) public returns (bytes memory) {
18        return bytes.concat(a, bytes(b));
19    }
20    function slice(bytes calldata a) public returns (bytes memory) {
21        require(a.length > 2, "");
22        return bytes.concat(a[:2], a[2:]);
23    }
24    function strParam(string calldata a) public returns (bytes memory) {
25        return bytes.concat(bytes(a), "bcdef");
26    }
27    function fixedBytesParam(bytes16 b1, bytes15 b2, bytes31 b3) public returns (
28        bytes memory,
29        bytes memory,
30        bytes memory,
31        bytes memory
32    ) {
33        return (
34            bytes.concat(b1, b2),
35            bytes.concat(b1, b3),
36            bytes.concat(b1, "bcdef"),
37            bytes.concat(b1, s)
38        );
39    }
40    function fixedBytesParam2(bytes calldata c, bytes6 b1, bytes6 b2) public returns (bytes memory, bytes memory) {
41        return (
42            bytes.concat(s, b1, c),
43            bytes.concat(b1, c, b2)
44        );
45    }
46}
47// ====
48// compileViaYul: also
49// revertStrings: debug
50// ----
51// f(bytes): 0x20, 32, "abcdabcdabcdabcdabcdabcdabcdabcd" -> 0x20, 37, "abcdabcdabcdabcdabcdabcdabcdabcd", "bcdef"
52// g(bytes): 0x20, 32, "abcdabcdabcdabcdabcdabcdabcdabcd" -> 0x20, 66, "abcdabcdabcdabcdabcdabcdabcdabcd", "abcdefghabcdefghabcdefghabcdefgh", "ab"
53// h(bytes): 0x20, 32, "abcdabcdabcdabcdabcdabcdabcdabcd" -> 0x20, 37, "abcdabcdabcdabcdabcdabcdabcdabcd", "bcdef"
54// j(bytes): 0x20, 32, "abcdabcdabcdabcdabcdabcdabcdabcd" -> 0x20, 42, "abcdabcdabcdabcdabcdabcdabcdabcd", "bcdefbcdef"
55// k(bytes,string): 0x40, 0x80, 32, "abcdabcdabcdabcdabcdabcdabcdabcd", 5, "bcdef" -> 0x20, 37, "abcdabcdabcdabcdabcdabcdabcdabcd", "bcdef"
56// slice(bytes): 0x20, 4, "abcd" -> 0x20, 4, "abcd"
57// strParam(string): 0x20, 32, "abcdabcdabcdabcdabcdabcdabcdabcd" -> 0x20, 37, "abcdabcdabcdabcdabcdabcdabcdabcd", "bcdef"
58// fixedBytesParam(bytes16,bytes15,bytes31):
59//  "aabbccddeeffgghh",
60//  "abcdefghabcdefg",
61//  "0123456789012345678901234567890" ->
62//  0x80, 0xc0, 0x120, 0x160,
63//  31, "aabbccddeeffgghhabcdefghabcdefg",
64//  47, "aabbccddeeffgghh0123456789012345", "678901234567890",
65//  21, "aabbccddeeffgghhbcdef",
66//  21, "aabbccddeeffgghhbcdef"
67// fixedBytesParam2(bytes,bytes6,bytes6): 0x60, left(0x010203040506), left(0x0708090A0B0C), 20, left(0x1011121314151617181920212223242526272829) ->
68//   0x40, 0x80,
69//   31, left(0x62636465660102030405061011121314151617181920212223242526272829),
70//   32, 0x01020304050610111213141516171819202122232425262728290708090A0B0C
71// fixedBytesParam2(bytes,bytes6,bytes6): 0x60, left(0x01), left(0x02), 5, left(0x03) ->
72//   0x40, 0x80,
73//   16, left(0x6263646566010000000000030000000000),
74//   17, left(0x010000000000030000000002000000000000)
75