<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/110317>110317</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [AVX2+] Vectorized `1 << u4` in a byte vector should turn into `vpshufb`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Validark
      </td>
    </tr>
</table>

<pre>
    This code: ([Godbolt link](https://zig.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:3,lang:zig,selection:(endColumn:2,endLineNumber:3,positionColumn:2,positionLineNumber:3,selectionStartColumn:2,selectionStartLineNumber:3,startColumn:2,startLineNumber:3),source:'export+fn+foo(chunk:+@Vector(32,+u8))+@TypeOf(chunk)+%7B%0A++++return+@as(@TypeOf(chunk),+@splat(1))+%3C%3C+@truncate(chunk+%3E%3E+@splat(4))%3B%0A%7D'),l:'5',n:'1',o:'Zig+source+%233',t:'0')),header:(),k:50.61449749453956,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:ztrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:zig,libs:!(),options:'-O+ReleaseFast+-target+x86_64-linux+-mcpu%3Dznver3',overrides:!(),selection:(endColumn:33,endLineNumber:18,positionColumn:33,positionLineNumber:18,selectionStartColumn:33,selectionStartLineNumber:18,startColumn:33,startLineNumber:18),source:3),l:'5',n:'0',o:'+zig+trunk+(Editor+%233)',t:'0')),header:(),k:49.38550250546045,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4))

```zig
export fn foo(chunk: @Vector(32, u8)) @TypeOf(chunk) {
    return @as(@TypeOf(chunk), @splat(1)) << @truncate(chunk >> @splat(4));
}
```

```llvm
define dso_local range(i8 1, -127) <32 x i8> @foo(<32 x i8> %0) local_unnamed_addr {
Entry:
  %1 = lshr <32 x i8> %0, <i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4, i8 4>
  %2 = and <32 x i8> %1, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
  %3 = shl nuw <32 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>, %2
  ret <32 x i8> %3
}
```

Compiles like so for Zen 3:

```asm
.LCPI0_1:
        .zero   32,16
.LCPI0_2:
 .zero   32,252
.LCPI0_3:
        .zero   32,224
.LCPI0_4:
 .byte   1
foo:
        vpsllw  ymm0, ymm0, 1
        vpbroadcastb ymm1, byte ptr [rip + .LCPI0_4]
        vpblendvb       ymm1, ymm1, ymmword ptr [rip + .LCPI0_1], ymm0
        vpand   ymm0, ymm0, ymmword ptr [rip + .LCPI0_3]
        vpsllw  ymm2, ymm1, 2
        vpand   ymm2, ymm2, ymmword ptr [rip + .LCPI0_2]
        vpaddb  ymm0, ymm0, ymm0
 vpblendvb       ymm1, ymm1, ymm2, ymm0
        vpaddb  ymm0, ymm0, ymm0
        vpaddb  ymm2, ymm1, ymm1
        vpblendvb       ymm0, ymm1, ymm2, ymm0
        ret
```

However, because the bytes resulting from `chunk >> @splat(4)` are in the range [0, 15], we can precompute all 16 possible answers and use vpshufb instead ([Godbolt, full code](https://zig.godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYgAzKVpMGoAF55gpJfWQE8Ayo3QBhVLQCuLBiABMpJwAyeAyYAHKeAEaYxPoAbKQADqgKhPYMrh5eEonJqQJBIeEsUTEAHFaYNnYCQgRMxAQZnt5%2B1pi2abX1BAVhkdFxVnUNTVlcQ929RSUgpQCUVqjuxMjsHGgMCgQA1Fvo2wCkegAi2wACeCxJDRAHPj57dz5zRwBCBxoAghtb2xHudDsDEOJ3Ol2uBFu93%2BgOCTxeeneXw%2BnyowP4qAgyAQ7gYAGsQOcAGrtIjECB6PzbdzzObnAAqAE8EpgAPJULE4/F0g4AdiRn22Qu2xEwBGWwLOTAUEDOTJZ7M5uLxC3OCgSRkhXDmPL0ziOznOBGIuNEBEwSvxIOwR2wao1TEhkh1bxRfOObq%2BmFUEO2aL9qFQPktBOJpJIFKpNJ1DOZbI52OVPP5KOF2x%2BOzqEXoINOaCudjYAcxewAdCkWOhS6KWY7ZSlTPHZfKm4nuaqyxWq/Y6hAaaRtlxYrr9Xr7ZqIM6XYjU8LReLiMCAG4JBQ4qgRCBZ%2BgDtt46228d1qeu5G8j3Ir7%2Bldr9wbrdMbPsbbGRkEOMD4L4VYKQlyuOKtumAxv%2BCockByYCmmeBUNssrBK4BaXBaMZ8lBabCku9QipgCjuLQBB/i2ipfngP66qcuJYDQIToKegoYUK/DEHBGilqWZwRIQQh4I2iqgU2pHkXSAD02zzIcvLOHgfKGmhs6MWmGbbF%2B3q5ipDDfrhBwAKyvDJOkejOXyKRhop4QRun6bppxHKcMFwapqgHqCGiqKUGh0ho2yVEo2xAVZTmHD4OlwZx3G8U2AmAY%2B9AxmJ8w2fRpnup6DGMfOEo4RZBDJcKqWXul6YCL8bAEAgGAKOpWwmrYknoYx3rmoufqSk8tC0EuLClu5sSlkwS6qDpXA%2BKWq7rqWESlsNPhPLKJK2BGsTSNS8wDmcC1khAy0DtGdIbeG5I7atCINRhTXROibX3B1XU9aUfUDaoo3jXek1zQdi3kpSu1rWGX2Rr9IGbRGP0nXljWqM1V3nO1nXdb15YKEoehjbeVCTaWI2lB9IPkkOQPrXjEAEyd%2B3E6T0YQ5JRkCgpOELsCCgAO6ENiYXEeBsXAZB9Npp9W3HdGuaHg5WKoEhRZlvS9TAGK919VQmCOssmBCGKAAS0oQDCBHBKWyAJO4pZKyr5kDv1g0zREzMxmVFXoAoHFw3diNPTNaMTVNM1zUBn6aWRuF0r5mDnPmCR0DgxDEBGTzOMocj%2BbLYrbEYyB4lVeEJL6zHbDe64RD79wLHzwoC6DUYSXZouweLkuh9LycEArJvKwuaua9rutAgbRut2buEW09zx0vblXOzd8Mt8PntvREvvc/7WkKMHtB%2BWc4eR9g0ex/c8eJ8Mcs7GnGe7O42ckDsuf53eEQhbE8KkKXQrl/j8QnSLeh2mL4eFg3BBVhlsQI%2BLdTbt3VgQLWMpu760NsbMBqsFAW2RijO2YoHZOzOC7BGD0kYo1nhjKa2MF5PiXoHFePk16hw3hLCO9Bt4x3JHHBOSdgEpxPpnc%2BOcSB51ehuYhxcn4mUUiHT%2BdoaFXC3jvckZYqAsGbr/ZCyhiDBEhE8AAkgwLCtA8D7Flp4RgmY4zbASNKJQ%2BwiC8PRhEQk8lzy6WcAwJ4Fs0LRS5k%2BF454dRCKKqlYynx3QcAWLQTgOleDeG4LwVAnAABaFhdhLBWKHO4eg9C8EIhwLQ3iEDKywDECACwCQ6TYj4XkeguAaAAJzVN5DpMpUhpAhI4JIXgLAJAaA0KQCJWhSDRI4LwX8nSMlZNIHAWASBN70DIBQOudCBimGNMqPggJoi/h1poXgXFmDEEZJwHgpAtn1EZKyCI2hSR7N4PmNgghWQMFoLszJvAsD/GAM4MQa8LmkCwCwYwwBxCPK%2BXgUUHQly4Q2f4VQ7R3Dmk%2Baoyo4KdERGIEc1wWBwXGkuJ80FxAIjJEwMcTAPyTA6JMBshYVAjDAAUESPAmBmashZBE/Z/BBAiDEOwKQMhBCKBUOoAFuhxhGFJeYSwiLfyQAWKgBI1RNicAALSsm2AAJUqMrJQAAxaUOw5WHxTr1AA%2BstOVJL3DOTlSwOBdlTBaOiGk3p2KVFYHFQUioVQ0iOE0qMbwXByiBGCH0YoAwuAGCSCkGVXqJDlFDXkBgUx%2BgxGDa60knRhiNDcM0SNSaOg1FTXGwNCaDBbG6BGn1EwGh5pmMGhYChEmrH0ME0J4TwV9O2CK/yJorQQFwIQHhKS9BzHSWShYOSmB5MoIUkAkhKmll5D4WIpRKkdI0D4SQc7Si8kMJwFppA2kVM6d0qJnABkgCGUOzdHAfBNoBX0wdjzvHYpSA4SQQA%3D)):

```zig
export fn foo2(chunk: @Vector(32, u8)) @TypeOf(chunk) {
    const table = comptime foo(std.simd.repeat(@sizeOf(@TypeOf(chunk)), std.simd.iota(u8, 16) << @splat(4)));
    return vpshufb(table, chunk >> @splat(4));
}

fn vpshufb(table: anytype, indices: @TypeOf(table)) @TypeOf(table) {
    if (@inComptime()) {
        var result: @TypeOf(indices) = undefined;
        for (0..@bitSizeOf(@TypeOf(indices)) / 8) |i| {
            const index = indices[i];
            result[i] = if (index >= 0x80) 0 else table[index % (@bitSizeOf(@TypeOf(table)) / 8)];
        }

        return result;
    }

    const methods = struct {
        extern fn @"llvm.x86.avx512.pshuf.b.512"(@Vector(64, u8), @Vector(64, u8)) @Vector(64, u8);
        extern fn @"llvm.x86.avx2.pshuf.b"(@Vector(32, u8), @Vector(32, u8)) @Vector(32, u8);
        extern fn @"llvm.x86.ssse3.pshuf.b.128"(@Vector(16, u8), @Vector(16, u8)) @Vector(16, u8);
    };

    return switch (@TypeOf(table)) {
 @Vector(64, u8) => if (comptime std.Target.x86.featureSetHas(builtin.cpu.features, .avx512bw)) methods.@"llvm.x86.avx512.pshuf.b.512"(table, indices) else @compileError("CPU target lacks support for vpshufb512"),
 @Vector(32, u8) => if (comptime std.Target.x86.featureSetHas(builtin.cpu.features, .avx2)) methods.@"llvm.x86.avx2.pshuf.b"(table, indices) else @compileError("CPU target lacks support for vpshufb256"),
        @Vector(16, u8) => if (comptime std.Target.x86.featureSetHas(builtin.cpu.features, .ssse3)) methods.@"llvm.x86.ssse3.pshuf.b.128"(table, indices) else @compileError("CPU target lacks support for vpshufb128"),
        else => @compileError(std.fmt.comptimePrint("Invalid argument type passed to vpshufb: {}\n", .{@TypeOf(table)})),
 };
}
```

```asm
.LCPI0_0:
        .zero   32,15
 .byte   1
        .byte   2
        .byte   4
        .byte   8
 .byte   16
        .byte   32
        .byte   64
        .byte 128
        .byte   1
        .byte   2
        .byte   4
 .byte   8
        .byte   16
        .byte   32
        .byte 64
        .byte   128
        .byte   1
        .byte   2
 .byte   4
        .byte   8
        .byte   16
        .byte 32
        .byte   64
        .byte   128
        .byte   1
 .byte   2
        .byte   4
        .byte   8
        .byte 16
        .byte   32
        .byte   64
        .byte 128
.LCPI0_2:
        .byte   1
        .byte   2
        .byte 4
        .byte   8
        .byte   16
        .byte   32
 .byte   64
        .byte   128
foo2:
        vpsrlw  ymm0, ymm0, 4
        vpand   ymm0, ymm0, ymmword ptr [rip + .LCPI0_0]
 vpbroadcastq    ymm1, qword ptr [rip + .LCPI0_2]
        vpshufb ymm0, ymm1, ymm0
        ret
```


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWluXojrT_jXMDWv3ggCKF3ORcFIREc96sxeHCMhRDoL--m8B2t3a9uzZ7zd3e1YvHZLKU5UnVRVS0cxz340x_klwiODEH2ZZeEn2c22GvmNmwQ8rcS4_l56fk3biYIKBJAF4gkNK4lhJWJChHwcEJxKA94oizQkGEkAmgHz13Te3k3lLMrdtZNy2m24QAP_9g0cwsNEmOX6RZAQQ_LaXP_ghjs0It099mgB9AgiHJC4Wthk2rTR7a1jleFZ3YlQndiQYyBBACM240XX1XQIIOQ6xXfhJ3OHj2BGSsIyaR0AAAcfOxI_xtIwsnN3Gp0nuNyMeBO-NX6TfFSwKMysexjx2fR35dcAruUHTkZSZfSMF12mSFQRAh7j5SBIC8LZXxkHbjQiWWmO7JZVnGlACoJJvYQZd9_KSYv3wPqprBly_-aBaiPtfhosyi7tRZt6s3MvRQieRp6FZEICnP5QBjhFuH41EkZWxbRb4Y3QrIt0-PoOwdxCOudvF9cV2oRuNYccF1618_OAuSfe0b9Yf3ZhrFQGG6SSKz37TqRE8bDot5a2DNi0NoRz11qNZdtBnByzHDLjeh262w4oap6SoDyuoByu6hyZoqBeKhddxEaV-iD9FxXsLA68Nh0ETA35Y4KyLRt56UG35sZldHjjpmnTriO3iocNOogjHhR6HlwcMB1ulK5hhmD-IOzgyYzfEj7J-1vj5GecPzbjGdlk8hrIfFzh8kAp9KzOzi9Clno_2IvOjh6FnnFlJjsXOAj92n7k8hKabr31c6SmO_9cEQj8nkNC38k8r1ChK0iaob5P9SycAmuMQmzmWzbwJzL8KM3Nx87-a7_3dY_8K_bism47ITsvGpcVrfMbZzRuTM84y38HPan6RuhpH_pK7aP5V8mKY77JXK_9N-mK-prYXY18MeSn5kMKYX0Twc-ygdg3QzecRAfj7hvEez4N_G9Ls4I3hOY4CHMWxPYrl_mxIf5ob-OXcvrP6jLO8W_R7DqREgoK3zx7V_TXEtC3ddkAeYvJxKyC_bATkfRsgX6VxkuijDpEkSbLL_OQ_5H3ya9YnCUYgmLbnOduTBCMRjES-yPLMTTXRF5_m-XLyYXiOuiYHH_wYk06e_B0mthmSmRm7jUafJ5tQJv-iW2obsxhA1qTP30zo2HpqBhzVCLdQf5dx8ybi_G06TvbBjhQXXW69cUUAjiYJRiTD3Mue1bR4QtPq82STeMj_5DcjfWILtGyZsfOVLPqDrP5t8H_v-4EspiUr90IyLqtnwlqi6NvA_95388ootB51JyzDxVenYn4ntQjdG1ZOhn6AyTwhD0lG7nFMMu-h_jTazG8p6G0izEbU3_SnnND9e7viLCFJsk2-dO9BGnxIP4i9T-Ymx_waFQD2QZz9BGtdCkySJN09N-nuGeqc5mFYkeQlito0df-mn8WsLDEd28wLq5FpV6BFT4uMJDiU-SlJAES-G8GJXxBCHDtn6_Z8B_n0XSWZ8w0e3R4-b-Y94TZp5OsEfo3HvLDvnQjw2S7wrbq7GPhndeCFOtNxrJdm3yf4G4yBbzn5J_CvkuAJ-6sHPFtD_Z41GS5-EXXDpMLn9qBDWtg2yxyThYdb38rJDOdlWPixSx6yJCKJHvXLt4geRZoZJv24hWhfA5rF6Byau7lQhUnbjMk0w82RqiwwaYYhSffINMlz3woxacZ5hbO83Z8ae85p7pUHi_TjvMCm81gaaSAPZRh2hZPfLZFcCQbqu4nrQRmdHM4QarirZjukCRGaO2gCZdoQbGjOJAFq1woVGuxDo5ILzUAXOHcHamHsJHjJfYsytlCoeYSgmqB4CeEKDtMKamco71x4VdeppiRQ5jg3HR82hsTDS8IYyFtPDKGcIB8iLR1X8ILhZQeHKoaSuatnCbRUA4onV_VmOy3zOCwl8fhkjNEIS_lqKcGhbO6m8U4w3LlWQ2MfF1yThxGd-sC0tjSCay9w5Hodr6bLdWgbAzCYL1Zuagir9elY1toxHyquJrgGpOVzAiohwC70QQUFLNRjcQ6HsyPXd67cdV4hAdUJdL3CAvWwdMRclPQxo4egRHI5YFrNri4sa4xjvK3a5_iSVDP2BN0LNPruDiq5odtQyYrRURJQb3a1nOtVt2IIT1DipdSFs_FqIrEEkGXKZaHjz2MAjBLUUoWUTTXRl3AlifpyvO9rXDmpBUYX3MU88LZiNJtQV1-_xjpSRuVUQlK1ONcjvZqDykzopeQFHm3V84OuW6fWukheSTowJ4OTbMyCAunjdDyS1XQ6pkV9b404oK9nM07VZVC3A_TrSdomo6luCqVz3EG7xhV0hGCje4ueutn194twORvuD2rExqV5utSbEwHkXc-DpjkvwnqXZYNt1t-fRlpvuzuu-MkcT3xNgAo7RgZ7cucC2ndMikXB9gDgHfqES07hj8wo67ddoZMNKitzNGuWW5YyDyRdE9kJu96pRngpdbUoI1ifW1khsQN02QlRhNFqmucZUllkbpGp7fkQmZYQlAPDT13hWE4MhAgg-8BPD7E76_VOdjneicZomajYTXYrlQCyKA2R4oenzb6ajwzDY0fAP7krkA6D7QKKFLheR_Z5og_dg6pEXt7TNpFiWXJrDHPi_FQUD5mHKqhezuJYD_BR317UuZekrDEv456VpvVQtTW5MtOTOzwJin9SV4pHeQm4rKUE1HC9X0ZDkdXDal8zCr8CMIK7VsEA1tGYr8BhnsZl2hMV7aBLCTvfI3Fsq6fNtgx7O2HCW1CCrgJVPd1UUbYL4mRXM1mUlIfTIuALgZLKiRCWXL4Ig2rRO4npFrYK1M2pn5020iLMpzNvNlHHKkBKvlxMF3wlRrZABx68UGKhOCMLK9yobxbCaDr3ltu57ltbBtHb1cBcHVaimSTMcYsD-mo4PhOki5LONsoWzLPBSLHmyoyKt-Fxc9LoNRPrdLx1LJrbqVKCvaOF18LS3IxAiAajWRDoxizbHiUoXZyOaKm3pHYGN54Hgpvq0iQXBBfqPWnq77YSRvkW7tFgmqaDDTN0lNIcutxGTSRvvg_Pi8ESKuqAHqyNSNDzPEKCokK4oBJDFNAQqZsLHOtsulcvGReIZ9qlrnPpqtXRWt4mMBnKFeP409lyamrL9VSjrysU98zNvJSpjIvEeBYJc0p0a1FCyvKqa4l9bK22JrvMknYXxIZrLI0nvevQEnGPnYv9QTUZXqtE6Imr3WK7T8oKT4LSG0wutgSz8VmtSrM0B1lZQNealwWwSmlDDa41dbbCrX51eK3gZ3Fxnkvns00Aub8JVG1YtPULtLFZPB-4FK4JINs8HvOanfeVWMF9nQV2IOblgWOwZHiWxKuBujWykADykTfixQR7IJqwWHYZhNZemBujFnPiLK2CWbvGZKOlZb9HTXNLQ6dchhsw94862CXDvX7VhT5SRCrYJXTsHVUTaDI387fJUMazgO55FeNNBH2ACrZmxsMh0heOK6X1LI3tLiPZC8TR2Ct3Xm3HbLRa-cNl2-MkprwVmOPZDva7E8wVKyOAvBcuni8iyZN4CAO3mggF5MW-HKbs3I127NWCi6k6NlqIyhf42dyTjIAPr5fexobVmJVzajJfcEErIbMc68wFVT2Fu0tcM4YNNxNj6eohFrHCTqo1jCFEpuw53gRt1KHOYncg8NLIqyYG40uieqlESYBCJRi95e7IbgPsltCEcHxdTzkx1dKVl0JvxI5HW3cCx9CElGoI4423EOcjdlJt-XihhfvpaAg3cIGmfUocIUMvHQH5kTLVTjPXHSc-AWSPTpOtu5UjUZL242roprCIaWmvXoQR8Bbz_pSdRVPX9TaGJieT_Do-w1wkgKxAjdUMk59EgVAJ1a6qUC3M1JaBrbtaDY3wwhrgwK6N_pwRo44bM7kkrOpIc2Uk2XS1QdVWCcoxT8k1HB3HUqXZSzi7LGFvrKHc263hUYRwJS1mMEKRmXt7JDUrRgAZIeiLkl6phuYhQUUrPYFy6dWeIo_xblH5k8PFgBvVRSN6PvVtCCeLPAIQjlcnLRsbENbmSq-4zbBeZjTsclle6OvxhBH1ZbiodOSES2TqvhIwKVDX8m4oGys_WRuUr0vUSbOqLbr4SBGG1C6BVQkVYSEEynp7GouhLG4D5K66TdKtFdHsUUE89_ypaGvUYrowdZeWl1ulmgqmiCylh5SYlirF49JIU7yd4ElRNqQ0iRqzy2o90IHQ7DaXcZIZhlyNjKGnLgboOlxsFt5OX0SI05LRKoCBp0ZhyInsZpTO1cAZUSK7MOz-wucDbVzJaQpBsNZ6DnUaxxAFrqCs9KszhAc0TdCWqpzj9TzcpQvILgwDtlXhezXs9YnzdckP_LGan53EeUEWZvMaTDAi2bwiF36Eb4XFvHDecj9y3jKc4va9u3kF968d5OsKYVskfB_oJ4VJAL4xSSDp3mO18MvFz0dV8FNB8vY6TgC-tbMB-ve1xe5A_BWMgaQZX4pL2uL6sePbbVH-gbub3i-c3tsfOfUPZEeOHws3Ou_F6CfJ9pxlZrdjz7PWuzEtZSJZxl3h03ngqPl3SLJGI_X2RrCU5ReLVwv0gdYCApnkO3sEn-gLX-368A4_dnDdmnDH4JDfnHye7ejWrJ1KJ9ENaum4g0hNE1Xzbc2VInHYnP9aGjl0kwHcjb_vpvKwHLeJvLLnafU_nU8bt7qT_mnQiwEdBREuvMTJu8JckZV28ZUwXBc4i5sIJViKACAMz9FbzffezHPN0eCtdbw3642jAQFAN6X3wO2xnwJXIL_tGnzb9Tz5X5nzbsxXQx4yiPAPyeVl128bkuc5Zt5poZsQebamSRjfWPPQNfi263l53zPDc5bJK7-wPfJXrva-4t-sQeMeTULqPP49lTa5cNneDrbTPmCzKDO8wMWwvWexSj8s_PjNTst7X95A3vzGqm7qbz749pve9Z4rP6WRNtoIlrrdLUtZ1k6BAECYrcjuBpMMTTvIybxMuw0nye458w7d3mF_JeKTD_x5IsA_kvDk039--oDrPU__nmde-94fZqENl1_T8E1E_Xku7tBfuehwu4l_hW_mfoiKtzsZs8yPi07tKD6boe-QZuaWEY4LstmTydTMc-yQRfK-cTebZB81ocwJcWuEQL41La-iti--v5LcPfZzDvi9m8fnqj_1D1V_7nU1_l341gxeN7Ovm_ln0N5rOeYb2N5L3GYdX4r_bzY_G_sM-q9sfm0x-T_b_JsE_5bN_47l37D5_-cUj2v6Zz3j6-XV_8NV_gT3n2by27S3Z6YXV2HZq6sw9k9cOFEfN0Cf7tJO5Kd7ndO_vEDqLiVe3MP8q_uXH85PxhkwA_MH_kn3QZ_tsSwFfng_KZOizYFj0xwY8DbHHHhz0MMOz_BgQAOr_8P_CSjAUgPQpwc0A8CbzfUpanDosZZtm9g-ECyFI9MP39oNKcncH36el_gnTVMM3f8RmhYO8_YXqQDEuCLb3iaFc-KP7Gcz6C-rdHOCpUI_L_IPmMIvwvanrHC9BQRAzdGi23H9K3ZIokfR91NlyRI9ivRj0uyuK8-tGJl7SRk6ZPum58dF0oy57yg96keZhT8fb3Fcv_BKq9moCCC3vz3pvv5Ks6T9QR2QW_NzAsi3-Z1_gv8LAAD__wMLL2U">