How to optimize DaCe SpMV? (unoptimized version 20x slower than SciPy sparse dot)

Problem description
In the DaCe paper, it is stated that DaCe SpMV is as fast as MKL：

We observe similar results in SpMV, which is more complicated to optimize due to its irregular memory access characteristics. SDFGs are on par with MKL (99.9% performance) on CPU, and are successfully vectorized on GPUs.

However, I found it 20x slower than scipy.sparse.csr_matrix.dot. 1.4s vs 60ms for the problem size used in the DaCe paper.

Full code to reproduce: https://gist.github.com/learning-chip/1ef56f6ea707b063c3177e9f143f0905
The SpMV code was taken from https://github.com/spcl/dace/blob/v0.10.8/samples/simple/spmv.py
DaCe version: 0.10.8
Hardware: Intel Xeon 8180 CPU

It is probably because I did not apply any transformations to optimize performance. But I could not found more words in the paper about SpMV optimization, except this short paragraph:

Using explicit dataflow is beneficial when defining nontrivial data accesses. Fig. 4 depicts a full implementation of Sparse Matrix-Vector multiplication (SpMV). In the implementation, the access x[A_col[j]] is translated into an indirect access subgraph (see Appendix F) that can be identified and used in transformations.

I also tried this sample code from the paper, slightly different from the GitHub version. But got TypeError: dtype must be a DaCe type, got __map_8_b0 at runtime.
# From DaCe paper fig.4
@dace.program
def spmv(A_row: dace.uint32[H+1], A_col: dace.uint32[nnz],
            A_val: dace.float32 [nnz], x: dace.float32 [W],
            b: dace.float32[H]):
    for i in dace.map[0:H]:
        for j in dace.map[A_row[i]:A_row[i+1]]:
            with dace.tasklet :
                a << A_val[j]
                in_x << x[A_col[j]]
                out >> b(1, dace.sum)[i]
                out = a * in_x

Environment
Conda environment.yml is
name: dace
dependencies:
  - python=3.7.5
  - pip
  - pip:
    - jupyterlab
    - scipy==1.6.2
    - dace==0.10.8

For reference, the SciPy sparse dot code is extremely simple:
template <class I, class T>
void csr_matvec(const I n_row,
                const I n_col,
                const I Ap[],
                const I Aj[],
                const T Ax[],
                const T Xx[],
                      T Yx[])
{
    for(I i = 0; i < n_row; i++){
        T sum = Yx[i];
        for(I jj = Ap[i]; jj < Ap[i+1]; jj++){
            sum += Ax[jj] * Xx[Aj[jj]];
        }
        Yx[i] = sum;
    }
}

Taken from https://github.com/scipy/scipy/blob/v1.6.2/scipy/sparse/sparsetools/csr.h#L1119-L1135

@learning-chip Thanks for providing the reproducible notebook. It made everything easier 👍
First of all, what you were timing includes compilation and running time. This was fixed since the latest release (should be part of v0.10.9, which also includes Python 3.9 support). If you run the code through Binder with the latest master branch the time goes down to 16.4ms, but the first run will be slower since it will compile the code once.
If you want to use the current 0.10.8 release, you can also precompile the SDFG yourself:
cspmv = spmv.compile()
%time cspmv(A_row=A_row, A_col=A_col, A_val=A_val, x=x, b=b, H=H, W=W, nnz=nnz)

The second part of the question is the transformations. If I recall correctly, the set of transformations we applied was tiling the internal map and using vectorization to improve the runtime.

If you run the code through Binder with the latest master branch the time goes down to 16.4ms

Thanks, it now runs as fast as SciPy on my machine.

the set of transformations we applied was tiling the internal map and using vectorization to improve the runtime.

Anything beyond loop tiling and SIMD? Since SpMV is a typical memory-bound kernel, can DaCe insert software prefetch instructions such as _mm_prefetch for x86 CPU? Or is it left to the C++ compiler to recognize prefetch-able patterns?

Great question! We don't provide this transformation as part of our standard set, but it's possible to write a simple transformation that gets the memory access patterns from the memlets and inserts a prefetch tasklet. We would be happy to accept any contribution as a PR :)

Thanks, will come back if I have any updates 👍

Oh I forgot to ask -- where can I find the code for loop tiling and SIMD transformations for SpMV? i.e. the exact code used by the SpMV benchmark in the DaCe paper .

Hi @learning-chip, while I did not contribute to the original paper you mentioned, I guess you should try standard tiling and vectorization transformations, which can be found [here] and [here]. They should be general enough for dynamic maps as well. Also maybe have a look at [SubgraphFusion] for loop/operator fusion. You can apply transformations either in the GUI or via code as stated in this tutorial. I do not know what exactly they did in the OG paper (@tbennun) to achieve said results, however.

Hello @learning-chip. We do have the optimized SpMV SDFG. Unfortunately, it is based on a quite old version of the SDFG specification, and it is not valid according to the current one. Therefore, I attempted a quick update so that we can at least showcase the optimizations that we did:

The optimizations are basically two:

Vectorization of the columns map (for j in dace.map[A_row[i]:A_row[i+1]]) as @sancierra suggested. On the left inner map, we perform vector_length (e.g., 4) indirections of x at a time and store them in a temporary vector, which is then multiplied by A_val[j:j+vector_length], while the result is reduced down and added to b. The right map handles the remainder in case A_row[i+1]-A_row[i] does not divide evenly by vector_length.
Output local storage for b in the form of b_tmp so that the threads don't add directly to b and potentially cause low performance due to cache invalidations.

I am attaching the (updated) SDFG and a script to run it below (in the zip file); however, there are a couple of caveats:
First, it will not validate as-is because we have changed how edges with a write-conflict-resolution work. These edges used to have a property called wcr_identity that effectively initialized the data they were pointing to at the start of the current scope.
This feature was used to initialize b_tmp to zero at the start of every iteration of the row map (for i in dace.map[0:H]). Since wcr_identity was removed (for reasons that might be out of this discussion's scope), b_tmp is not initialized and garbage values are returned. A temporary quick fix is to do a very simple change to generated code:
            #pragma omp parallel for
            for (auto i = 0; i < H; i += 1) {
                unsigned int rowptr;
                unsigned int rowend;
                float b_tmp; // <---- SET THIS TO ZERO (float b_tmp = 0;)

Second, there might be some performance regression (I am not sure, though) due to the use of atomics in the edges with write-conflict resolution. However, it is easy to disable if needed.
I hope this helps!
optimized_spmv_cpu.zip

@sancierra @alexnick83 Wonderful, thanks for the detailed replies! Let me take a closer look.


Update Getting Started with Okteto tutorial with instructions for how  to fix the error when there is no storage left on the okteto cloud

The Getting Started with Okteto is a great place to learn about the use of Okteto and Okteto manifest. However, When we try to run okteto up, it should work fine. However, sometimes we come across errors like:

couldn't activate your development container\n    error creating kubernetes volume claim: persistentvolumeclaims "hello-world-okteto" is forbidden: exceeded quota: nitishkumar06, requested: requests.storage=2Gi, used: requests.storage=5Gi, limited: requests.storage=5Gi" action=711c3401-9ccc-41df-b192-a68113a9aa4f version=2.12.1

Although this error is easy to solve, just delete the unused volume/storage on okteto cloud. However, I believe this would be much better if we mentioned the solution to this error in the docs.

I'm sorry for not putting much detail over this PR and why these changes have been made. Here's a detailed explanation:
Consider the image below:

You can see that the storage is being shown as 4GB/5GB. Earlier the storage was being shown as 5GB/5GB due to which no other application could be deployed onto okteto cloud. The amount of storage that was required for my application to get deployed on okteto cloud was 2GB. However, due to insufficient storage, okteto was throwing the error:

couldn't activate your development container\n error creating kubernetes volume claim: persistentvolumeclaims "hello-world-okteto" is forbidden: exceeded quota: nitishkumar06, requested: requests.storage=2Gi, used: requests.storage=5Gi, limited: requests.storage=5Gi" action=711c3401-9ccc-41df-b192-a68113a9aa4f version=2.12.1

This is not an internal error and seems obvious. However, I tried looking at if there's any volume manifest exists locally for my application and there's no one. Finally, at the end I went to okteto cloud and noticed the space left there which was 0GB. Hence I deleted the unused application that was deployed on the okteto cloud (including volumes) to get space for my new application to get deployed on okteto.
This PR focuses on adding a slight note for someone who comes across such a condition. Although the solution is easy to be found yet we can document it on the docs I believe.
WDYT @RinkiyaKeDad ?

Update: Understood this later - No storage left on okteto cloud means no storage left in the current working namespace at okteto cloud. This PR adds a message on how to deal with this.

@nitishfy 👋
Sorry for the delay in circling back to this PR. We've made some significant changes to our doc structure recently and this PR now has some conflicts that will need to be resolved. It might be easier to open a new one with your proposed changes.
I'm also happy to make the new PR myself if you'd like 🙂

Closing this one since Okteto Cloud is not longer available


Bpiol key (smartcard on usb pen drive) not working

I tried it on rpi4 with debian 10, armhf, tried both freerdp 2.2.0 and 2.3.2 and on both is not working.
Other type of usb pendrive with smartcard (for auth on website and signing file) works for both freerdp versions, Bpiol key instead not.
Here some informations if can be useful (if is possible make it working without broken other smartcard device):
lsusb:
`Bus 001 Device 015: ID 25dd:2311
Bus 001 Device 014: ID 048d:1167 Integrated Technology Express, Inc.
Bus 001 Device 013: ID 058f:6254 Alcor Micro Corp. USB Hub`

freerdp with smartcard log debug (only part because seems that loop on them):
`[12:56:57:096] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 50
[12:56:57:096] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:096] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:096] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:100] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:100] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:100] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 0CB8BA39 }
[12:56:57:100] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:103] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardReleaseContext (0x00090018) FileId: 1 CompletionId: 49
[12:56:57:103] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Call {
[12:56:57:103] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 20C01614 }
[12:56:57:103] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:104] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Return {
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 50
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 0CB8BA39 }
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:105] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:106] [26547:28413] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:109] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 49
[12:56:57:110] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:110] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:110] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:113] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:113] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:113] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 49902B73 }
[12:56:57:113] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:117] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:117] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:117] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 49902B73 }
[12:56:57:118] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:118] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:118] [26547:28415] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:263] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:264] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:264] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 662A563B }
[12:56:57:264] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:264] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:264] [26547:28409] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:265] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardReleaseContext (0x00090018) FileId: 1 CompletionId: 49
[12:56:57:266] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Call {
[12:56:57:266] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 662A563B }
[12:56:57:266] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:267] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Return {
[12:56:57:267] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:267] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:271] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 49
[12:56:57:271] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:271] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:271] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:272] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:273] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:273] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { F1116B7D }
[12:56:57:273] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:281] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:281] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:282] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { F1116B7D }
[12:56:57:282] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:282] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:282] [26547:28417] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:291] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:291] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:291] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { DF6F3424 }
[12:56:57:291] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:291] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:291] [26547:28411] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:293] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardReleaseContext (0x00090018) FileId: 1 CompletionId: 49
[12:56:57:293] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Call {
[12:56:57:293] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { DF6F3424 }
[12:56:57:293] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:295] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Return {
[12:56:57:295] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:295] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:298] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 49
[12:56:57:298] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:298] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:298] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:299] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:299] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:299] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 61577C7A }
[12:56:57:299] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:302] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:302] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:303] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 61577C7A }
[12:56:57:303] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:303] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:303] [26547:28419] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:310] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:310] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:310] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 0CB8BA39 }
[12:56:57:310] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:310] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:310] [26547:28413] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:314] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardReleaseContext (0x00090018) FileId: 1 CompletionId: 49
[12:56:57:314] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Call {
[12:56:57:314] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 0CB8BA39 }
[12:56:57:314] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:316] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Return {
[12:56:57:317] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:317] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:321] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 49
[12:56:57:321] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:322] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:322] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:323] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:324] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:324] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { C8A7244F }
[12:56:57:324] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:324] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 50
[12:56:57:325] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:325] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 49902B73 }
[12:56:57:325] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:325] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:326] [26547:28415] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:327] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 49
[12:56:57:327] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:327] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { C8A7244F }
[12:56:57:327] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:327] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:328] [26547:28421] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
[12:56:57:330] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardReleaseContext (0x00090018) FileId: 1 CompletionId: 50
[12:56:57:330] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Call {
[12:56:57:330] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { 49902B73 }
[12:56:57:330] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:331] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ReleaseContext_Return {
[12:56:57:332] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:332] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:337] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardEstablishContext (0x00090014) FileId: 1 CompletionId: 50
[12:56:57:338] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Call {
[12:56:57:338] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - dwScope: SCARD_SCOPE_SYSTEM (0x00000002)
[12:56:57:338] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:346] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - EstablishContext_Return {
[12:56:57:346] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] -   ReturnCode: SCARD_S_SUCCESS (0x00000000)
[12:56:57:346] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { A6F39F13 }
[12:56:57:346] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:348] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - SCardListReadersA (0x00090028) FileId: 1 CompletionId: 50
[12:56:57:349] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - ListReadersA_Call {
[12:56:57:349] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - hContext: { A6F39F13 }
[12:56:57:349] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - cBytes: 0 mszGroups: (nil) fmszReadersIsNULL: 0 cchReaders: 0xFFFFFFFF
[12:56:57:349] [26547:26602] [DEBUG][com.freerdp.channels.smartcard.client] - }
[12:56:57:350] [26547:28423] [INFO][com.freerdp.channels.smartcard.client] - SCardListReadersA failed with error SCARD_E_NO_READERS_AVAILABLE [-2146435026]
`

scard-tester output (not all because cmd deleted the first part as too long):
`SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListCardsA 471 [  Oberthur COSMO 0,  Oberthur COSMO 1,  Oberthur COSMO 2,
Oberthur COSMO 2048,  Oberthur COSMO 3,  Oberthur COSMO AR 0,  Oberthur COSMO CL
 0,  Oberthur COSMO CL 1,  Oberthur COSMO CNN 0,  Oberthur COSMO HPC 0,  Oberthu
r COSMO HPC 1,  Oberthur COSMO HPP 0,  Oberthur COSMO I,  Oberthur COSMO I 1,  O
berthur COSMO SM 0,  Oberthur COSMO SMX 0, dentity Device (Microsoft Generic Pro
file), dentity Device (NIST SP 800-73 [PIV]), nfoCert WirelessKey 1, nfoCert Wir
elessKey 2, ]
SCardListCardsW 471 [  Oberthur COSMO 0,  Oberthur COSMO 1,  Oberthur COSMO 2,
Oberthur COSMO 2048,  Oberthur COSMO 3,  Oberthur COSMO AR 0,  Oberthur COSMO CL
 0,  Oberthur COSMO CL 1,  Oberthur COSMO CNN 0,  Oberthur COSMO HPC 0,  Oberthu
r COSMO HPC 1,  Oberthur COSMO HPP 0,  Oberthur COSMO I,  Oberthur COSMO I 1,  O
berthur COSMO SM 0,  Oberthur COSMO SMX 0, dentity Device (Microsoft Generic Pro
file), dentity Device (NIST SP 800-73 [PIV]), nfoCert WirelessKey 1, nfoCert Wir
elessKey 2, ]
SCardIntroduceReaderGroupA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderGroupW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardLocateCardsA failed with SCARD_E_UNKNOWN_CARD
SCardLocateCardsW failed with SCARD_E_UNKNOWN_CARD
SCardLocateCardsByATRA failed with SCARD_E_INVALID_VALUE
SCardLocateCardsByATRW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardGetReaderIconA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardGetReaderIconW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardEstablishContext [SCARD_SCOPE_SYSTEM] success
SCardGetStatusChangeA failed with SCARD_E_TIMEOUT
SCardGetStatusChangeW failed with SCARD_E_TIMEOUT
SCardListReaderGroupsA 22 [SCard$DefaultReaders, ]
SCardListReaderGroupsW 22 [SCard$DefaultReaders, ]
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [nullptr] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$AllReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersA [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [nullptr] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$AllReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$DefaultReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$LocalReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListReadersW [SCard$SystemReaders] failed with UNKNOWN
SCardListCardsA 471 [  Oberthur COSMO 0,  Oberthur COSMO 1,  Oberthur COSMO 2,
Oberthur COSMO 2048,  Oberthur COSMO 3,  Oberthur COSMO AR 0,  Oberthur COSMO CL
 0,  Oberthur COSMO CL 1,  Oberthur COSMO CNN 0,  Oberthur COSMO HPC 0,  Oberthu
r COSMO HPC 1,  Oberthur COSMO HPP 0,  Oberthur COSMO I,  Oberthur COSMO I 1,  O
berthur COSMO SM 0,  Oberthur COSMO SMX 0, dentity Device (Microsoft Generic Pro
file), dentity Device (NIST SP 800-73 [PIV]), nfoCert WirelessKey 1, nfoCert Wir
elessKey 2, ]
SCardListCardsW 471 [  Oberthur COSMO 0,  Oberthur COSMO 1,  Oberthur COSMO 2,
Oberthur COSMO 2048,  Oberthur COSMO 3,  Oberthur COSMO AR 0,  Oberthur COSMO CL
 0,  Oberthur COSMO CL 1,  Oberthur COSMO CNN 0,  Oberthur COSMO HPC 0,  Oberthu
r COSMO HPC 1,  Oberthur COSMO HPP 0,  Oberthur COSMO I,  Oberthur COSMO I 1,  O
berthur COSMO SM 0,  Oberthur COSMO SMX 0, dentity Device (Microsoft Generic Pro
file), dentity Device (NIST SP 800-73 [PIV]), nfoCert WirelessKey 1, nfoCert Wir
elessKey 2, ]
SCardIntroduceReaderGroupA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderGroupW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardIntroduceReaderW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardLocateCardsA failed with SCARD_E_UNKNOWN_CARD
SCardLocateCardsW failed with SCARD_E_UNKNOWN_CARD
SCardLocateCardsByATRA failed with SCARD_E_INVALID_VALUE
SCardLocateCardsByATRW failed with SCARD_E_UNSUPPORTED_FEATURE
SCardGetReaderIconA failed with SCARD_E_UNSUPPORTED_FEATURE
SCardGetReaderIconW failed with SCARD_E_UNSUPPORTED_FEATURE`

well, this looks like pcsc is not detecting it? nothing we can do here ;)


[irods/irods#4649] Clear returned microservice parameters (4-2-stable)

As the return list is cleared after executing a rule, the microservice
parameters that are returned need to be properly free'd. Popping them
from the list of parameters causes leaking because the inOutStruct and
other members are not properly handled.
CI tests to run overnight.

#'d


Thumbnail verification should fail only after fetched

When entering a thumbnail URL while creating a Post, the thumbnail preview immediately shows the error image while the image is being fetched.  Can be confusing when the image is huge or if you have a slow connection.
Example
https://spee.ch/8/3716133c744ea8a9.png
As it takes me 3-5s to fetch from speech:

I get this and was confused for a while:

Extra
If possible, should we route this to the optimizer so that we don't fetch the full size, since we are only displaying it in a small container?

This has come up in a few complaints recently, maybe there's a quick fix for it.

Haven't seen this happen recently...  but agreed on passing through the optimizer - noticed this today that we aren't.


Expose links in badge-maker

:clipboard: Description
Fundamentally we need to add the ability to pass a couple of strings into makeBadge(), but we need to decide on the interface for that. One of the useful things we've done in v3 is bringing the terminology used in shields.io URL params, the endpoint badge and the NPM package into line. This is a good thing but the current interface for links in URL params is a bit weird. Now is probably a good time to re-think it. There is some discussion of this in:
https://github.com/badges/shields/issues/4849#issuecomment-609108141
Of the v3.1 issues, this one is currently the least clearly-defined.

This got done in https://github.com/badges/shields/pull/10283 by just exposing the current interface on to it with no changes. Improving it is still valid though.


Updgrade to Rouge 3

Rouge is currently in 3.x
Any chance to upgrade?

No reasoning. PRs welcome.


Multiple reports generated and closes #28, closes #29, closes #30, closes #31, closes #32, closes #33, closes #34, closes #35, closes #36, closes #37

@Danny-Mutale @TvonSween, can you help me with the readme table to reference the images?

@nkoik sure, do you mean adding the images and CSVs?

@nkoik, @Danny-Mutale, I#ve pushed the images and updated the readme with the added images on the feat/reports branch

@nkoik I've also approved the PR - thank you for doing these reports

Thanks @TvonSween
Take a look at the changes. I simplified the code so we can add only the queries fir the rest of the reports

@nkoik, yeah, nice work, that's really great.


Added condition to hide html preset button

Added to the code written by @jackbondpreston in https://github.com/godotengine/godot/pull/35680. Included a condition to check if button is disabled, then the button is hidden.
Fixes #35592.

@maxbarrett9 Is this still desired? If so, this needs to be rebased on the latest master branch.

@maxbarrett9 Is this still desired? If so, this needs to be rebased on the latest master branch.

Thanks for your contribution, but this needs to be redone if still relevant. The other PR that this refers to hasn't been merged, has been closed instead. The code added by it doesn't seem correct either, as we unconditionally update the states on NOTIFICATION_PROCESS, which is excessive.
The relevant parts of editor_run_native.cpp changed a lot since this had been opened. So I'm going to close it. Worth double-checking the issue and finding a new fix for it.


Enable ESLint for browser-side source code

Currently blocked on https://github.com/eslint/eslint/issues/2134 & https://github.com/eslint/espree/issues/124

https://github.com/eslint/eslint/issues/2134 has been fixed :smile:


[Release] Update version to 4.109.0

FIX - Parameter specified as non-null is null - parameter state
FIX - Crash when PaymentTypeId is null
FEATURE - Remove label "interest free" from the front of the installment amount
FEATURE - Added tracks for debin transfer.

listo


Investment portfolio creation and option exploration

Succesfully adds investment portfolio and creation
integrates backend

Great Job @AhmadHassan71 and @FarazRashid !!

@AhmadHassan71 please review!


use latest version of pip

Description
Use latest version of pip instead of older version. Upgrade pip before upgrading/installing the rest.

Coverage increased (+0.03%) to 72.793% when pulling 0a4f87a7f3991dc1356e60d4934ff176506b788b on cl1ent:patch-1 into a71fe82596e2f36f7424e2f8376c5d91a8288c51 on Miserlou:master.

Coverage increased (+0.03%) to 72.793% when pulling 0a4f87a7f3991dc1356e60d4934ff176506b788b on cl1ent:patch-1 into a71fe82596e2f36f7424e2f8376c5d91a8288c51 on Miserlou:master.


[Diagnostics] Update diagnostic message for invalid overrides in protocol context

When we diagnose an override of a protocol requirement which doesn't actually override anything from the base declaration, the diagnostic mentions "superclass". So, adjust the diagnostic to say "parent protocol" instead.
Before:
protocol P {
  override var foo: Int { get } // property does not override any property from its superclass
}

After:
protocol P {
  override var foo: Int { get } // property does not override any property from its parent protocol
}

@swift-ci please smoke test

Looks like we were using the 'superclass' diagnostic in more places like in structs, so I have adjusted the code to emit the existing override_nonclass_decl diagnostic in those cases (since you can't override in structs or enums).
@swift-ci please smoke test

@swift-ci please smoke test


Apex Colorization

Expected behavior
highlights
Actual behavior
no highlights
Steps to reproduce the behavior
download the extension and open a class file

We already have that feature  but for some reason it's not always working.
Probably something to do with our apex.tmLanguage file not up to date with the latest features present in Apex.

fixed with #72


#134 - Fix server react config and add necessary warning and document.

Refer to: #134

@justin808 @robwise I reworked on this one according to Justin's comments, please review.

@yorzi can we move docs/webpack.md file to docs/additional_reading/webpack.md, and then put a link to it in the README in the "Additional Reading" in alphabetical order?

Great idea @robwise

@yorzi Awesome! This looks good, can you change the heading level to 2 from 3 in the webpack.md doc, and then rebase and force push?

Thanks @yorzi!!!! :+1:


Unknown Person

Hi , Thanks for the repo , I am not sure what happens when an untrained person is before the camera  , the model starts predicting someone already trained. It should ideally predict unknown person .
Also how can i reset a trained model in the folder so that it starts training from scratch , do i need to download a new copy from the repo for that ?
Thanks

Which parameters are you using? I did with mtcnn+facenet+knn, gave me false positiives

These stuffs need to be tuned based on the dataset.
There is no one-size fits all face recognition.
Otherwise, Amazon, Google or Microsoft would have release it already.
Tune the parameters based on the datasets, based on how far is the face from the camera, based on the background lighting. I have provided the code.  Dont just download and test. Fine tune based on your conditions.
Go deeper.


Site body has a 500px bottom margin

If this is intentional, what purpose does it serve?

I like being able to scroll to the bottom and still view the bottom-most content at mid level, else I would end up with poor posture, bad jaw health and undesirable physiognomy.


Support package_info_plus 8.x.x

Platform
Dart
Obfuscation
Enabled
Debug Info
Enabled
Doctor
[✓] Flutter (Channel stable, 3.19.6, on macOS 14.4.1 23E224 darwin-arm64, locale en-GB)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 15.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2023.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2024.1)
[✓] Connected device (4 available)
[✓] Network resources
• No issues found!
Version
8.0.0
Steps to Reproduce
Add sentry_flutter as a dependency to a project with package_info_plus: ^8.0.0
Expected Result
Dependencies should be compatible
Actual Result

Because every version of mat_common from path depends on package_info_plus ^8.0.0 and sentry_flutter >=8.0.0 depends on
package_info_plus >=1.0.0 <8.0.0, mat_common from path is incompatible with sentry_flutter >=8.0.0.
So, because mat_mobile depends on both sentry_flutter ^8.0.0 and mat_common from path, version solving failed.

Are you willing to submit a PR?
Yes

PR https://github.com/getsentry/sentry-dart/pull/2010 has already been merged in.  Leaving this issue open to close when there's a new version of sentry_flutter on pub.dev.

We've got some CI failures that's blocking a release, I'm looking into it
meanwhile you can do
dependency_overrides:
  package_info_plus: ^8.0.0

Currently released in 7.20.1. 8.1.0 will follow

Now release on both 7.20.1 and 8.1.0


Add support to upload files to xmpp from bridges with private urls like slack/mattermost/telegram (xmpp)

I'm using matterbridge within xmpp and telegram and I noticed that when someone sends a file in telegram I can't receive it in xmpp.
Once that #278 is solved for telegram, could it be possible to add support for upload files to xmpp using this xep:
https://xmpp.org/extensions/xep-0363.html
Basically consists in upload the file to the xmpp server and share de url link.
Some xmpp clients supports this xep (Conversations, gajim (via plugin), dino, movim...)
Thanks in advance.

Unfortunately the library I use (https://github.com/mattn/go-xmpp) doesn't support this.
Not much I can do for now.

@srgcdev I've just added support for sending files to your own "mediaserver". This is supported for the irc, xmpp and gitter bridges (who don't support native uploading).
An example of how to setup your own with caddy can be found on https://github.com/42wim/matterbridge/wiki/Mediaserver-setup-[advanced]

@42wim Thanks! But having on my own server apache I think its a bit more difficult to configure caddy. I opened an enhancement issue to go-xmpp library to support native http upload for xmpp. I hope they implement it someday.

Oh, could be possible to use caddy for media server upload and apache for media server download, something like this:
[general]
MediaServerUpload="http://localhost:2015
MediaServerDownload="https://yourserver.com/"

Hello. tell me. I configured the caddy according to your wiki. Added line in the config matterbridge. For example: investments of the telegram now appear in the folder according to the settings, but no change in xmpp. that is, they do not appear in any way in the conference. How to configure this feature

@42wim I also use this project for SpaceVim's comunity; here is the channels:

gitter: SpaceVim/SpaceVim
matrix: #spacevim:matrix.org
telegram: t.me/SpaceVim
irc: #spacevim(freenode.net)

now all work well except telegram, when user send message in telegram, we can not get message in irc gitter and matrix.

@Madji it should show the link. You also added MediaServerDownload to the config ?
Could you please run with -debug and then upload an image with telegram and paste me all of the debug logs on pastebin.com (be sure to remove any secrets / identifiers).

@wsdjeg this is probably an issue with the telegram configuration.
Check out https://core.telegram.org/bots#privacy-mode and https://github.com/yagop/node-telegram-bot-api/issues/174#issuecomment-244632667
Also run with -debug and see if you get any messages from telegram in the logs.

Thanks,fixed.

Yes, of course I added in the config MediaServerDownload.
Strange, but I have updated the version to matterbridge-v1.4.1-14. and images began to appear. But to be honest to take a single domain for the transmission of pictures is too much.
https://pasteit.cf/view/08af71ac
Concerned about the TLS error in the log. Please tell me how to get rid of them?

@42wim I want to use tools  like this  https://img.vim-cn.com/
is it possible to implement this feature? when user in tg/matrix/slack upload a file, just send them to https://img.vim-cn.com/ , and then post the url to other channels. then no need to upload file to the channel's server

@madji it's probably something at telegram, does it still happen ?

@wsdjeg please open a new issue with this feature request. It seems http://img.vim-cn.com/ only supports images ? and not videos/files ?

@42wim ok, I will open new issue about it.

Going to close this as this needs to be fixed by the xmpp library.

Going to close this as this needs to be fixed by the xmpp library.

Just in case you haven't seen my comment at https://github.com/mattn/go-xmpp/issues/94#issuecomment-852971832: I was also missing http-upload in mattn/go-xmpp so I wrote it directly in my program: https://salsa.debian.org/mdosch/go-sendxmpp/-/blob/master/httpupload.go

@mdosch looks cool, willing to open a PR for this in matterbridge?:)

Sorry, I am neither using matterbridge nor do I know the code so I'm not
able to PR this. Also I'm quite busy these times.
But maybe someone who is involved with matterbridge can easily PR this.
:)

@mdosch I have noticed, that your program is licensed under BSD 2, but matterbridge is licensed under Apache2. I have no idea if these licenses are compatible, but I think it would be helpfull to clearify this point to prevent work which can't be merged.

I am not a lawyer so I can't tell you what to do on this but afaik you
can do pretty much anything with BSD licensed code and it seems that
apache sees BSD-2-clause as almost similar to the apache license: https://www.apache.org/legal/resolved.html#category-a
On 18.02.2022 11:17, sirdrakeistda wrote:
@.*** I have noticed, that your program is licensed under BSD 2, but matterbridge is licensed under Apache2. I have no idea if these licenses are compatible, but I think it would be helpfull to clearify this point to prevent work which can't be merged.

--
Reply to this email directly or view it on GitHub:
https://github.com/42wim/matterbridge/issues/295#issuecomment-1045047498
You are receiving this because you were mentioned.
Message ID: @.***>


Consistently getting ValueError('Wrong challenge in response.')

I apologize as this is likely an issue in my code, and not the repo- but I have tried this for days to no avail, and the lack of documentation is exacerbating my confusion.
I am running a local https server and testing FIDO2 keys. I generate a key like this:
registration_data, state = server.register_begin({
            u'id': '1',
            u'name': 'my user',
            u'displayName': 'my user',
             }, credentials)
request.session['fido2_state'] = state
# generate pubkey to pass to front end credential
publicKey = {
       'challenge': websafe_encode(registration_data['publicKey']['challenge']),
       'rp': {
           'name':'Example Inc.',
           'id': 'localhost',
        },
        'user': {
             'id': 1,
             'name'<EMAIL_ADDRESS>              'displayName': 'Alice von Wunderland'
         },
        'pubKeyCredParams': [
                { 'type': 'public-key', 'alg': -7  },
                { 'type': 'public-key', 'alg': -257 }
         ]
}
return render(request, self.template_name, {'registration_data':  publicKey})

And in the front end:
//Get response from server and convert values to array buffer
publicKey = {{ registration_data | safe }}
challenge = publicKey['challenge']
user_id = publicKey['user']['id']
publicKey['challenge'] = str2ab(challenge)
publicKey['user']['id'] = str2ab(user_id)
navigator.credentials.create({ 'publicKey': publicKey }) .then(function(attestation) {
                return fetch('/fido/', {
                    method: 'POST',
                    credentials: 'same-origin',
                    headers: {'Content-Type': 'application/cbor'},
                    body: CBOR.encode({
                      "attestationObject": new Uint8Array(attestation.response.attestationObject),
                      "clientDataJSON": new Uint8Array(attestation.response.clientDataJSON),
                    });
             });
        });

Once it's posted to server, I get the data from the request and try to verify
       # verify response from server
        data = cbor.loads(request.body)[0]
        client_data = ClientData(data['clientDataJSON'])
        att_obj = AttestationObject(data['attestationObject'])
        state = request.session['fido2_state']
        auth_data = server.register_complete(
            state,
            client_data,
            att_obj
        )

This consistently returns
  File "/usr/local/lib/python2.7/dist-packages/fido2/server.py", line 180, in register_complete
    raise ValueError('Wrong challenge in response.')

I am completely lost. I have tried the few examples I have found online. However I truly have no idea how to proceed. My guess is my encoding of the challenge in the original registration challenge generation is incorrect, but I'm not sure what to do. I have tried encoding this in a variety of ways, completely unsuccessfully.
I would appreciate any hints here. If this is too far out of the scope for these issues, I apologize and will close it out.

Hi,
You can try django-mfa2 (https://github.com/mkalioby/django-mfa2) which integrates FIDO2 Keys in Django

Hello!
I've actually been using your django-mfa2 as a primary example and it has been pretty helpful and I appreciate the work. However the current build of django-mfa2 doesn't work with django1.11. I will raise an issue there if you would like- I may be able to open a PR with fixes as well.
That said, after taking an even closer look at how you are handling encoding of the CBOR data from the django server to the front end- I was able to solve my problem.
I greatly appreciate your help- closing this out.

we can work on it or you can open a PR (which will be much appreciated) as well


How to change text inside popup dynamically???

Hey @Leaflet I am trying to change the text inside the color dynamically,but I m not getting how to do it?Please help me figure it out
const MyCircles = (props) => {   return (     props.data.map((row, i) => {       if (row[props.date] <= 0) {         return;       }       if (row["Lat"] != null && row["Long"] != null) {         return (           <Circle             key={i}             center={[row["Lat"], row["Long"]]}             radius={1000 * Math.sqrt(row[props.date])}             fillOpacity={0.8}             fillColor={props.color}             stroke={false}           >           {console.log('hi',props.color)};           <Popup>
{row[props.date]}
           </Popup>           </Circle>           )         }       }     )   ); }
Inside the Popup I have tried the following...
1.<Popup>
{row[props.date]}
    </Popup>
2.<Popup>
{row[props.date]}
    </Popup>
None of them worked out.Please help me how can I set the color of the text inside the Popup div to the "props.color"..
"props.color" is printing the corrent color but it's not getting added to the text.Help me asap...
Thanks.

Hi, and thanks for taking the time to open a bug report in Leaflet.
However, in this repository we only handle bugs in "vanilla" Leaflet. This means that we do not handle bugs which are specific to frameworks such as:

React
Ractive
AngularJS
Bootstrap
Leaflet for R
Joomla
Wordpress
Ionic
Cordova
Vue
Electron
Polymer
TypeScript
D3
Folium
...etc

Please understand that we only have the time and energy to test Leaflet in plain web browsers.
Please try to either reproduce the bug without using any frameworks, or submit a bug to the appropriate repo.


Externalise UniformPowerOfTwo

By submitting this pull request, I confirm that my contribution is made under the terms of the MIT license.

Closing as the alternative approach in #149 is preferred.


feat: Use eth_createAccessList RPC in type=1 prepared transaction

What I did
now when using type=1, access lists are automatically prepared on the tx
question: should we automatically set access list on type=2? I am too afraid to make that change I think but there isnt really a good way to do in Ape otherwise
How I did it

How to verify it

Checklist

[ ] All changes are completed
[ ] New test cases have been added
[ ] Documentation has been updated

question: should we automatically set access list on type=2? I am too afraid to make that change I think but there isnt really a good way to do in Ape otherwise

Maybe something for v0.8?


Ephemeral models injected in the wrong order

Issue
Issue description
We caught this one in the wild using an 0.11.0 prerelease (development) in sinter.
dbt errantly injected ephemeral models in the wrong order, leading to an error like:
relation "__dbt__cte__model_name" does not exist

The issue was that __dbt__cte__model_name was defined below where it was called from. The compiled SQL looked something like this:
with __dbt__cte__dependent_model as (

  select * from __dbt__cte__model_name

),  __dbt__cte__model_name as (

  select * from public.data

)

select ....

It appears that this is a regression in development (the same code works in 0.10.2) but I can't immediately identity any changes we made to this part of the codebase.

I probably caused this in the PR where I changed things from using the flat_graph to using the manifest. In particular, dbt.compilation.prepend_ctes.
Is the trick to have ephemeral models that depend upon each other?

Could very well be either of these:

https://github.com/fishtown-analytics/dbt/commit/74b33f483bf50a2ab1d6143f778113bb30cdedbe#diff-31186f2642031d69b53e5db816518cc3
https://github.com/fishtown-analytics/dbt/commit/2690b5098662063f7d9bbc57049d5cf6cca07f56#diff-31186f2642031d69b53e5db816518cc3R57

I'll look into this next, I have a couple ideas around it. One possibility is that the OrderedDict is getting turned into a regular dict somehow and the order is getting lost. We'll probably want to create a failing test case to help track it down.

@beckjake yes, this does look like a case where an ephemeral model depends on another. should be relatively easy to repro


 I put it in 2 different VMs one to extract the files another to run it and it installed nothing crucial and it leaves the files wholly unknown with registry access, it makes the project less trustworthy but if you're happy with it as is then as you were.

Not to seem combative but that is an absolutely crazy amount of distrust for an installer.
Having a zip version as an option is a good idea for lots of reasons, but not because someone's 2 virtual machines deep in paranoia

[...] someone's 2 virtual machines deep in paranoia [...]

You kind of missed the point.
OP was saying  that the installer doesn't add anything to the project other than complexity, and they proved that by installing the project into a VM, then moved the files into another VM.
Regardless, I agree with OP that distributing this project as an MSI is not a good thing. I would much rather have this be completely portable via a ZIP as opposed to an obfuscated MSI which could reasonably hold anything in there and not the actual product of the code on the repo.


some queries regarding manual

show default values of config in manual
is the offline manual available online?

The default values are listed in an example configuration file that should have been installed on the side if memory serves :thinking:
At any rate, an example configuration file can be seen in the source code at codeberg (which reminds me to update the link at todotxt.org).
You can find the online both at codeberg and on the project’s website.

The default values are listed in an example configuration file that should have been installed on the side if memory serves 🤔

There should have been an example configuration file, example.conf distributed with your copy of pter that can give you an idea on how that works. In this documentation you will find the full explanation.
- %appdata%/../Local/Programs/Python/Python310/Lib/site-packages/pter/docs/pter.html#files

yes, the manuals mentions about example configuration file too, but where is that?

trying for other such directory variables in windows

userprofile
appdata
programdata
programfiles

an example configuration file can be seen in the source code at codeberg

also, that doesn't contain value for default font-size, is that not hardcoded?

Indeed, both font and font-size are not hard-coded, because that’ll cause the system default to be taken over.

yes, the manuals mentions about example configuration file too, but where is that?

I suspect it should be in %userprofile%/.local/share/doc/pter/

%userprofile%/.local/share/doc/pter/

/doc/pter/ is not present there...

Hm. Not sure where that’s installed into on Windows.

Ah, I found it. It’s in the folder of your python installation (e.g. C:\Python or C:\User\<username>\AppData\Local\Programs\Python\Python<version>) in share\doc\pter\.

It’s in the folder of your python installation (e.g. C:\Python or C:\User\<username>\AppData\Local\Programs\Python\Python<version>) in share\doc\pter\.

yep, replicated. and as per recorded at https://github.com/vonshednob/pter/issues/23#issuecomment-1333911643, the location using variables (in caps for distinction) becomes:
%LOCALAPPDATA%/Programs/Python/Python<version> / share/doc/pter/

P.S.:

tbh, it's really nice that i raised that variable thing here, and experimented further, it's a nice documentation
i'll keep that comment saved somewhere lol
'cz those long locations (incurred frequently for ALL SORTS of softwares) always make me go "ahh, not again"
... hopefully not anymore :)

oh, and excuse my / fwd slashes in locations of files in windows  😅, i always liked these as universal as they are long before i even knew anything about linux, and hey, it works :)

P.S.:

tbh, it's really nice that i raised that variable thing here, and experimented further, it's a nice documentation
i'll keep that comment saved somewhere lol
'cz those long locations (incurred frequently for ALL SORTS of softwares) always make me go "ahh, not again"
... hopefully not anymore :)

oh, and excuse my / fwd slashes in locations of files in windows  😅, i always liked these as universal as they are long before i even knew anything about linux, and hey, it works :)

* 'cz those long locations (incurred frequently for ALL SORTS of softwares) always make me go "ahh, not again"

Right. That's a bit iffy; it's works nicely on Linux, but it's not greatly supported on Windows.

* oh, and excuse my `/` fwd slashes in locations of files in windows  sweat_smile, i always liked these as universal as they are long before i even knew anything about linux, and hey, it works :)

haha, no worries, I just try to not confuse the future people that might stumble upon this and think "but on Windows it's \, not /! This bug is not resolved at all!" ;)


Showing a black screen before opening the plaid screen

If you haven’t already, check out our contributing guidelines for onboarding and email<EMAIL_ADDRESS>to request to join our Slack channel!

Action Performed:
1.Open setting
2. Click on workspaces
3. Select any workspace
4. Click on connect bank account
5. Click on connect online with plaid
Expected result:
Shouldn't show any other screen before redirect in plaid
Actual result:
Showing black screen then redirect in plaid
Workaround:
Can the user still use Expensify without this being fixed? Have you informed them of the workaround?
Platforms:

Which of our officially supported platforms is this issue occurring on?

[x] Android / native
[ ] Android / Chrome
[ ] iOS / native
[ ] iOS / Safari
[ ] MacOS / Chrome / Safari
[ ] MacOS / Desktop

Version Number: <IP_ADDRESS>
Reproducible in staging?: y
Reproducible in production?: y
If this was caught during regression testing, add the test name, ID and link from TestRail:
Email or phone of affected tester (no customers):
Logs: https://stackoverflow.com/c/expensify/questions/4856
Notes/Photos/Videos: Any additional supporting documentation
https://user-images.githubusercontent.com/43996225/235775165-a219c9b0-f9a8-478c-b6c7-05561e212077.mp4
https://user-images.githubusercontent.com/43996225/235775200-cb7aefbb-4744-4204-9160-7d094cae1af8.mp4
Expensify/Expensify Issue URL:
Issue reported by: @jaydipramani
Slack conversation: https://expensify.slack.com/archives/C049HHMV9SM/p1682570253279599
View all open jobs on GitHub

Triggered auto assignment to @alexpensify (Bug), see https://stackoverflow.com/c/expensify/questions/14418 for more details.

Bug0 Triage Checklist (Main S/O)

[ ] This "bug" occurs on a supported platform (ensure Platforms in OP are ✅)
[ ] This bug is not a duplicate report (check E/App issues and #expensify-bugs)

If it is, comment with a link to the original report, close the issue and add any novel details to the original issue instead

[ ] This bug is reproducible using the reproduction steps in the OP. S/O

If the reproduction steps are clear and you're unable to reproduce the bug, check with the reporter and QA first, then close the issue.
If the reproduction steps aren't clear and you determine the correct steps, please update the OP.

[ ] This issue is filled out as thoroughly and clearly as possible

Pay special attention to the title, results, platforms where the bug occurs, and if the bug happens on staging/production.

[ ] I have reviewed and subscribed to the linked Slack conversation to ensure Slack/Github stay in sync

I'm catching up from being OOO on Friday and Monday, I'll try to test this one soon.

I've run out of time this week; I will test over the weekend to continue the process.

I was able to verify this is an issue but I see other mentions of black screens. Tomorrow, I'm going to create a thread to identify if we want to fix a larger problem or each issue as they come up.

I'll start the thread soon.

I'm OOO today and will start the thread tomorrow.

After thinking about this more, let's address this problem here (one at a time) instead of trying to fix every screen issue. I've assigned the External label.

Proposal
Based on the information provided in the GitHub issue, it appears that the problem is related to the app showing a black screen for a brief moment before opening the Plaid screen when users attempt to link their bank accounts. To address this issue, I propose the following solution:
Implement a loading screen that will be displayed while the app loads the Plaid component.
Optimize the performance of the app to reduce the loading time required to display the Plaid screen.
Implement a caching mechanism to improve the speed at which the app loads data from the server.
Minimize the amount of data transferred between the server and the app to reduce the loading time.
To achieve these goals, I would suggest the following technical changes:
Use the React Native Navigation library to implement a loading screen that will be displayed while the Plaid component loads. This will provide users with a visual indication that the app is working and reduce the perceived loading time.
Use the React Native Performance API to identify areas of the app that can be optimized for performance, such as reducing the size of images or reducing the number of API calls made by the app.
Implement a caching mechanism using the React Native Async Storage library. This will allow the app to store frequently accessed data locally, reducing the amount of data that needs to be fetched from the server.
Implement data compression techniques, such as Gzip compression, to reduce the amount of data transferred between the server and the app.
If my proposal is accepted, I will post it on Upwork as required and provide regular updates on my progress. Once the code is ready for review, I will create a fork of the Expensify/App GitHub repo, create a branch for my changes, and create a pull request to merge my changes into the main codebase. I will also provide screenshots and confirmation that I have tested the pull request on all platforms.
I have reviewed the Expensify Contributor Guidelines and understand the payment timelines and requirements. I am confident that I can deliver high-quality code that meets your requirements and I look forward to the opportunity to work with your team.
Adil Rehman
Software Engineer

Proposal
Based on the information provided in the GitHub issue, it appears that the problem is related to the app showing a black screen for a brief moment before opening the Plaid screen when users attempt to link their bank accounts. To address this issue, I propose the following solution:
Implement a loading screen that will be displayed while the app loads the Plaid component. Optimize the performance of the app to reduce the loading time required to display the Plaid screen. Implement a caching mechanism to improve the speed at which the app loads data from the server. Minimize the amount of data transferred between the server and the app to reduce the loading time. To achieve these goals, I would suggest the following technical changes:
Use the React Native Navigation library to implement a loading screen that will be displayed while the Plaid component loads. This will provide users with a visual indication that the app is working and reduce the perceived loading time. Use the React Native Performance API to identify areas of the app that can be optimized for performance, such as reducing the size of images or reducing the number of API calls made by the app. Implement a caching mechanism using the React Native Async Storage library. This will allow the app to store frequently accessed data locally, reducing the amount of data that needs to be fetched from the server. Implement data compression techniques, such as Gzip compression, to reduce the amount of data transferred between the server and the app. If my proposal is accepted, I will post it on Upwork as required and provide regular updates on my progress. Once the code is ready for review, I will create a fork of the Expensify/App GitHub repo, create a branch for my changes, and create a pull request to merge my changes into the main codebase. I will also provide screenshots and confirmation that I have tested the pull request on all platforms.
I have reviewed the Expensify Contributor Guidelines and understand the payment timelines and requirements. I am confident that I can deliver high-quality code that meets your requirements and I look forward to the opportunity to work with your team.
Adil Rehman Software Engineer

Contributor details
Your Expensify account email<EMAIL_ADDRESS>Upwork Profile Link: https://www.upwork.com/freelancers/adilrehman2

@aimane-chnaif - when you get a chance, can you review this proposal? Thanks!

@dylanexpensify - this one is moving forward, but assigning if a BZ team member is needed to step in while I'm OOO.

Proposal
Please re-state the problem that we are trying to solve in this issue.
Based on the information provided in the GitHub issue, the problem is related to the app showing a black screen for a brief moment before opening the Plaid screen when users attempt to link their bank accounts.
What is the root cause of that problem?
The root cause of this problem is the lack of a loading screen during the loading process of the Plaid component, as well as potential performance optimizations and data transfer inefficiencies.
What changes do you think we should make in order to solve the problem?

To address this issue, I propose the following solution:

Implement a loading screen that will be displayed while the app loads the Plaid component.
Optimize the performance of the app to reduce the loading time required to display the Plaid screen.
Implement a caching mechanism to improve the speed at which the app loads data from the server.
Minimize the amount of data transferred between the server and the app to reduce the loading time.

What alternative solutions did you explore? (Optional)
No alternative solutions were explored in this proposal.
To achieve these goals, I would suggest the following technical changes:

Use the React Native Navigation library to implement a loading screen that will be displayed while the Plaid component loads. This will provide users with a visual indication that the app is working and reduce the perceived loading time.
Utilize the React Native Performance API to identify areas of the app that can be optimized for performance, such as reducing the size of images or minimizing the number of API calls made by the app.
Implement a caching mechanism using the React Native Async Storage library. This will allow the app to store frequently accessed data locally, reducing the amount of data that needs to be fetched from the server.
Apply data compression techniques, such as Gzip compression, to reduce the amount of data transferred between the server and the app.

If my proposal is accepted, I will post it on Upwork as required and provide regular updates on my progress. Once the code is ready for review, I will create a fork of the Expensify/App GitHub repository, create a branch for my changes, and submit a pull request to merge my code into the main codebase. I will also provide screenshots and confirmation that I have tested the pull request on all platforms.
I have reviewed the Expensify Contributor Guidelines and understand the payment timelines and requirements. I am confident that I can deliver high-quality code that meets your requirements, and I look forward to the opportunity to work with your team.
Contributor details:
Your Expensify account email<EMAIL_ADDRESS>Upwork Profile Link: Adil Rehman on Upwork
Adil Rehman
Software Engineer

@aimane-chnaif let's get this reviewed today if we can now that it's in the correct format! 🙇♂

Started thread.

@joekaufmanexpensify - I'm going to hold on the reassignment process since there has been some movement today. I have a reminder to open tomorrow.

@alexpensify I'm starting to get ready for my own OOO next week, so going to let you take this one back!

@chiragsalian and @aimane-chnaif - Joe shared some good feedback in this Slack thread - here. We need your feedback. Thanks!

Thank you for this feedback!

I've bumped @chiragsalian in Chat.

Yeah, i think the issue is because of the 3rd party plaid flow screen.
If someone notices I'm mistaken, please don't hesitate to reopen this issue. I'm closing it for now.


Duplicating children fix for {shadow: false}

When shadowDOM is not attached and developer wants to render children inside react component it will lead to duplicating of children.

Children will be placed at slot as intended
Children will remain at the and of the node, because after rendering original content won't be cleared

I just tried the fixed shown here and have to admit that it does not work properly: while it indeed deletes one of the two child instances, it removes the first one rather than the second.
As a consequence, componentDidMount will be called for the child instance that will be deleted right afterwards, but never for the instance that "survives". Programs relying on componentDidMount (like mine) will therefore fail...

My solution: instead of modifying the source of "preact-custom-components", I got rid of the duplicated child elements using a "trick" mentiond in issue #32:

for a component with inner elements add a <slot/> tag instead of ${props.children}

This workaround sounds strange, but it works (somehow):

the <slot/> tag will be rendered as
<slot></slot>
 and
the actual child elements will be rendered as direct descendants of the container element, right next to the
<slot></slot>

This may not look nice, but I can live with that hack...


Node with names instead of numbers

Request: support node names instead of numbers.
The Scharzwaldverein has implemented a signing system for walking that incorporates a node network. where the nodes have names instead of numbers. Examples of two nodes referring to each other: https://www.mapillary.com/map/im/JHsA93GEpA3eUM9xgzyvXw and https://www.mapillary.com/map/im/eIRS73pR_EzwiMm9uWxi2A . This covers a wide area.
The netwerk is represented by the symbol on the center shield: in this case the yellow diamond. All the routes of the network carry that symbol. The unique node name is above the symbol, The number gives height above sea. The upper destinations on the fingers  are the adjacent node names.
I could plan a test for this one network with the German mappers to map node names as rwn_ref=<node_name>, see how it works out in the analysis (old and new) and planner.

Did a small test on one node in my area.

Taken from the new planner, when zooming in, at zoom 13. At other zoomlevels and in the result list it looks like the ref is cut off after max 3 characters.

Detail information on the example nodes above:

osm id
what
name

7590438451
guidepost
Hilsenberg

11168702
route
Hinterer Wasen - Hilsenberg

11168701
route
Katzensteiner Hof - Hilsenberg

11168698
route
Kreuzbuche - Hilsenberg

osm id
what
name

7590438450
guidepost
Katzensteiner Hof

11168701
route
Katzensteiner Hof - Hilsenberg

11168700
route
Katzensteiner Hof - Unterm Katzenstein

11168689
route
Katzensteiner Hof - Sandgrube

Observation: the guideposts are part of the routerelations but they are not nodes of the of the route ways. The knooppuntnet logic will have to be adapted for this (at this moment the nodes are expected to be nodes on the ways).
Current guidepost tags:

tag
value

tourism
information

information
guidepost

hiking
yes

name
Katzensteiner Hof

Current route tags:

tag
value

network
lwn

type
route

route
hiking

name
Katzensteiner Hof - Hilsenberg

I think they should use the way intersections as (logical) junction nodes, and map the guideposts as separate features for display at the exact positions.  It's an interesting development! I'll contact the German mappers  now.

I have a go-ahead to make a small network of say 10 nodes. that should be enough for a model. I'll take this on in two weeks time, after my vacation.

I think the Swiss mapper your talking about was me, though I'm actually Dutch, but my brother moved to Switzerland, so I come there a bit more often lately :-p
In any case, the current Swiss practices are documented here: https://wiki.openstreetmap.org/wiki/DE:Switzerland/HikingNetwork and I believe it's pretty much identical to the german one shown here (even uses the same yellow diamond symbol and the same layout on guideposts). One thing is that not all nodes actually have names (nor numbers), consensus seems to be to invent a name for the node then (based on its location), see the talk page for the linked wiki page) about this. Also, they use name= now for guideposts, but also on the talk page someone argued the guidepost does not actually have a name, so maybe switching to a complete node network style and using lwn_ref instead of name could fix that as well. Though I wonder if you would still need to tag the junction and then additionally include the guidepost in the relation, or just use the guidepost as the node? I also recall people advocating that guideposts do not belong in a route relation at all (beter in a destination_sign relation, though that has a bit of a different purpose).

Inmiddels wordt het in Duitsland opgepakt, men is te ongeduldig om even te wachten.... er verschijnen ontiegelijk lange rwn_refs op de kaarten, dat is niet geweldig.
Ik zie ook een paar problemen in de tagnamen, die bij waymarkedtrails niet goed gaan vallen. Liefst heb ik eerst overeenstemming met zoveel mogelijk partijen over het taggebruik en hoe de knooppunten zich verhouden tot de wegwijzerpalen, welke tags waarop staan, etc.
Ik overweeg om een wiki-pagina hierover te maken, een soort pre-proposal, en dan op de diverse landelijke forums daarover te diskussiëren en bij te schaven, voordat het naar de tagging list gaat en voor voting. Maar anders zie ik het niet goed komen. Dan gaan we natuurlijk ook door, maar drijven we weer af van de grote stroom, terwijl we net zo goed bezig waren om de uitzonderingen ongedaan te maken.

I have created a draft proposal: https://wiki.openstreetmap.org/wiki/Proposed_features/Named_nodes_in_node_networks
For now, I do not want to push the issue on the tagging list, in Nederland and in Belgium, but I would like to get the discussion going in Germany and possibly Switzerland. Is the Swiss community actively  mapping recreational routes and networks?

Isn't this a bit off-topic for this issue? Maybe some forum thread would be more appropriate?
Anyway, good to see a proposal towards this, thanks for investing time into this! Should your proposal also reference the new node network wikipage your were working on, since it essentially extends that mapping scheme? I wonder if rendering these long node names is really meaningful by default, but I guess that might be something for the renderers to decide (unless we want to distinguish a "Short ref" (number of few letters) from a "Descriptive ref" (the names of nearby places used in .de and .ch)?

Is the Swiss community actively mapping recreational routes and networks?

Looking at the map, it seems that their walking network is pretty comprehensively mapped in a large part of Switzerland:. When I asked a question about their network mapping recently, I got a fairly swift answer, after discussing my question in the "Zurich stammtisch", which is apparently a monthly meeting for OSM-related things. So it seems that there is an active interest in mapping their hiking network there. This stammtisch might be a good entrypoint to get this discussion started, or maybe just post in the Swiss OSM forum?

"Isn't this a bit off-topic for this issue? Maybe some forum thread would be more appropriate?" You are right. We'll come back to it later, if a proper tagging scheme has been established.

I have a new French pilot area. They use null-refrences to make it work, as a temp setup, so they can go on entering the data into OSM. Based on the pilots, I have made a proposal and announced it on the Dutch, Belgian and German forums. Got no principal objections and a few suggestions. The Germans are adamant in that they will not implement a temporary solution.
I would like Knooppuntnet to support the proposed setup: rwn_name= for the network node name, and ref=* optional for the routes (but should still match node number(s) if present). The result list in Planner should of course show node names if present. In Analysis, for nodes the Name column can be filled in. For routes, maybe use node1_name-node2_name for the ref column?

I would also propose to add support for the key lwn_name=, which could be used for more dense local networks.

I would also propose to add support for the key lwn_name=, which could be used for more dense local networks.

May I politely ask if/when this enhancement will be implemented? I still have the pilot site near Toulouse, but I'm getting complaints about the "phantom" tagging of non-existing ref and **n_ref numbers, and they are right!
 The mappers in France, Germany and Switzerland then can still enter route data (Switzerland already has al the node2node routes mappen, I think), but they cannot use the full benefits of Knooppuntnet Analysis and Planner.

Thanks for the reminder. I will move this issue back to the top of my todo list.

I see a lot of commits, but I can't tell what the progress is! Can I help by testing something?

@pelderson I have been making a lot of changes to the route analysis logic, and I am not yet finished with all the changes I wanted to do.
In order for  you to be able to see some progress, I have just published the current state of the work-in-progress on experimental.knooppuntnet.nl (only look at the analysis, the planner will still be broken in certain areas at this moment).
As far as routes with nodes with names instead of numbers are concerned, you can look for example at the routes in
Wanderwegenetz Oberkirch.
I am currently still working on getting a better result for routes where the node names do not match the route name like for example this route.
There is now a big difference in number of facts in the old de facts and the new de facts.
The new code also contains improvements for issue #126 (see route 75-75), issue #114  (see 04-04) and issue #109.
In the new code the fact RouteInvalidSortingOrder has been dropped. I am also considering dropping NodeMemberMissing (no longer encouraging to add each node to a network relation).
Fact RouteWithoutNodes is new.
A lot a facts on page NetworkExtraMemberRelation are caused by mixing lcn and rcn in network and route relations. I thought a moment about just allowing this (ignoring the scope 'l',  'r', etc), but that is not a good idea I guess?
I would like to get the route analysis completely sorted out before continuing with #147.

At the time of the last post I had noticed that network analysis already was included in the experimental version of knooppuntnet and it seemed to work pretty fine (great work!).
I used it for some network maintenance but unfortunately it has been removed again from the experimental site. Do you plan to include the feature again in near future so I can continue my maintenance?

@Karthoo Later today (after some sanity checks), I will try to publish the current state of the development branch on experimental again.

Implemented in experimental.knooppuntnet.nl (will come to knooppuntnet.nl in release v3.2).
Example with nodes mapped with lwn_name (11168701):

Example with nodes  mapped with both rwn_ref and rwn_name (12012162):

Oberkirch:

Question: in Oberkirch the routes have a name tag. Is there a check to see if the route's name tag matches the lwn_name tags of the nodes? Just asking, it's not a request!

Yes, there is a check whether the route name matches the node names.
This is why there is a considerable number of routes where the analysis fails (generates various facts where a single RouteNodeNameMismatch would have been better), for example:

12893520 Über dem Kleingehren <--> Über den Kleingehren
12563835 Heschmattweg <--> Heschmattenweg

This needs to be improved I think...

I think, since the route "name" is actually just taken from the node names anyway, it's in fact a check of the string copying skills of the mappers. That's why in the proposal I just said ref=mm-nn is no longer required, and not: add name= - . I sort of recommended not to add a name tag in the pilots. I was suprprised that the mappers actually insist on entering redundant name information!
Question: if name and ref are not present in the route relation, is the route still valid en what do you present as the name?

Nice work! How often is the map data updated? I noticed that the nodes and routes on the map are not synched with the analysis and seem to be a few weeks or months old.

@Karthoo I am glad you ask this question
The background tiles (containing all map details other than the nodes, routes and points of interest) are generated through a process which currently still requires a number of manual interventions and takes a couple of days to fully complete. I usually try to run this process about once per month. So, the details in the background will always be a bit outdated. The idea for the future is to automate this process so that the backgound is at most 1 week old, or to change to a different mechanism that can keep the background tiles more up-to-date.
But: the nodes, routes and points of interest that are shown on the analysis and planner maps are intended to be in sync with the information in the analysis. So when nothing else goes wrong you should normally see your changes in OpenStreetMap reflected in the maps after 3 to 10 minutes or so.  However, a flag ("analyzerTileUpdateEnabled") has to be set in the server configuration for these tile updates to be done as part of the analysis.
This flag was set to "false" in the "experimental" server.  This is why you did see outdated information.  The reason for this was that until about 2 weeks ago the "experimental.knooppuntnet.nl" and "knooppuntnet.nl" servers both pointed to the same tiles, and the update had to be done from 1 of these servers only to avoid conflicts.
I have changed the server configuration, and as far as I can see the maps now seem up-to-date.
So, thanks again for asking this question. I would not have known about the problem otherwise.

@vmarc

I thought a moment about just allowing this (ignoring the scope 'l', 'r', etc), but that is not a good idea I guess?

I think of simply ignoring the scope from the tags 😉
Use simply name (or ref) where it is appropriate .
In France hiking, mtb, riding (and probably snowshoe) use the same network.
A guidepost don't have several names according to the local/regional/national network or hiking/riding/… network.
These two guideposts are distant of 0.8 km:

Les Combettes
Les tufs

So does knooppuntnet could display name or **n_name ?

I support pyrog's request for using the name as a default ...
All in all, I think it's an idea for a later release: multimode nodes, with the challenge: how to know which modes exactly, and which modes to exclude.

With ref, I would not recommend such a default. The Node refs are numbers or codes which (looking at existing networks and developments in various countries) tend to be different for networks of different types.

In fact I don't recommend to support name or ref as default. I recommend to support also name and ref :smiley:
The order of selection could be:

display nxn_ref if available. If not display
rxn_ref
lxn_ref
and finally, simply display ref

Same with xxn_name and finally, simply name.

You can say "the node is the same for all networks", but should the node appear on the map for inline skating or canooing? I think you somehow need to specify for which network(s) the node is valid.

Or simply (like information=guidepost) use hiking=yes, riding=yes… and so on ?

The use of the network key and its values is approved. It gives geographical scopes and transport modes for all recreational routes and networks around the globe, and lots of applications use the system. So let's not go another way, for the moment. I suggest to first discuss this on a wiki page and/or forums, specify what exactly is proposed to get approval or consensus, then open another issue for multimode nodes in the Node Networks routing and navigating system.

This is probably the wrong place for this, but I suspect people here will be interested, so I'm posting this anyway. Through the swiss mailing list, I came across a proposal for "basic networks", which are similar to node networks but without (consistently) named or numbered nodes. I haven't read it properly yet, but at first glance this proposal seems to tag the ways (with or without relations) and not the nodes. The examples it lists suggest it could apply to routes that this issue also applies to.
https://wiki.openstreetmap.org/wiki/Proposed_feature/basic_network


feat: add updated KinD example

Description of the changes
This PR creates the new KinD deployment example as well as adding the respective document page.
As a sidenote, we also updated the folder structure to better reflect the naming scheme used throughout the rest of the modules.

We are nearing completion and waiting on the PRs from MinIO and Keycloak:

https://github.com/camptocamp/devops-stack-module-keycloak/pull/16
https://github.com/camptocamp/devops-stack-module-minio/pull/23