Skip to content

Fix/2491 unclosed file handles#2522

Open
immortal71 wants to merge 29 commits intoOWASP:masterfrom
immortal71:fix/2491-unclosed-file-handles
Open

Fix/2491 unclosed file handles#2522
immortal71 wants to merge 29 commits intoOWASP:masterfrom
immortal71:fix/2491-unclosed-file-handles

Conversation

@immortal71
Copy link
Contributor

Proposed fix

def create_level_summary(level: int, arr: List[dict[str, Any]]) -> None:
    topic = ""
    category = ""
    os.mkdir(Path(convert_vars.args.output_path, f"level-{level}-controls"))
    with open(Path(convert_vars.args.output_path, f"level-{level}-controls/index.md"), "w", encoding="utf-8") as f:
        f.write(f"# Level {level} controls\n\n")
        f.write(f"Level {level} contains {len(arr)} controls listed below: \n\n")
        for link in arr:
            if link["topic"] != topic:
                topic = link["topic"]
                f.write(f"## {topic}\n\n")
            ...

Describe the bug

In scripts/convert_asvs.py, the create_level_summary() function opens a file using f = open(...) without a with context manager. If any exception is raised inside the loop body (e.g., a missing dictionary key during iteration), the file handle f is never explicitly closed, leaking the OS file descriptor. On batch runs that generate many ASVS taxonomy pages, this can exhaust system file handle limits.

Accessing catalog['Categories']['Category'] without guards caused an
unhandled KeyError if the CAPEC JSON had no Categories section.

Added defensive checks consistent with existing guards for
Attack_Patterns and Attack_Pattern. Logs a warning and skips the
categories block if the key is absent or malformed.

Fixes OWASP#2488
…te_limiter prod bypass, schema changeset tests
Copilot AI review requested due to automatic review settings March 5, 2026 11:10
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes unclosed file handles in Python scripts (convert_asvs.py and convert_capec.py) by converting manual open()/close() patterns to with context managers, ensuring files are properly closed even when exceptions occur. The PR also includes several other fixes and test coverage improvements across both the Python scripts and the Elixir (copi.owasp.org) codebase.

Changes:

  • Replaced manual file open/close with with context managers in convert_asvs.py and convert_capec.py, and refactored capec_map_enricher.py to extract a reusable _extract_names_from_items helper with improved error handling for missing categories.
  • Fixed LiveView callback return values in player_live/show.ex (changed {:ok, redirect(...)} to {:noreply, redirect(...)}) and added a nil guard in index.html.heex to prevent rendering FormComponent when @player is nil.
  • Added extensive test coverage across Python and Elixir codebases, including file handle closure verification tests, pure function tests, edge case tests, and model changeset tests.

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
scripts/convert_asvs.py Converted file open/close to with context manager
scripts/convert_capec.py Converted two file open/close blocks to with context managers
scripts/capec_map_enricher.py Extracted _extract_names_from_items helper; added defensive checks for Categories
tests/scripts/convert_asvs_utest.py Added file handle closure assertions and error-handling test
tests/scripts/convert_capec_utest.py Added file handle closure test for CAPEC page generation
copi.owasp.org/lib/copi_web/live/player_live/show.ex Fixed handle_params/handle_info return values from {:ok, ...} to {:noreply, ...}
copi.owasp.org/lib/copi_web/live/player_live/index.html.heex Added nil guard around FormComponent rendering
copi.owasp.org/test/copi_web/live/player_live/show_test.exs Added tests for nonexistent player redirect and validation errors
copi.owasp.org/test/copi_web/live/player_live/show_pure_test.exs New pure function tests for PlayerLive.Show helpers
copi.owasp.org/test/copi_web/live/game_live/show_test.exs Added tests for edge cases including different game id, finished game, and nonexistent game
copi.owasp.org/test/copi_web/live/game_live/show_pure_test.exs New pure function tests for GameLive.Show helpers
copi.owasp.org/test/copi_web/controllers/card_controller_test.exs Added test for format_capec/1
copi.owasp.org/test/copi_web/plugs/rate_limiter_plug_test.exs Improved test for no-IP scenario; added init/1 test
copi.owasp.org/test/copi/rate_limiter_test.exs Added tests for normalize_ip fallback, prod env bypass, and cleanup
copi.owasp.org/test/copi/ip_helper_test.exs Added tests for various socket/connect_info edge cases
copi.owasp.org/test/copi/cornucopia/vote_test.exs New changeset test for Vote
copi.owasp.org/test/copi/cornucopia/player_test.exs New changeset tests for Player
copi.owasp.org/test/copi/cornucopia/dealt_card_test.exs New changeset and find tests for DealtCard

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@immortal71
Copy link
Contributor Author

Hi @cw-owasp @rewtd @sydseter — all 16 code checks pass. The only failing check is commentpr which fails on all fork PRs due to a wildcard refspec issue in the pull_request_target workflow on master. The fix is to update .github/workflows/run-tests-generate-output.yaml on master to use ref: ${{ github.event.pull_request.head.sha }} instead of ref: ${{ github.sha }} in the checkout step of the uploadoutputfiles job. Happy to open a separate PR for that fix if helpful.

@rewtd
Copy link
Collaborator

rewtd commented Mar 6, 2026 via email

@sydseter
Copy link
Collaborator

sydseter commented Mar 7, 2026

@rewtd @immortal71 I think I will need to look at the commenting issue. Thanks

@immortal71
Copy link
Contributor Author

@sydseter is there any update ?

sydseter
sydseter previously approved these changes Mar 17, 2026
@sydseter
Copy link
Collaborator

@immortal71 This looks good, but there are a lot of conflicts, could you have a look at them.

@sydseter
Copy link
Collaborator

I like the work you have done with the tests.

@github-actions
Copy link
Contributor

Build artifacts:

Name Link
Output files cornucopia-build-files.5ba3fdce0cb28ef47e6bd7d6c6f257248310c0db.zip

Translation Check Report

The following sentences/tags have issues in the translations:

Spanish

File: eop-cards-5.0-es.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00105, T00140

Russian

File: eop-cards-5.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00001, T00003, T00004, T00090, T00100, T00105, T00210, T00220, T00230, T00240, T00250, T00260, T00270, T00280, T00290, T00300, T00310, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00410, T00420, T00430, T00440, T00450, T00460, T00470, T00480

Russian

File: mobileapp-cards-1.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00120, T00130, T00220, T00240, T00310, T00311, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00510, T00520, T00530, T00610, T01010, T01070, T01160, T01170, T01180, T01200, T01210, T01220, T01301, T01411, T02680, T02690, T02700, T02710, T02720, T02730, T02780, T03010

Russian

File: mobileapp-cards-1.1-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00120, T00130, T00220, T00240, T00310, T00311, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00510, T00520, T00530, T00610, T01010, T01070, T01160, T01170, T01180, T01200, T01210, T01220, T01301, T01411, T02680, T02690, T02700, T02710, T02720, T02730, T02780, T03010

Spanish

File: webapp-cards-2.2-es.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00030, T00380, T01590, T02940, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03771, T03773, T03775, T03800, T03810, T03820, T03830, T03840, T03850, T03860, T03870, T03900, T03940, T03950

French

File: webapp-cards-2.2-fr.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00200, T01100, T03110, T03120, T03771, T03773, T03775

Hungarian

File: webapp-cards-2.2-hu.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T00005, T00161, T00162, T01301, T01311, T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00030, T00140, T00145, T00200, T00210, T00220, T00230, T00240, T00300, T00320, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00500, T00510, T00520, T00600, T00610, T00700, T00710, T00720, T00730, T00740, T00750, T00760, T00770, T00780, T00790, T00800, T00810, T00830, T00840, T00900, T00910, T00920, T01000, T01020, T01060, T01100, T01110, T01120, T01130, T01140, T01150, T01160, T01170, T01190, T01200, T01240, T01250, T01260, T01270, T01280, T01290, T01300, T01400, T01410, T01420, T01430, T01431, T01440, T01450, T01500, T01510, T01520, T01530, T01540, T01550, T01560, T01570, T01571, T01580, T01590, T01600, T01610, T01700, T01710, T01720, T01730, T01740, T01800, T01810, T01811, T01820, T01900, T01910, T01920, T01930, T01940, T01960, T01970, T01980, T02000, T02010, T02020, T02030, T02040, T02100, T02120, T02140, T02200, T02220, T02240, T02250, T02260, T02280, T02290, T02300, T02310, T02320, T02340, T02400, T02410, T02420, T02440, T02450, T02460, T02480, T02490, T02500, T02510, T02520, T02540, T02600, T02610, T02620, T02630, T02650, T02680, T02690, T02700, T02710, T02720, T02730, T02760, T02770, T02790, T02800, T02810, T02820, T02840, T02850, T02860, T02870, T02880, T02890, T02900, T02910, T02920, T02930, T02940, T02950, T02960, T02970, T02980, T02990, T03000, T03020, T03100, T03110, T03120, T03140, T03160, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03740, T03760, T03771, T03773, T03775, T03800, T03810, T03820, T03830, T03840, T03900, T03920, T03950

Italian

File: webapp-cards-2.2-it.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02940, T03250, T03771, T03773, T03775

Dutch

File: webapp-cards-2.2-nl.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00500, T03771, T03773, T03775

Norwegian

File: webapp-cards-2.2-no_nb.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01700, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03771, T03773, T03775

Portuguese (Brazil)

File: webapp-cards-2.2-pt_br.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02250, T02290, T02310, T02450, T02490, T02510, T03100, T03110, T03120, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03771, T03773, T03775

Portuguese (Portugal)

File: webapp-cards-2.2-pt_pt.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T03771, T03773, T03775

Russian

File: webapp-cards-2.2-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01411, T03771, T03773, T03775

French

File: webapp-cards-3.0-fr.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00200, T01100, T03110, T03120

Italian

File: webapp-cards-3.0-it.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02940, T03250

Dutch

File: webapp-cards-3.0-nl.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02270, T02290, T03250

Norwegian

File: webapp-cards-3.0-no_nb.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01700, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700

Portuguese (Brazil)

File: webapp-cards-3.0-pt_br.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00330, T00340, T00350, T00360, T00370, T00380, T02240, T02260, T02280, T02300, T02320, T02340, T02440, T02460, T02480, T02500, T02520, T02540

Portuguese (Portugal)

File: webapp-cards-3.0-pt_pt.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380

Russian

File: webapp-cards-3.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380

@immortal71
Copy link
Contributor Author

@sydseter is this good to go ???!!

@sydseter
Copy link
Collaborator

@immortal71 There are new conflicts now that we merged in the work you habe done in other branches. Could you look at the conflicts?

@immortal71
Copy link
Contributor Author

@sydseter okay wait I will resolve it......

@github-actions
Copy link
Contributor

Build artifacts:

Name Link
Output files cornucopia-build-files.25d0a44b038666b5c2caa921cf8676267ad16aea.zip

Translation Check Report

The following sentences/tags have issues in the translations:

Spanish

File: eop-cards-5.0-es.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00105, T00140

Russian

File: eop-cards-5.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00001, T00003, T00004, T00090, T00100, T00105, T00210, T00220, T00230, T00240, T00250, T00260, T00270, T00280, T00290, T00300, T00310, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00410, T00420, T00430, T00440, T00450, T00460, T00470, T00480

Russian

File: mobileapp-cards-1.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00120, T00130, T00220, T00240, T00310, T00311, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00510, T00520, T00530, T00610, T01010, T01070, T01160, T01170, T01180, T01200, T01210, T01220, T01301, T01411, T02680, T02690, T02700, T02710, T02720, T02730, T02780, T03010

Russian

File: mobileapp-cards-1.1-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00120, T00130, T00220, T00240, T00310, T00311, T00320, T00330, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00510, T00520, T00530, T00610, T01010, T01070, T01160, T01170, T01180, T01200, T01210, T01220, T01301, T01411, T02680, T02690, T02700, T02710, T02720, T02730, T02780, T03010

Spanish

File: webapp-cards-2.2-es.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00030, T00380, T01590, T02940, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03771, T03773, T03775, T03800, T03810, T03820, T03830, T03840, T03850, T03860, T03870, T03900, T03940, T03950

French

File: webapp-cards-2.2-fr.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00200, T01100, T03110, T03120, T03771, T03773, T03775

Hungarian

File: webapp-cards-2.2-hu.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T00005, T00161, T00162, T01301, T01311, T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00020, T00030, T00140, T00145, T00200, T00210, T00220, T00230, T00240, T00300, T00320, T00340, T00350, T00360, T00370, T00380, T00390, T00400, T00500, T00510, T00520, T00600, T00610, T00700, T00710, T00720, T00730, T00740, T00750, T00760, T00770, T00780, T00790, T00800, T00810, T00830, T00840, T00900, T00910, T00920, T01000, T01020, T01060, T01100, T01110, T01120, T01130, T01140, T01150, T01160, T01170, T01190, T01200, T01240, T01250, T01260, T01270, T01280, T01290, T01300, T01400, T01410, T01420, T01430, T01431, T01440, T01450, T01500, T01510, T01520, T01530, T01540, T01550, T01560, T01570, T01571, T01580, T01590, T01600, T01610, T01700, T01710, T01720, T01730, T01740, T01800, T01810, T01811, T01820, T01900, T01910, T01920, T01930, T01940, T01960, T01970, T01980, T02000, T02010, T02020, T02030, T02040, T02100, T02120, T02140, T02200, T02220, T02240, T02250, T02260, T02280, T02290, T02300, T02310, T02320, T02340, T02400, T02410, T02420, T02440, T02450, T02460, T02480, T02490, T02500, T02510, T02520, T02540, T02600, T02610, T02620, T02630, T02650, T02680, T02690, T02700, T02710, T02720, T02730, T02760, T02770, T02790, T02800, T02810, T02820, T02840, T02850, T02860, T02870, T02880, T02890, T02900, T02910, T02920, T02930, T02940, T02950, T02960, T02970, T02980, T02990, T03000, T03020, T03100, T03110, T03120, T03140, T03160, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03740, T03760, T03771, T03773, T03775, T03800, T03810, T03820, T03830, T03840, T03900, T03920, T03950

Italian

File: webapp-cards-2.2-it.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02940, T03250, T03771, T03773, T03775

Dutch

File: webapp-cards-2.2-nl.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00500, T03771, T03773, T03775

Norwegian

File: webapp-cards-2.2-no_nb.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01700, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03771, T03773, T03775

Portuguese (Brazil)

File: webapp-cards-2.2-pt_br.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02250, T02290, T02310, T02450, T02490, T02510, T03100, T03110, T03120, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700, T03720, T03771, T03773, T03775

Portuguese (Portugal)

File: webapp-cards-2.2-pt_pt.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T03771, T03773, T03775

Russian

File: webapp-cards-2.2-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01411, T03771, T03773, T03775

French

File: webapp-cards-3.0-fr.yaml

Missing Tags

The following tags are present in the English version but missing in this translation:

T01411

Untranslated Tags

The following tags have identical text to English (not translated):

T00200, T01100, T03110, T03120

Italian

File: webapp-cards-3.0-it.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02940, T03250

Dutch

File: webapp-cards-3.0-nl.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T02270, T02290, T03250

Norwegian

File: webapp-cards-3.0-no_nb.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380, T01700, T03140, T03160, T03180, T03200, T03210, T03220, T03230, T03250, T03270, T03280, T03290, T03300, T03310, T03320, T03330, T03340, T03360, T03370, T03380, T03390, T03400, T03410, T03430, T03440, T03450, T03460, T03480, T03500, T03510, T03520, T03530, T03550, T03560, T03570, T03590, T03600, T03610, T03620, T03630, T03640, T03650, T03660, T03670, T03680, T03690, T03700

Portuguese (Brazil)

File: webapp-cards-3.0-pt_br.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00330, T00340, T00350, T00360, T00370, T00380, T02240, T02260, T02280, T02300, T02320, T02340, T02440, T02460, T02480, T02500, T02520, T02540

Portuguese (Portugal)

File: webapp-cards-3.0-pt_pt.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380

Russian

File: webapp-cards-3.0-ru.yaml

Untranslated Tags

The following tags have identical text to English (not translated):

T00380

@immortal71
Copy link
Contributor Author

@sydseter done !!

@immortal71
Copy link
Contributor Author

can u check

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants