Граф коммитов
64512 Коммитов
Автор SHA1 Сообщение Дата
Chauncey Hui 62bfad38a7 SWDEV-2 - Change OpenCL version number from 3501 to 3502
[ROCm/clr commit: b2d412bcf1]
2022-09-02 03:00:06 -04:00
Chauncey Hui b2d412bcf1 SWDEV-2 - Change OpenCL version number from 3501 to 3502 2022-09-02 03:00:06 -04:00
Anusha Godavarthy Surya 459e9539b2 SWDEV-354717 - Fix hipExtLaunchKernel as part of stream capture
Change-Id: Ic29d7403dfa38f01bec423aa1df7aa75c60a86e2


[ROCm/clr commit: 7f4c711ac1]
2022-09-01 19:26:14 +00:00
Anusha Godavarthy Surya 7f4c711ac1 SWDEV-354717 - Fix hipExtLaunchKernel as part of stream capture
Change-Id: Ic29d7403dfa38f01bec423aa1df7aa75c60a86e2
2022-09-01 19:26:14 +00:00
Philip Yang 3dbf5feffe libhsakmt: Fix queue leaking debug memory
Queue ctx_save_restore memory is allocated with size
ctx_save_restore_size + debug_memory_size, use the same size
in free_queue to free ctx_save_restore memory.

Change-Id: I4902ff15fb82ddea64b8342b89776a1bf5c38d13
Signed-off-by: Philip Yang <Philip.Yang@amd.com>
2022-09-01 12:31:16 -04:00
Philip Yang 8e77b792f8 libhsakmt: Fix queue leaking debug memory
Queue ctx_save_restore memory is allocated with size
ctx_save_restore_size + debug_memory_size, use the same size
in free_queue to free ctx_save_restore memory.

Change-Id: I4902ff15fb82ddea64b8342b89776a1bf5c38d13
Signed-off-by: Philip Yang <Philip.Yang@amd.com>


[ROCm/ROCR-Runtime commit: 3dbf5feffe]
2022-09-01 12:31:16 -04:00
Yifan Zhang 87847a38ba SWDEV-354850 - Enable gfx1103 on ROCm backend.
Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com>
Change-Id: Ia420444fd0cb703fcdca1ed7e3d2e262ffd7f4db


[ROCm/clr commit: d6c35273e3]
2022-09-01 18:58:00 +08:00
Yifan Zhang d6c35273e3 SWDEV-354850 - Enable gfx1103 on ROCm backend.
Signed-off-by: Yifan Zhang <yifan1.zhang@amd.com>
Change-Id: Ia420444fd0cb703fcdca1ed7e3d2e262ffd7f4db
2022-09-01 18:58:00 +08:00
Chauncey Hui da11e3ee37 SWDEV-2 - Change OpenCL version number from 3500 to 3501
[ROCm/clr commit: 38e9bc9540]
2022-09-01 03:00:06 -04:00
Chauncey Hui 38e9bc9540 SWDEV-2 - Change OpenCL version number from 3500 to 3501 2022-09-01 03:00:06 -04:00
Anusha Godavarthy Surya ed2f9051fa SWDEV-354717 - Add support for hipExtLaunchKernel as part of stream capture
Change-Id: I22708923f454a0f4456ff99d25559daffe08c208


[ROCm/clr commit: 2b322a9087]
2022-09-01 05:02:20 +00:00
Anusha Godavarthy Surya 2b322a9087 SWDEV-354717 - Add support for hipExtLaunchKernel as part of stream capture
Change-Id: I22708923f454a0f4456ff99d25559daffe08c208
2022-09-01 05:02:20 +00:00
Anusha Godavarthy Surya 67706897e0 SWDEV-352951 - Add capture support for hipModuleLaunchKernel
Change-Id: Iced0846c9f753ecbb87e3f7aec2bfd72137d8c00


[ROCm/clr commit: c72942964d]
2022-08-31 22:15:02 -04:00
Anusha Godavarthy Surya c72942964d SWDEV-352951 - Add capture support for hipModuleLaunchKernel
Change-Id: Iced0846c9f753ecbb87e3f7aec2bfd72137d8c00
2022-08-31 22:15:02 -04:00
Hao Zhou 20bc07bcf6 Merge amd-staging into amd-master 20220901
Signed-off-by: Hao Zhou <Hao.Zhou@amd.com>
Change-Id: Ic59465c248f96a74d20226810c9ae98360797e34


[ROCm/rocm_smi_lib commit: 1efd6ee29c]
2022-09-01 09:54:40 +08:00
Hao Zhou 1efd6ee29c Merge amd-staging into amd-master 20220901
Signed-off-by: Hao Zhou <Hao.Zhou@amd.com>
Change-Id: Ic59465c248f96a74d20226810c9ae98360797e34
2022-09-01 09:54:40 +08:00
Jenkins aec1c64171 SWDEV-299127 - Merge 'develop' into 'amd-staging'
Change-Id: Ief9fca104afb64b13c02a9b17deddda0655a16f7


[ROCm/hip commit: ada9cea4c6]
2022-08-31 19:10:27 -04:00
Jenkins ada9cea4c6 SWDEV-299127 - Merge 'develop' into 'amd-staging'
Change-Id: Ief9fca104afb64b13c02a9b17deddda0655a16f7
2022-08-31 19:10:27 -04:00
Joseph Greathouse b995ea06e8 SWDEV-330307 - Avoid releasing command before last use
The fix for SWDEV-329789 moved down the last use of the a
command object pointer in order to prevent a race condition.
However, the previous patch did not move down the release of
that command. By releasing the command early, another thread
could get a command with the same pointer. That second thread
could later submit work to the queue using that new command.
The first thread could then perform a comparison against the
queue's last command using its own now-stale pointer. This
could eventually allow the second thread to skip synchornizing
on the queue. This would result in host synchronizations
completing before their device work was actually complete.

Change-Id: I292b7b369743251ceafe453a4c5cae14a6d01046


[ROCm/clr commit: 6b956f7627]
2022-08-31 16:07:49 -04:00
Joseph Greathouse 6b956f7627 SWDEV-330307 - Avoid releasing command before last use
The fix for SWDEV-329789 moved down the last use of the a
command object pointer in order to prevent a race condition.
However, the previous patch did not move down the release of
that command. By releasing the command early, another thread
could get a command with the same pointer. That second thread
could later submit work to the queue using that new command.
The first thread could then perform a comparison against the
queue's last command using its own now-stale pointer. This
could eventually allow the second thread to skip synchornizing
on the queue. This would result in host synchronizations
completing before their device work was actually complete.

Change-Id: I292b7b369743251ceafe453a4c5cae14a6d01046
2022-08-31 16:07:49 -04:00
Alex Xie 29acb61cae SWDEV-351337 - Add asic ID to staging for PAL
Change-Id: I64a24cc0118457d492d76063c808465d212b47bd


[ROCm/clr commit: c00f10daea]
2022-08-31 15:56:40 -04:00
Alex Xie c00f10daea SWDEV-351337 - Add asic ID to staging for PAL
Change-Id: I64a24cc0118457d492d76063c808465d212b47bd
2022-08-31 15:56:40 -04:00
David Yat Sin 1c385fb257 libhsakmt: Add check for invalid aperture
Avoiding segfault when an invalid SharedMemoryHandle is passed in
when calling fmm_register_shared_memory.

Change-Id: I0e0bbed01487fc10afcbb170eb9330e70b209d14
Signed-off-by: David Yat Sin <David.YatSin@amd.com>
2022-08-31 15:14:16 -04:00
David Yat Sin 95d4d31648 libhsakmt: Add check for invalid aperture
Avoiding segfault when an invalid SharedMemoryHandle is passed in
when calling fmm_register_shared_memory.

Change-Id: I0e0bbed01487fc10afcbb170eb9330e70b209d14
Signed-off-by: David Yat Sin <David.YatSin@amd.com>


[ROCm/ROCR-Runtime commit: 1c385fb257]
2022-08-31 15:14:16 -04:00
Ranjith Ramakrishnan fb1fd43157 SWDEV-352582 - Updated warning message
Using wrapper header file will generate warning message during build time.
Updated the message content to make it more meaningful

Change-Id: I4e0c5e3d845946d9b493d98879ea8e75a92506ee


[ROCm/clr commit: c833a19284]
2022-08-31 11:58:26 -07:00
Ranjith Ramakrishnan c833a19284 SWDEV-352582 - Updated warning message
Using wrapper header file will generate warning message during build time.
Updated the message content to make it more meaningful

Change-Id: I4e0c5e3d845946d9b493d98879ea8e75a92506ee
2022-08-31 11:58:26 -07:00
Jonathan R. Madsen 1b6cbf7d65 Support tracing thread locks with perfetto (#143)
- remove sampling and roctracer flat/timeline options
  - unused/unnecessary clutter
- start pthread_gotcha before perfetto
- remove pthread_mutex_gotcha validate
- update timemory submodule with tid fix

[ROCm/rocprofiler-systems commit: 2718596e5a]
2022-08-31 11:33:45 -05:00
Jonathan R. Madsen 2718596e5a Support tracing thread locks with perfetto (#143)
- remove sampling and roctracer flat/timeline options
  - unused/unnecessary clutter
- start pthread_gotcha before perfetto
- remove pthread_mutex_gotcha validate
- update timemory submodule with tid fix
2022-08-31 11:33:45 -05:00
Ori Messinger d415a3b2e1 ROCm SMI CLI: Modify Column Header
The purpose of this patch is to modify the column header of the default
'./rocm-smi' command from 'Temp' to 'Temp (DieEdge)' for clarity.

Signed-off-by: Ori Messinger <Ori.Messinger@amd.com>
Change-Id: I127a9214be97a1185c3db010f1c9176d1f412ec9


[ROCm/rocm_smi_lib commit: dfd88b593f]
2022-08-31 09:47:14 -04:00
Ori Messinger dfd88b593f ROCm SMI CLI: Modify Column Header
The purpose of this patch is to modify the column header of the default
'./rocm-smi' command from 'Temp' to 'Temp (DieEdge)' for clarity.

Signed-off-by: Ori Messinger <Ori.Messinger@amd.com>
Change-Id: I127a9214be97a1185c3db010f1c9176d1f412ec9
2022-08-31 09:47:14 -04:00
pghafari 8b508ffc6b SWDEV-341326 - removing sigabrt for NoBinaryForGpu
Change-Id: Ia30fb3efec7f71b870e6a35d5ce51a4aa61fad28


[ROCm/clr commit: 9f37acc55f]
2022-08-31 09:39:59 -04:00
pghafari 9f37acc55f SWDEV-341326 - removing sigabrt for NoBinaryForGpu
Change-Id: Ia30fb3efec7f71b870e6a35d5ce51a4aa61fad28
2022-08-31 09:39:59 -04:00
Jonathan R. Madsen 2ef9dfd002 Support sampling duration, sampling TIDs (#142)
- Sampling duration config values
  - OMNITRACE_SAMPLING_DURATION
  - OMNITRACE_PROCESS_SAMPLING_DURATION
  - Disables sampling after this time (in seconds) has elapsed 
- Sampling thread-id config values
  - OMNITRACE_SAMPLING_TIDS
  - OMNITRACE_SAMPLING_CPUTIME_TIDS
  - OMNITRACE_SAMPLING_REALTIME_TIDS
  - Allows user to select certain threads for sampling
- Miscellaneous
  - Tweaked the finalization verbosity messages
  - moved sampling-on-child-threads into runtime.hpp and runtime.cpp
  - fixed submodule dyninst header install

[ROCm/rocprofiler-systems commit: e67afd33eb]
2022-08-31 06:29:19 -05:00
Jonathan R. Madsen e67afd33eb Support sampling duration, sampling TIDs (#142)
- Sampling duration config values
  - OMNITRACE_SAMPLING_DURATION
  - OMNITRACE_PROCESS_SAMPLING_DURATION
  - Disables sampling after this time (in seconds) has elapsed 
- Sampling thread-id config values
  - OMNITRACE_SAMPLING_TIDS
  - OMNITRACE_SAMPLING_CPUTIME_TIDS
  - OMNITRACE_SAMPLING_REALTIME_TIDS
  - Allows user to select certain threads for sampling
- Miscellaneous
  - Tweaked the finalization verbosity messages
  - moved sampling-on-child-threads into runtime.hpp and runtime.cpp
  - fixed submodule dyninst header install
2022-08-31 06:29:19 -05:00
jie1zhan 8941e7135c fix rocrtst on hang issue
close the file at the end of every test, instead of the whole test

Change-Id: Ia510990dad8d0bd82625bbd9b2958181e8f1dd25
2022-08-31 17:03:09 +08:00
jie1zhan 8ba559c4e6 fix rocrtst on hang issue
close the file at the end of every test, instead of the whole test

Change-Id: Ia510990dad8d0bd82625bbd9b2958181e8f1dd25


[ROCm/ROCR-Runtime commit: 8941e7135c]
2022-08-31 17:03:09 +08:00
Chauncey Hui ee33ffb85c SWDEV-2 - Change OpenCL version number from 3499 to 3500
[ROCm/clr commit: 2587a700b8]
2022-08-31 03:00:06 -04:00
Chauncey Hui 2587a700b8 SWDEV-2 - Change OpenCL version number from 3499 to 3500 2022-08-31 03:00:06 -04:00
Jonathan R. Madsen cbdc7cad4b bump-version (#141)
[ROCm/rocprofiler-systems commit: c2d6589b93]
2022-08-31 01:26:49 -05:00
Jonathan R. Madsen c2d6589b93 bump-version (#141) 2022-08-31 01:26:49 -05:00
Jonathan R. Madsen 473f452d39 Rework sampling and colorized logs (#140)
## Overview

This is a significant PR which has 3 very notable characteristics:

1. Omnitrace colorizes most of it's logging
2. Completely reworked the sampling 
  - Samples now record the current instruction pointers instead of strings
    - This _dramatically_ decreases the overhead of taking a sample
  - The collection of metrics during a sample are split out into another component, enabling that data collection to be disabled -- which decreases the sampling overhead even further
  - When both `OMNITRACE_SAMPLING_CPUTIME` and `OMNITRACE_SAMPLING_REALTIME` are ON:
    - `OMNITRACE_SAMPLING_CPUTIME_FREQ` and `OMNITRACE_SAMPLING_REALTIME_FREQ` can be used to individually control the sampling frequency 
  - `OMNITRACE_SAMPLING_CPUTIME_DELAY` and `OMNITRACE_SAMPLING_REALTIME_DELAY` can be used to individually control the delay time before starting
  - Now, omnitrace does not start a real-time sampler on the main thread unless `OMNITRACE_SAMPLING_REALTIME` is ON
    - In the future, an `OMNITRACE_SAMPLING_TIDS` (and real-time, cpu-time variants) configuration variable(s) will allow you to select which threads will be sampled
3. Files produced by `omnitrace` exe -- `available-instr.txt`, `instrumented-instr.txt`, etc. -- now no longer has `-instr` suffix and are placed in `instrumentation/` subfolder, i.e. `available-instr.txt` -> instrumentation/available.txt`
  - This helped de-clutter the output folder

Most of the other edits were reorganization (e.g. internal namespace changes), cleanup, and splitting up functionality.

## Bug Fixes

There is a bug fix with respect to the HSA callbacks which disabled sampling on child threads when an HSA API call was made

## Details

- created thread_info struct for mapping different thread IDs
- reorganized file structure significantly
- added categories.hpp, concepts.hpp
- moved around name trait definitions
- moved all omnitrace components into `omnitrace::component` namespace
  - there was a lot of inconsistency b/t using `tim::component` in some places and `omnitrace::component`
  - added macros like OMNITRACE_DECLARE_COMPONENT in lieu of TIMEMORY_DECLARE_COMPONENT
- OMNITRACE_CRITICAL_TRACE_NUM_THREADS -> OMNITRACE_THREAD_POOL_SIZE
- roctracer and critical_trace use same thread pool
- critical_trace functions do not lock anymore bc of thread-local TaskGroup
- added `component::local_category_region` to support using `component::category_region` without explicitly passing in name
- removed `component::omnitrace` (unused)
- migrated KokkosP and OMPT to use `component::local_category_region`
  - removed `component::user_region` as a result
- migrated omnitrace_{push,pop}_{trace,region}_hidden to use component::category_region
  - removed `component::functors` as a result
- migrated some ppdefs
- `api::omnitrace` -> `project::omnitrace`
- `api::(...)` -> `category::(...)`
- improved recording the execution time of threads
  - migrated this functionality out of pthread_create_gotcha and into thread_info
- moved mpi_gotcha, fork_gotcha, exit_gotcha, rcclp into omnitrace::component namespace
- split backtrace up into backtrace, backtrace_metrics, backtrace_timestamp components
- sampling.cpp handles setup and post-processing that was formerly in backtrace
- updated logging to use colors
- `OMNITRACE_COLORIZED_LOG` config variable
- updated docs on JSON output from timemory
- instrumentation info in instrumentation subfolder
- added testing for KokkosP entries
- added testing for ompt entries
- add_critical_trace function defined in critical_trace.hpp
- disable push_thread_state and pop_thread_state when thread state is Disabled or Completed
- add comp::page_rss to main bundle
- thread_data supports std::optional instead of std::unique_ptr
- thread_data supports tim::identity<T> to avoid unique_ptr or optional
- tracing::record_thread_start_time()
- tracing::push_timemory and tracing::pop_timemory are templated on CategoryT
- removed anonymous namespace from omnitrace::utility
- sampling backtrace stores instruction pointers instead of strings
- component::category_region updates
  - handle disabled thread state
  - handle finalized state
  - fewer debug messages
  - invoke thread_init()
  - invoke thread_init_sampling()
  - handle push/pop count based on category
  - push/pop count only modified when used
- component::cpu_freq
- components/ensure_storage.hpp
- reworked the pthread_create replacement function
- updated parallel-overhead example to report # of times locked
- OMNITRACE_MAX_UNWIND_DEPTH build option
- update timemory submodule

[ROCm/rocprofiler-systems commit: 808ea7dfa7]
2022-08-31 01:24:31 -05:00
Jonathan R. Madsen 808ea7dfa7 Rework sampling and colorized logs (#140)
## Overview

This is a significant PR which has 3 very notable characteristics:

1. Omnitrace colorizes most of it's logging
2. Completely reworked the sampling 
  - Samples now record the current instruction pointers instead of strings
    - This _dramatically_ decreases the overhead of taking a sample
  - The collection of metrics during a sample are split out into another component, enabling that data collection to be disabled -- which decreases the sampling overhead even further
  - When both `OMNITRACE_SAMPLING_CPUTIME` and `OMNITRACE_SAMPLING_REALTIME` are ON:
    - `OMNITRACE_SAMPLING_CPUTIME_FREQ` and `OMNITRACE_SAMPLING_REALTIME_FREQ` can be used to individually control the sampling frequency 
  - `OMNITRACE_SAMPLING_CPUTIME_DELAY` and `OMNITRACE_SAMPLING_REALTIME_DELAY` can be used to individually control the delay time before starting
  - Now, omnitrace does not start a real-time sampler on the main thread unless `OMNITRACE_SAMPLING_REALTIME` is ON
    - In the future, an `OMNITRACE_SAMPLING_TIDS` (and real-time, cpu-time variants) configuration variable(s) will allow you to select which threads will be sampled
3. Files produced by `omnitrace` exe -- `available-instr.txt`, `instrumented-instr.txt`, etc. -- now no longer has `-instr` suffix and are placed in `instrumentation/` subfolder, i.e. `available-instr.txt` -> instrumentation/available.txt`
  - This helped de-clutter the output folder

Most of the other edits were reorganization (e.g. internal namespace changes), cleanup, and splitting up functionality.

## Bug Fixes

There is a bug fix with respect to the HSA callbacks which disabled sampling on child threads when an HSA API call was made

## Details

- created thread_info struct for mapping different thread IDs
- reorganized file structure significantly
- added categories.hpp, concepts.hpp
- moved around name trait definitions
- moved all omnitrace components into `omnitrace::component` namespace
  - there was a lot of inconsistency b/t using `tim::component` in some places and `omnitrace::component`
  - added macros like OMNITRACE_DECLARE_COMPONENT in lieu of TIMEMORY_DECLARE_COMPONENT
- OMNITRACE_CRITICAL_TRACE_NUM_THREADS -> OMNITRACE_THREAD_POOL_SIZE
- roctracer and critical_trace use same thread pool
- critical_trace functions do not lock anymore bc of thread-local TaskGroup
- added `component::local_category_region` to support using `component::category_region` without explicitly passing in name
- removed `component::omnitrace` (unused)
- migrated KokkosP and OMPT to use `component::local_category_region`
  - removed `component::user_region` as a result
- migrated omnitrace_{push,pop}_{trace,region}_hidden to use component::category_region
  - removed `component::functors` as a result
- migrated some ppdefs
- `api::omnitrace` -> `project::omnitrace`
- `api::(...)` -> `category::(...)`
- improved recording the execution time of threads
  - migrated this functionality out of pthread_create_gotcha and into thread_info
- moved mpi_gotcha, fork_gotcha, exit_gotcha, rcclp into omnitrace::component namespace
- split backtrace up into backtrace, backtrace_metrics, backtrace_timestamp components
- sampling.cpp handles setup and post-processing that was formerly in backtrace
- updated logging to use colors
- `OMNITRACE_COLORIZED_LOG` config variable
- updated docs on JSON output from timemory
- instrumentation info in instrumentation subfolder
- added testing for KokkosP entries
- added testing for ompt entries
- add_critical_trace function defined in critical_trace.hpp
- disable push_thread_state and pop_thread_state when thread state is Disabled or Completed
- add comp::page_rss to main bundle
- thread_data supports std::optional instead of std::unique_ptr
- thread_data supports tim::identity<T> to avoid unique_ptr or optional
- tracing::record_thread_start_time()
- tracing::push_timemory and tracing::pop_timemory are templated on CategoryT
- removed anonymous namespace from omnitrace::utility
- sampling backtrace stores instruction pointers instead of strings
- component::category_region updates
  - handle disabled thread state
  - handle finalized state
  - fewer debug messages
  - invoke thread_init()
  - invoke thread_init_sampling()
  - handle push/pop count based on category
  - push/pop count only modified when used
- component::cpu_freq
- components/ensure_storage.hpp
- reworked the pthread_create replacement function
- updated parallel-overhead example to report # of times locked
- OMNITRACE_MAX_UNWIND_DEPTH build option
- update timemory submodule
2022-08-31 01:24:31 -05:00
ROCm CI Service Account 568c361802 SWDEV-353807 - Fixes multiple catch issues (#2912)
- enforcing c++17 for all tests
- Warning as error: ignoring return value

Change-Id: I3d171540403f74222e631d1a8e393386461c9729


[ROCm/hip-tests commit: d0aaed906d]
2022-08-30 16:53:21 -07:00
ROCm CI Service Account d0aaed906d SWDEV-353807 - Fixes multiple catch issues (#2912)
- enforcing c++17 for all tests
- Warning as error: ignoring return value

Change-Id: I3d171540403f74222e631d1a8e393386461c9729
2022-08-30 16:53:21 -07:00
ROCm CI Service Account 1c54135503 SWDEV-353807 - Fixes multiple catch issues (#2912)
- enforcing c++17 for all tests
- Warning as error: ignoring return value

Change-Id: I3d171540403f74222e631d1a8e393386461c9729


[ROCm/hip commit: 87c69c5759]
2022-08-30 16:53:21 -07:00
ROCm CI Service Account 87c69c5759 SWDEV-353807 - Fixes multiple catch issues (#2912)
- enforcing c++17 for all tests
- Warning as error: ignoring return value

Change-Id: I3d171540403f74222e631d1a8e393386461c9729
2022-08-30 16:53:21 -07:00
Ajay 1d84cdb2af SWDEV-352127 - Handle Raphael arch in palsettings create()
assert statement were hit silently in Release builds like SWDEV-353548.
Issue only seen in Debug builds

Change-Id: I9f7177806c854d64fcf986e9f6092076d8a05f23


[ROCm/clr commit: 040c416cb1]
2022-08-30 16:21:25 -04:00
Ajay 040c416cb1 SWDEV-352127 - Handle Raphael arch in palsettings create()
assert statement were hit silently in Release builds like SWDEV-353548.
Issue only seen in Debug builds

Change-Id: I9f7177806c854d64fcf986e9f6092076d8a05f23
2022-08-30 16:21:25 -04:00
ROCm CI Service Account d5c78a909c SWDEV-353807 - deviceLib test when build/execution nodes are different (#2905)
Change-Id: I9dd831bbf87999cb3ea65c91b7e86679198357d3


[ROCm/hip-tests commit: ba5a0b9af5]
2022-08-30 12:27:28 -07:00
ROCm CI Service Account ba5a0b9af5 SWDEV-353807 - deviceLib test when build/execution nodes are different (#2905)
Change-Id: I9dd831bbf87999cb3ea65c91b7e86679198357d3
2022-08-30 12:27:28 -07:00