Skip to content

Commit 757d8dd

Browse files
Merge branch 'master' into telink_zephyr_4.1
2 parents 4706bd2 + 56a0c43 commit 757d8dd

File tree

2,151 files changed

+185233
-106274
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,151 files changed

+185233
-106274
lines changed

.github/workflows/examples-efr32.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ jobs:
8484
--target efr32-brd4187c-lock-rpc \
8585
--target efr32-brd4187c-air-quality-sensor-app-shell-heap-monitoring \
8686
--target efr32-brd4187c-window-covering-additional-data-advertising \
87-
--target efr32-brd4187c-closure \
8887
build \
8988
--copy-artifacts-to out/artifacts \
9089
"
@@ -107,7 +106,6 @@ jobs:
107106
--enable-flashbundle \
108107
--target efr32-brd2605a-light-skip-rps-generation \
109108
--target efr32-brd4338a-lock-skip-rps-generation \
110-
--target efr32-brd4338a-closure-skip-rps-generation \
111109
build \
112110
--copy-artifacts-to out/artifacts \
113111
"

.github/workflows/examples-nxp.yaml

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ on:
1818
push:
1919
branches:
2020
- master
21-
- 'v*-branch'
21+
- "v*-branch"
2222
pull_request:
2323
merge_group:
2424

2525
concurrency:
26-
group: ${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name == 'pull_request' && github.event.number) || (github.event_name == 'workflow_dispatch' && github.run_number) || github.sha }}
26+
group:
27+
${{ github.ref }}-${{ github.workflow }}-${{ (github.event_name ==
28+
'pull_request' && github.event.number) || (github.event_name ==
29+
'workflow_dispatch' && github.run_number) || github.sha }}
2730
cancel-in-progress: true
2831

2932
env:
@@ -40,7 +43,7 @@ jobs:
4043
if: github.actor != 'restyled-io[bot]'
4144

4245
container:
43-
image: ghcr.io/project-chip/chip-build-nxp:125
46+
image: ghcr.io/project-chip/chip-build-nxp:127
4447
volumes:
4548
- "/tmp/bloat_reports:/tmp/bloat_reports"
4649
steps:
@@ -49,8 +52,8 @@ jobs:
4952
- name: Checkout submodules & Bootstrap
5053
uses: ./.github/actions/checkout-submodules-and-bootstrap
5154
with:
52-
platform: nxp
53-
extra-submodule-parameters: --recursive
55+
platform: nxp
56+
extra-submodule-parameters: --recursive
5457

5558
- name: Detect changed paths
5659
uses: dorny/paths-filter@v3
@@ -64,7 +67,7 @@ jobs:
6467
uses: ./.github/actions/setup-size-reports
6568
if: ${{ !env.ACT }}
6669
with:
67-
gh-context: ${{ toJson(github) }}
70+
gh-context: ${{ toJson(github) }}
6871

6972
- name: Build K32W0 examples
7073
run: |
@@ -145,7 +148,9 @@ jobs:
145148
--copy-artifacts-to out/artifacts \
146149
"
147150
- name: Build RT1060 thermostat example app
148-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
151+
if:
152+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
153+
== 'true'
149154
run: |
150155
scripts/run_in_build_env.sh "\
151156
./scripts/build/build_examples.py \
@@ -154,7 +159,9 @@ jobs:
154159
--copy-artifacts-to out/artifacts \
155160
"
156161
- name: Build RT1060 laundry-washer example app
157-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
162+
if:
163+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
164+
== 'true'
158165
run: |
159166
scripts/run_in_build_env.sh "\
160167
./scripts/build/build_examples.py \
@@ -168,7 +175,9 @@ jobs:
168175
run: rm -rf ./out
169176

170177
- name: Build RT1170 all clusters example app
171-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
178+
if:
179+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
180+
== 'true'
172181
run: |
173182
scripts/run_in_build_env.sh "\
174183
./scripts/build/build_examples.py \
@@ -186,7 +195,9 @@ jobs:
186195
--copy-artifacts-to out/artifacts \
187196
"
188197
- name: Build RT1170 laundry-washer example app
189-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
198+
if:
199+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
200+
== 'true'
190201
run: |
191202
scripts/run_in_build_env.sh "\
192203
./scripts/build/build_examples.py \
@@ -215,7 +226,9 @@ jobs:
215226
--copy-artifacts-to out/artifacts \
216227
"
217228
- name: Build RW61X laundry-washer example app
218-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
229+
if:
230+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
231+
== 'true'
219232
run: |
220233
scripts/run_in_build_env.sh "\
221234
./scripts/build/build_examples.py \
@@ -231,7 +244,7 @@ jobs:
231244
uses: ./.github/actions/upload-size-reports
232245
if: ${{ !env.ACT }}
233246
with:
234-
platform-name: NXP-FREERTOS
247+
platform-name: NXP-FREERTOS
235248
zephyr:
236249
name: ZEPHYR
237250

@@ -247,7 +260,7 @@ jobs:
247260
- name: Checkout submodules & Bootstrap
248261
uses: ./.github/actions/checkout-submodules-and-bootstrap
249262
with:
250-
platform: nxp
263+
platform: nxp
251264
- name: Detect changed paths
252265
uses: dorny/paths-filter@v3
253266
id: changed_paths
@@ -256,7 +269,9 @@ jobs:
256269
nxp:
257270
- '**/nxp/**'
258271
- name: Build NXP Zephyr examples
259-
if: github.event_name == 'push' || steps.changed_paths.outputs.nxp == 'true'
272+
if:
273+
github.event_name == 'push' || steps.changed_paths.outputs.nxp
274+
== 'true'
260275
run: |
261276
scripts/run_in_build_env.sh "\
262277
./scripts/build/build_examples.py \

.github/workflows/java-tests.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ jobs:
3737
name: Linux
3838

3939
env:
40+
PW_PROJECT_ROOT: ${{ github.workspace }}
4041
TSAN_OPTIONS: "halt_on_error=1 suppressions=scripts/tests/chiptest/tsan-linux-suppressions.txt"
4142

4243
if: github.actor != 'restyled-io[bot]'

.github/workflows/protocol_compatibility.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ jobs:
3535
run: |
3636
python3 -m venv venv
3737
venv/bin/pip3 install click coloredlogs lark
38+
venv/bin/pip3 install -e scripts/py_matter_idl
3839
- name: Create old/new copies
3940
run: |
4041
mkdir -p out

.github/workflows/tests.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ jobs:
8888
#
8989
run: |
9090
./scripts/run_in_build_env.sh \
91-
"./scripts/py_matter_idl/matter/idl/zapxml_parser.py \
91+
"matter-zapxml-parser \
9292
--no-print \
9393
--log-level info \
9494
src/app/zap-templates/zcl/data-model/chip/global-attributes.xml \
@@ -136,6 +136,7 @@ jobs:
136136
src/app/zap-templates/zcl/data-model/chip/diagnostic-logs-cluster.xml \
137137
src/app/zap-templates/zcl/data-model/chip/dishwasher-alarm-cluster.xml \
138138
src/app/zap-templates/zcl/data-model/chip/dishwasher-mode-cluster.xml \
139+
src/app/zap-templates/zcl/data-model/chip/electrical-grid-conditions-cluster.xml \
139140
src/app/zap-templates/zcl/data-model/chip/measurement-and-sensing.xml \
140141
src/app/zap-templates/zcl/data-model/chip/microwave-oven-mode-cluster.xml \
141142
src/app/zap-templates/zcl/data-model/chip/microwave-oven-control-cluster.xml \
@@ -468,7 +469,7 @@ jobs:
468469
runs-on: ubuntu-latest
469470

470471
container:
471-
image: ghcr.io/project-chip/chip-build:125
472+
image: ghcr.io/project-chip/chip-build:126
472473
options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0
473474
net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0"
474475

@@ -509,6 +510,7 @@ jobs:
509510
--target linux-x64-fabric-admin-rpc-ipv6only-no-ble-no-wifi-clang \
510511
--target linux-x64-fabric-bridge-rpc-ipv6only-no-ble-no-wifi-clang \
511512
--target linux-x64-fabric-sync-ipv6only-no-ble-no-wifi-clang \
513+
--target linux-x64-camera \
512514
--target linux-x64-light-data-model-no-unique-id-ipv6only-no-ble-no-wifi-clang \
513515
--target linux-x64-terms-and-conditions \
514516
--target linux-x64-python-bindings \
@@ -520,6 +522,7 @@ jobs:
520522
echo -n "" >/tmp/test_env.yaml
521523
echo "ALL_CLUSTERS_APP: out/linux-x64-all-clusters-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-all-clusters-app" >> /tmp/test_env.yaml
522524
echo "CHIP_LOCK_APP: out/linux-x64-lock-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-lock-app" >> /tmp/test_env.yaml
525+
echo "CAMERA_APP: out/linux-x64-camera/chip-camera-app" >> /tmp/test_env.yaml
523526
echo "ENERGY_MANAGEMENT_APP: out/linux-x64-energy-management-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-energy-management-app" >> /tmp/test_env.yaml
524527
echo "LIT_ICD_APP: out/linux-x64-lit-icd-ipv6only-no-ble-no-wifi-tsan-clang-test/lit-icd-app" >> /tmp/test_env.yaml
525528
echo "AIR_PURIFIER_APP: out/linux-x64-air-purifier-ipv6only-no-ble-no-wifi-tsan-clang-test/chip-air-purifier-app" >> /tmp/test_env.yaml

build/chip/chip_codegen.gni

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ template("_chip_build_time_zapgen") {
149149
"${_template_dir}/endpoint_config.zapt",
150150
"${_template_dir}/gen_config.zapt",
151151
"${_template_dir}/im-cluster-command-handler.zapt",
152+
153+
# config data controls template contents (specifically command handling)
154+
"${chip_root}/src/app/common/templates/config-data.yaml",
152155
]
153156

154157
_output_subdir = "zap-generated"

config/esp32/components/chip/CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ if (CONFIG_ENABLE_ESP_INSIGHTS_TRACE)
302302
chip_gn_arg_append("matter_trace_config" "\"${CHIP_ROOT}/src/tracing/esp32_trace:esp32_trace_tracing\"")
303303
endif()
304304

305+
if (CONFIG_ENABLE_ESP_DIAGNOSTICS_TRACE)
306+
chip_gn_arg_bool("matter_enable_tracing_support" "true")
307+
chip_gn_arg_append("matter_trace_config" "\"${CHIP_ROOT}/src/tracing/esp32_diagnostic_trace:esp32_diagnostic_tracing\"")
308+
endif()
309+
305310
if (CONFIG_ENABLE_ESP_INSIGHTS_SYSTEM_STATS)
306311
chip_gn_arg_append("matter_enable_esp_insights_system_stats" "true")
307312
endif()
@@ -314,6 +319,10 @@ if (CONFIG_ENABLE_ESP_INSIGHTS_TRACE)
314319
target_include_directories(${COMPONENT_LIB} INTERFACE "${CHIP_ROOT}/src/tracing/esp32_trace/include")
315320
endif()
316321

322+
if (CONFIG_ENABLE_ESP_DIAGNOSTICS_TRACE)
323+
target_include_directories(${COMPONENT_LIB} INTERFACE "${CHIP_ROOT}/src/tracing/esp32_diagnostic_trace/include")
324+
endif()
325+
317326
if (CONFIG_CHIP_DEVICE_ENABLE_DYNAMIC_SERVER)
318327
chip_gn_arg_append("chip_build_controller_dynamic_server" "true")
319328
endif()
@@ -379,6 +388,11 @@ if (CONFIG_ENABLE_ESP_INSIGHTS_TRACE)
379388
list(APPEND chip_libraries "${CMAKE_CURRENT_BINARY_DIR}/lib/libEsp32TracingBackend.a")
380389
endif()
381390

391+
if (CONFIG_ENABLE_ESP_DIAGNOSTICS_TRACE)
392+
list(APPEND chip_libraries "${CMAKE_CURRENT_BINARY_DIR}/lib/libEsp32DiagnosticsBackend.a")
393+
endif()
394+
395+
382396
# When using the pregenerated files, there is a edge case where an error appears for
383397
# undeclared argument chip_code_pre_generated_directory. To get around with it we are
384398
# disabling the --fail-on-unused-args flag.

config/esp32/components/chip/Kconfig

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,13 @@ menu "CHIP Device Layer"
860860
NVS namespace. If this option is enabled, the application can use an API to set a CD,
861861
the configured CD will be used for subsequent CD reads.
862862

863+
config ENABLE_ESP_DIAGNOSTICS_TRACE
864+
bool "Enable ESP Platform Diagnostics for Matter"
865+
default n
866+
help
867+
Enables the ESP Diagnostics platform to collect, store, and retrieve diagnostic data for the Matter protocol.
868+
This feature helps monitor system health and performance by providing insights through diagnostics logs.
869+
863870
config ENABLE_ESP_INSIGHTS_TRACE
864871
bool "Enable Matter ESP Insights"
865872
depends on ESP_INSIGHTS_ENABLED
@@ -876,15 +883,14 @@ menu "CHIP Device Layer"
876883
help
877884
This option enables the system statistics to be sent to the insights cloud.
878885

879-
config MAX_PERMIT_LIST_SIZE
880-
int "Set permit list size for Insights traces"
881-
range 5 30
882-
depends on ESP_INSIGHTS_ENABLED
883-
default 20
884-
help
885-
Maximum number of group entries that can be included in the permit list for reporting
886-
the traces to insights.
887-
886+
config MAX_PERMIT_LIST_SIZE
887+
int "Set permit list size for Insights traces"
888+
range 5 30
889+
depends on ESP_INSIGHTS_ENABLED || ENABLE_ESP_DIAGNOSTICS_TRACE
890+
default 20
891+
help
892+
Set the maximum number of group entries that can be included in the permit list for reporting
893+
traces to Insights or diagnostics. This ensures proper management of trace reporting capacity.
888894
endmenu
889895

890896

credentials/generate_revocation_set.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,14 +1006,11 @@ def setUp(self):
10061006
def get_test_file_path(self, filename):
10071007
return os.path.join(self.test_base_dir, 'test', filename)
10081008

1009-
def compare_revocation_sets(self, generated_set, expected_file):
1010-
with open(os.path.join(self.test_base_dir, expected_file), 'r') as f:
1011-
expected_set = [RevocationSet(**r) for r in json.load(f)]
1012-
1013-
# Compare the contents
1014-
self.assertEqual(len([generated_set]), len(expected_set))
1015-
expected = expected_set[0]
1009+
def get_expected_revocation_set(self, idx):
1010+
with open(os.path.join(self.test_base_dir, 'test/revoked-attestation-certificates/revocation-sets/revocation-set.json'), 'r') as f:
1011+
return RevocationSet(**json.load(f)[idx])
10161012

1013+
def compare_revocation_sets(self, generated_set, expected):
10171014
# Compare required fields
10181015
self.assertEqual(generated_set.type, expected.type)
10191016
self.assertEqual(generated_set.issuer_subject_key_id, expected.issuer_subject_key_id)
@@ -1038,10 +1035,7 @@ def test_paa_revocation_set(self):
10381035
revocation_set = generate_revocation_set_from_crl(
10391036
crl, crl_signer, ca_name_b64, ca_akid_hex, None)
10401037

1041-
self.compare_revocation_sets(
1042-
revocation_set,
1043-
'test/revoked-attestation-certificates/revocation-sets/revocation-set-for-paa.json'
1044-
)
1038+
self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(0))
10451039

10461040
def test_pai_revocation_set(self):
10471041
"""Test generation of PAI revocation set"""
@@ -1057,10 +1051,23 @@ def test_pai_revocation_set(self):
10571051
revocation_set = generate_revocation_set_from_crl(
10581052
crl, crl_signer, ca_name_b64, ca_akid_hex, None)
10591053

1060-
self.compare_revocation_sets(
1061-
revocation_set,
1062-
'test/revoked-attestation-certificates/revocation-sets/revocation-set-for-pai.json'
1063-
)
1054+
self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(1))
1055+
1056+
def test_revoked_pai_revocation_set(self):
1057+
"""Test generation of revocation set of revoked PAI"""
1058+
with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-CRL.pem'), 'rb') as f:
1059+
crl = x509.load_pem_x509_crl(f.read())
1060+
with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAI-FFF1-noPID-Revoked-Cert.pem'), 'rb') as f:
1061+
crl_signer = x509.load_pem_x509_certificate(f.read())
1062+
with open(self.get_test_file_path('revoked-attestation-certificates/Chip-Test-PAA-FFF1-Cert.pem'), 'rb') as f:
1063+
paa = x509.load_pem_x509_certificate(f.read())
1064+
1065+
ca_name_b64, ca_akid_hex = get_certificate_authority_details(
1066+
crl_signer, None, paa, False)
1067+
revocation_set = generate_revocation_set_from_crl(
1068+
crl, crl_signer, ca_name_b64, ca_akid_hex, None)
1069+
1070+
self.compare_revocation_sets(revocation_set, self.get_expected_revocation_set(2))
10641071

10651072

10661073
if __name__ == "__main__":
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICAjCCAaigAwIBAgIIc151wP6PWsUwCgYIKoZIzj0EAwIwRjEuMCwGA1UEAwwl
3+
TWF0dGVyIFRlc3QgUEFJIDB4RkZGMSBubyBQSUQgUmV2b2tlZDEUMBIGCisGAQQB
4+
gqJ8AgEMBEZGRjEwIBcNMjUwMzI1MDAwMDAwWhgPOTk5OTEyMzEyMzU5NTlaMGQx
5+
NjA0BgNVBAMMLU1hdHRlciBUZXN0IFJldm9rZWQgREFDIFNpZ25lZCBieSBSZXZv
6+
a2VkIFBBSTEUMBIGCisGAQQBgqJ8AgEMBEZGRjExFDASBgorBgEEAYKifAICDAQ4
7+
MDAxMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaELP83azv5+vdJg+vmO/g6td
8+
Z9obWLWWZdgatid+/x5leASGpBEgL0pEv1UZ74ol4bK6S287eQKrIAZB2xdqWaNg
9+
MF4wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFDO1Scke
10+
5qNNVdIn4aGgsbGhUWs6MB8GA1UdIwQYMBaAFJEzfFz+e7KTdv6IfTyU5/Wd2D0v
11+
MAoGCCqGSM49BAMCA0gAMEUCIGO/qO9oglMxDEPMplwri0o31iRLg/p+qAyhtUC1
12+
DiWxAiEAgv4UPAsPjvj1gPMWaLe9xnbrZOuXg+7bjOFPeODItFc=
13+
-----END CERTIFICATE-----
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIJoLKewrsvBa4y0m97yUkHqvZHBNjl32M5xbK15Q+ShHoAoGCCqGSM49
3+
AwEHoUQDQgAEaELP83azv5+vdJg+vmO/g6tdZ9obWLWWZdgatid+/x5leASGpBEg
4+
L0pEv1UZ74ol4bK6S287eQKrIAZB2xdqWQ==
5+
-----END EC PRIVATE KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN X509 CRL-----
2+
MIIBHjCBxQIBATAKBggqhkjOPQQDAjBGMS4wLAYDVQQDDCVNYXR0ZXIgVGVzdCBQ
3+
QUkgMHhGRkYxIG5vIFBJRCBSZXZva2VkMRQwEgYKKwYBBAGConwCAQwERkZGMRcN
4+
MjUwMzI2MDYyODU2WhgPMjEyNTAzMjcwNjI4NTZaMBswGQIIc151wP6PWsUXDTI1
5+
MDMyNjA2Mjg1NlqgLzAtMB8GA1UdIwQYMBaAFJEzfFz+e7KTdv6IfTyU5/Wd2D0v
6+
MAoGA1UdFAQDAgEAMAoGCCqGSM49BAMCA0gAMEUCIQDM4thiU6vEOH5jwGaFypV2
7+
P9InyjTJKpMo5bR4QEMMRgIgYge7z2UStTlJzS2gVm/MVld7SNnD+020LOVP1SWb
8+
ufk=
9+
-----END X509 CRL-----

credentials/test/revoked-attestation-certificates/dac-provider-test-vectors/indirect-revoked-dac-01-pai-03.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"description": "Indirect revoked PAI 03: use this with revocation-sets/indirect-revocation-set.json",
2+
"description": "Indirect revoked PAI 03: use this with revocation-sets/revocation-set.json",
33
"basic_info_pid": 32769,
44
"certification_declaration": "3081e706092a864886f70d010702a081d93081d6020103310d300b0609608648016503040201304306092a864886f70d010701a0360434152400012501f1ff3602050180182403162c0413435341303030303053574330303030302d303124050024060024070124080018317d307b020103801462fa823359acfaa9963e1cfa140addf504f37160300b0609608648016503040201300a06082a8648ce3d0403020447304502204dc6be89beeb5a49adec51ee7f0e6d1263ffc9e6238f2044385a5e0c86751b83022100ed902842f7a5784368d63eba6a2fb90086dd65a0ce3c283d86b915a3536afdac",
55
"pai_cert": "308201ce30820173a00302010202145433500af72d566dd0c0fd2710ab6f8562bd6f8f300a06082a8648ce3d04030230303118301606035504030c0f4d617474657220546573742050414131143012060a2b0601040182a27c02010c04464646313020170d3235303130393130303431375a180f32313234313231363130303431375a3033311b301906035504030c124d617474657220546573742050414920303331143012060a2b0601040182a27c02010c04464646313059301306072a8648ce3d020106082a8648ce3d03010703420004bb1a980f395d0a448f315df82f820564b127398e9c1396916195ef3bba5fbc247445ceaa589ca835ca99058b1b7c1b2aef55dbec4338a3d8382a100c7f199dada366306430120603551d130101ff040830060101ff020100300e0603551d0f0101ff040403020186301d0603551d0e04160414f97059a4f532b98b3b808592cd943a91004acd6d301f0603551d230418301680146afd22771f511fecbf1641976710dcdc31a1717e300a06082a8648ce3d0403020349003046022100ad4364c9b8c18ed56b11239ec95468981f598beece1e6904eddf7c67a7f533980221008a0428bbbcd9b725341deab309de87569b76fbae735bac659ce83c84b209d91f",

0 commit comments

Comments
 (0)