diff --git a/debug/accuracy_tools/cmake/Findprotobuf.cmake b/debug/accuracy_tools/cmake/Findprotobuf.cmake index 4d70515e980f7a921447250fe58400f600419e4c..9923b386fa542d83d9fac69e0745d4dd46bc7a44 100644 --- a/debug/accuracy_tools/cmake/Findprotobuf.cmake +++ b/debug/accuracy_tools/cmake/Findprotobuf.cmake @@ -1,10 +1,10 @@ -set(PACKAGE_VERSION 3.13.0) +set(PACKAGE_VERSION 3.15.0) set(PKG_NAME protobuf) -set(URL "https://gitee.com/mirrors/protobuf_source/repository/archive/v3.13.0.tar.gz") -set(SHA256_VALUE "ab9b39e7053a6fb06b01bf75fb6ec6a71a1ada5a5f8e2446f927336e97b9e7bb") +set(URL "https://gitee.com/mirrors/protobuf_source/repository/archive/v3.15.0.tar.gz") +set(SHA256_VALUE "a1ce078c369f46a3277fdc7ce462ac73cb7cb0edec8bc9d90d23fdb34491c575") set(DOWNLOAD_PATH "$ENV{PROJECT_ROOT_PATH}/third_party") -set(DIR_NAME "${DOWNLOAD_PATH}/protobuf_source-v3.13.0") +set(DIR_NAME "${DOWNLOAD_PATH}/protobuf_source-v3.15.0") if (NOT ${PKG_NAME}_FOUND) diff --git a/debug/accuracy_tools/msprobe/ccsrc/CMakeLists.txt b/debug/accuracy_tools/msprobe/ccsrc/CMakeLists.txt index 2579a3a0e785c0e0ca384b4d52118a5d828249f8..97c0fb50eb97d3ad430545a93b882194b3a47a32 100644 --- a/debug/accuracy_tools/msprobe/ccsrc/CMakeLists.txt +++ b/debug/accuracy_tools/msprobe/ccsrc/CMakeLists.txt @@ -26,6 +26,8 @@ compile_protobuf_file( ${PROTO_SRC} ) +set(CMAKE_SKIP_RPATH TRUE) + add_library(_msprobe_c SHARED) target_compile_options(_msprobe_c PRIVATE "-Wall") @@ -33,10 +35,13 @@ target_compile_options(_msprobe_c PRIVATE "-fPIC") target_compile_options(_msprobe_c PRIVATE "-fstack-protector-all") target_compile_options(_msprobe_c PRIVATE "-ftrapv") target_compile_options(_msprobe_c PRIVATE "-fstack-check") +target_compile_options(_msprobe_c PRIVATE "-D_FORTIFY_SOURCE=2") target_link_options(_msprobe_c PRIVATE "-Wl,-z,relor") target_link_options(_msprobe_c PRIVATE "-Wl,-z,now") target_link_options(_msprobe_c PRIVATE "-Wl,-z,noexecstack") +target_link_options(_msprobe_c PRIVATE "-Wl,--disable-new-dtags") +target_link_options(_msprobe_c PRIVATE "-s") target_link_libraries(_msprobe_c PUBLIC dl) target_link_libraries(_msprobe_c PUBLIC pthread) diff --git a/debug/accuracy_tools/msprobe/core/common/const.py b/debug/accuracy_tools/msprobe/core/common/const.py index 55f30b183f19d0baf59aa9aadb42533ba83f7ec8..adcc171f6710b435e97e64313595bdbc74b4d256 100644 --- a/debug/accuracy_tools/msprobe/core/common/const.py +++ b/debug/accuracy_tools/msprobe/core/common/const.py @@ -662,6 +662,15 @@ class MonitorConst: """ Class for monitor const """ + + # monitor config set default values + DEFAULT_GRAD_ACC_STEPS = 1 + DEFAULT_START_ITERATION = 0 + DEFAULT_START_STEP = 0 + DEFAULT_MAX_COLLECT_TIMES = 1e8 + DEFAULT_MIN_COLLECT_TIMES = 0 + DEFAULT_STEP_INTERVAL = 1 + OP_LIST = ["norm", "min", "max", "zeros", "nans", "id", "mean"] MONITOR_OUTPUT_DIR = "MONITOR_OUTPUT_DIR" DEFAULT_MONITOR_OUTPUT_DIR = "./monitor_output" @@ -707,3 +716,5 @@ class MonitorConst: CSV = "csv" API = "api" HEADER_NAME = 'name' + + MAX_NDIGITS = 20 diff --git a/debug/accuracy_tools/msprobe/core/common/decorator.py b/debug/accuracy_tools/msprobe/core/common/decorator.py new file mode 100644 index 0000000000000000000000000000000000000000..d3710002bcc281be2fd0f19fc7abda1af35ec936 --- /dev/null +++ b/debug/accuracy_tools/msprobe/core/common/decorator.py @@ -0,0 +1,50 @@ +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from collections import defaultdict +from functools import wraps + +from msprobe.core.common.const import Const +from msprobe.core.common.exceptions import MsprobeException +from msprobe.core.common.log import logger + +# 记录工具函数递归的深度 +recursion_depth = defaultdict(int) + + +def recursion_depth_decorator(func_info, max_depth=Const.MAX_DEPTH): + """装饰一个函数,当函数递归调用超过限制时,抛出异常并打印函数信息。""" + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + func_id = id(func) + recursion_depth[func_id] += 1 + if recursion_depth[func_id] > max_depth: + msg = f"call {func_info} exceeds the recursion limit." + logger.error_log_with_exp( + msg, + MsprobeException( + MsprobeException.RECURSION_LIMIT_ERROR, msg + ), + ) + try: + result = func(*args, **kwargs) + finally: + recursion_depth[func_id] -= 1 + return result + + return wrapper + + return decorator diff --git a/debug/accuracy_tools/msprobe/core/common/file_utils.py b/debug/accuracy_tools/msprobe/core/common/file_utils.py index fdc626ca6a1a90e9060cefa237f9d5d8d7e42844..55b041335af44de5654a7ebcff1c13fbe16322c1 100644 --- a/debug/accuracy_tools/msprobe/core/common/file_utils.py +++ b/debug/accuracy_tools/msprobe/core/common/file_utils.py @@ -26,6 +26,7 @@ import yaml import numpy as np import pandas as pd +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.core.common.log import logger from msprobe.core.common.exceptions import FileCheckException from msprobe.core.common.const import FileCheckConst @@ -332,6 +333,23 @@ def change_mode(path, mode): 'Failed to change {} authority. {}'.format(path, str(ex))) from ex +@recursion_depth_decorator('msprobe.core.common.file_utils.recursive_chmod') +def recursive_chmod(path): + """ + 递归地修改目录及其子目录和文件的权限,文件修改为640,路径修改为750 + + :param path: 要修改权限的目录路径 + """ + for _, dirs, files in os.walk(path): + for file_name in files: + file_path = os.path.join(path, file_name) + change_mode(file_path, FileCheckConst.DATA_FILE_AUTHORITY) + for dir_name in dirs: + dir_path = os.path.join(path, dir_name) + change_mode(dir_path, FileCheckConst.DATA_DIR_AUTHORITY) + recursive_chmod(dir_path) + + def path_len_exceeds_limit(file_path): return len(os.path.realpath(file_path)) > FileCheckConst.DIRECTORY_LENGTH or \ len(os.path.basename(file_path)) > FileCheckConst.FILE_NAME_LENGTH @@ -632,7 +650,7 @@ def os_walk_for_files(path, depth): return res -def check_crt_valid(pem_path): +def check_crt_valid(pem_path, is_public_key=False): """ Check the validity of the SSL certificate. @@ -641,6 +659,7 @@ def check_crt_valid(pem_path): Parameters: pem_path (str): The file path of the SSL certificate. + is_public_key (bool): The file is public key or not. Raises: RuntimeError: If the SSL certificate is invalid or expired. @@ -649,7 +668,10 @@ def check_crt_valid(pem_path): try: with FileOpen(pem_path, "r") as f: pem_data = f.read() - cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, pem_data) + if is_public_key: + cert = OpenSSL.crypto.load_publickey(OpenSSL.crypto.FILETYPE_PEM, pem_data) + else: + cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, pem_data) pem_start = parser.parse(cert.get_notBefore().decode("UTF-8")) pem_end = parser.parse(cert.get_notAfter().decode("UTF-8")) logger.info(f"The SSL certificate passes the verification and the validity period " diff --git a/debug/accuracy_tools/msprobe/core/common/utils.py b/debug/accuracy_tools/msprobe/core/common/utils.py index e08e40f1ee6198488e1fa0a68b01aa6f7233d0b3..8d55dd4c1647e3584855491fa67ba3b9741ffa23 100644 --- a/debug/accuracy_tools/msprobe/core/common/utils.py +++ b/debug/accuracy_tools/msprobe/core/common/utils.py @@ -18,9 +18,7 @@ import os import re import subprocess import time -from collections import defaultdict from datetime import datetime, timezone -from functools import wraps import numpy as np @@ -481,36 +479,6 @@ def safe_get_value(container, index, container_name, key=None): raise MsprobeBaseException(MsprobeBaseException.INVALID_OBJECT_TYPE_ERROR) from e -# 记录工具函数递归的深度 -recursion_depth = defaultdict(int) - - -# 装饰一个函数,当函数递归调用超过限制时,抛出异常并打印函数信息。 -def recursion_depth_decorator(func_info, max_depth=Const.MAX_DEPTH): - def decorator(func): - @wraps(func) - def wrapper(*args, **kwargs): - func_id = id(func) - recursion_depth[func_id] += 1 - if recursion_depth[func_id] > max_depth: - msg = f"call {func_info} exceeds the recursion limit." - logger.error_log_with_exp( - msg, - MsprobeException( - MsprobeException.RECURSION_LIMIT_ERROR, msg - ), - ) - try: - result = func(*args, **kwargs) - finally: - recursion_depth[func_id] -= 1 - return result - - return wrapper - - return decorator - - def check_str_param(param): if not re.match(Const.REGEX_PREFIX_PATTERN, param): logger.error('The parameter {} contains special characters.'.format(param)) diff --git a/debug/accuracy_tools/msprobe/core/data_dump/data_processor/pytorch_processor.py b/debug/accuracy_tools/msprobe/core/data_dump/data_processor/pytorch_processor.py index 04e090510f3f3e110d7ba20985b83f4a6e7b8a30..973bfd981eaeba8145ee304cab8a886b4aa95a70 100644 --- a/debug/accuracy_tools/msprobe/core/data_dump/data_processor/pytorch_processor.py +++ b/debug/accuracy_tools/msprobe/core/data_dump/data_processor/pytorch_processor.py @@ -27,7 +27,8 @@ from msprobe.core.common.const import Const from msprobe.core.common.exceptions import MsprobeException from msprobe.core.common.file_utils import path_len_exceeds_limit from msprobe.core.common.log import logger -from msprobe.core.common.utils import convert_tuple, recursion_depth_decorator +from msprobe.core.common.utils import convert_tuple +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.core.data_dump.data_processor.base import BaseDataProcessor, ModuleBackwardInputsOutputs, \ ModuleForwardInputsOutputs, TensorStatInfo from msprobe.pytorch.common.utils import Const as PtConst, save_pt, is_hifloat8_tensor, is_float8_tensor diff --git a/debug/accuracy_tools/msprobe/core/data_dump/json_writer.py b/debug/accuracy_tools/msprobe/core/data_dump/json_writer.py index f1221d8122776bbc6a52315ab78b5bd3d1f8d5b2..e1f57f53b88fc33a56c2bf12ec65df7b8ee76795 100644 --- a/debug/accuracy_tools/msprobe/core/data_dump/json_writer.py +++ b/debug/accuracy_tools/msprobe/core/data_dump/json_writer.py @@ -21,7 +21,7 @@ import threading from msprobe.core.common.const import Const, FileCheckConst from msprobe.core.common.file_utils import change_mode, FileOpen, save_json, load_json from msprobe.core.common.log import logger -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator lock = threading.Lock() diff --git a/debug/accuracy_tools/msprobe/core/grad_probe/constant.py b/debug/accuracy_tools/msprobe/core/grad_probe/constant.py index 22a8b6c13411b68a6566d0686062f8c74cb27196..dead9d9227b2ef99e63de03e89764369b38150b1 100644 --- a/debug/accuracy_tools/msprobe/core/grad_probe/constant.py +++ b/debug/accuracy_tools/msprobe/core/grad_probe/constant.py @@ -31,6 +31,7 @@ class GradConst: STEP = "step" BOUNDS = "bounds" OUTPUT_PATH = "output_path" + TIME_STAMP = "time_stamp" # level const LEVEL = "level" diff --git a/debug/accuracy_tools/msprobe/core/grad_probe/grad_compare.py b/debug/accuracy_tools/msprobe/core/grad_probe/grad_compare.py index 4f2b25bd28dfe330a8716695278ab8c64222c4b6..a7ce97b27782020b594d33d70d1f120b46cba890 100644 --- a/debug/accuracy_tools/msprobe/core/grad_probe/grad_compare.py +++ b/debug/accuracy_tools/msprobe/core/grad_probe/grad_compare.py @@ -112,7 +112,7 @@ class GradComparator: result.append([key] + value) result_csv_path = os.path.join(output_dir, "similarities.csv") if os.path.exists(result_csv_path): - logger.warning(f"{result_csv_path} will be recoverd") + logger.warning(f"{result_csv_path} will be deleted") remove_path(result_csv_path) write_csv(result, result_csv_path) diff --git a/debug/accuracy_tools/msprobe/docs/08.accuracy_checker_online_PyTorch.md b/debug/accuracy_tools/msprobe/docs/08.accuracy_checker_online_PyTorch.md index a93ad3b62405d549a16e7196e2f2145de68e8674..7dfc71e8369ac906c434e10d372210d49c847bf9 100644 --- a/debug/accuracy_tools/msprobe/docs/08.accuracy_checker_online_PyTorch.md +++ b/debug/accuracy_tools/msprobe/docs/08.accuracy_checker_online_PyTorch.md @@ -60,7 +60,9 @@ Host 与 GPU Host 设备间建立连接,将 NPU 上对应 API 的输入数据 #### 3.1.3 局域网场景配置示例 -若采用 TLS1.2 协议加密传输 api 数据,需配置 SSL 证书,可参考如下生成自签名证书方法,仅供调试使用,生产环境请申请正式证书。 +若采用 TLS1.2 协议加密传输 api 数据,需配置 SSL 证书,可参考如下生成自签名证书方法。 + +以下秘钥生成方法仅为简单示例,客户应使用与自己需求相符的秘钥生成和存储机制并保证秘钥安全性与机密性,必要时可采用分层秘钥机制。 ```shell # 创建私钥文件server.key openssl genrsa -out server.key 2048 diff --git a/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md b/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md index 50f2a26ad4b4d8e1cb32546b5d54cf9f8634ab89..684c82dfcca70c31277c1a9aac06e5eca680bc5e 100644 --- a/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md +++ b/debug/accuracy_tools/msprobe/docs/10.accuracy_compare_PyTorch.md @@ -380,10 +380,10 @@ compare_index: - MeanRelativeErr ``` -| 参数名 | 说明 | -| ------------- | ------------------------------------------------------------ | -| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | -| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、Norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | +| 参数名 | 说明 | +| ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | +| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | **汇总结果件说明** diff --git a/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md b/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md index cd50b73e07009ed8a32d2ac6680f63891714ef00..b724e73d56638999859249c67cb7026028df643d 100644 --- a/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md +++ b/debug/accuracy_tools/msprobe/docs/11.accuracy_compare_MindSpore.md @@ -224,10 +224,10 @@ compare_index: - MeanRelativeErr ``` -| 参数名 | 说明 | -| ------------- | ------------------------------------------------------------ | -| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | -| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、Norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | +| 参数名 | 说明 | +| ------------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| api | 表示需要汇总的API或module名称。如果没有配置,工具会提示报错。
api名称配置格式为:`{api_type}.{api_name}.{API调用次数}.{前向反向}`
须按顺序配置以上四个字段,可按如下组合配置:
{api_type}
{api_type}.{api_name}
{api_type}.{api_name}.{API调用次数}
{api_type}.{api_name}.{API调用次数}.{前向反向}
这里的api指代API或module。 | +| compare_index | 表示需要汇总的比对指标。compare_index需为dump_mode对应比对指标的子集。如果没有配置,工具将根据比对结果自动提取dump_mode对应的全部比对指标进行汇总。
统计数据模式比对指标:Max diff、Min diff、Mean diff、L2norm diff、MaxRelativeErr、MinRelativeErr、MeanRelativeErr、NormRelativeErr
真实数据模式比对指标:Cosine、EucDist、MaxAbsErr、MaxRelativeErr、One Thousandth Err Ratio、Five Thousandths Err Ratio | **汇总结果件说明** diff --git a/debug/accuracy_tools/msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py b/debug/accuracy_tools/msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py index cb268efeae90a51465493c65caa948045bae4913..c5adc9842414fd616816f30f3c0b66c22b0e86b7 100644 --- a/debug/accuracy_tools/msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py +++ b/debug/accuracy_tools/msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py @@ -230,67 +230,6 @@ def convert_to_bnsd(_input, n, input_layout): return out.to(GTYPE) -def convert_from_bsnd(_input, input_layout): - """ - transform qkv from bsnd to input_layout. - B: batch_size - S: sequence_length - N: num_heads - D: head_dim - Args: - _input (torch.Tensor): tensor of shape (B,S,N,D) - input_layout (str): "BSH" or "SBH" or "BSND" or "BNSD" or "TND" - Returns: - tensor of shape (B,N,S,D) or (B,S,N,D) or (S,B,H) or (B,S,H) - """ - if input_layout == "BSH": - # (B,S,N,D)=>(B,S,N*D) - out = rearrange(_input, 'b s n d -> b s (n d)').contiguous() - elif input_layout == "SBH": - # (B,S,N,D)=>(S,B,N*D) - out = rearrange(_input, 'b s n d -> s b (n d)').contiguous() - elif input_layout == "BNSD": - # (B,S,N,D)=>(B,N,S,D) - out = rearrange(_input, 'b s n d -> b n s d').contiguous() - elif input_layout == "TND": - raise ValueError(f"input_layout {input_layout} does not supported for now.") - else: - out = _input - return out - - -def convert_to_bsnd(_input, n, input_layout): - """ - transform qkv from input_layout to bsnd. - B: batch_size - S: sequence_length - N: num_heads - D: head_dim - Args: - _input (torch.Tensor): tensor of shape (B,N,S,D) or (B,S,N,D) or (S,B,H) or (B,S,H) - n (int): num_heads - input_layout (str):"BSH" or "SBH" or "BSND" or "BNSD" or "TND" - Returns: - tensor of shape (B,S,N,D) - """ - if input_layout == "BSH": - # (B,S,N*D)=>(B,S,N,D) - out = rearrange(_input, 'b s (n d) -> b s n d', n=n) - elif input_layout == "SBH": - # (S,B,N*D)=>(B,S,N,D) - out = rearrange(_input, 's b (n d) -> b s n d', n=n) - elif input_layout == "BNSD": - # (B,N,S,D)=>(B,S,N,D) - out = rearrange(_input, 'b n s d -> b s n d', n=n) - elif input_layout == "TND": - raise ValueError(f"input_layout {input_layout} does not supported for now.") - else: - out = _input - if out.dim() != 4: - raise ValueError(f"convert qkv format failed with input_layout {input_layout}.") - return out - - def generate_attn_mask(*args): """ # 当sparse_mode=2、3、4时小算子到融合算子会走这个优化,反过来看就要拆解回原来的基本实现 diff --git a/debug/accuracy_tools/msprobe/mindspore/code_mapping/graph_parser.py b/debug/accuracy_tools/msprobe/mindspore/code_mapping/graph_parser.py index ee35750fb35c100e2025b0dcbdd9e20ef998b2ee..262e3b6fe0703f9ea1bc757ae3873e4fc3c99fac 100644 --- a/debug/accuracy_tools/msprobe/mindspore/code_mapping/graph_parser.py +++ b/debug/accuracy_tools/msprobe/mindspore/code_mapping/graph_parser.py @@ -34,19 +34,6 @@ class Parser: if isinstance(subgraph_node.attrs, list): subgraph_node.attrs.extend(attrs) - @staticmethod - def parse_graph_attributes(text: str, graph_node: GraphNode) -> None: - attr_pattern = re.compile(r'# Attrs:\s*(.*)', re.DOTALL) - match = attr_pattern.search(text, graph_node.pos) - if match: - attrs = match.group(1).strip().split('\n') - for attr in attrs: - if not attr: - break - key, value = attr.split(':') - if isinstance(graph_node.attrs, dict): - graph_node.attrs[key.strip()] = value.strip() - @staticmethod def parse_code_info(text: str, start_pos: int, end_pos: int) -> List[str]: code_info = [] @@ -203,11 +190,6 @@ class Parser: subgraph_info.end = end_pos logging.info('Parsed subgraph: %s', subgraph_name) - def count_nodes(self) -> Tuple[int, int]: - total_nodes = len(self.nodes) - total_cnodes = sum(1 for node in self.nodes.values() if node.name.startswith('CNode')) - return total_nodes, total_cnodes - def create_backward_map(self): for node in self.nodes.values(): if node.scope and node.scope.startswith("Gradients"): diff --git a/debug/accuracy_tools/msprobe/mindspore/compare/ms_compare.py b/debug/accuracy_tools/msprobe/mindspore/compare/ms_compare.py index 7ef577c8ec3b092b68e383edae07c6df2e1ac2d0..c0ef3bc66c3b25a3162630cc1e0fb4a1c4783310 100644 --- a/debug/accuracy_tools/msprobe/mindspore/compare/ms_compare.py +++ b/debug/accuracy_tools/msprobe/mindspore/compare/ms_compare.py @@ -315,7 +315,7 @@ class MSComparator(Comparator): for mapping_dict in self.api_mapping_dict: keys_to_compare = [ ('ms_args', 'pt_args'), - ('ms_output', 'pt_output'), + ('ms_outputs', 'pt_outputs'), ('ms_parameters', 'pt_parameters'), ('ms_parameters_grad', 'pt_parameters_grad'), ] diff --git a/debug/accuracy_tools/msprobe/mindspore/debugger/debugger_config.py b/debug/accuracy_tools/msprobe/mindspore/debugger/debugger_config.py index 92155b4ec4ebd636477ef67f1c75b43e7a82b802..e2497c6039bc414d297912eb2ee12ec03fb33b4b 100644 --- a/debug/accuracy_tools/msprobe/mindspore/debugger/debugger_config.py +++ b/debug/accuracy_tools/msprobe/mindspore/debugger/debugger_config.py @@ -53,11 +53,13 @@ class DebuggerConfig: self.stage = FreeBenchmarkConst.DEFAULT_STAGE if not task_config.fuzz_stage else task_config.fuzz_stage if self.handler_type == FreeBenchmarkConst.FIX and \ self.pert_type != FreeBenchmarkConst.DEFAULT_PERT_TYPE: - raise ValueError("pert_mode must be improve_precision or empty when handler_type is fix, " - f"but got {self.pert_type}.") + logger.error("pert_mode must be improve_precision or empty when handler_type is fix, " + f"but got {self.pert_type}.") + raise ValueError if self.stage == Const.BACKWARD and self.handler_type == FreeBenchmarkConst.FIX: - raise ValueError("handler_type must be check or empty when fuzz_stage is backward, " - f"but got {self.handler_type}.") + logger.error("handler_type must be check or empty when fuzz_stage is backward, " + f"but got {self.handler_type}.") + raise ValueError self.dump_level = FreeBenchmarkConst.DEFAULT_DUMP_LEVEL def check(self): diff --git a/debug/accuracy_tools/msprobe/mindspore/dump/dump_tool_factory.py b/debug/accuracy_tools/msprobe/mindspore/dump/dump_tool_factory.py index 0ca63b4a84aee00127bca37b7da36888e905a5aa..726ddc245546667fa9e8b11377f1886f7500096a 100644 --- a/debug/accuracy_tools/msprobe/mindspore/dump/dump_tool_factory.py +++ b/debug/accuracy_tools/msprobe/mindspore/dump/dump_tool_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,6 +14,7 @@ # limitations under the License. from msprobe.mindspore.common.const import Const +from msprobe.core.common.log import logger from msprobe.mindspore.debugger.debugger_config import DebuggerConfig from msprobe.mindspore.dump.kernel_graph_dump import KernelGraphDump from msprobe.mindspore.dump.kernel_kbyk_dump import KernelKbykDump @@ -47,6 +48,7 @@ class DumpToolFactory: raise Exception("Valid level is needed.") tool = tool.get(config.execution_mode) if not tool: - raise Exception(f"Data dump is not supported in {config.execution_mode} mode " - f"when dump level is {config.level}.") + logger.error(f"Data dump is not supported in {config.execution_mode} mode " + f"when dump level is {config.level}.") + raise ValueError return tool(config) diff --git a/debug/accuracy_tools/msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py b/debug/accuracy_tools/msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py index 3fd1430bff792d5043429caac8fe477e457b8bee..39ca164f2043c5d8f6d2e05987edfffe5bca2bee 100644 --- a/debug/accuracy_tools/msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +++ b/debug/accuracy_tools/msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,6 +14,7 @@ # limitations under the License. from msprobe.mindspore.common.const import FreeBenchmarkConst +from msprobe.mindspore.common.log import logger from msprobe.mindspore.free_benchmark.common.config import Config from msprobe.mindspore.free_benchmark.perturbation.add_noise import AddNoisePerturbation from msprobe.mindspore.free_benchmark.perturbation.bit_noise import BitNoisePerturbation @@ -41,4 +42,5 @@ class PerturbationFactory: if perturbation: return perturbation(api_name_with_id) else: - raise Exception(f'{Config.pert_type} is a invalid perturbation type') + logger.error(f'{Config.pert_type} is a invalid perturbation type') + raise ValueError diff --git a/debug/accuracy_tools/msprobe/mindspore/free_benchmark/self_check_tool_factory.py b/debug/accuracy_tools/msprobe/mindspore/free_benchmark/self_check_tool_factory.py index 35b5eb2ab65511fa4320dc97702a60a9c8d07f62..b21b15d1758a90e62861c7edf2976d38ab43c5f0 100644 --- a/debug/accuracy_tools/msprobe/mindspore/free_benchmark/self_check_tool_factory.py +++ b/debug/accuracy_tools/msprobe/mindspore/free_benchmark/self_check_tool_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,6 +14,7 @@ # limitations under the License. from msprobe.mindspore.common.const import Const +from msprobe.core.common.log import logger from msprobe.mindspore.debugger.debugger_config import DebuggerConfig from msprobe.mindspore.free_benchmark.api_pynative_self_check import ApiPyNativeSelfCheck @@ -41,8 +42,10 @@ class SelfCheckToolFactory: def create(config: DebuggerConfig): tool = SelfCheckToolFactory.tools.get(config.level) if not tool: - raise Exception(f"{config.level} is not supported.") + logger.error(f"{config.level} is not supported.") + raise ValueError tool = tool.get(config.execution_mode) if not tool: - raise Exception(f"Task free_benchmark is not supported in this mode: {config.execution_mode}.") + logger.error(f"Task free_benchmark is not supported in this mode: {config.execution_mode}.") + raise ValueError return tool(config) diff --git a/debug/accuracy_tools/msprobe/mindspore/grad_probe/global_context.py b/debug/accuracy_tools/msprobe/mindspore/grad_probe/global_context.py index 01e46e019a4d1634a4592970386d855637c34e8f..ca032e61e5b5cc0d98732ac0bca2d14f377ebfb1 100644 --- a/debug/accuracy_tools/msprobe/mindspore/grad_probe/global_context.py +++ b/debug/accuracy_tools/msprobe/mindspore/grad_probe/global_context.py @@ -16,6 +16,7 @@ import os import threading from typing import Dict, Union, Tuple +import time from msprobe.core.common.utils import is_int from msprobe.core.common.file_utils import create_directory, check_path_before_create @@ -69,6 +70,8 @@ class GlobalContext: else: logger.warning("The output_path exists, the data will be covered.") + self._setting[GradConst.TIME_STAMP] = str(int(time.time())) + def get_context(self, key: str): if key not in self._setting: logger.warning(f"Unrecognized {key}.") diff --git a/debug/accuracy_tools/msprobe/mindspore/grad_probe/grad_analyzer.py b/debug/accuracy_tools/msprobe/mindspore/grad_probe/grad_analyzer.py index 8a154f4d65f63e55f6b0cf3165d3c905bcb68546..c46d55b7b481bc89a56f2eac997c1618fb2cdda2 100644 --- a/debug/accuracy_tools/msprobe/mindspore/grad_probe/grad_analyzer.py +++ b/debug/accuracy_tools/msprobe/mindspore/grad_probe/grad_analyzer.py @@ -111,7 +111,8 @@ class CSVGenerator(Process): output_path = context.get_context(GradConst.OUTPUT_PATH) self.level = context.get_context(GradConst.LEVEL) self.bounds = context.get_context(GradConst.BOUNDS) - self.dump_dir = f"{output_path}/rank{rank_id}/Dump/" + time_stamp = context.get_context(GradConst.TIME_STAMP) + self.dump_dir = f"{output_path}/rank{rank_id}/Dump{time_stamp}/" self.save_dir = f"{output_path}/rank{rank_id}/" self.current_step = None self.stop_event = multiprocessing.Event() diff --git a/debug/accuracy_tools/msprobe/mindspore/grad_probe/hook.py b/debug/accuracy_tools/msprobe/mindspore/grad_probe/hook.py index 1aa9fcfad10815d5845de66ab0ea6d4d7211741f..36857636fa301db37ae4267f8e18d41d9f0328a5 100644 --- a/debug/accuracy_tools/msprobe/mindspore/grad_probe/hook.py +++ b/debug/accuracy_tools/msprobe/mindspore/grad_probe/hook.py @@ -49,12 +49,10 @@ class HookInput: self.param_list = grad_context.get_context(GradConst.PARAM_LIST) self.rank_id = get_rank_id() output_path = grad_context.get_context(GradConst.OUTPUT_PATH) - self.dump_dir = os.path.join(output_path, f"rank{self.rank_id}", "Dump") + time_stamp = grad_context.get_context(GradConst.TIME_STAMP) + self.dump_dir = os.path.join(output_path, f"rank{self.rank_id}", f"Dump{time_stamp}") self.save_dir = os.path.join(output_path, f"rank{self.rank_id}") self.step_finish_flag = os.path.join(self.dump_dir, GradConst.STEP_FINISH) - if os.path.exists(self.save_dir): - logger.warning(f"Delete existing path {self.save_dir}.") - remove_path(self.save_dir) self.level = grad_context.get_context(GradConst.LEVEL) self.bounds = grad_context.get_context(GradConst.BOUNDS) self.mode = mindspore.get_context("mode") diff --git a/debug/accuracy_tools/msprobe/mindspore/overflow_check/overflow_check_tool_factory.py b/debug/accuracy_tools/msprobe/mindspore/overflow_check/overflow_check_tool_factory.py index a2d3e290bd6b16b3deeb7f22a5e7d327ebaa2bc4..1a31c6e658e08eb8edc13f405422fd368db83dc0 100644 --- a/debug/accuracy_tools/msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +++ b/debug/accuracy_tools/msprobe/mindspore/overflow_check/overflow_check_tool_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from msprobe.core.common.log import logger from msprobe.mindspore.common.const import Const from msprobe.mindspore.debugger.debugger_config import DebuggerConfig from msprobe.mindspore.overflow_check.kernel_graph_overflow_check import KernelGraphOverflowCheck @@ -44,6 +45,7 @@ class OverflowCheckToolFactory: raise Exception("Valid level is needed.") tool = tool.get(config.execution_mode) if not tool: - raise Exception(f"Overflow check is not supported in {config.execution_mode} mode " - f"when level is {config.level}.") + logger.error(f"Overflow check is not supported in {config.execution_mode} mode " + f"when level is {config.level}.") + raise ValueError return tool(config) diff --git a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py index 641eada030353ec67f6ce7b59bd3d14909a56e51..9ad3f2804ecce2404de7661d8d0f0cb2002d379f 100644 --- a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +++ b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py @@ -28,10 +28,10 @@ from msprobe.pytorch.api_accuracy_checker.compare.compare_utils import binary_st ulp_standard_api, thousandth_standard_api from msprobe.core.common.file_utils import FileOpen, load_json, save_json from msprobe.core.common.utils import check_file_or_directory_path, check_op_str_pattern_valid, is_int -from msprobe.core.common.const import Const, MonitorConst, MsgConst +from msprobe.core.common.const import Const, MonitorConst, MsgConst, FileCheckConst from msprobe.core.common.log import logger -from msprobe.core.common.file_utils import make_dir -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.file_utils import make_dir, change_mode +from msprobe.core.common.decorator import recursion_depth_decorator TENSOR_DATA_LIST = ["torch.Tensor", "torch.nn.parameter.Parameter"] TORCH_BOOL_TYPE = ["torch.bool"] @@ -169,7 +169,7 @@ class APIExtractor: value = self.load_real_data_path(value, real_data_path) new_data[key] = value if not new_data: - logger.error(f"Error: The api '{self.api_name}' does not exist in the file.") + logger.warning(f"Warning: The api '{self.api_name}' does not exist in the file.") else: save_json(self.output_file, new_data, indent=4) logger.info( @@ -468,6 +468,7 @@ def _run_operator_generate_commond(cmd_args): fout.write(code_template.format(**internal_settings)) except OSError: logger.error(f"Failed to open file. Please check file {template_path} or {operator_script_path}.") + change_mode(operator_script_path, FileCheckConst.DATA_FILE_AUTHORITY) logger.info(f"Generate operator script successfully and the name is {operator_script_path}.") diff --git a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py index e8285ff44e97535cb1574c2309c8ba6ce4fd8420..20f1679a5ee6af6acd59c329bfc085d8bd408af4 100644 --- a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +++ b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py @@ -504,6 +504,7 @@ def checked_online_config(online_config): check_file_or_directory_path(os.path.join(online_config.tls_path, "server.key")) check_file_or_directory_path(os.path.join(online_config.tls_path, "server.crt")) check_crt_valid(os.path.join(online_config.tls_path, "server.crt")) + check_crt_valid(os.path.join(online_config.tls_path, "server.key"), True) # host and port if not isinstance(online_config.host, str) or not re.match(Const.ipv4_pattern, online_config.host): @@ -573,7 +574,15 @@ def run_ut_command(args): error_data_path = checker_config.error_data_path if save_error_data: if args.result_csv_path: - time_info = result_csv_path.split('.')[0].split('_')[-1] + parts_by_dot = result_csv_path.split(Const.SEP) + if len(parts_by_dot) < 2 or not parts_by_dot[0]: + raise ValueError("result_csv_path does not contain a valid file name with an extension.") + file_name_part = parts_by_dot[0] + parts_by_underscore = file_name_part.split(Const.REPLACEMENT_CHARACTER) + if len(parts_by_underscore) < 2: + raise ValueError("File name part does not contain enough '_' separated segments.") + time_info = parts_by_underscore[-1] + global UT_ERROR_DATA_DIR UT_ERROR_DATA_DIR = 'ut_error_data' + time_info error_data_path = initialize_save_error_data(error_data_path) diff --git a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py index f858067b6616ff34ee95e1c4394e63fe4385b397..2cfc355ec035d245261ca9c817e02687c684d471 100644 --- a/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +++ b/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py @@ -27,8 +27,7 @@ from msprobe.pytorch.api_accuracy_checker.tensor_transport_layer.client import T from msprobe.pytorch.api_accuracy_checker.tensor_transport_layer.server import TCPServer from msprobe.core.common.file_utils import remove_path from msprobe.pytorch.common.utils import logger, save_api_data, load_api_data, save_pkl, load_pkl -from msprobe.core.common.utils import recursion_depth_decorator - +from msprobe.core.common.decorator import recursion_depth_decorator BufferType = Union[ApiData, Dict[str, Any], str] # Union[Tensor, Tuple[Optional[Tensor]]] diff --git a/debug/accuracy_tools/msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py b/debug/accuracy_tools/msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py index be15935ce9c9f77bc0a8447902f7f4a7b536a7fb..07655ba841120a80f64a9975a74abd7556569a41 100644 --- a/debug/accuracy_tools/msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +++ b/debug/accuracy_tools/msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py @@ -29,6 +29,8 @@ def softmax_func(x, axis=None): def npu_moe_gating_top_k_softmax(x, finished_optional, k): input_dtype = x.dtype + if x.dim() < 1: + raise ValueError("Input x must have at least 1 dimensions.") num_expert = x.shape[-1] softmax = softmax_func(x, -1) softmax = softmax.to(input_dtype) @@ -36,9 +38,13 @@ def npu_moe_gating_top_k_softmax(x, finished_optional, k): expert_idx = expert_idx[:, :k] y = torch.gather(softmax, index=expert_idx, dim=-1) if finished_optional is not None: + if finished_optional.dim() < 1: + raise ValueError("Finished_optional must have at least 1 dimensions.") finished_optional = finished_optional.view(finished_optional.shape[0], 1) finished_optional = finished_optional.expand(-1, k) expert_idx = torch.where(finished_optional, num_expert, expert_idx) + if y.dim() < 2: + raise ValueError("Variable y must have at least 2 dimensions.") row_idx = torch.arange(y.shape[0] * y.shape[1]).reshape(y.shape[1], y.shape[0]).t() return y, expert_idx, row_idx diff --git a/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/hook_wrapper.py b/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/hook_wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..ba4a79a8a1463567151bf1bc498455aad37da1ff --- /dev/null +++ b/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/hook_wrapper.py @@ -0,0 +1,91 @@ +# Copyright (c) 2025-2025, Huawei Technologies Co., Ltd. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import wraps + +import torch +from torch.utils.hooks import BackwardHook + +from msprobe.core.common.const import Const +from msprobe.core.common.decorator import recursion_depth_decorator +from msprobe.pytorch.common.log import logger +from msprobe.pytorch.common.utils import is_float8_tensor + + +def wrap_setup_backward_hook(func): + def requires_clone(tensor): + return isinstance(tensor, torch.Tensor) and not is_float8_tensor(tensor) and \ + tensor.requires_grad and torch.is_grad_enabled() + + @recursion_depth_decorator("Dump: wrap_setup_backward_hook.parse_tensor", max_depth=Const.DUMP_MAX_DEPTH) + def parse_tensor(item, tensor_list): + if requires_clone(item): + tensor_list.append(item) + elif isinstance(item, (list, tuple)): + for value in item: + parse_tensor(value, tensor_list) + elif isinstance(item, dict): + for value in item.values(): + parse_tensor(value, tensor_list) + + @recursion_depth_decorator("Dump: wrap_setup_backward_hook.rebuild_args", max_depth=Const.DUMP_MAX_DEPTH) + def rebuild_args(item, tensor_iter): + if requires_clone(item): + return next(tensor_iter).clone() + if isinstance(item, list): + for index, value in enumerate(item): + item[index] = rebuild_args(value, tensor_iter) + return item + if isinstance(item, dict): + for key, value in item.items(): + item[key] = rebuild_args(value, tensor_iter) + return item + if isinstance(item, tuple): + if hasattr(item, '_fields'): + return type(item)(*[rebuild_args(i, tensor_iter) for i in item]) + return type(item)([rebuild_args(i, tensor_iter) for i in item]) + return item + + @wraps(func) + def wrap_setup_hook_func(*args, **kwargs): + if len(args) < 2: + return func(*args, **kwargs) + + self_, actual_args = args[0], args[1] + if hasattr(self_.module, "inplace") and self_.module.inplace: + return actual_args + + tensor_list = [] + + parse_tensor(actual_args, tensor_list) + + new_args = args[0], tuple(tensor_list) + hooked_tensors = func(*new_args, **kwargs) + + tensor_iter = iter(hooked_tensors) + try: + new_data = rebuild_args(actual_args, tensor_iter) + except Exception as e: + logger.debug(f"Unsupported data in setup input/output hook. The detail info: {e}") + new_data = actual_args + + return new_data + + return wrap_setup_hook_func + + +def wrap_setup_input_output_hook(): + BackwardHook.setup_input_hook = wrap_setup_backward_hook(BackwardHook.setup_input_hook) + BackwardHook.setup_output_hook = wrap_setup_backward_hook(BackwardHook.setup_output_hook) diff --git a/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/module_processer.py b/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/module_processer.py index ae75d3c657abda34dd060b610a5c614cbba11686..73871cdc250d7be3d54c2d40121e0f9edc982530 100644 --- a/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/module_processer.py +++ b/debug/accuracy_tools/msprobe/pytorch/dump/module_dump/module_processer.py @@ -13,16 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -from functools import wraps - import torch -from torch.utils.hooks import BackwardHook from msprobe.core.common.const import Const -from msprobe.core.common.utils import recursion_depth_decorator from msprobe.core.data_dump.scope import BaseScope, ModuleRangeScope, MixRangeScope from msprobe.pytorch.common.log import logger -from msprobe.pytorch.common.utils import replace_last_occurrence, is_float8_tensor +from msprobe.pytorch.common.utils import replace_last_occurrence +from msprobe.pytorch.dump.module_dump.hook_wrapper import wrap_setup_input_output_hook torch_version_above_or_equal_2 = torch.__version__.split('+')[0] >= '2.0' if torch_version_above_or_equal_2: @@ -47,33 +44,9 @@ class ModuleProcesser: def __init__(self, scope): self.scope = scope if isinstance(scope, (ModuleRangeScope, MixRangeScope)) else None - BackwardHook.setup_input_hook = ModuleProcesser.clone_return_value(BackwardHook.setup_input_hook) - BackwardHook.setup_output_hook = ModuleProcesser.clone_return_value(BackwardHook.setup_output_hook) + wrap_setup_input_output_hook() replace_checkpoint() - @staticmethod - def clone_return_value(func): - @wraps(func) - def clone_return_value_func(*args, **kwargs): - result = func(*args, **kwargs) - return ModuleProcesser.clone_if_tensor(result) - - return clone_return_value_func - - @staticmethod - @recursion_depth_decorator("ModuleDump: ModuleProcesser.clone_if_tensor", max_depth=Const.DUMP_MAX_DEPTH) - def clone_if_tensor(result): - if isinstance(result, torch.Tensor) and not is_float8_tensor(result): - return result.clone() - elif type(result) is tuple: - return tuple(ModuleProcesser.clone_if_tensor(x) for x in result) - elif type(result) is list: - return list(ModuleProcesser.clone_if_tensor(x) for x in result) - elif type(result) is dict: - return {k: ModuleProcesser.clone_if_tensor(v) for k, v in result.items()} - else: - return result - @staticmethod def module_count_func(module_name): if module_name not in ModuleProcesser.module_count: diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/common/utils.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/common/utils.py index e3fd2b69fef2772354401a22344376258e77a008..6baa684cbff27001ac489eddf11269ba2c71dfae 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/common/utils.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/common/utils.py @@ -16,7 +16,7 @@ import torch from msprobe.core.common.exceptions import FreeBenchmarkException -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark.common.enums import DeviceType diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/compare/single_benchmark.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/compare/single_benchmark.py index 49e845da4011565f1b6ccf0c0e1193fb3fcffcbf..a5f18946c44c09bf1670173d45cc99ace3b0e79d 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/compare/single_benchmark.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/compare/single_benchmark.py @@ -16,7 +16,7 @@ import math import torch -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark import logger from msprobe.pytorch.free_benchmark.common.constant import ThresholdConfig from msprobe.pytorch.free_benchmark.common.utils import TorchC diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py index 986b833ab9afec3681749aafa20fa292535012fb..754e3b06e9670a04fcf7c20d5af3d7e1733b7af1 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py @@ -14,7 +14,7 @@ # limitations under the License. import torch -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark import logger from msprobe.pytorch.free_benchmark.common.constant import ThresholdConfig from msprobe.pytorch.free_benchmark.common.enums import PerturbationMode diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py index 7d5cda6be577b1e6f9150f565a6e67b49f73ec81..aec0c3ca96e39958316f6835261618c148c7ad4e 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py @@ -14,7 +14,7 @@ # limitations under the License. import torch -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark import logger from msprobe.pytorch.free_benchmark.common.constant import ThresholdConfig from msprobe.pytorch.free_benchmark.common.enums import PerturbationMode diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py index c4fbeaf82f8fcafba235a7faa6dd9073d4d556d8..521637a1d8b3bca226a6eacfc5f6f5a0d4bc1921 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py @@ -14,7 +14,7 @@ # limitations under the License. import torch -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark import logger from msprobe.pytorch.free_benchmark.common.enums import PerturbationMode from msprobe.pytorch.free_benchmark.common.params import DataParams diff --git a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py index 095e77ffaff39a795cb1418c1695608d91d7427b..daa271976f3b05f81b9997bd1775ee2809b776c9 100644 --- a/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +++ b/debug/accuracy_tools/msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py @@ -15,7 +15,7 @@ import torch from msprobe.core.common.const import Const -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.free_benchmark import logger from msprobe.pytorch.free_benchmark.common.constant import CommonField from msprobe.pytorch.free_benchmark.common.enums import PerturbationMode diff --git a/debug/accuracy_tools/msprobe/pytorch/function_factory.py b/debug/accuracy_tools/msprobe/pytorch/function_factory.py index 247e2cd0ed5ea11047cc0d75954dbc1e92b889f4..f515b5d4783c0e20a2303579f6954d42a7b9deac 100644 --- a/debug/accuracy_tools/msprobe/pytorch/function_factory.py +++ b/debug/accuracy_tools/msprobe/pytorch/function_factory.py @@ -70,7 +70,7 @@ class Register(dict): def add_register_item(key, value): if key in self._dict: - logger.warning(f"{value.__name__} has been registered before, so we will overriden it.") + logger.warning(f"{value.__name__} has been registered before, so we will override it.") self[key] = value return value diff --git a/debug/accuracy_tools/msprobe/pytorch/grad_probe/grad_monitor.py b/debug/accuracy_tools/msprobe/pytorch/grad_probe/grad_monitor.py index 926476b8fb353531e54a485ccb47c4c59860c5d0..81d7575fc251c0b90703b13c537f61f778cf5136 100644 --- a/debug/accuracy_tools/msprobe/pytorch/grad_probe/grad_monitor.py +++ b/debug/accuracy_tools/msprobe/pytorch/grad_probe/grad_monitor.py @@ -46,7 +46,7 @@ class GradientMonitor: if not os.path.exists(self._output_path): create_directory(self._output_path) else: - logger.warning(f"the file in {self._output_path} will be recoverd") + logger.warning(f"the file in {self._output_path} will be deleted") self._step = -1 self._param2name = defaultdict(str) @@ -97,7 +97,7 @@ class GradientMonitor: create_directory(output_dirpath) output_path = os.path.join(output_dirpath, f"grad_summary_{self._step}.csv") if os.path.exists(output_path): - logger.warning(f"{output_path} will be recoverd") + logger.warning(f"{output_path} will be deleted") remove_path(output_path) header_result = GradStatCsv.generate_csv_header(self._level_adp, self._bounds) output_lines.insert(0, header_result) diff --git a/debug/accuracy_tools/msprobe/pytorch/hook_module/support_wrap_ops.yaml b/debug/accuracy_tools/msprobe/pytorch/hook_module/support_wrap_ops.yaml index 15603758f52475d9d401de37e5113a4541b67572..c57f8c182a4df1b2336f3773287b52321e3116e4 100644 --- a/debug/accuracy_tools/msprobe/pytorch/hook_module/support_wrap_ops.yaml +++ b/debug/accuracy_tools/msprobe/pytorch/hook_module/support_wrap_ops.yaml @@ -1258,6 +1258,7 @@ torch_npu: - npu_scatter_nd_update_ - npu_scatter_nd_update - npu_prefetch + - npu_dynamic_block_quant aten: - signbit diff --git a/debug/accuracy_tools/msprobe/pytorch/monitor/csv2tb.py b/debug/accuracy_tools/msprobe/pytorch/monitor/csv2tb.py index 6ffd1ffabe7b113ff4e61786d4d9f0709b8b605b..9b85070a04447f624f143b4a57a38140a8c638b9 100644 --- a/debug/accuracy_tools/msprobe/pytorch/monitor/csv2tb.py +++ b/debug/accuracy_tools/msprobe/pytorch/monitor/csv2tb.py @@ -22,13 +22,14 @@ from torch.utils.tensorboard import SummaryWriter from tqdm import tqdm from msprobe.core.common.const import MonitorConst -from msprobe.core.common.file_utils import read_csv, create_directory, remove_path +from msprobe.core.common.file_utils import read_csv, create_directory, remove_path, recursive_chmod from msprobe.core.common.utils import is_int from msprobe.pytorch.common.log import logger from msprobe.pytorch.monitor.utils import get_target_output_dir all_data_type_list = ["actv", "actv_grad", "exp_avg", "exp_avg_sq", "grad_unreduced", "grad_reduced", "param"] CSV_FILE_SUFFIX = r"_\d+-\d+\.csv" +MAX_PROCESS_NUM = 128 def parse_step_line(line, ops): @@ -115,11 +116,13 @@ def csv2tb_by_step_work(target_output_dirs, output_dirpath, data_type_list): def check_process_num(process_num): if not is_int(process_num) or process_num <= 0: raise ValueError(f"process_num({process_num}) is not a positive integer") + if process_num > MAX_PROCESS_NUM: + raise ValueError(f"The maximum supported process_num is {MAX_PROCESS_NUM}, current value: {process_num}.") def check_data_type_list(data_type_list): if data_type_list is None: - logger.info(f"data_type_list is None, use defualt all_data_type_list: {all_data_type_list}") + logger.info(f"data_type_list is None, use default all_data_type_list: {all_data_type_list}") return if not isinstance(data_type_list, list): raise ValueError(f"data_type_list({data_type_list}) is not a list") @@ -161,4 +164,5 @@ def csv2tensorboard_by_step( p.start() for p in processes: p.join() + recursive_chmod(output_dirpath) logger.info(f"output has been saved to: {output_dirpath}") diff --git a/debug/accuracy_tools/msprobe/pytorch/monitor/distributed/wrap_distributed.py b/debug/accuracy_tools/msprobe/pytorch/monitor/distributed/wrap_distributed.py index 20ef3757d4ad45cc2bb90769f44eef1cebe82560..c209fdba97fa9a4a153516d340892fbefbf0284f 100644 --- a/debug/accuracy_tools/msprobe/pytorch/monitor/distributed/wrap_distributed.py +++ b/debug/accuracy_tools/msprobe/pytorch/monitor/distributed/wrap_distributed.py @@ -142,7 +142,7 @@ def get_process_group(process_group): def stack_filter(stack): if len(stack) > MAX_STRING_LENGTH: - logger.warning(f'The character strin contains more than {MAX_STRING_LENGTH}. re match is skipped.') + logger.warning(f'The character string contains more than {MAX_STRING_LENGTH}. re match is skipped.') for pattern in StackBlackList: if re.search(pattern, stack): return False @@ -197,7 +197,7 @@ def is_target_line(codeline): stack = get_callstack() whole_stack = ';'.join(stack) if len(whole_stack) > MAX_STRING_LENGTH: - logger.warning(f'The character strin contains more than {MAX_STRING_LENGTH}. re match is skipped.') + logger.warning(f'The character string contains more than {MAX_STRING_LENGTH}. re match is skipped.') for pattern in codeline: if re.search(pattern, whole_stack): return True diff --git a/debug/accuracy_tools/msprobe/pytorch/monitor/module_hook.py b/debug/accuracy_tools/msprobe/pytorch/monitor/module_hook.py index cb44885761a85cad77feb9281f7dacab7a6c07df..dc5038b024c90876ac650ebeb811850194632d21 100644 --- a/debug/accuracy_tools/msprobe/pytorch/monitor/module_hook.py +++ b/debug/accuracy_tools/msprobe/pytorch/monitor/module_hook.py @@ -26,7 +26,7 @@ from torch.utils.hooks import BackwardHook from msprobe.core.common.const import MonitorConst, Const from msprobe.core.common.file_utils import load_json, save_json -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.common.log import logger from msprobe.pytorch.common.utils import is_recomputation, is_float8_tensor from msprobe.pytorch.monitor.anomaly_analyse import AnomalyDataWriter @@ -40,7 +40,7 @@ from msprobe.pytorch.monitor.module_metric import get_metrics, get_summary_write from msprobe.pytorch.monitor.module_spec_verifier import validate_config_spec from msprobe.pytorch.monitor.optimizer_collect import OptimizerMonFactory from msprobe.pytorch.monitor.utils import get_param_struct, validate_config, validate_ops, \ - get_output_base_dir, get_target_output_dir + get_output_base_dir, get_target_output_dir, chmod_tensorboard_dir, validate_set_monitor from msprobe.pytorch.monitor.visualizer import HeatmapVisualizer torch_version_above_or_equal_2 = torch.__version__.split('+')[0] >= '2.0' @@ -337,11 +337,11 @@ class TrainerMon: # 初始化writer, 创建输出目录 if self.format not in FORMAT_MAPPING: - logger.error(f"Unsupported format: {self.format}, use default format: {MonitorConst.CSV}") + logger.warning(f"Unsupported format: {self.format}, use default format: {MonitorConst.CSV}") self.format = MonitorConst.CSV if self.ur_distribution and self.format != 'tensorboard': - logger.error("can only set ur_distribution when format is 'tensorboard', cancel ur_distribution") + logger.warning("can only set ur_distribution when format is 'tensorboard', cancel ur_distribution") self.ur_distribution = False writer = FORMAT_MAPPING[self.format] @@ -404,6 +404,7 @@ class TrainerMon: start_iteration=0 ): """External interface""" + grad_acc_steps, start_iteration = validate_set_monitor(grad_acc_steps, start_iteration) global start_step start_step = start_iteration logger.info(f'grad acc steps {grad_acc_steps}') @@ -569,17 +570,19 @@ class TrainerMon: # skip generate metrics if context.step < self.start_step or (context.step - self.start_step) % self.step_interval != 0: return + mv_result = None if MonitorConst.DEEPSPEED_ZERO_OPT_FILTER in self.optimizer_class: # use deepspeed with zero1/2/3 if not self.name2indices: self.name2indices = self.optimizer_mon.get_param_index(self.param2name, self.name2index, optimizer) mv_result = self.optimizer_mon.fetch_mv(self, optimizer, self.param2name, self.name2indices) self.param2name = mv_result.grad - else: + elif self.mv_distribution or self.ur_distribution or self.mg_direction: mv_result = self.optimizer_mon.fetch_mv(self, optimizer, self.param2name) - context.param_exp_avg = mv_result.exp_avg - context.param_exp_avg_sq = mv_result.exp_avg_sq - context.param_adam_update = mv_result.update - context.param_adam_ratio = mv_result.ratio + if mv_result: + context.param_exp_avg = mv_result.exp_avg + context.param_exp_avg_sq = mv_result.exp_avg_sq + context.param_adam_update = mv_result.update + context.param_adam_ratio = mv_result.ratio self.generate_wgrad_metrics() self.generate_mv_metrics(context) @@ -699,6 +702,9 @@ class TrainerMon: if self.anomaly_data_factory: self.anomaly_data_writer.write_detected_json(self.summary_writer.get_anomalies()) self.summary_writer.clear_anomalies() + + if self.format == MonitorConst.TENSORBOARD: + chmod_tensorboard_dir(self.tensorboard_dir) self.call_id = 0 self.param_name_call_id.clear() diff --git a/debug/accuracy_tools/msprobe/pytorch/monitor/unittest/test_monitor.py b/debug/accuracy_tools/msprobe/pytorch/monitor/unittest/test_monitor.py index 4d5c1a717d80ee30414f25b44a93ddc7257ef2c7..acdb34ff5aa960136ff676e0e25b23f11d0475ed 100644 --- a/debug/accuracy_tools/msprobe/pytorch/monitor/unittest/test_monitor.py +++ b/debug/accuracy_tools/msprobe/pytorch/monitor/unittest/test_monitor.py @@ -92,7 +92,7 @@ def valid_reduce(reduced, unreduced, tp_size, dp_size, sequence_parallel): if errors: logger.info(errors) else: - logger.info(f'grad mean is in consist between unreduced grad and reduced grad monitord.') + logger.info(f'grad mean is in consist between unreduced grad and reduced grad monitored.') def assert_equal(a, b): diff --git a/debug/accuracy_tools/msprobe/pytorch/monitor/utils.py b/debug/accuracy_tools/msprobe/pytorch/monitor/utils.py index 00998089145ce053907221a8d3566c6bd8ad91cb..3ca2409b9c8ed22d2b5a68683acb26856d5fa448 100644 --- a/debug/accuracy_tools/msprobe/pytorch/monitor/utils.py +++ b/debug/accuracy_tools/msprobe/pytorch/monitor/utils.py @@ -25,7 +25,7 @@ import torch from msprobe.core.common.const import MonitorConst, Const from msprobe.pytorch.common.log import logger from msprobe.core.common.utils import is_int -from msprobe.core.common.file_utils import check_file_or_directory_path +from msprobe.core.common.file_utils import check_file_or_directory_path, recursive_chmod device = "cpu" @@ -105,6 +105,15 @@ def validate_ops(ops): return valid_ops +def validate_ndigits(ndigits): + if not ndigits: + return + if not is_int(ndigits) or ndigits <= 0: + raise ValueError(f"ndigits({ndigits}) is not a positive integer, current is: {ndigits}.") + if ndigits > MonitorConst.MAX_NDIGITS: + raise ValueError(f"The maximum supported ndigits is {MonitorConst.MAX_NDIGITS}, current value: {ndigits}.") + + def validate_ranks(ranks): if not isinstance(ranks, list): raise TypeError("module_ranks should be a list") @@ -214,6 +223,9 @@ def validate_dynamic_on(dynamic_on): def validate_config(config): config['ops'] = validate_ops(config.get('ops', [])) + ndigits = config.get('ndigits') + validate_ndigits(ndigits) + eps = config.get('eps', 1e-8) if not isinstance(eps, float): raise TypeError("eps should be a float") @@ -251,6 +263,14 @@ def validate_config(config): step_count_per_record = config.get('step_count_per_record', 1) validate_step_count_per_record(step_count_per_record) + config["start_step"] = validate_int_arg(config.get("start_step"), "start_step", + MonitorConst.DEFAULT_START_STEP, MonitorConst.DEFAULT_START_STEP) + config["collect_times"] = validate_int_arg(config.get("collect_times"), "collect_times", + MonitorConst.DEFAULT_MIN_COLLECT_TIMES, + MonitorConst.DEFAULT_MAX_COLLECT_TIMES) + config["step_interval"] = validate_int_arg(config.get("step_interval"), "step_interval", + MonitorConst.DEFAULT_STEP_INTERVAL, MonitorConst.DEFAULT_STEP_INTERVAL) + squash_name = config.get('squash_name', True) validate_squash_name(squash_name) @@ -265,6 +285,8 @@ def validate_config(config): def time_str2time_digit(time_str): time_format = '%b%d_%H-%M-%S' + if not isinstance(time_str, str): + raise TypeError(f"time_str:{time_str} should be a str") try: time_digit = datetime.strptime(time_str, time_format) except Exception as e: @@ -292,3 +314,40 @@ def get_target_output_dir(monitor_path, time_start, time_end): if start_ok and end_ok: result[rank] = os.path.join(monitor_path, dirname) return result + + +def chmod_tensorboard_dir(path): + """ + format配置为tensorboard时,需要补充文件权限设置 + """ + try: + recursive_chmod(path) + except Exception as e: + logger.warning(f"chmod tensorboard dir wrong because {e}, not updated, please check!!!") + + +def validate_set_monitor(grad_acc_steps, start_iteration): + """ + validate parameters of set_monitor. + """ + grad_acc_steps = validate_int_arg(grad_acc_steps, "grad_acc_steps", + MonitorConst.DEFAULT_GRAD_ACC_STEPS, MonitorConst.DEFAULT_GRAD_ACC_STEPS) + + start_iteration = validate_int_arg(start_iteration, "start_iteration", + MonitorConst.DEFAULT_START_ITERATION, MonitorConst.DEFAULT_START_ITERATION) + return grad_acc_steps, start_iteration + + +def validate_int_arg(value, name, minimum, default_value): + """Validate int args, if any exception occurs, use the default value.""" + if value is None: + return default_value + try: + if not is_int(value): + raise TypeError(f"{name} must be int") + if value < minimum: + raise ValueError(f"{name} must greater than {minimum}") + except Exception as e: + value = default_value + logger.warning(f"Validate {name} failed, {e}, replaced with default value {value}.") + return value diff --git a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/compare.py b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/compare.py index 7a265e70fa4cbe95c897c35d68e4afa8ebd77249..18d8e0f1d0ab00fb723eafa9d0dc17d92bd164a6 100644 --- a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/compare.py +++ b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/compare.py @@ -125,8 +125,6 @@ class Saver: def write_summary_csv(self, test_result): test_rows = [] - if self.stack_info: - test_rows[0].append(self.COLUMN_STACK_INFO) check_op_str_pattern_valid(test_result.api_name) df_row = [test_result.api_name, test_result.is_fwd_success, test_result.is_bwd_success] diff --git a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dispatch.py b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dispatch.py index 9f6582cf44c1d08eb7fcec904210e173ccb9c38b..1057d7d4b6daf8b330d444d4cb854c61d15c1863 100644 --- a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dispatch.py +++ b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dispatch.py @@ -122,6 +122,8 @@ class PtdbgDispatch(TorchDispatchMode): if len(json_line_data) == 0: break msg = json.loads(json_line_data) + if len(msg) < 2: + raise ValueError("JSON data does not contain enough elements. Expected at least 2 elements.") self.all_summary[msg[0]] = msg[1] fp_handle.close() diff --git a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dump_compare.py b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dump_compare.py index a154064755ed116eeb2f2ea97b50160bf4b7beb9..915db3be7045fb4f9cc2f7b6610ef0e2a20b8ea5 100644 --- a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dump_compare.py +++ b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/dump_compare.py @@ -20,7 +20,7 @@ from datetime import datetime, timezone import torch from msprobe.core.common.const import Const -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.core.common.file_utils import FileOpen, save_npy, save_json from msprobe.pytorch.common.log import logger diff --git a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/utils.py b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/utils.py index 2116186cc046865388c40d33142384301f84acd2..37105551a3bccca548fe2b6594f4848324746b49 100644 --- a/debug/accuracy_tools/msprobe/pytorch/online_dispatch/utils.py +++ b/debug/accuracy_tools/msprobe/pytorch/online_dispatch/utils.py @@ -27,7 +27,7 @@ else: pta_cpu_device = torch.device("cpu") from msprobe.core.common.const import CompareConst -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator from msprobe.pytorch.common.log import logger diff --git a/debug/accuracy_tools/msprobe/pytorch/pt_config.py b/debug/accuracy_tools/msprobe/pytorch/pt_config.py index f63f467213a53f1317c1ca842b4801e1c12119b9..8e92abab8549166d2f71a75b1f3f86d48bc39187 100644 --- a/debug/accuracy_tools/msprobe/pytorch/pt_config.py +++ b/debug/accuracy_tools/msprobe/pytorch/pt_config.py @@ -67,6 +67,7 @@ class TensorConfig(BaseConfig): check_file_or_directory_path(os.path.join(self.tls_path, "client.key")) check_file_or_directory_path(os.path.join(self.tls_path, "client.crt")) check_crt_valid(os.path.join(self.tls_path, "client.crt")) + check_crt_valid(os.path.join(self.tls_path, "client.key"), True) if not isinstance(self.host, str) or not re.match(Const.ipv4_pattern, self.host): raise Exception(f"host: {self.host} is invalid.") @@ -96,6 +97,8 @@ class OverflowCheckConfig(BaseConfig): def check_overflow_config(self): if self.overflow_nums is not None and not is_int(self.overflow_nums): raise Exception("overflow_num is invalid") + if self.overflow_nums is not None and self.overflow_nums != -1 and self.overflow_nums <= 0: + raise Exception("overflow_nums should be -1 or positive integer") if self.check_mode is not None and self.check_mode not in ["all", "aicore", "atomic"]: raise Exception("check_mode is invalid") @@ -149,7 +152,7 @@ class FreeBenchmarkCheckConfig(BaseConfig): self.pert_mode in PytorchFreeBenchmarkConst.CPU_MODE_LIST ): msg = ( - f"You neet to and can only set fuzz_device as {DeviceType.CPU} " + f"You need to and can only set fuzz_device as {DeviceType.CPU} " f"when pert_mode in {PytorchFreeBenchmarkConst.CPU_MODE_LIST}" ) logger.error_log_with_exp( diff --git a/debug/accuracy_tools/msprobe/pytorch/service.py b/debug/accuracy_tools/msprobe/pytorch/service.py index b0b2780328d0261b41fab005d70e37b4168aceb7..27235292e1ed740a33e8d1778b06c7993d4ae94e 100644 --- a/debug/accuracy_tools/msprobe/pytorch/service.py +++ b/debug/accuracy_tools/msprobe/pytorch/service.py @@ -412,7 +412,7 @@ class Service: if self.config.nfs_path: self.attl.upload("end") elif self.attl.socket_manager is not None: - logger.info(f"pid: {os.getpid()} finished, start send STOP signal.") + logger.info(f"pid: {os.getpid()} finished, start sends STOP signal.") self.attl.socket_manager.send_stop_signal() def reset_status(self): diff --git a/debug/accuracy_tools/msprobe/test/core_ut/common/test_utils.py b/debug/accuracy_tools/msprobe/test/core_ut/common/test_utils.py index 69abbf12b4c7823e87ead0d055f20f7a12ed5ff4..df5d6c7857ec69d0ce71e314e8988cc2ac68eb8b 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/common/test_utils.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/common/test_utils.py @@ -52,11 +52,11 @@ from msprobe.core.common.utils import (CompareException, get_stack_construct_by_dump_json_path, check_seed_all, safe_get_value, - recursion_depth_decorator, MsprobeBaseException, check_str_param, is_json_file, detect_framework_by_dump_json) +from msprobe.core.common.decorator import recursion_depth_decorator class TestUtils(TestCase): diff --git a/debug/accuracy_tools/msprobe/test/core_ut/data_dump/data_processor/test_mindspore_processor.py b/debug/accuracy_tools/msprobe/test/core_ut/data_dump/data_processor/test_mindspore_processor.py index b593d34c5d86c7fb3b4a0e8a3ff548c55555e09d..70c89ef419f55fe24dbf6a759d35e40910d9246e 100644 --- a/debug/accuracy_tools/msprobe/test/core_ut/data_dump/data_processor/test_mindspore_processor.py +++ b/debug/accuracy_tools/msprobe/test/core_ut/data_dump/data_processor/test_mindspore_processor.py @@ -19,7 +19,7 @@ from unittest.mock import patch, MagicMock import zlib import mindspore as ms -from mindspore import Tensor +from mindspore import Tensor, ops, mint import numpy as np from msprobe.core.data_dump.data_processor.base import BaseDataProcessor @@ -32,6 +32,13 @@ from msprobe.core.data_dump.data_processor.mindspore_processor import ( from msprobe.mindspore.common.log import logger +def patch_norm(value): + return ops.norm(value) + + +setattr(mint, "norm", patch_norm) + + class TestMindsporeDataProcessor(unittest.TestCase): def setUp(self): self.config = MagicMock() diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/debugger/test_ms_debugger_config.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/debugger/test_ms_debugger_config.py index 033b0c1ea5769c3f1f8e19dd8b45c48918e15814..b345729ae55c9225a594a052229b04276becf3ea 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/debugger/test_ms_debugger_config.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/debugger/test_ms_debugger_config.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,13 +18,15 @@ from unittest.mock import patch from msprobe.core.common.const import Const from msprobe.core.common_config import CommonConfig, BaseConfig +from msprobe.core.common.log import logger from msprobe.mindspore.common.const import FreeBenchmarkConst from msprobe.mindspore.debugger.debugger_config import DebuggerConfig class TestDebuggerConfig(unittest.TestCase): + @patch.object(logger, "error") @patch("msprobe.mindspore.debugger.debugger_config.create_directory") - def test_init(self, _): + def test_init(self, _, mock_logger_error): json_config = { "dump_path": "/absolute_path", "rank": [], @@ -49,17 +51,16 @@ class TestDebuggerConfig(unittest.TestCase): task_config.handler_type = FreeBenchmarkConst.FIX task_config.pert_mode = FreeBenchmarkConst.ADD_NOISE - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): DebuggerConfig(common_config, task_config) - self.assertEqual(str(context.exception), - "pert_mode must be improve_precision or empty when handler_type is fix, " - f"but got {FreeBenchmarkConst.ADD_NOISE}.") + mock_logger_error.assert_called_with("pert_mode must be improve_precision or empty when handler_type is fix, " + f"but got {FreeBenchmarkConst.ADD_NOISE}.") + mock_logger_error.reset_mock() task_config.handler_type = FreeBenchmarkConst.FIX task_config.pert_mode = FreeBenchmarkConst.DEFAULT_PERT_TYPE task_config.fuzz_stage = Const.BACKWARD - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): DebuggerConfig(common_config, task_config) - self.assertEqual(str(context.exception), - "handler_type must be check or empty when fuzz_stage is backward, " - f"but got {task_config.handler_type}.") + mock_logger_error.assert_called_with("handler_type must be check or empty when fuzz_stage is backward, " + f"but got {task_config.handler_type}.") diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/perturbation/test_ms_perturbation_factory.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/perturbation/test_ms_perturbation_factory.py index 858e664bbaddb3506bf53ea067eeca1c9706b43b..a4458912149fc8600d32a542c398a335be5d636d 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/perturbation/test_ms_perturbation_factory.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/perturbation/test_ms_perturbation_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,7 +14,9 @@ # limitations under the License. import unittest +from unittest.mock import patch +from msprobe.mindspore.common.log import logger from msprobe.mindspore.free_benchmark.perturbation.perturbation_factory import PerturbationFactory from msprobe.mindspore.free_benchmark.common.config import Config from msprobe.mindspore.common.const import FreeBenchmarkConst @@ -27,14 +29,14 @@ from msprobe.mindspore.free_benchmark.perturbation.exchange_value import Exchang class TestPerturbationFactory(unittest.TestCase): - def test_create(self): + @patch.object(logger, "error") + def test_create(self, mock_logger_error): api_name = "Functional.add.0" Config.pert_type = "UNKNOWN" - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): PerturbationFactory.create(api_name) - self.assertEqual(str(context.exception), - "UNKNOWN is a invalid perturbation type") + mock_logger_error.assert_called_with("UNKNOWN is a invalid perturbation type") Config.pert_type = FreeBenchmarkConst.EXCHANGE_VALUE pert = PerturbationFactory.create(api_name) diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/test_ms_self_check_tool_factory.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/test_ms_self_check_tool_factory.py index fa68b8896c26d4156833c54d2b2bf5b443164e8f..4f3ddd45b5a05162c60abe831967dd449f3f5ae6 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/test_ms_self_check_tool_factory.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/free_benchmark/test_ms_self_check_tool_factory.py @@ -1,7 +1,6 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -# Copyright (C) 2024-2024. Huawei Technologies Co., Ltd. All rights reserved. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. +# All rights reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,11 +12,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" import os import unittest +from unittest.mock import patch +from msprobe.core.common.log import logger from msprobe.mindspore.free_benchmark.self_check_tool_factory import SelfCheckToolFactory from msprobe.mindspore.free_benchmark.api_pynative_self_check import ApiPyNativeSelfCheck from msprobe.mindspore.debugger.debugger_config import DebuggerConfig @@ -28,7 +28,8 @@ from msprobe.core.common.const import Const class TestSelfCheckToolFactory(unittest.TestCase): - def test_create(self): + @patch.object(logger, "error") + def test_create(self, mock_logger_error): common_config = CommonConfig({}) common_config.task = Const.FREE_BENCHMARK common_config.dump_path = os.path.dirname(os.path.realpath(__file__)) @@ -36,16 +37,16 @@ class TestSelfCheckToolFactory(unittest.TestCase): config = DebuggerConfig(common_config, task_config) config.level = "UNKNOWN" - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): SelfCheckToolFactory.create(config) - self.assertEqual(str(context.exception), "UNKNOWN is not supported.") + mock_logger_error.assert_called_with("UNKNOWN is not supported.") + mock_logger_error.reset_mock() config.level = MsConst.API config.execution_mode = MsConst.GRAPH_KBYK_MODE - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): SelfCheckToolFactory.create(config) - self.assertEqual(str(context.exception), - f"Task free_benchmark is not supported in this mode: {MsConst.GRAPH_KBYK_MODE}.") + mock_logger_error.assert_called_with(f"Task free_benchmark is not supported in this mode: {MsConst.GRAPH_KBYK_MODE}.") config.execution_mode = MsConst.PYNATIVE_MODE tool = SelfCheckToolFactory.create(config) diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/grad_probe/test_grad_analyzer.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/grad_probe/test_grad_analyzer.py index 802769d9005916c8723d436349d13ca7f557a00a..af8f6b0477f766507db55dbe345f2d802415dc14 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/grad_probe/test_grad_analyzer.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/grad_probe/test_grad_analyzer.py @@ -1,6 +1,7 @@ import os import shutil import json +import time import numpy as np import mindspore as ms from unittest import TestCase, mock @@ -15,7 +16,8 @@ class TestGradAnalyzer(TestCase): @classmethod def setUpClass(cls): cls.output_path = "./test_output" - cls.dump_dir = f"{cls.output_path}/rank0/Dump" + cls.time_stamp = str(int(time.time())) + cls.dump_dir = f"{cls.output_path}/rank0/Dump{cls.time_stamp}" cls.save_dir = f"{cls.output_path}/rank0" os.makedirs(cls.dump_dir, exist_ok=True) @@ -31,7 +33,8 @@ class TestGradAnalyzer(TestCase): 'get_context.side_effect': lambda x: { GradConst.OUTPUT_PATH: self.output_path, GradConst.LEVEL: GradConst.LEVEL2, - GradConst.BOUNDS: [-0.1, 0.0, 0.1] + GradConst.BOUNDS: [-0.1, 0.0, 0.1], + GradConst.TIME_STAMP: self.time_stamp, }[x] })) # Clear dump directory before each test diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/test_dump_tool_factory.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/test_dump_tool_factory.py index 8f5d207c41923175b6efe4f9dc313896f879fd89..dede6f01eae96b0c6842c9b8eeed3bc2991020c0 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/test_dump_tool_factory.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/test_dump_tool_factory.py @@ -1,4 +1,4 @@ -# Copyright (c) 2024-2024, Huawei Technologies Co., Ltd. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,6 +16,7 @@ from unittest import TestCase from unittest.mock import patch +from msprobe.core.common.log import logger from msprobe.core.common_config import CommonConfig, BaseConfig from msprobe.core.common.const import Const as CoreConst from msprobe.mindspore.common.const import Const @@ -24,8 +25,9 @@ from msprobe.mindspore.dump.dump_tool_factory import DumpToolFactory class TestDumpToolFactory(TestCase): + @patch.object(logger, "error") @patch("msprobe.mindspore.debugger.debugger_config.create_directory") - def test_create(self, _): + def test_create(self, _, mock_logger_error): json_config = { "task": "statistics", "dump_path": "/absolute_path", @@ -55,15 +57,16 @@ class TestDumpToolFactory(TestCase): self.assertEqual(str(context.exception), "Valid level is needed.") config.level = Const.KERNEL - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): DumpToolFactory.create(config) - self.assertEqual(str(context.exception), "Data dump is not supported in None mode when dump level is kernel.") + mock_logger_error.assert_called_with("Data dump is not supported in None mode when dump level is kernel.") + mock_logger_error.reset_mock() config.execution_mode = Const.GRAPH_GE_MODE config.level = Const.CELL - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): DumpToolFactory.create(config) - self.assertEqual(str(context.exception), "Data dump is not supported in graph_ge mode when dump level is cell.") + mock_logger_error.assert_called_with("Data dump is not supported in graph_ge mode when dump level is cell.") config.execution_mode = Const.GRAPH_KBYK_MODE config.level = Const.KERNEL diff --git a/debug/accuracy_tools/msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py b/debug/accuracy_tools/msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py index f46f171aa38585ea801f1fd3a9716bd3876a63a5..31fe6254a4638b941babb74a5d63713f1b3a7120 100644 --- a/debug/accuracy_tools/msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +++ b/debug/accuracy_tools/msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py @@ -1,7 +1,6 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -# Copyright (C) 2024-2024. Huawei Technologies Co., Ltd. All rights reserved. +# Copyright (c) 2024-2025, Huawei Technologies Co., Ltd. +# All rights reserved. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,19 +12,21 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -""" + from unittest import TestCase from unittest.mock import patch -from msprobe.mindspore.common.const import Const +from msprobe.core.common.log import logger from msprobe.core.common_config import CommonConfig, BaseConfig +from msprobe.mindspore.common.const import Const from msprobe.mindspore.debugger.debugger_config import DebuggerConfig from msprobe.mindspore.overflow_check.overflow_check_tool_factory import OverflowCheckToolFactory class TestOverflowCheckToolFactory(TestCase): + @patch.object(logger, "error") @patch("msprobe.mindspore.debugger.debugger_config.create_directory") - def test_create(self, _): + def test_create(self, _, mock_logger_error): json_config = { "task": "overflow_check", "dump_path": "/absolute_path", @@ -45,11 +46,10 @@ class TestOverflowCheckToolFactory(TestCase): config.execution_mode = Const.GRAPH_GE_MODE config.level = "cell" - with self.assertRaises(Exception) as context: + with self.assertRaises(ValueError): OverflowCheckToolFactory.create(config) - self.assertEqual(str(context.exception), - f"Overflow check is not supported in {config.execution_mode} mode " - f"when level is {config.level}.") + mock_logger_error.assert_called_with(f"Overflow check is not supported in {config.execution_mode} mode " + f"when level is {config.level}.") config.level = "kernel" dumper = OverflowCheckToolFactory.create(config) diff --git a/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_module_processer.py b/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_module_processer.py index f8a561b61b6a758a525675bdc59957e5c923b261..20cfdfa6ba399d274ca67effb6f93a7c3762edce 100644 --- a/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_module_processer.py +++ b/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_module_processer.py @@ -25,28 +25,6 @@ class TestModuleProcesser(unittest.TestCase): processor = ModuleProcesser(scope) self.assertIsNone(processor.scope) - def test_clone_return_value_and_test_clone_if_tensor(self): - def func(x): - return x - - input = torch.tensor([1]) - input_tuple = (torch.tensor([1]), torch.tensor([2])) - input_list = [torch.tensor([1]), torch.tensor([2])] - input_dict = {"A": torch.tensor([1]), "B": torch.tensor([2])} - - result = ModuleProcesser.clone_return_value(func)(input) - result[0] = 2 - self.assertNotEqual(result, input) - result_tuple = ModuleProcesser.clone_return_value(func)(input_tuple) - result_tuple[0][0] = 2 - self.assertNotEqual(result_tuple, input_tuple) - result_list = ModuleProcesser.clone_return_value(func)(input_list) - result_list[0][0] = 2 - self.assertNotEqual(result_list, input_list) - result_dict = ModuleProcesser.clone_return_value(func)(input_dict) - result_dict["A"][0] = 2 - self.assertNotEqual(result_dict, input_dict) - def test_module_count_func(self): test = ModuleProcesser(None) self.assertEqual(test.module_count, {}) diff --git a/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_pt_hook_wrapper.py b/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_pt_hook_wrapper.py new file mode 100644 index 0000000000000000000000000000000000000000..692f8f86aad4a958e0c181d7199302016969f064 --- /dev/null +++ b/debug/accuracy_tools/msprobe/test/pytorch_ut/dump/test_pt_hook_wrapper.py @@ -0,0 +1,104 @@ +# Copyright (c) 2025-2025, Huawei Technologies Co., Ltd. +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest.mock import MagicMock, patch + +import torch + +from msprobe.pytorch.dump.module_dump.hook_wrapper import wrap_setup_backward_hook + + +class TestWrapSetupBackwardHook(unittest.TestCase): + def setUp(self): + self.mock_func = MagicMock() + self.mock_func.return_value = ["clone_tensor1", "clone_tensor2"] + + self.decorated_func = wrap_setup_backward_hook(self.mock_func) + + self.tensor = torch.randn(3, requires_grad=True) + torch.set_grad_enabled(True) + + def test_insufficient_args(self): + result = self.decorated_func("test_case1") + self.mock_func.assert_called_once_with("test_case1") + self.assertListEqual(result, ["clone_tensor1", "clone_tensor2"]) + + def test_inplace_enabled(self): + class MockModule: + inplace = True + + mock_self = MagicMock() + mock_self.module = MockModule() + + result = self.decorated_func(mock_self, "test_case2") + + self.assertEqual(result, "test_case2") + self.mock_func.assert_not_called() + + def test_normal_processing_flow(self): + test_tensor = torch.randn(2, requires_grad=False) + test_data = { + "tensors": [self.tensor, torch.randn(2, requires_grad=True)], + "nested": { + "tuple": (self.tensor, test_tensor) + } + } + + mock_self = MagicMock() + mock_self.module.inplace = False + test_tensor1 = torch.randn(4, requires_grad=True) + test_tensor2 = torch.randn(4, requires_grad=True) + test_tensor3 = torch.randn(4, requires_grad=True) + self.mock_func.return_value = [test_tensor1, test_tensor2, test_tensor3] + result = self.decorated_func(mock_self, test_data) + + self.assertIsInstance(result, dict) + self.assertFalse(torch.equal(result["tensors"][0], self.tensor)) + self.assertTrue(torch.equal(result["tensors"][1], test_tensor2)) + self.assertIsInstance(result["nested"]["tuple"][0], torch.Tensor) + self.assertTrue(torch.equal(result["nested"]["tuple"][1], test_tensor)) + + def test_complex_data_structures(self): + test_case = [ + self.tensor, + {"dict": torch.randn(4, requires_grad=True)}, + (torch.randn(5, requires_grad=True),), + [torch.randn(6, requires_grad=True)] + ] + + mock_self = MagicMock() + mock_self.module.inplace = False + test_tensor1 = torch.randn(4, requires_grad=True) + test_tensor2 = torch.randn(5, requires_grad=True) + test_tensor3 = torch.randn(6, requires_grad=True) + self.mock_func.return_value = [self.tensor, test_tensor1, test_tensor2, test_tensor3] + result = self.decorated_func(mock_self, test_case) + + self.assertIsInstance(result, list) + self.assertTrue(torch.equal(result[1]["dict"], test_tensor1)) + self.assertTrue(torch.equal(result[2][0], test_tensor2)) + self.assertTrue(torch.equal(result[3][0], test_tensor3)) + + @patch('msprobe.pytorch.common.utils.is_float8_tensor', return_value=True) + def test_float8_tensor_handling(self, _): + test_data = [torch.randn(3, requires_grad=True)] + + mock_self = MagicMock() + self.mock_func.return_value = [] + result = self.decorated_func(mock_self, test_data) + + self.assertIsInstance(result, list) + self.assertListEqual(result, test_data) diff --git a/debug/accuracy_tools/msprobe/test/pytorch_ut/test_pt_config.py b/debug/accuracy_tools/msprobe/test/pytorch_ut/test_pt_config.py index 0724581bc79f48ed158b691d315a5a75cc1bc65d..f931c2b5c2bb3ecde578d12866fa7a56125d700e 100644 --- a/debug/accuracy_tools/msprobe/test/pytorch_ut/test_pt_config.py +++ b/debug/accuracy_tools/msprobe/test/pytorch_ut/test_pt_config.py @@ -268,7 +268,7 @@ class TestFreeBenchmarkCheckConfig(unittest.TestCase): invalid_config["fuzz_device"] = "cpu" invalid_config["pert_mode"] = "INVALID_CPU_MODE" config = FreeBenchmarkCheckConfig(invalid_config) - self.assertIn("You neet to and can only set fuzz_device as ", str(mock_error.call_args)) + self.assertIn("You need to and can only set fuzz_device as ", str(mock_error.call_args)) @patch('msprobe.core.common.log.logger.error_log_with_exp') def test_check_handler_type_invalid(self, mock_error): diff --git a/debug/accuracy_tools/msprobe/visualization/compare/graph_comparator.py b/debug/accuracy_tools/msprobe/visualization/compare/graph_comparator.py index 3f695d23483c8980c958995a36025b0514877cf9..f2ba394bcd3c5ae96ce2eadb62cafe50e488a2d6 100644 --- a/debug/accuracy_tools/msprobe/visualization/compare/graph_comparator.py +++ b/debug/accuracy_tools/msprobe/visualization/compare/graph_comparator.py @@ -19,7 +19,7 @@ from msprobe.visualization.utils import GraphConst, load_json_file, load_data_js from msprobe.visualization.graph.graph import Graph, NodeOp from msprobe.visualization.compare.mode_adapter import ModeAdapter from msprobe.core.common.const import Const -from msprobe.core.common.utils import recursion_depth_decorator +from msprobe.core.common.decorator import recursion_depth_decorator class GraphComparator: diff --git a/msmonitor/dynolog_npu/dynolog/src/Main.cpp b/msmonitor/dynolog_npu/dynolog/src/Main.cpp index 8e5177768327e37173d4e7661e334a9400bd6172..817199d8c9dcadad9d131daaa346189015614adc 100644 --- a/msmonitor/dynolog_npu/dynolog/src/Main.cpp +++ b/msmonitor/dynolog_npu/dynolog/src/Main.cpp @@ -192,11 +192,14 @@ int main(int argc, char** argv) { auto server = setup_server(handler); server->run(); - km_thread.join(); - if (pm_thread) { + if (km_thread.joinable()) { + km_thread.join(); + } + + if (pm_thread && pm_thread->joinable()) { pm_thread->join(); } - if (gpumon_thread) { + if (gpumon_thread && gpumon_thread->joinable()) { gpumon_thread->join(); } diff --git a/msmonitor/plugin/bindings.cpp b/msmonitor/plugin/bindings.cpp index 2e6678bddbe29cb129d28f49daaa3f487bd9b7ab..b7c8a812a0182f3244f67b0f46937e723841795a 100644 --- a/msmonitor/plugin/bindings.cpp +++ b/msmonitor/plugin/bindings.cpp @@ -1,4 +1,5 @@ #include +#include #include "ipc_monitor/PyDynamicMonitorProxy.h" namespace py = pybind11; @@ -7,5 +8,7 @@ PYBIND11_MODULE(IPCMonitor, m) { py::class_(m, "PyDynamicMonitorProxy") .def(py::init<>()) .def("init_dyno", &dynolog_npu::ipc_monitor::PyDynamicMonitorProxy::InitDyno, py::arg("npuId")) - .def("poll_dyno", &dynolog_npu::ipc_monitor::PyDynamicMonitorProxy::PollDyno); + .def("poll_dyno", &dynolog_npu::ipc_monitor::PyDynamicMonitorProxy::PollDyno) + .def("enable_dyno_npu_monitor", &dynolog_npu::ipc_monitor::PyDynamicMonitorProxy::EnableMsptiMonitor, py::arg("cfg_map")) + .def("finalize_dyno", &dynolog_npu::ipc_monitor::PyDynamicMonitorProxy::FinalizeDyno); } \ No newline at end of file diff --git a/msmonitor/plugin/ipc_monitor/NpuIpcClient.cpp b/msmonitor/plugin/ipc_monitor/NpuIpcClient.cpp index ca2429f1e368ad996b8a8a954810ed7439c78bea..41c84829d4c9079e74e8d494a0da0cccc2ceb361 100644 --- a/msmonitor/plugin/ipc_monitor/NpuIpcClient.cpp +++ b/msmonitor/plugin/ipc_monitor/NpuIpcClient.cpp @@ -28,6 +28,10 @@ std::string IpcClient::IpcClientNpuConfig() { auto size = pids_.size(); auto *req = (NpuRequest *)malloc(sizeof(NpuRequest) + sizeof(int32_t) * size); + if (req == nullptr) { + LOG(ERROR) << " Malloc for NpuRequest failed !"; + return ""; + } req->type = DYNO_IPC_TYPE; req->pidSize = size; req->jobId = JOB_ID; @@ -42,6 +46,7 @@ std::string IpcClient::IpcClientNpuConfig() return ""; } free(req); + req = nullptr; message = PollRecvMessage(MAX_IPC_RETRIES, MAX_SLEEP_US); if (!message) { LOG(ERROR) << " Failed to receive on-demand config !"; diff --git a/msmonitor/plugin/ipc_monitor/NpuIpcEndPoint.h b/msmonitor/plugin/ipc_monitor/NpuIpcEndPoint.h index 6560fa515646226ddbffbca49c4f818eb0d0ebcf..c9536e9130e48513ede59da22f343cc421e5ed57 100644 --- a/msmonitor/plugin/ipc_monitor/NpuIpcEndPoint.h +++ b/msmonitor/plugin/ipc_monitor/NpuIpcEndPoint.h @@ -1,6 +1,7 @@ #ifndef NPU_IPC_ENDPOINT_H #define NPU_IPC_ENDPOINT_H #include +#include #include #include #include @@ -47,16 +48,25 @@ public: throw std::runtime_error(std::strerror(errno) + IPC_ERROR(ErrCode::PARAM)); } struct sockaddr_un address; + int ret; size_t addressLen = SetSocketAdress(addressName, address); if (address.sun_path[0] != STR_END_CHAR) { - unlink(address.sun_path); + ret = unlink(address.sun_path); } - int res = bind(socketFd, ReinterpretConvert(&address), addressLen); - if (res == -1) { + if (ret == -1) { + throw std::runtime_error("Unlink failed, error is " + std::string(strerror(errno)) + IPC_ERROR(ErrCode::PARAM)); + } + + ret = bind(socketFd, ReinterpretConvert(&address), addressLen); + if (ret == -1) { throw std::runtime_error("Bind socket failed." + IPC_ERROR(ErrCode::PARAM)); } + if (address.sun_path[0] != STR_END_CHAR) { - chmod(address.sun_path, SOCKET_FD_CHMOD); + ret = chmod(address.sun_path, SOCKET_FD_CHMOD); + } + if (ret == -1) { + throw std::runtime_error("Chmod failed, error is " + std::string(strerror(errno)) + IPC_ERROR(ErrCode::PARAM)); } } ~NpuIpcEndPoint() @@ -137,7 +147,7 @@ public: throw std::runtime_error("TryPeekMessage occur " + std::string(std::strerror(errno))); } - const char *GetName(Ctxt const & ctxt) const noexcept + const char *GetName(Ctxt const & ctxt) const { if (ctxt.messageName.sun_path[0] != STR_END_CHAR) { throw std::runtime_error("GetName() want to got abstract socket, but got " + diff --git a/msmonitor/plugin/ipc_monitor/PyDynamicMonitorProxy.h b/msmonitor/plugin/ipc_monitor/PyDynamicMonitorProxy.h index 0471a70a3419eeeee2986d1d18710ee112c70313..4aefca1c8fe48a47e03cc7b380651a59fd30a6aa 100644 --- a/msmonitor/plugin/ipc_monitor/PyDynamicMonitorProxy.h +++ b/msmonitor/plugin/ipc_monitor/PyDynamicMonitorProxy.h @@ -33,9 +33,18 @@ public: std::string PollDyno() { - return monitor_->Poll(); + return monitor_->Poll(); }; + void EnableMsptiMonitor(std::unordered_map& config_map) + { + LOG(WARNING) << "EnableMsptiMonitor is not support now"; + } + + void FinalizeDyno() + { + LOG(WARNING) << "FinalizeDyno is not support now"; + } private: MonitorBase *monitor_ = nullptr; }; diff --git a/msmonitor/plugin/setup.py b/msmonitor/plugin/setup.py index fb5d2660ad2b5177246c6b2c4e2b620b3bb45c94..7f276dc57d94a5abbfbb84f4b849e9634113b7a9 100644 --- a/msmonitor/plugin/setup.py +++ b/msmonitor/plugin/setup.py @@ -29,6 +29,8 @@ ext_modules = [ sources=["bindings.cpp"] + list(glob("ipc_monitor/*.cpp")), # Source files include_dirs=[os.path.join(BASE_DIR, "ipc_monitor"), GLOG_INC_PATH, GLOG_LIB_PATH], # Include Pybind11 headers library_dirs=[GLOG_LIB_PATH], + extra_compile_args=["-std=c++14", "-fPIC", "-fstack-protector-all", "-fno-strict-aliasing", "-fno-common", + "-fvisibility=hidden", "-fvisibility-inlines-hidden", "-Wfloat-equal", "-Wextra", "-O2"], libraries=["glog"], language="c++", # Specify the language ), diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/package-lock.json b/plugins/tensorboard-plugins/tb_graph_ascend/fe/package-lock.json index b0a19c5749c43c8e8d99458f92ce245b008a9e3d..f9414ccb3cb7240d74c6e4311fb2d6a67a8a1867 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/package-lock.json +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/package-lock.json @@ -44,20 +44,19 @@ "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "^3.5.1", "@types/lodash": "^4.17.1", - "@vaadin/button": "^23.5.11", - "@vaadin/combo-box": "^23.5.11", - "@vaadin/details": "^24.6.5", - "@vaadin/icon": "^23.5.11", - "@vaadin/icons": "^23.5.11", - "@vaadin/notification": "^23.5.11", - "@vaadin/progress-bar": "^23.5.11", - "@vaadin/tabs": "^23.5.11", - "@vaadin/tabsheet": "^23.5.11", - "@vaadin/text-field": "^24.6.6", - "@vaadin/tooltip": "^23.5.11", - "@vaadin/vaadin-combo-box": "^23.5.12", - "@vaadin/vaadin-grid": "^23.5.11", - "@vaadin/vaadin-select": "^23.5.12", + "@vaadin/button": "24.6.5", + "@vaadin/combo-box": "24.6.5", + "@vaadin/details": "24.6.5", + "@vaadin/grid": "24.6.5", + "@vaadin/icon": "24.6.5", + "@vaadin/icons": "24.6.5", + "@vaadin/notification": "24.6.5", + "@vaadin/progress-bar": "24.6.5", + "@vaadin/select": "24.6.5", + "@vaadin/tabs": "24.6.5", + "@vaadin/tabsheet": "24.6.5", + "@vaadin/text-field": "24.6.5", + "@vaadin/tooltip": "24.6.5", "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", "css-loader": "^7.1.2", @@ -82,7 +81,9 @@ "tslib": "^2.6.2", "typescript": "^5.4.5", "webpack": "^5.96.1", - "webpack-cli": "^5.1.4" + "webpack-cli": "^5.1.4", + "webpack-dev-server": "4.15.1", + "ws": "8.13.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -90,6 +91,7 @@ "resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -98,6 +100,7 @@ "version": "0.3.8", "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -111,6 +114,7 @@ "version": "3.1.2", "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -119,6 +123,7 @@ "version": "1.2.1", "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -127,6 +132,7 @@ "version": "0.3.6", "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -135,39 +141,52 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" + "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", + "license": "BSD-3-Clause" }, "node_modules/@lit/reactive-element": { - "version": "1.6.3", - "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-1.6.3.tgz", - "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "license": "BSD-3-Clause", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.0.0" + "@lit-labs/ssr-dom-shim": "^1.2.0" } }, "node_modules/@open-wc/dedupe-mixin": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", - "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==" + "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", + "license": "MIT" }, "node_modules/@polymer/decorators": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/@polymer/decorators/-/decorators-3.0.0.tgz", "integrity": "sha512-qh+VID9nDV9q3ABvIfWgm7/+udl7v2HKsMLPXFm8tj1fI7qr7yWJMFwS3xWBkMmuNPtmkS8MDP0vqLAQIEOWzg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.5" } @@ -175,12 +194,14 @@ "node_modules/@polymer/font-roboto": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@polymer/font-roboto/-/font-roboto-3.0.2.tgz", - "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==" + "integrity": "sha512-tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==", + "license": "BSD-3-Clause" }, "node_modules/@polymer/iron-a11y-announcer": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.2.0.tgz", "integrity": "sha512-We+hyaFHcg7Ke8ovsoxUpYEXFIJLHxMCDaLehTB4dELS+C+K0zMnGSiqQvb/YzGS+nSYpAfkQIyg1msOCdHMtA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -189,6 +210,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.1.tgz", "integrity": "sha512-lnrjKq3ysbBPT/74l0Fj0U9H9C35Tpw2C/tpJ8a+5g8Y3YJs1WSZYnEl1yOkw6sEyaxOq/1DkzH0+60gGu5/PQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -197,6 +219,7 @@ "version": "3.0.3", "resolved": "https://registry.npmmirror.com/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.3.tgz", "integrity": "sha512-5r0VkWrIlm0JIp5E5wlnvkw7slK72lFRZXncmrsLZF+6n1dg2rI8jt7xpFzSmUWrqpcyXwyKaGaDvUjl3j4JLA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -208,6 +231,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-behaviors/-/iron-behaviors-3.0.1.tgz", "integrity": "sha512-IMEwcv1lhf1HSQxuyWOUIL0lOBwmeaoSTpgCJeP9IBYnuB1SPQngmfRuHKgK6/m9LQ9F9miC7p3HeQQUdKAE0w==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -217,6 +241,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.1.tgz", "integrity": "sha512-aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-form-element-behavior": "^3.0.0-pre.26", "@polymer/iron-validatable-behavior": "^3.0.0-pre.26", @@ -227,6 +252,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-collapse/-/iron-collapse-3.0.1.tgz", "integrity": "sha512-yg6q5ZyckQR9VL9VmLrSTkSFXWy9AcJC8KtnD5cg0EHRPbakE8I9S/gVAgeP4nMWV2a/BjLLC4IBygcCMDhAGw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -236,6 +262,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-dropdown/-/iron-dropdown-3.0.1.tgz", "integrity": "sha512-22yLhepfcKjuQMfFmRHi/9MPKTqkzgRrmWWW0P5uqK++xle53k2QBO5VYUAYiCN3ZcxIi9lEhZ9YWGeQj2JBig==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-overlay-behavior": "^3.0.0-pre.27", @@ -247,6 +274,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.1.0.tgz", "integrity": "sha512-ABcgIYqrjhmUT8tiuolqeGttF/8pd3sEymUDrO1vXbZu4FWIvoLNndrMDFvs++AGd12Mjf5pYy84NJc6dB8Vig==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -255,6 +283,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz", "integrity": "sha512-7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -263,6 +292,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.1.tgz", "integrity": "sha512-G/e2KXyL5AY7mMjmomHkGpgS0uAf4ovNpKhkuUTRnMuMJuf589bKqE85KN4ovE1Tzhv2hJoh/igyD6ekHiYU1A==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -271,6 +301,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-icon/-/iron-icon-3.0.1.tgz", "integrity": "sha512-QLPwirk+UPZNaLnMew9VludXA4CWUCenRewgEcGYwdzVgDPCDbXxy6vRJjmweZobMQv/oVLppT2JZtJFnPxX6g==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-meta": "^3.0.0-pre.26", @@ -281,6 +312,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-icons/-/iron-icons-3.0.1.tgz", "integrity": "sha512-xtEI8erH2GIBiF3QxEMyW81XuVjguu6Le5WjEEpX67qd9z7jjmc4T/ke3zRUlnDydex9p8ytcwVpMIKcyvjYAQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/iron-iconset-svg": "^3.0.0-pre.26", @@ -291,6 +323,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-iconset-svg/-/iron-iconset-svg-3.0.1.tgz", "integrity": "sha512-XNwURbNHRw6u2fJe05O5fMYye6GSgDlDqCO+q6K1zAnKIrpgZwf2vTkBd5uCcZwsN0FyCB3mvNZx4jkh85dRDw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-meta": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -300,6 +333,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-input/-/iron-input-3.0.1.tgz", "integrity": "sha512-WLx13kEcbH9GKbj9+pWR6pbJkA5kxn3796ynx6eQd2rueMyUfVTR3GzOvadBKsciUuIuzrxpBWZ2+3UcueVUQQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-announcer": "^3.0.0-pre.26", "@polymer/iron-validatable-behavior": "^3.0.0-pre.26", @@ -310,6 +344,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@polymer/iron-list/-/iron-list-3.1.0.tgz", "integrity": "sha512-Eiv6xd3h3oPmn8SXFntXVfC3ZnegH+KHAxiKLKcOASFSRY3mHnr2AdcnExUJ9ItoCMA5UzKaM/0U22eWzGERtA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", @@ -321,6 +356,7 @@ "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@polymer/iron-menu-behavior/-/iron-menu-behavior-3.0.2.tgz", "integrity": "sha512-8dpASkFNBIkxAJWsFLWIO1M7tKM0+wKs3PqdeF/dDdBciwoaaFgC2K1XCZFZnbe2t9/nJgemXxVugGZAWpYCGg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -332,6 +368,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-meta/-/iron-meta-3.0.1.tgz", "integrity": "sha512-pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -340,6 +377,7 @@ "version": "3.0.3", "resolved": "https://registry.npmmirror.com/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.3.tgz", "integrity": "sha512-Q/Fp0+uOQQ145ebZ7T8Cxl4m1tUKYjyymkjcL2rXUm+aDQGb1wA1M1LYxUF5YBqd+9lipE0PTIiYwA2ZL/sznA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-fit-behavior": "^3.0.0-pre.26", @@ -351,6 +389,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-pages/-/iron-pages-3.0.1.tgz", "integrity": "sha512-PQe8S1JKHPcsIvFOaQP+9+AXmqUIL9fPqC6xT63OAZQxYCeZJDKgT9GKBx+VRryYBUlj2FLEXkUVpG+PTotdjg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", "@polymer/iron-selector": "^3.0.0-pre.26", @@ -361,6 +400,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-range-behavior/-/iron-range-behavior-3.0.1.tgz", "integrity": "sha512-+jtL9v45M/T1RJleWyQaNH84S9/mIIR+AjNbYIttbKGp1eG+98j8MDWe7LXNtg79V2LQnE/+VS82cBeELyGVeg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -369,6 +409,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.1.tgz", "integrity": "sha512-FyHxRxFspVoRaeZSWpT3y0C9awomb4tXXolIJcZ7RvXhMP632V5lez+ch5G5SwK0LpnAPkg35eB0LPMFv+YMMQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -377,6 +418,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-scroll-target-behavior/-/iron-scroll-target-behavior-3.0.1.tgz", "integrity": "sha512-xg1WanG25BIkQE8rhuReqY9zx1K5M7F+YAIYpswEp5eyDIaZ1Y3vUmVeQ3KG+hiSugzI1M752azXN7kvyhOBcQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -385,6 +427,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-selector/-/iron-selector-3.0.1.tgz", "integrity": "sha512-sBVk2uas6prW0glUe2xEJJYlvxmYzM40Au9OKbfDK2Qekou/fLKcBRyIYI39kuI8zWRaip8f3CI8qXcUHnKb1A==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/polymer": "^3.0.0" } @@ -393,6 +436,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.1.tgz", "integrity": "sha512-wwpYh6wOa4fNI+jH5EYKC7TVPYQ2OfgQqocWat7GsNWcsblKYhLYbwsvEY5nO0n2xKqNfZzDLrUom5INJN7msQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-meta": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -402,6 +446,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/neon-animation/-/neon-animation-3.0.1.tgz", "integrity": "sha512-cDDc0llpVCe0ATbDS3clDthI54Bc8YwZIeTGGmBJleKOvbRTUC5+ssJmRL+VwVh+VM5FlnQlx760ppftY3uprg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-resizable-behavior": "^3.0.0-pre.26", "@polymer/iron-selector": "^3.0.0-pre.26", @@ -412,6 +457,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-behaviors/-/paper-behaviors-3.0.1.tgz", "integrity": "sha512-6knhj69fPJejv8qR0kCSUY+Q0XjaUf0OSnkjRjmTJPAwSrRYtgqE+l6P1FfA+py1X/cUjgne9EF5rMZAKJIg1g==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", @@ -423,6 +469,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-button/-/paper-button-3.0.1.tgz", "integrity": "sha512-JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -434,6 +481,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@polymer/paper-checkbox/-/paper-checkbox-3.1.0.tgz", "integrity": "sha512-kXm6yDG1tT8if0XuJ2cc9NF+g8Ev4wG+rnf0a+Sx+O7J6fn1jcnBlYn72FlrfjVjDQZDBFmT6nynhD5PvFw8iQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", @@ -447,6 +495,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-dialog/-/paper-dialog-3.0.1.tgz", "integrity": "sha512-KvglYbEq7AWJvui2j6WKLnOvgVMeGjovAydGrPRj7kVzCiD49Eq/hpYFJTRV5iDcalWH+mORUpw+jrFnG9+Kgw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-overlay-behavior": "^3.0.0-pre.27", "@polymer/neon-animation": "^3.0.0-pre.26", @@ -458,6 +507,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-dialog-behavior/-/paper-dialog-behavior-3.0.1.tgz", "integrity": "sha512-wbI4kCK8le/9MHT+IXzvHjoatxf3kd3Yn0tgozAiAwfSZ7N4Ubpi5MHrK0m9S9PeIxKokAgBYdTUrezSE5378A==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-overlay-behavior": "^3.0.0-pre.27", "@polymer/paper-styles": "^3.0.0-pre.26", @@ -468,6 +518,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-dialog-scrollable/-/paper-dialog-scrollable-3.0.1.tgz", "integrity": "sha512-1E8B9kNdL58jUrJ/BwqJeOoNVcxNrB559z//d1V0rVHWT5bWCCZegwS3G06iFK5MjxWFbIKzleVTLrT0opiZkA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/paper-dialog-behavior": "^3.0.0-pre.26", @@ -479,6 +530,7 @@ "version": "3.2.0", "resolved": "https://registry.npmmirror.com/@polymer/paper-dropdown-menu/-/paper-dropdown-menu-3.2.0.tgz", "integrity": "sha512-2ohwSHF+RLSK6kA0UkkMiMQF6EZcaEYWAA25kfisI6DWie7yozKrpQNsqvwfOEHU6DdDMIotrOtH1TM88YS8Zg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-form-element-behavior": "^3.0.0-pre.26", @@ -497,6 +549,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-header-panel/-/paper-header-panel-3.0.1.tgz", "integrity": "sha512-aaugJS3Dt+J467GM7B2Ea3GVSusMoXvwZKfA/0ZbMmG6wjZwkc4wnP8fDZjm5BZDD9CyI+PFo7aWa4K0WMF9mQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -506,6 +559,7 @@ "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@polymer/paper-icon-button/-/paper-icon-button-3.0.2.tgz", "integrity": "sha512-kOdxQgnKL097bggFF6PWvsBYuWg+MCcoHoTHX6bh/MuZoWFZNjrFntFqwuB4oEbpjCpfm4moA33muPJFj7CihQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-icon": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -517,6 +571,7 @@ "version": "3.2.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-input/-/paper-input-3.2.1.tgz", "integrity": "sha512-6ghgwQKM6mS0hAQxQqj+tkeEY1VUBqAsrasAm8V5RpNcfSWQC/hhRFxU0beGuKTAhndzezDzWYP6Zz4b8fExGg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-autogrow-textarea": "^3.0.0-pre.26", @@ -531,6 +586,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-item/-/paper-item-3.0.1.tgz", "integrity": "sha512-KTk2N+GsYiI/HuubL3sxebZ6tteQbBOAp4QVLAnbjSPmwl+mJSDWk+omuadesU0bpkCwaWVs3fHuQsmXxy4pkw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -542,6 +598,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-listbox/-/paper-listbox-3.0.1.tgz", "integrity": "sha512-vMLWFpYcggAPmEDBmK+96fFefacOG3GLB1EguTn8+ZkqI+328hNfw1MzHjH68rgCIIUtjmm+9qgB1Sy/MN0a/A==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-menu-behavior": "^3.0.0-pre.26", @@ -553,6 +610,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-material/-/paper-material-3.0.1.tgz", "integrity": "sha512-FUa3iqEcwjYtUzMqIh9cEfdTJE8ZtRasAzxVbck5GChthA/T2HwnhjAyqzN4lusVMyafdl3rjNEwhVPK/Pmykg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/paper-styles": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -562,6 +620,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@polymer/paper-menu-button/-/paper-menu-button-3.1.0.tgz", "integrity": "sha512-q0G0/rvYD/FFmIBMGCQWjfXzRqwFw9+WHSYV4uOQzM1Ln8LMXSAd+2CENsbVwtMh6fmBePj15ZlU8SM2dt1WDQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-behaviors": "^3.0.0-pre.26", @@ -576,6 +635,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-progress/-/paper-progress-3.0.1.tgz", "integrity": "sha512-5nguG+tmnyoaWKVNG8Smtno2uLSPBgEsT3f20JY8yJTjUBYWaqa8E3l5RLkTRXgA4x9OnvLb8/CdlQWXQIogBg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/iron-range-behavior": "^3.0.0-pre.26", @@ -587,6 +647,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-radio-button/-/paper-radio-button-3.0.1.tgz", "integrity": "sha512-ltCdgolOrmTeG3IxHhfMgxRc9AloNpoIwRMInrTI5Nzva4yOzSpP01bfpEwBpTl11o0NYxqfYYCxCjLQGRq9ng==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -599,6 +660,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-radio-group/-/paper-radio-group-3.0.1.tgz", "integrity": "sha512-VYUWj6Y7/1sJncbtKJ4+aKJ0U98cLPXWu6mTgMREoA2jOKrb41JxtnKNrKMjs+lBHCZj4wvtmHwzeS//HFULfA==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-menu-behavior": "^3.0.0-pre.26", @@ -610,6 +672,7 @@ "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@polymer/paper-ripple/-/paper-ripple-3.0.2.tgz", "integrity": "sha512-DnLNvYIMsiayeICroYxx6Q6Hg1cUU8HN2sbutXazlemAlGqdq80qz3TIaVdbpbt/pvjcFGX2HtntMlPstCge8Q==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -619,6 +682,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-slider/-/paper-slider-3.0.1.tgz", "integrity": "sha512-TNA8nEQci1fe3vTQQaFwkPj9p9yTLSr9Mhe8xQSTHpFNKun1rsp91LlKJmiKJDO7xU9RGZmA2mRlQwaj6kgR3g==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-keys-behavior": "^3.0.0-pre.26", "@polymer/iron-behaviors": "^3.0.0-pre.26", @@ -635,6 +699,7 @@ "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@polymer/paper-spinner/-/paper-spinner-3.0.2.tgz", "integrity": "sha512-XUzu8/4NH+pnNZUTI2MxtOKFAr0EOsW7eGhTg3VBhTh7DDW/q3ewzwYRWnqNJokX9BEnxKMiXXaIeTEBq4k2dw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/paper-styles": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -644,6 +709,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-styles/-/paper-styles-3.0.1.tgz", "integrity": "sha512-y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/font-roboto": "^3.0.1", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -654,6 +720,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@polymer/paper-tabs/-/paper-tabs-3.1.0.tgz", "integrity": "sha512-t8G+3CiyI0R+wA077UNQXR/oG9GlsqRRO1KMsFHHjBSsYqWXghNsqxUG827wEj+PafI5u9tZ3vVt1S++Lg4B2g==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-behaviors": "^3.0.0-pre.26", "@polymer/iron-flex-layout": "^3.0.0-pre.26", @@ -671,6 +738,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-toast/-/paper-toast-3.0.1.tgz", "integrity": "sha512-pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-a11y-announcer": "^3.0.0-pre.26", "@polymer/iron-fit-behavior": "^3.0.0-pre.26", @@ -682,6 +750,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-toggle-button/-/paper-toggle-button-3.0.1.tgz", "integrity": "sha512-jadZB60fycT7YnSAH0H23LYo6/2HYmMZTtNr9LpdSIRFPLX6mqqxewex92cFz019bMKaRJgORn308hRlJo2u6A==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-checked-element-behavior": "^3.0.0-pre.26", "@polymer/paper-behaviors": "^3.0.0-pre.27", @@ -693,6 +762,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-toolbar/-/paper-toolbar-3.0.1.tgz", "integrity": "sha512-tEdHRorVmnN3kvJg3xxRPnEiEBdGmGwcDNbIcYuXxoRDF0nAB74SW5+He8OlFT1Lw2Hz/xlvMn+wHuqxIJeyQw==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/iron-flex-layout": "^3.0.0-pre.26", "@polymer/paper-styles": "^3.0.0-pre.26", @@ -703,6 +773,7 @@ "version": "3.0.1", "resolved": "https://registry.npmmirror.com/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz", "integrity": "sha512-yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==", + "license": "BSD-3-Clause", "dependencies": { "@polymer/paper-styles": "^3.0.0-pre.26", "@polymer/polymer": "^3.0.0" @@ -712,15 +783,59 @@ "version": "3.5.2", "resolved": "https://registry.npmmirror.com/@polymer/polymer/-/polymer-3.5.2.tgz", "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==", + "license": "BSD-3-Clause", "dependencies": { "@webcomponents/shadycss": "^1.9.1" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/d3": { "version": "5.7.2", "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-5.7.2.tgz", "integrity": "sha512-7/wClB8ycneWGy3jdvLfXKTd5SoTg9hji7IdJ0RuO9xTY54YpJ8zlcFADcXhY1J3kCBwxp+/1jeN6a5OMwgYOw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "^1", "@types/d3-axis": "*", @@ -759,13 +874,15 @@ "version": "1.2.12", "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-1.2.12.tgz", "integrity": "sha512-zIq9wCg/JO7MGC6vq3HRDaVYkqgSPIDjpo3JhAQxl7PHYVPA5D9SMiBfjW/ZoAvPd2a+rkovqBg0nS0QOChsJQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -775,6 +892,7 @@ "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -783,25 +901,29 @@ "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-collection": { "version": "1.0.13", "resolved": "https://registry.npmmirror.com/@types/d3-collection/-/d3-collection-1.0.13.tgz", "integrity": "sha512-v0Rgw3IZebRyamcwVmtTDCZ8OmQcj4siaYjNc7wGMZT7PmdSHawGsCOQMxyLvZ7lWjfohYLK0oXtilMOMgfY8A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -811,13 +933,15 @@ "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -826,19 +950,22 @@ "version": "3.0.7", "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } @@ -847,19 +974,22 @@ "version": "3.0.10", "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz", "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -868,13 +998,15 @@ "version": "3.1.7", "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -883,31 +1015,36 @@ "version": "3.1.1", "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz", "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.3", "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz", "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-time": "*" } @@ -916,19 +1053,22 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.11", "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz", "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.7", "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.7.tgz", "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-path": "*" } @@ -937,25 +1077,29 @@ "version": "3.0.4", "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz", "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.9", "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz", "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -964,13 +1108,15 @@ "version": "1.1.12", "resolved": "https://registry.npmmirror.com/@types/d3-voronoi/-/d3-voronoi-1.1.12.tgz", "integrity": "sha512-DauBl25PKZZ0WVJr42a6CNvI6efsdzofl9sajqZr2Gf5Gu733WkDdUGiPkUHXiUvYGzNNlFQde2wdZdfQPG+yw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-zoom": { "version": "3.0.8", "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -980,6 +1126,7 @@ "version": "9.6.1", "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -989,26 +1136,69 @@ "version": "3.7.7", "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/glob": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -1018,720 +1208,609 @@ "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.17.16", "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz", "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "license": "MIT" }, "node_modules/@types/node": { "version": "16.18.126", "resolved": "https://registry.npmmirror.com/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==" + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "license": "MIT" + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmmirror.com/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/offscreencanvas": { "version": "2019.7.3", "resolved": "https://registry.npmmirror.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/requirejs": { "version": "2.1.37", "resolved": "https://registry.npmmirror.com/@types/requirejs/-/requirejs-2.1.37.tgz", "integrity": "sha512-jmFgr3mwN2NSmtRP6IpZ2nfRS7ufSXuDYQ6YyPFArN8x5dARQcD/DXzT0J6NYbvquVT4pg9K9HWdi6e6DZR9iQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/resize-observer-browser": { "version": "0.1.11", "resolved": "https://registry.npmmirror.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.11.tgz", "integrity": "sha512-cNw5iH8JkMkb3QkCoe7DaZiawbDQEUX8t7iuQaRTyLOyQCR2h+ibBD4GJt7p5yhUHrlOeL7ZtbxNHeipqNsBzQ==", - "dev": true - }, - "node_modules/@types/three": { - "version": "0.131.1", - "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.131.1.tgz", - "integrity": "sha512-unnjsolcm7R90e4XK9qMq4JYEzly0XQNa0pG8RAOMZeVzj3FLIFPymAYUx4Osz0gY9jFZz8omIQplqiieEE7gw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" }, - "node_modules/@vaadin/a11y-base": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/a11y-base/-/a11y-base-24.7.1.tgz", - "integrity": "sha512-e9MzAB4WmyOnbrCIiry7j17D+57Gr8M68Wlqhh9jONEOpN1Q4T1SiEflb4G1QHCF5Ol5oid5gDvs/T6GGVqIoA==", + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "license": "MIT", "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "lit": "^3.0.0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/@vaadin/a11y-base/node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" + "@types/express": "*" } }, - "node_modules/@vaadin/a11y-base/node_modules/@vaadin/component-base": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-24.7.1.tgz", - "integrity": "sha512-XO+35dd3OvxyIg9Q6YAeUCUtRFerLi0EWO4EiSYokEI2nJwv8gMtm7OWQzXjPXTbBzzWKLkKrIFdjnWP4c/HNQ==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "license": "MIT", "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-development-mode-detector": "^2.0.0", - "@vaadin/vaadin-usage-statistics": "^2.1.0", - "lit": "^3.0.0" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/@vaadin/a11y-base/node_modules/lit": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit/-/lit-3.2.1.tgz", - "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "license": "MIT", "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.1.0", - "lit-html": "^3.2.0" + "@types/node": "*" } }, - "node_modules/@vaadin/a11y-base/node_modules/lit-element": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-4.1.1.tgz", - "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "node_modules/@types/three": { + "version": "0.131.1", + "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.131.1.tgz", + "integrity": "sha512-unnjsolcm7R90e4XK9qMq4JYEzly0XQNa0pG8RAOMZeVzj3FLIFPymAYUx4Osz0gY9jFZz8omIQplqiieEE7gw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", + "dev": true, + "license": "MIT", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.2.0" + "@types/node": "*" } }, - "node_modules/@vaadin/a11y-base/node_modules/lit-html": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-3.2.1.tgz", - "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "node_modules/@vaadin/a11y-base": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/a11y-base/-/a11y-base-24.6.7.tgz", + "integrity": "sha512-CJYYTWPBEEaVt4AvBE8RzEn3hqUZbGUGLzqs6NGBFTw0c5cfkqoO2ZMkKhz5Z52QF+2mCXpEtyg6s+t0h171Qg==", + "license": "Apache-2.0", "dependencies": { - "@types/trusted-types": "^2.0.2" + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.6.7", + "lit": "^3.0.0" } }, "node_modules/@vaadin/button": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/button/-/button-23.5.12.tgz", - "integrity": "sha512-1eqS3ntcIareH2FNuXg+eOBB9nvgRe1TEtpwkJjH/UvgK3nTISVDPl8cZBA5Tsnv4WY+Yt2G9O2bXBV69EKQlA==", + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/button/-/button-24.6.5.tgz", + "integrity": "sha512-i+pgR0Gn6EWxLgWEQOi7yXXQSQklsr7a+yotlet1GOB+DymE+w9RVp4WOZ6T8yaqTICKcDQldFkreTzFVxsHAQ==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, "node_modules/@vaadin/checkbox": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/checkbox/-/checkbox-23.5.12.tgz", - "integrity": "sha512-PP9NWU1UoCRmtrLd+uMIEHkF3P3iLhISFd0Nx7+xHcdkhG8ap9QCDXFpxyTEdvbvfJyOKrkdHQRk4YcYtJHXLg==", + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/checkbox/-/checkbox-24.6.7.tgz", + "integrity": "sha512-/Vl5codokNdN5ku1l/iAkdjUmYTUZGKyAleHjM7V3ZFpwkK2IoWN4HrbWyhPuf1gL3T85bKMLSPuYoOX/ymrFw==", + "license": "Apache-2.0", "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/field-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/field-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, "node_modules/@vaadin/combo-box": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/combo-box/-/combo-box-23.5.12.tgz", - "integrity": "sha512-GtTiehNhw2BGOIflBLgmglY8CfYVtTa2fQBuWEUKrGmLTNlseM9EOPxV20ec3PJ/uMHPnEhMl/MOeQ8iMs2cfQ==", + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/combo-box/-/combo-box-24.6.5.tgz", + "integrity": "sha512-u/xC9QegwWgmw9TutPRoIzeBpUgG6Kt9CmJbNZNeWBrP9Nicz/QAawApynvjWQtmm7zIKXp7SPzW1Gqwpe09mQ==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/field-base": "~23.5.12", - "@vaadin/input-container": "~23.5.12", - "@vaadin/item": "~23.5.12", - "@vaadin/lit-renderer": "~23.5.12", - "@vaadin/overlay": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/field-base": "~24.6.5", + "@vaadin/input-container": "~24.6.5", + "@vaadin/item": "~24.6.5", + "@vaadin/lit-renderer": "~24.6.5", + "@vaadin/overlay": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, "node_modules/@vaadin/component-base": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-23.5.12.tgz", - "integrity": "sha512-gOPz4/gPX5I5L5jeBFCqNc3rSDveEVeHBkI/3Xm7CLq1nrkEOWBLkD/N/6UoaDE6e8qt0w4zLgh/iz/izy4Wug==", + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-24.6.7.tgz", + "integrity": "sha512-LcZQZEwouPDHBoXfXRREb1mRScsPSPeKTUZdgrXh180Piy57VzpNzslIMrdfVFSye9lLMs2/g2o8HCUDgnY/OQ==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", "@vaadin/vaadin-development-mode-detector": "^2.0.0", "@vaadin/vaadin-usage-statistics": "^2.1.0", - "lit": "^2.0.0" + "lit": "^3.0.0" } }, "node_modules/@vaadin/details": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/details/-/details-24.7.1.tgz", - "integrity": "sha512-bnS+UWdamfRoYaR0WxuXJhywC7YAQ5byxti8Jzqex26KEcsUHnm1aEFsCtQ0tYJbdH5cx9wC26gC3I7YoqbcpQ==", + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/details/-/details-24.6.5.tgz", + "integrity": "sha512-V22OCdRnT7qOVsVpedGfrwDPE9dFWdhFDv66RfkiWGHpPoq0+dYUpP2Y5Iy7YRCxqVnogVBiE8qHPgZAO4U18A==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.1", - "@vaadin/button": "~24.7.1", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-material-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/button": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/@vaadin/details/node_modules/@vaadin/button": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/button/-/button-24.7.1.tgz", - "integrity": "sha512-6t+KBKq/Qz1fEEgBVWRWTRFQkQCA8JBmS6ZMtrWLSoDyycaqlI1SjDHT/1jzIUGcXRVOI7TeZKyJ+fTZVWhNgg==", + "node_modules/@vaadin/field-base": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/field-base/-/field-base-24.6.7.tgz", + "integrity": "sha512-5MXpAQGZA15/hRdnZrJK5q5Mv8rgOraSyBpC/gjRJ1W1IQ5DrCcb3ltvPATguv0K3vpJwunXGXrGqm/+SGEk0w==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.1", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-material-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/@vaadin/component-base": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-24.7.1.tgz", - "integrity": "sha512-XO+35dd3OvxyIg9Q6YAeUCUtRFerLi0EWO4EiSYokEI2nJwv8gMtm7OWQzXjPXTbBzzWKLkKrIFdjnWP4c/HNQ==", + "node_modules/@vaadin/grid": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/grid/-/grid-24.6.5.tgz", + "integrity": "sha512-BlZO8+oWTmrnCbZESa73IbMuXfxQu7Viotd88NXY/ixq/8LiQqj2yNHtKTPz2l2QL1ke57ckFsjzN6w52nYc5g==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-development-mode-detector": "^2.0.0", - "@vaadin/vaadin-usage-statistics": "^2.1.0", + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/checkbox": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/lit-renderer": "~24.6.5", + "@vaadin/text-field": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/@vaadin/icon": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-24.7.1.tgz", - "integrity": "sha512-yg26hh1F4eteVv35FQw2k9ULNay/2IEH7pFctkp0EKftKbQQESkSQ4dp72lAUYKa/IgdzDs6eNGtj1vbbYc48g==", + "node_modules/@vaadin/icon": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-24.6.5.tgz", + "integrity": "sha512-y6Jy69nySb3tZqEIYAYpyGTiNkKS//ro+w6tuD0a0gu+GrfTv90XDNEY9FvGvnUHsM44OoiQRH3kD15kmISkxQ==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", + "@vaadin/component-base": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.7.1.tgz", - "integrity": "sha512-QRpUgD6XHbM7PAb8bDA9KEDdW5w2qQInvepd2/GWVwyO3PXdbPmPK8JWqDAIpMCe+TYdPEDVrc+IrhswOxOE8g==", + "node_modules/@vaadin/icons": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/icons/-/icons-24.6.5.tgz", + "integrity": "sha512-zd8KKkJ18EI70IQGoCz3hcQed+VFPnqECKci8vt+OJi1n5j7qzPW4sbEOLZxr6cWrnN1eNdSHfJCQWXrFfL0bQ==", + "license": "Apache-2.0", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/icon": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1" + "@vaadin/icon": "~24.6.5" } }, - "node_modules/@vaadin/details/node_modules/@vaadin/vaadin-material-styles": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.7.1.tgz", - "integrity": "sha512-5DJ6LY2hqcfYs8ZDMi0E5ZYvxPVO/lE9b4MpHIFfqTxq39lsqlWlw9sYue63T9NGicHBrPMWswO1jDYttTj4gQ==", + "node_modules/@vaadin/input-container": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/input-container/-/input-container-24.6.7.tgz", + "integrity": "sha512-376ZyD74jrKvjiM+gE0xNScyZPU7REMBbGXpmM4DpoLYgw60m01D3fliZaOTVDyXc3gvxWIai3L1vCY0KYpD6w==", + "license": "Apache-2.0", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1" + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.7.1.tgz", - "integrity": "sha512-V52WbXMB2+7fiG2HBlYxMIn+LwzSPAKnxcU/G1WAbv9jsKeTzutGUgzWo0R8RCC7L4fNAyyB8ogM5Hpak2vLUw==", + "node_modules/@vaadin/item": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/item/-/item-24.6.7.tgz", + "integrity": "sha512-9xpJEVhgHF3YQGVeet2uakMTH7SyEbQx+uT5Kld/r1CiCYOKUxbERXrFuJ/5/lgakXjDvN1d7rYDcjPb3CUfsQ==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/lit": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit/-/lit-3.2.1.tgz", - "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", + "node_modules/@vaadin/list-box": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/list-box/-/list-box-24.6.7.tgz", + "integrity": "sha512-yUBHonI6uD28l2h+CUh2KPzXe+Ptv6UWtNJIIevX/xkQhptquXzE01bVXlh1NcLVppnu21gaxFs/l+/rHlAKpw==", + "license": "Apache-2.0", "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.1.0", - "lit-html": "^3.2.0" + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/item": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/lit-element": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-4.1.1.tgz", - "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "node_modules/@vaadin/lit-renderer": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/lit-renderer/-/lit-renderer-24.6.7.tgz", + "integrity": "sha512-S9daJnGW/X+HBhOriENRYNf8hCFYABmea756onaLS0QoWLkaU3QVPKrhHjZtzNVf/15UcIeAx4C5JlIas2osFA==", + "license": "Apache-2.0", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.2.0" + "lit": "^3.0.0" } }, - "node_modules/@vaadin/details/node_modules/lit-html": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-3.2.1.tgz", - "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "node_modules/@vaadin/notification": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/notification/-/notification-24.6.5.tgz", + "integrity": "sha512-9OgYmZn3qU3pVMaoIRITNs6gymrnswYO7bk9+8e97o3W4A9TIcAO6F2HTgLO5ieMuuOI1DSlVCpXbrM3xBe8pw==", + "license": "Apache-2.0", "dependencies": { - "@types/trusted-types": "^2.0.2" + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.6.5", + "@vaadin/lit-renderer": "~24.6.5", + "@vaadin/overlay": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/field-base": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/field-base/-/field-base-23.5.12.tgz", - "integrity": "sha512-uhtoXH+qDv13319Mw/IEeLPyfjv3YUpF21P9v9oJVAPcDCC0OApZ2iwjqU1nHWizjke92+0NH1SiNTCiZcgQqA==", + "node_modules/@vaadin/overlay": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/overlay/-/overlay-24.6.7.tgz", + "integrity": "sha512-3HZ2+Ld/ktOzFt3Ug3EoZeMqX//uKh9rsXd1d3lQl18bwVtSvG81lY7NI6tEQ2dSuniM0yy2tM+mVnV4lZq9Gw==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "lit": "^2.0.0" + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/grid": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/grid/-/grid-23.5.12.tgz", - "integrity": "sha512-Uez5BEMWGsTTlLEFIMUS/Fqd4YougHh+pQn8GLnkPsD2Ky8sP3Bi4LV/jg4wVIjdPq8zFs60t7PPyJw+b6FcFA==", + "node_modules/@vaadin/popover": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/popover/-/popover-24.6.7.tgz", + "integrity": "sha512-GqdDsi+x6+6YNBNPC+BvrshrwXlcmL+nR8v5sY+l1TMPVKNWFb2579Qzc9vvu7jMOr2rQd3F+ZjPoMAqgwuZHw==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/checkbox": "~23.5.12", - "@vaadin/component-base": "~23.5.12", - "@vaadin/lit-renderer": "~23.5.12", - "@vaadin/text-field": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/lit-renderer": "~24.6.7", + "@vaadin/overlay": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/grid/node_modules/@vaadin/text-field": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/text-field/-/text-field-23.5.12.tgz", - "integrity": "sha512-1u4tzl0wfeYkKE4fRzUmYtPAdg53OtAlFxkh+BGBllAlC6wZqH4C4gsLLPXrRQiiqIEiDI3nLH5PI66Ab5QvlQ==", + "node_modules/@vaadin/progress-bar": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/progress-bar/-/progress-bar-24.6.5.tgz", + "integrity": "sha512-lJPRV1SAP0Z46pcgQ9RiV8ZVqytDpIDZ7oMJW7WsjS70CAlrqJZF0JoJ3WoqUrHasNhxU7jjx+iXVXw7CzRrDg==", + "license": "Apache-2.0", "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/field-base": "~23.5.12", - "@vaadin/input-container": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/component-base": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/icon": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-23.5.12.tgz", - "integrity": "sha512-ml7bPANrZ9bA8BQaVLMWx9UPvthsQv1pn2+/coZ9U9IuUeMAz0R2DH10jJg1v0W1rCS3ZfGUUJbrCZ8kBFS9Ww==", + "node_modules/@vaadin/scroller": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/scroller/-/scroller-24.6.7.tgz", + "integrity": "sha512-JLqrJCVcfo3GELWd8xNLGif+xz4WpiodPn4uW5/kI3lqLKYg7RKhEu9dg1zRpSEUou5SVFQCMB9m+D1AwyoQGQ==", + "license": "Apache-2.0", "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12", - "lit": "^2.0.0" + "@vaadin/a11y-base": "~24.6.7", + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-material-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/icons": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/icons/-/icons-23.5.12.tgz", - "integrity": "sha512-ecY/dZ4coYblW+SzQFQ6xFjrNXE/Azj5zrnCFTnMU2Zu56ZRFF+52lYW3BSfo9OYGWVmS7V9QMphxXUgQQYWkg==", + "node_modules/@vaadin/select": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/select/-/select-24.6.5.tgz", + "integrity": "sha512-dDVv4d4QLs7EZEJuOkBI/wjmR7mZ5TyUacCKmscq+Ke7DQrq46DuCUjj82+OSFC7z2m3+v5wflfVMciQehR1+Q==", + "license": "Apache-2.0", "dependencies": { - "@polymer/iron-icon": "^3.0.0", - "@polymer/iron-iconset-svg": "^3.0.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/icon": "~23.5.12" + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.2.0", + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/button": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/field-base": "~24.6.5", + "@vaadin/input-container": "~24.6.5", + "@vaadin/item": "~24.6.5", + "@vaadin/list-box": "~24.6.5", + "@vaadin/lit-renderer": "~24.6.5", + "@vaadin/overlay": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/input-container": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/input-container/-/input-container-23.5.12.tgz", - "integrity": "sha512-6oSTGfGTXdyLvVb/9KyhWKZYQirYlSrl/j9UuAOtTKNbD8rcyaEpHpvm7qQ43syRl0TcA5YD8/OsgESisuzubg==", + "node_modules/@vaadin/tabs": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/tabs/-/tabs-24.6.5.tgz", + "integrity": "sha512-svUqDjwzlnKsAOYB0szST4Tjhspnb007bMf16fhmkM12u3KK053hEZ2TYX7lNVFLC3RiDvGa8i6nCAK2SVXCDQ==", + "license": "Apache-2.0", "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/item": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/item": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/item/-/item-23.5.12.tgz", - "integrity": "sha512-V/57uCdVH/0KwydCeTWiTyIv1phBzQZUnwKNEE0mTTac2r+aYUQ+n3DXyeEiHAVnA4AZZRpMM0zUC6Dzrzzbqw==", + "node_modules/@vaadin/tabsheet": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/tabsheet/-/tabsheet-24.6.5.tgz", + "integrity": "sha512-dn4RFFdK+7Hu6Hhq/V0jb1pwwcLxipgMjAmYGsot4vapqFKSdqea1WpVo6TvVkGXCg3TIrYq5SRbzrIzh9FEzg==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/component-base": "~24.6.5", + "@vaadin/scroller": "~24.6.5", + "@vaadin/tabs": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/list-box": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/list-box/-/list-box-23.5.12.tgz", - "integrity": "sha512-/ACapy8n0oKQYYhFpQXFWdDAREFJPSpqVS6osepDdCYup9i8XRIlvnETS+s474ksuFUYTxXLNJoLpmA+7B0HMQ==", + "node_modules/@vaadin/text-field": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/text-field/-/text-field-24.6.5.tgz", + "integrity": "sha512-zujt5k6i6pkVbfUiQlYWBGa/MUAmWeq0xhDLgHIapzUlEIq6gf67KFwEfhfmwdVzGQImFTTKUBWhO4DERRF0Nw==", + "license": "Apache-2.0", "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/item": "~23.5.12", - "@vaadin/vaadin-list-mixin": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/field-base": "~24.6.5", + "@vaadin/input-container": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", + "lit": "^3.0.0" } }, - "node_modules/@vaadin/lit-renderer": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/lit-renderer/-/lit-renderer-23.5.12.tgz", - "integrity": "sha512-7DBeiauuIXlfnnZXTkVIpSMRiMWwFRs/GhT2ADXlg2PMtSmYXcQONH3I9i4EbzgZMHLfH79SX4J9O4gjUBOk/A==", - "dependencies": { - "lit": "^2.0.0" - } - }, - "node_modules/@vaadin/notification": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/notification/-/notification-23.5.12.tgz", - "integrity": "sha512-ck81mhI4qPtLYjsDBXnju8cdURDexHuxu9v58oTtMQLWvoE9QNYAxIWp6mC0pFOxlze36JM++xFnJoZODJH90g==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/lit-renderer": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12", - "lit": "^2.0.0" - } - }, - "node_modules/@vaadin/overlay": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/overlay/-/overlay-23.5.12.tgz", - "integrity": "sha512-EsMh6EW5oyyZTnxzRl8vJXiCwniiBhfg/NnlVvUrbO9X1XoBCswQDSgHLK+cim2pxuOr9H7ekJ/844U/Eic5zA==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/progress-bar": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/progress-bar/-/progress-bar-23.5.12.tgz", - "integrity": "sha512-9QHDq84xBggklSUpRE6dDS6BEO/4aQFEB1u8qJCPJ2ysAqmorkDbxmKgrXDhsPwYjR8cnNMqebgVfnnw1+I/pA==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/scroller": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/scroller/-/scroller-23.5.12.tgz", - "integrity": "sha512-jL091wLIyR9xkYekk9cnYhn9qsLLHxjbXBZVgZIF6M2LvpsJS5KG79404gTwBNLERSlqrxbvkL43yKsc/z1Ktw==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/select": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/select/-/select-23.5.12.tgz", - "integrity": "sha512-ZHePOvPVR6+ICP5xKMkaltX/4AFxxyKsFqT1y4fYnhPfwbLNFFUvw7G9OoNMRQHLwwZtLItkF6QDndfWVnqGrw==", - "dependencies": { - "@polymer/polymer": "^3.2.0", - "@vaadin/button": "~23.5.12", - "@vaadin/component-base": "~23.5.12", - "@vaadin/field-base": "~23.5.12", - "@vaadin/input-container": "~23.5.12", - "@vaadin/item": "~23.5.12", - "@vaadin/list-box": "~23.5.12", - "@vaadin/lit-renderer": "~23.5.12", - "@vaadin/overlay": "~23.5.12", - "@vaadin/vaadin-list-mixin": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/tabs": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/tabs/-/tabs-23.5.12.tgz", - "integrity": "sha512-UYlnqzIVGwvbjEzzUDcXHKAcA4dDV/z3jBzMF9xtKu5xXy+GA13Pu7DsIN3W+Pub1wI8wUZOLRyfkdJUH3emng==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/item": "~23.5.12", - "@vaadin/vaadin-list-mixin": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/tabsheet": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/tabsheet/-/tabsheet-23.5.12.tgz", - "integrity": "sha512-sx3V8mhyg6H/1rfe/yyXJDkxIf8Pbjkd6c973cDh2jwBBcMiqesGeL0ktLwuvEeov4WrgPrgBcjxdyXDOwju7g==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/field-base": "~23.5.12", - "@vaadin/scroller": "~23.5.12", - "@vaadin/tabs": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/text-field": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/text-field/-/text-field-24.7.1.tgz", - "integrity": "sha512-kz9kOWn4Z/VI3DxOHn0Bl+CfDwWvbMNbN9tW32eVPuNpa8qBttLV4LV+NzbSuOEiFW7AweIKspsL0YM7Ywnl9Q==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.1", - "@vaadin/component-base": "~24.7.1", - "@vaadin/field-base": "~24.7.1", - "@vaadin/input-container": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-material-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/component-base": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/component-base/-/component-base-24.7.1.tgz", - "integrity": "sha512-XO+35dd3OvxyIg9Q6YAeUCUtRFerLi0EWO4EiSYokEI2nJwv8gMtm7OWQzXjPXTbBzzWKLkKrIFdjnWP4c/HNQ==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-development-mode-detector": "^2.0.0", - "@vaadin/vaadin-usage-statistics": "^2.1.0", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/field-base": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/field-base/-/field-base-24.7.1.tgz", - "integrity": "sha512-V5C+aHlKzgNzmvS/N3ZMElZUpRmdt+Lvibns6VZnjm7jeOsCFql0LQTRNOSWuNuzGGO0jgc1mT/rsGW0uLqg5A==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "@polymer/polymer": "^3.0.0", - "@vaadin/a11y-base": "~24.7.1", - "@vaadin/component-base": "~24.7.1", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/icon": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-24.7.1.tgz", - "integrity": "sha512-yg26hh1F4eteVv35FQw2k9ULNay/2IEH7pFctkp0EKftKbQQESkSQ4dp72lAUYKa/IgdzDs6eNGtj1vbbYc48g==", + "node_modules/@vaadin/tooltip": { + "version": "24.6.5", + "resolved": "https://registry.npmmirror.com/@vaadin/tooltip/-/tooltip-24.6.5.tgz", + "integrity": "sha512-IPcMN61PO+u9IgHyM3GCqrzSUQUo13Tysvp58Z7OvtZg/IgQpcEtWkC2m+Qg9rwJAZu/x37Qfd/8on0TQWzlMg==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/input-container": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/input-container/-/input-container-24.7.1.tgz", - "integrity": "sha512-9L3ZprqOu4yyQ5VN5XdeP0OIoAIa6FJa+tOENVR2FrUngV8jLzCrBo48ZmZOZnB6VnjRPLhPfGYytjd1EuaOxw==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-lumo-styles": "~24.7.1", - "@vaadin/vaadin-material-styles": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1", - "lit": "^3.0.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/vaadin-lumo-styles": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.7.1.tgz", - "integrity": "sha512-QRpUgD6XHbM7PAb8bDA9KEDdW5w2qQInvepd2/GWVwyO3PXdbPmPK8JWqDAIpMCe+TYdPEDVrc+IrhswOxOE8g==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/icon": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/vaadin-material-styles": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.7.1.tgz", - "integrity": "sha512-5DJ6LY2hqcfYs8ZDMi0E5ZYvxPVO/lE9b4MpHIFfqTxq39lsqlWlw9sYue63T9NGicHBrPMWswO1jDYttTj4gQ==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~24.7.1", - "@vaadin/vaadin-themable-mixin": "~24.7.1" - } - }, - "node_modules/@vaadin/text-field/node_modules/@vaadin/vaadin-themable-mixin": { - "version": "24.7.1", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.7.1.tgz", - "integrity": "sha512-V52WbXMB2+7fiG2HBlYxMIn+LwzSPAKnxcU/G1WAbv9jsKeTzutGUgzWo0R8RCC7L4fNAyyB8ogM5Hpak2vLUw==", - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", + "@vaadin/a11y-base": "~24.6.5", + "@vaadin/component-base": "~24.6.5", + "@vaadin/overlay": "~24.6.5", + "@vaadin/popover": "~24.6.5", + "@vaadin/vaadin-lumo-styles": "~24.6.5", + "@vaadin/vaadin-material-styles": "~24.6.5", + "@vaadin/vaadin-themable-mixin": "~24.6.5", "lit": "^3.0.0" } }, - "node_modules/@vaadin/text-field/node_modules/lit": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit/-/lit-3.2.1.tgz", - "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", - "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.1.0", - "lit-html": "^3.2.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/lit-element": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-4.1.1.tgz", - "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.2.0" - } - }, - "node_modules/@vaadin/text-field/node_modules/lit-html": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-3.2.1.tgz", - "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/@vaadin/tooltip": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/tooltip/-/tooltip-23.5.12.tgz", - "integrity": "sha512-yLBaNIPuor41Fsdg5frjvtwuEsix8jtQ2drxdywanR3JrDWjTjSoCz+X5xT7IXkcRfX4kb9ZKPglmTp/RTIvWQ==", - "dependencies": { - "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12", - "@vaadin/overlay": "~23.5.12", - "@vaadin/vaadin-lumo-styles": "~23.5.12", - "@vaadin/vaadin-material-styles": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/vaadin-combo-box": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-combo-box/-/vaadin-combo-box-23.5.12.tgz", - "integrity": "sha512-BmiwyZzFvZNJ4rMIlEIFSwHcWKGUDfYHVfuEpddwmrYwXwYdI39Pw2+3rrtKc7Qfh4p7VyRhVkIJxPFTpK3iHg==", - "dependencies": { - "@vaadin/combo-box": "~23.5.12" - } - }, "node_modules/@vaadin/vaadin-development-mode-detector": { "version": "2.0.7", "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", - "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==" - }, - "node_modules/@vaadin/vaadin-grid": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-grid/-/vaadin-grid-23.5.12.tgz", - "integrity": "sha512-CwkbUCZ7tRPB2HVojBnknxgC6Lc42iOJgcCTV6ATX92iLI1JE4SbkYx8n60nSi/9n+AdC0owzYTdLmn1oOM5yg==", - "dependencies": { - "@vaadin/grid": "~23.5.12" - } + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", + "license": "Apache-2.0" }, - "node_modules/@vaadin/vaadin-list-mixin": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-list-mixin/-/vaadin-list-mixin-23.5.12.tgz", - "integrity": "sha512-FF/Po0aoyRJ7uPDN/9ENyDs2TI+hXhmRlw/NP/QbDe3SAJT8e4KjX8w3A1CByIeT2GwsxIad4JRe6cgZr+2tfQ==", + "node_modules/@vaadin/vaadin-lumo-styles": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.6.7.tgz", + "integrity": "sha512-DNamU8cVxbaVn3HfRm3pN8ul95xvaem92ByVeEQwdvKaHwLI4m7AdSWKEA+13ST9TdBtCeDW6DjmtGcoEqbqiw==", + "license": "Apache-2.0", "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/component-base": "~23.5.12" + "@vaadin/component-base": "~24.6.7", + "@vaadin/icon": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7" } }, - "node_modules/@vaadin/vaadin-lumo-styles": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-23.5.12.tgz", - "integrity": "sha512-EBWkiemVpbIItNs/FsKWdi4OA/1MliUvEuRlBvMaLEprbcq0NVlxmYUM3H+LHpWU8DnUic7aTo4v0wGULIwotA==", + "node_modules/@vaadin/vaadin-lumo-styles/node_modules/@vaadin/icon": { + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/icon/-/icon-24.6.7.tgz", + "integrity": "sha512-+Cv3hLyFSXJAhnuGuPQ+hQcv9/ijZpIprJ6rqWeChvFk+bQOoPgUPx/tj67mOiTcrmV5hYt+dYs4QM7JZ//dGg==", + "license": "Apache-2.0", "dependencies": { - "@polymer/iron-icon": "^3.0.0", - "@polymer/iron-iconset-svg": "^3.0.0", + "@open-wc/dedupe-mixin": "^1.3.0", "@polymer/polymer": "^3.0.0", - "@vaadin/icon": "~23.5.12", - "@vaadin/vaadin-themable-mixin": "~23.5.12" + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-lumo-styles": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7", + "lit": "^3.0.0" } }, "node_modules/@vaadin/vaadin-material-styles": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-23.5.12.tgz", - "integrity": "sha512-K1kEcTRmkKhEFIhJXcp7zUslNa7+R6i778FTJqzRNmKoslBFgmkRYJQbKjbcogFnRjyy2okXVz+5do5Sgnd2ZA==", + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.6.7.tgz", + "integrity": "sha512-7ecHOEZrFEbUz5UVSGapOt/uC7lSYV05RADCNhG16c+WsuN+oxkGIIaThMMCdBcclg5ej/BeTxZlZha8JoNO3g==", + "license": "Apache-2.0", "dependencies": { "@polymer/polymer": "^3.0.0", - "@vaadin/vaadin-themable-mixin": "~23.5.12" - } - }, - "node_modules/@vaadin/vaadin-select": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-select/-/vaadin-select-23.5.12.tgz", - "integrity": "sha512-K/ivIwKdXD+sTuypSXk9iYjRpO+Df2qJ+G3KKphht2jBKQxYKfvsBV7B1Gn/wZ4oJiHhxQiSlnYuoo1IHNfhlg==", - "dependencies": { - "@vaadin/select": "~23.5.12" + "@vaadin/component-base": "~24.6.7", + "@vaadin/vaadin-themable-mixin": "~24.6.7" } }, "node_modules/@vaadin/vaadin-themable-mixin": { - "version": "23.5.12", - "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-23.5.12.tgz", - "integrity": "sha512-WVh8AIeZWKXF+pezTcLTlx6/DIIk2UXQ3AP2crhxSjeS/4qk5VMLsHekhTdCUcaHymsWgbwFAlRJemmY2/EO9Q==", + "version": "24.6.7", + "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.6.7.tgz", + "integrity": "sha512-fiVBvJWInNBq/oXeE0UAQmzadQ7UJE3ns768D1taKOwTMOxiio1UMoUXcVGwni9ASzXrd96S7F6c4aIaVqNx6A==", + "license": "Apache-2.0", "dependencies": { "@open-wc/dedupe-mixin": "^1.3.0", - "lit": "^2.0.0" + "lit": "^3.0.0" } }, "node_modules/@vaadin/vaadin-usage-statistics": { @@ -1739,6 +1818,7 @@ "resolved": "https://registry.npmmirror.com/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@vaadin/vaadin-development-mode-detector": "^2.0.0" }, @@ -1750,6 +1830,7 @@ "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" @@ -1758,22 +1839,26 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1783,12 +1868,14 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1800,6 +1887,7 @@ "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1808,6 +1896,7 @@ "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -1815,12 +1904,14 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1836,6 +1927,7 @@ "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", @@ -1848,6 +1940,7 @@ "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", @@ -1859,6 +1952,7 @@ "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", @@ -1872,6 +1966,7 @@ "version": "1.14.1", "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" @@ -1880,13 +1975,15 @@ "node_modules/@webcomponents/shadycss": { "version": "1.11.2", "resolved": "https://registry.npmmirror.com/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", - "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==" + "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", + "license": "BSD-3-Clause" }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz", "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -1900,6 +1997,7 @@ "resolved": "https://registry.npmmirror.com/@webpack-cli/info/-/info-2.0.2.tgz", "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -1913,6 +2011,7 @@ "resolved": "https://registry.npmmirror.com/@webpack-cli/serve/-/serve-2.0.5.tgz", "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.15.0" }, @@ -1929,17 +2028,44 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1951,6 +2077,7 @@ "version": "8.17.1", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -1966,6 +2093,7 @@ "version": "2.1.1", "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, @@ -1982,6 +2110,7 @@ "version": "5.1.0", "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -1989,11 +2118,25 @@ "ajv": "^8.8.2" } }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2003,6 +2146,7 @@ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2013,10 +2157,32 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, "node_modules/array-union": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz", "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "license": "MIT", "dependencies": { "array-uniq": "^1.0.1" }, @@ -2028,6 +2194,7 @@ "version": "1.0.3", "resolved": "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2035,18 +2202,77 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2057,6 +2283,7 @@ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2082,6 +2309,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -2098,22 +2326,65 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/camel-case": { "version": "4.1.2", "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, + "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001706", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001706.tgz", - "integrity": "sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==", + "version": "1.0.30001707", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", "funding": [ { "type": "opencollective", @@ -2127,13 +2398,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2145,10 +2418,36 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "engines": { "node": ">=6.0" } @@ -2158,6 +2457,7 @@ "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz", "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, + "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, @@ -2169,6 +2469,7 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", + "license": "MIT", "dependencies": { "del": "^4.1.1" }, @@ -2184,6 +2485,7 @@ "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -2198,6 +2500,7 @@ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2209,58 +2512,154 @@ "version": "1.1.4", "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": ">= 0.6" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/compression": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.8.0.tgz", + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 8" + "node": ">= 0.8.0" } }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", @@ -2296,6 +2695,7 @@ "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -2312,6 +2712,7 @@ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -2323,6 +2724,7 @@ "version": "3.0.0", "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -2334,6 +2736,7 @@ "version": "5.7.0", "resolved": "https://registry.npmmirror.com/d3/-/d3-5.7.0.tgz", "integrity": "sha512-8KEIfx+dFm8PlbJN9PI0suazrZ41QcaAufsKE9PRcqYPWLngHIyWJZX96n6IQKePGgeSu0l7rtlueSSNq8Zc3g==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1", "d3-axis": "1", @@ -2371,17 +2774,20 @@ "node_modules/d3-array": { "version": "1.2.4", "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==", + "license": "BSD-3-Clause" }, "node_modules/d3-axis": { "version": "1.0.12", "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-1.0.12.tgz", - "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==" + "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-brush": { "version": "1.1.6", "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-1.1.6.tgz", "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-drag": "1", @@ -2394,6 +2800,7 @@ "version": "1.0.6", "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-1.0.6.tgz", "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1", "d3-path": "1" @@ -2402,17 +2809,20 @@ "node_modules/d3-collection": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==", + "license": "BSD-3-Clause" }, "node_modules/d3-color": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-1.4.1.tgz", - "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==" + "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==", + "license": "BSD-3-Clause" }, "node_modules/d3-contour": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-1.3.2.tgz", "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^1.1.1" } @@ -2420,12 +2830,14 @@ "node_modules/d3-dispatch": { "version": "1.0.6", "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" + "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==", + "license": "BSD-3-Clause" }, "node_modules/d3-drag": { "version": "1.2.5", "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-1.2.5.tgz", "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-selection": "1" @@ -2435,6 +2847,7 @@ "version": "1.2.0", "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-1.2.0.tgz", "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==", + "license": "BSD-3-Clause", "dependencies": { "commander": "2", "iconv-lite": "0.4", @@ -2455,12 +2868,14 @@ "node_modules/d3-ease": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-1.0.7.tgz", - "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==" + "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-fetch": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-1.2.0.tgz", "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "license": "BSD-3-Clause", "dependencies": { "d3-dsv": "1" } @@ -2469,6 +2884,7 @@ "version": "1.2.1", "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-1.2.1.tgz", "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", + "license": "BSD-3-Clause", "dependencies": { "d3-collection": "1", "d3-dispatch": "1", @@ -2479,12 +2895,14 @@ "node_modules/d3-format": { "version": "1.4.5", "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-geo": { "version": "1.12.1", "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-1.12.1.tgz", "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1" } @@ -2492,12 +2910,14 @@ "node_modules/d3-hierarchy": { "version": "1.1.9", "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-interpolate": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz", "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1" } @@ -2505,27 +2925,32 @@ "node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" }, "node_modules/d3-polygon": { "version": "1.0.6", "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-1.0.6.tgz", - "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==" + "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-quadtree": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" + "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==", + "license": "BSD-3-Clause" }, "node_modules/d3-random": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-1.1.2.tgz", - "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==" + "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-scale": { "version": "2.2.2", "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-2.2.2.tgz", "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "^1.2.0", "d3-collection": "1", @@ -2539,6 +2964,7 @@ "version": "1.5.0", "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1", "d3-interpolate": "1" @@ -2547,12 +2973,14 @@ "node_modules/d3-selection": { "version": "1.4.2", "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==", + "license": "BSD-3-Clause" }, "node_modules/d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" } @@ -2560,12 +2988,14 @@ "node_modules/d3-time": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==", + "license": "BSD-3-Clause" }, "node_modules/d3-time-format": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-2.3.0.tgz", "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-time": "1" } @@ -2573,12 +3003,14 @@ "node_modules/d3-timer": { "version": "1.0.10", "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" + "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==", + "license": "BSD-3-Clause" }, "node_modules/d3-transition": { "version": "1.3.2", "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-1.3.2.tgz", "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==", + "license": "BSD-3-Clause", "dependencies": { "d3-color": "1", "d3-dispatch": "1", @@ -2591,12 +3023,14 @@ "node_modules/d3-voronoi": { "version": "1.1.4", "resolved": "https://registry.npmmirror.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz", - "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==" + "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==", + "license": "BSD-3-Clause" }, "node_modules/d3-zoom": { "version": "1.8.3", "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-1.8.3.tgz", "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "1", "d3-drag": "1", @@ -2609,15 +3043,50 @@ "version": "0.8.5", "resolved": "https://registry.npmmirror.com/dagre/-/dagre-0.8.5.tgz", "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "license": "MIT", "dependencies": { "graphlib": "^2.1.8", "lodash": "^4.17.15" } }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/del": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/del/-/del-4.1.1.tgz", "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "license": "MIT", "dependencies": { "@types/glob": "^7.1.1", "globby": "^6.1.0", @@ -2631,11 +3100,53 @@ "node": ">=6" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, + "license": "MIT", "dependencies": { "utila": "~0.4" } @@ -2645,6 +3156,7 @@ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -2659,6 +3171,7 @@ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -2673,13 +3186,15 @@ "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "4.3.1", "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -2695,6 +3210,7 @@ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -2709,20 +3225,55 @@ "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.120", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.120.tgz", - "integrity": "sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==" + "version": "1.5.126", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.126.tgz", + "integrity": "sha512-AtH1uLcTC72LA4vfYcEJJkrMk/MY/X0ub8Hv7QGAePW2JkeUFHEL/QfS4J77R6M87Sss8O0OcqReSaN1bpyA+Q==", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2736,6 +3287,7 @@ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -2748,6 +3300,7 @@ "resolved": "https://registry.npmmirror.com/envinfo/-/envinfo-7.14.0.tgz", "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -2755,23 +3308,66 @@ "node": ">=4" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.6.0", "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -2784,6 +3380,7 @@ "version": "4.3.0", "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2795,6 +3392,7 @@ "version": "5.3.0", "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2803,22 +3401,113 @@ "version": "4.3.0", "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.0.6", @@ -2833,22 +3522,38 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2856,11 +3561,31 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2874,29 +3599,148 @@ "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "dev": true, + "license": "Unlicense" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2912,15 +3756,30 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz", "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "license": "MIT", "dependencies": { "array-union": "^1.0.1", "glob": "^7.0.3", @@ -2936,36 +3795,74 @@ "version": "2.3.0", "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphlib": { + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphlib": { "version": "2.1.8", "resolved": "https://registry.npmmirror.com/graphlib/-/graphlib-2.1.8.tgz", "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", "dependencies": { "lodash": "^4.17.15" } }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -2978,15 +3875,80 @@ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "license": "MIT", "bin": { "he": "bin/he" } }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.3", + "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.5.3.tgz", + "integrity": "sha512-D3AfvN7SjhTgBSA8L1BN4FpPzuEd06uy4lHwSoRWr0lndi9BKaNzPLKGOWZ2ocSGguozr08TTb2jhCLHaemruw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-loader": { "version": "5.1.0", "resolved": "https://registry.npmmirror.com/html-loader/-/html-loader-5.1.0.tgz", "integrity": "sha512-Jb3xwDbsm0W3qlXrCZwcYqYGnYz55hb6aoKQTlzyZPXsPpi6tHXzAfqalecglMQgNvtEfxrCQPaKT90Irt5XDA==", "dev": true, + "license": "MIT", "dependencies": { "html-minifier-terser": "^7.2.0", "parse5": "^7.1.2" @@ -3007,6 +3969,7 @@ "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", @@ -3028,6 +3991,7 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -3037,6 +4001,7 @@ "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -3069,6 +4034,7 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } @@ -3078,6 +4044,7 @@ "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, + "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -3106,6 +4073,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -3118,14 +4086,97 @@ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.9", + "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -3137,6 +4188,7 @@ "version": "5.1.0", "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -3149,6 +4201,7 @@ "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -3168,6 +4221,7 @@ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3176,7 +4230,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/inline-chunk-html-plugin": { "version": "1.1.1", @@ -3190,15 +4245,40 @@ "resolved": "https://registry.npmmirror.com/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3209,11 +4289,51 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3222,6 +4342,7 @@ "version": "2.2.0", "resolved": "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz", "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3230,6 +4351,7 @@ "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "license": "MIT", "dependencies": { "is-path-inside": "^2.1.0" }, @@ -3241,6 +4363,7 @@ "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-2.1.0.tgz", "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "license": "MIT", "dependencies": { "path-is-inside": "^1.0.2" }, @@ -3248,11 +4371,25 @@ "node": ">=6" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -3260,16 +4397,51 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3278,6 +4450,7 @@ "version": "27.5.1", "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -3291,6 +4464,7 @@ "version": "8.1.1", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3304,46 +4478,63 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/launch-editor": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.10.0.tgz", + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/lit": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/lit/-/lit-2.8.0.tgz", - "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/lit/-/lit-3.2.1.tgz", + "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", + "license": "BSD-3-Clause", "dependencies": { - "@lit/reactive-element": "^1.6.0", - "lit-element": "^3.3.0", - "lit-html": "^2.8.0" + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.1.0", + "lit-html": "^3.2.0" } }, "node_modules/lit-element": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-3.3.3.tgz", - "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", + "license": "BSD-3-Clause", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.1.0", - "@lit/reactive-element": "^1.3.0", - "lit-html": "^2.8.0" + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.2.0" } }, "node_modules/lit-html": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-2.8.0.tgz", - "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", + "license": "BSD-3-Clause", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -3352,6 +4543,7 @@ "version": "4.3.0", "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -3361,6 +4553,7 @@ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3371,27 +4564,84 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -3400,10 +4650,24 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -3412,6 +4676,7 @@ "version": "2.1.35", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -3419,10 +4684,28 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3430,6 +4713,27 @@ "node": "*" } }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", @@ -3440,6 +4744,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -3447,31 +4752,78 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -3483,23 +4835,103 @@ "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3515,6 +4947,7 @@ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3526,15 +4959,31 @@ "version": "2.1.0", "resolved": "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz", "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3544,6 +4993,7 @@ "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -3554,6 +5004,7 @@ "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.2.1.tgz", "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -3561,11 +5012,22 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -3576,6 +5038,7 @@ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3584,6 +5047,7 @@ "version": "1.0.1", "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3591,12 +5055,14 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3605,18 +5071,28 @@ "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3628,6 +5104,7 @@ "version": "4.0.1", "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3636,6 +5113,7 @@ "version": "2.0.4", "resolved": "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3644,6 +5122,7 @@ "version": "2.0.1", "resolved": "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -3656,6 +5135,7 @@ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -3681,6 +5161,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -3694,6 +5175,7 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -3705,6 +5187,7 @@ "version": "4.2.0", "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", @@ -3721,6 +5204,7 @@ "version": "3.2.1", "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { "postcss-selector-parser": "^7.0.0" }, @@ -3735,6 +5219,7 @@ "version": "4.0.0", "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -3749,6 +5234,7 @@ "version": "7.1.0", "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3760,12 +5246,14 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/prettier": { "version": "3.5.3", "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.5.3.tgz", "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -3781,24 +5269,128 @@ "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/rechoir": { "version": "0.8.0", "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.8.0.tgz", "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.20.0" }, @@ -3811,6 +5403,7 @@ "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -3820,6 +5413,7 @@ "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -3832,15 +5426,24 @@ "version": "2.0.2", "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -3861,6 +5464,7 @@ "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -3873,15 +5477,27 @@ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -3892,7 +5508,8 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -3911,17 +5528,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.0.tgz", "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -3936,10 +5556,32 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3947,19 +5589,155 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -3971,6 +5749,7 @@ "version": "2.0.0", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3982,14 +5761,124 @@ "version": "3.0.0", "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3998,6 +5887,7 @@ "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -4006,16 +5896,120 @@ "version": "0.5.21", "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4023,10 +6017,21 @@ "node": ">=8" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/style-loader": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/style-loader/-/style-loader-4.0.0.tgz", "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "license": "MIT", "engines": { "node": ">= 18.12.0" }, @@ -4043,6 +6048,7 @@ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -4055,6 +6061,7 @@ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4066,6 +6073,7 @@ "version": "2.2.1", "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4074,6 +6082,7 @@ "version": "5.39.0", "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.0.tgz", "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -4091,6 +6100,7 @@ "version": "5.3.14", "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", @@ -4120,11 +6130,19 @@ } } }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4132,11 +6150,22 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-loader": { "version": "9.5.2", "resolved": "https://registry.npmmirror.com/ts-loader/-/ts-loader-9.5.2.tgz", "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", @@ -4157,6 +6186,7 @@ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } @@ -4165,13 +6195,29 @@ "version": "2.8.1", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } }, "node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.2.tgz", "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4180,6 +6226,16 @@ "node": ">=14.17" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -4198,6 +6254,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" @@ -4212,18 +6269,51 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz", "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz", "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -4232,10 +6322,21 @@ "node": ">=10.13.0" } }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.98.0.tgz", "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -4282,6 +6383,7 @@ "resolved": "https://registry.npmmirror.com/webpack-cli/-/webpack-cli-5.1.4.tgz", "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^2.1.1", @@ -4327,15 +6429,118 @@ "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -4349,14 +6554,41 @@ "version": "3.2.3", "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -4371,12 +6603,36 @@ "version": "2.0.1", "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/package.json b/plugins/tensorboard-plugins/tb_graph_ascend/fe/package.json index 88c7bfb3c7d5874ab788f28c19c0c6ac4b5f7c53..318bc7bff89d2c8e3dfeace0995738c1a19af868 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/package.json +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/package.json @@ -25,7 +25,8 @@ "typescript": "^5.4.5", "webpack": "^5.96.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "4.15.1" + "webpack-dev-server": "4.15.1", + "ws": "8.13.0" }, "dependencies": { "@polymer/decorators": "^3.0.0", @@ -64,20 +65,19 @@ "@polymer/paper-tooltip": "^3.0.1", "@polymer/polymer": "^3.5.1", "@types/lodash": "^4.17.1", - "@vaadin/button": "^23.5.11", - "@vaadin/combo-box": "^23.5.11", - "@vaadin/details": "^24.6.5", - "@vaadin/icon": "^23.5.11", - "@vaadin/icons": "^23.5.11", - "@vaadin/notification": "^23.5.11", - "@vaadin/progress-bar": "^23.5.11", - "@vaadin/tabs": "^23.5.11", - "@vaadin/tabsheet": "^23.5.11", - "@vaadin/text-field": "^24.6.6", - "@vaadin/tooltip": "^23.5.11", - "@vaadin/vaadin-combo-box": "^23.5.12", - "@vaadin/vaadin-grid": "^23.5.11", - "@vaadin/vaadin-select": "^23.5.12", + "@vaadin/button": "24.6.5", + "@vaadin/combo-box": "24.6.5", + "@vaadin/details": "24.6.5", + "@vaadin/icon": "24.6.5", + "@vaadin/icons": "24.6.5", + "@vaadin/notification": "24.6.5", + "@vaadin/progress-bar": "24.6.5", + "@vaadin/tabs": "24.6.5", + "@vaadin/tabsheet": "24.6.5", + "@vaadin/text-field": "24.6.5", + "@vaadin/tooltip": "24.6.5", + "@vaadin/grid": "24.6.5", + "@vaadin/select": "24.6.5", "clean-webpack-plugin": "^4.0.0", "cross-env": "^7.0.3", "css-loader": "^7.1.2", @@ -85,7 +85,6 @@ "dagre": "^0.8.5", "lodash": "^4.17.21", "prettier": "^3.4.2", - "style-loader": "^4.0.0", - "ws": "8.13.0" + "style-loader": "^4.0.0" } } \ No newline at end of file diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/canceller.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/canceller.ts deleted file mode 100644 index bc840bb4a41ff268e2e59daf6a7dfb367e63ae5b..0000000000000000000000000000000000000000 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/canceller.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -export interface CancelResult { - value: T; - cancelled: boolean; -} - -/** - * A class that allows marking promises as cancelled. - * - * This can be useful to, e.g., prevent old network requests from - * stomping new ones and writing bad data. - * - * Usage: - * - * const canceller = new Canceller(); - * let myPromise: Promise = getPromise(); - * myPromise.then(canceller.cancellable(({value, cancelled} => { - * if (cancelled) { - * console.warn("Don't make promises you can't keep >:-{"); - * } - * console.log("Enjoy your value:", value); - * })); - * - * // If `myPromise` is resolved now, then `cancelled` will be `false`. - * canceller.cancelAll(); - * // If `myPromise` is resolved now, then `cancelled` will be `true`. - */ -export class Canceller { - /** - * How many times has `cancelAll` been called? - */ - private cancellationCount = 0; - /** - * Create a cancellable task. This returns a new function that, when - * invoked, will pass its argument to the provided function as well as - * a `cancelled` argument. This argument will be `false` unless and - * until `cancelAll` is invoked after the creation of this task. - */ - public cancellable(f: (result: CancelResult) => U): (T) => U { - const originalCancellationCount = this.cancellationCount; - return (value) => { - const cancelled = this.cancellationCount !== originalCancellationCount; - return f({ value, cancelled }); - }; - } - - /** - * Mark all outstanding tasks as cancelled. Tasks not yet created will - * not be affected. - */ - public cancelAll(): void { - this.cancellationCount++; - } -} diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/requestManager.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/requestManager.ts index 9fc04e490c230b38ed99020a42ebd60db48bf71b..a93256199001fa3d0bfaf539fc57871f0ac432a2 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/requestManager.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_backend/requestManager.ts @@ -15,7 +15,7 @@ limitations under the License. Copyright (c) 2025, Huawei Technologies. Adapt to the model hierarchical visualization data collected by the msprobe tool ==============================================================================*/ -import { safeJSONParse } from "../utils"; +import { safeJSONParse } from '../utils'; const FEATURE_FLAGS_HEADER_NAME = 'X-TensorBoard-Feature-Flags'; @@ -185,22 +185,6 @@ export class RequestManager { }); } - public clearQueue(): void { - while (this._queue.length > 0) { - this._queue.pop()?.reject(new RequestCancellationError('Request cancelled by clearQueue')); - } - } - - /* Return number of currently pending requests */ - public activeRequests(): number { - return this._nActiveRequests; - } - - /* Return total number of outstanding requests (includes queue) */ - public outstandingRequests(): number { - return this._nActiveRequests + this._queue.length; - } - /* Actually get promise from url using XMLHttpRequest */ protected _promiseFromUrl(url: string, requestOptions: RequestOptions): Promise { return new Promise((resolve, reject) => { diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/components/legend/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/components/legend/index.ts index c4e85d38e9e4158b26c8eb92eb7eb69eb36dee85..88e97a6a9a2835e52b21c4e53409860ff70a876a 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/components/legend/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/components/legend/index.ts @@ -38,15 +38,6 @@ class Legend extends PolymerElement { margin-left: 5px; font-size: 12px; } - .legend-clarifier { - } - .legend-item { - margin-right: 10px; - } - .legend-item-value { - margin-left: 5px; - font-size: 12px; - } .legend-clarifier { color: #266236; cursor: pointer; diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.html.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.html.ts index 769b67f53868fcb5d3f397e85af29d876245c634..7033d6b90ec811b090101933abccba2e0aa879f9 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.html.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.html.ts @@ -214,105 +214,6 @@ export const template = html` stroke-width: 4; } - .faded, - .faded rect, - .faded ellipse, - .faded path, - .faded use, - #rectHatch line, - #ellipseHatch line { - color: #e0d4b3 !important; - fill: white; - stroke: #e0d4b3 !important; - } - - .faded path { - stroke-width: 1px !important; - } - - .faded rect { - fill: url(#rectHatch) !important; - } - - .faded ellipse, - .faded use { - fill: url(#ellipseHatch) !important; - } - - .faded text { - opacity: 0; - } - - /* Rules used for input-tracing. */ - .input-highlight > * > rect, - .input-highlight > * > ellipse, - .input-highlight > * > use { - fill: white; - stroke: #ff9800 !important; - } - - /* - Faded non-input styling */ - .non-input > * > rect, - .non-input > * > ellipse, - .non-input > * > use, - /* For Const nodes. */ - .non-input > * > .constant:not([class*="input-highlight"]) > - .annotation-node > ellipse, - /* For styling of annotation nodes of non-input nodes. */ - .non-input > g > .annotation > .annotation-node > rect { - stroke: #e0d4b3 !important; - stroke-width: inherit; - stroke-dasharray: inherit; - } - - .non-input path { - visibility: hidden; - } - - .non-input > .nodeshape > rect, - .non-input > .annotation-node > rect, - /* For styling of annotation nodes of non-input nodes. */ - .non-input > g > .annotation > .annotation-node > rect { - fill: url(#rectHatch) !important; - } - - .non-input ellipse, - .non-input use { - fill: url(#ellipseHatch) !important; - } - - .non-input > text { - opacity: 0; - } - - .non-input .annotation > .annotation-edge { - marker-end: url(#annotation-arrowhead-faded); - } - - .non-input .annotation > .annotation-edge.refline { - marker-start: url(#ref-annotation-arrowhead-faded); - } - - /* Input edges. */ - .input-edge-highlight > text { - fill: black !important; - } - .input-highlight > .in-annotations > .annotation > .annotation-edge, - .input-highlight-selected > .in-annotations > .annotation > .annotation-edge { - stroke: #999 !important; - } - - /* Non-input edges. */ - .non-input-edge-highlight, - .non-input > g > .annotation > path, - /* Annotation styles (label and edges respectively). */ - .non-input > g > - .annotation:not(.input-highlight):not(.input-highlight-selected) > - .annotation-label - /*.annotation-edge*/ { - visibility: hidden; - } - /* --- Op Node --- */ .op > .nodeshape > .nodecolortarget, @@ -355,18 +256,10 @@ export const template = html` font-size: 9px; } - .series > text.nodelabel { - font-size: 8px; - } - .op > text.nodelabel { font-size: 6px; } - .bridge > text.nodelabel { - display: none; - } - .node.meta.expanded > text.nodelabel { cursor: normal; } @@ -396,153 +289,12 @@ export const template = html` stroke-dasharray: 1, 1; } - .annotation.summary > .annotation-node > *, - .annotation.constant > .annotation-node > * { - stroke-width: 1; - stroke-dasharray: none; - } - - .annotation > .annotation-edge { - fill: none; - stroke: #aaa; - stroke-width: 0.5; - marker-end: url(#annotation-arrowhead); - } - - .faded .annotation > .annotation-edge { - marker-end: url(#annotation-arrowhead-faded); - } - - .annotation > .annotation-edge.refline { - marker-start: url(#ref-annotation-arrowhead); - } - - .faded .annotation > .annotation-edge.refline { - marker-start: url(#ref-annotation-arrowhead-faded); - } - - .annotation > .annotation-control-edge { - stroke-dasharray: 1, 1; - } - - #annotation-arrowhead { - fill: #aaa; - } - - #annotation-arrowhead-faded { - fill: #e0d4b3; - } - - #ref-annotation-arrowhead { - fill: #aaa; - } - - #ref-annotation-arrowhead-faded { - fill: #e0d4b3; - } - - .annotation > .annotation-label { - font-size: 5px; - cursor: pointer; - } - .annotation > .annotation-label.annotation-ellipsis { - cursor: default; - } - /* Hide annotations on expanded meta nodes since they're redundant. */ .expanded > .in-annotations, .expanded > .out-annotations { display: none; } - /* --- Annotation: Constant --- */ - - .constant > .annotation-node > ellipse { - cursor: pointer; - fill: white; - stroke: #848484; - } - - .constant.selected > .annotation-node > ellipse { - fill: white; - stroke: red; - } - - .constant.highlighted > .annotation-node > ellipse { - stroke-width: 1.5; - } - - /* --- Annotation: Summary --- */ - - .summary > .annotation-node > ellipse { - cursor: pointer; - fill: #db4437; - stroke: #db4437; - } - - .summary.selected > .annotation-node > ellipse { - fill: #a52714; - stroke: #a52714; - } - - .summary.highlighted > .annotation-node > ellipse { - stroke-width: 1.5; - } - - /* --- Edge --- */ - - .edge > path.edgeline { - display: none; - fill: none; - stroke: #bbb; - stroke-linecap: round; - stroke-width: 0.75; - } - - .highlighted > path.edgeline { - cursor: pointer; - stroke: #5ae; - } - - .edge .selectableedge { - cursor: pointer; - } - - .selectededge > path.edgeline { - cursor: default; - stroke: #f00; - } - - .edge.selectededge text { - fill: #000; - } - - /* Labels showing tensor shapes on edges */ - .edge > text { - font-size: 3.5px; - fill: #666; - } - - .dataflow-arrowhead { - fill: #bbb; - } - - .reference-arrowhead { - fill: #ffb74d; - } - - .selected-arrowhead { - fill: #f00; - } - - .highlighted-arrowhead { - fill: #5ae; - } - - .edge .control-dep { - stroke-dasharray: 2, 2; - } - /* --- Group node expand/collapse button --- */ /* Hides expand/collapse buttons when a node isn't expanded or highlighted. Using @@ -554,12 +306,6 @@ export const template = html` .node.highlighted > .nodeshape > .buttoncontainer { cursor: pointer; } - .buttoncircle { - fill: #e7811d; - } - .buttoncircle:hover { - fill: #b96717; - } .expandbutton, .collapsebutton { stroke: white; @@ -578,17 +324,6 @@ export const template = html` display: none; } - .health-pill-stats { - font-size: 4px; - text-anchor: middle; - } - - .health-pill rect { - filter: url(#health-pill-shadow); - rx: 3; - ry: 3; - } - .titleContainer { position: relative; top: 20px; @@ -638,180 +373,6 @@ export const template = html`
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.ts index 17d388d7145e2b4de8b2ffc9882cfab20a2f477c..867fa2f797b8584688df5e9b01a8e6ae3cf9dddc 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph-scene.ts @@ -124,7 +124,7 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im @property({ type: Object, }) - _zoomStartCoords: {x: number, y: number} | null = null; + _zoomStartCoords: { x: number; y: number } | null = null; /** * Keeps track of the current coordinates of a graph zoom/pan @@ -134,7 +134,7 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im @property({ type: Object, }) - _zoomTransform: {x: number, y: number} | null = null; + _zoomTransform: { x: number; y: number } | null = null; /** Maximum distance of a zoom event for it to be interpreted as a click */ @property({ @@ -231,19 +231,6 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im setTimeout(this.fit.bind(this), tf_graph_layout.PARAMS.animation.duration); } - // When renderHierarchy changes, we need to first build the new SVG based - // on the new hierarchy (and it is asynchronous). We will let that observer - // update the input trace. - @observe('traceInputs', 'selectedNode') - _updateInputTrace(): void { - tf_graph_scene_node.updateInputTrace( - this.getGraphSvgRoot(), - this.renderHierarchy, - this.selectedNode, - this.traceInputs, - ); - } - getNode(nodeName): tf_graph_render.RenderNodeInfo { return this.renderHierarchy.getRenderNodeByName(nodeName); } @@ -313,7 +300,6 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im (): void => { tf_graph_scene_node.buildGroupForScene(d3.select(this.$.root), renderHierarchy.root, this); tf_graph_scene.addGraphClickListener(this.$.svg, this); - this._updateInputTrace(); }, tb_debug.GraphDebugEventId.RENDER_SCENE_BUILD_SCENE, ); @@ -328,49 +314,47 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im this._zoom = d3 .zoom() .on('end', () => { - if (this._zoomStartCoords && this._zoomTransform) { - // Calculate the total distance dragged during the zoom event. - // If it is sufficiently small, then fire an event indicating - // that zooming has ended. Otherwise wait to fire the zoom end - // event, so that a mouse click registered as part of this zooming - // is ignored (as this mouse click was part of a zooming, and should - // not be used to indicate an actual click on the graph). - let dragDistance = Math.sqrt( - Math.pow(this._zoomStartCoords.x - this._zoomTransform.x, 2) + - Math.pow(this._zoomStartCoords.y - this._zoomTransform.y, 2), - ); - if (dragDistance < this._maxZoomDistanceForClick) { - this._fireEnableClick(); - } else { - setTimeout(this._fireEnableClick.bind(this), 50); - } + if (this._zoomStartCoords && this._zoomTransform) { + // Calculate the total distance dragged during the zoom event. + // If it is sufficiently small, then fire an event indicating + // that zooming has ended. Otherwise wait to fire the zoom end + // event, so that a mouse click registered as part of this zooming + // is ignored (as this mouse click was part of a zooming, and should + // not be used to indicate an actual click on the graph). + let dragDistance = Math.sqrt( + Math.pow(this._zoomStartCoords.x - this._zoomTransform.x, 2) + + Math.pow(this._zoomStartCoords.y - this._zoomTransform.y, 2), + ); + if (dragDistance < this._maxZoomDistanceForClick) { + this._fireEnableClick(); + } else { + setTimeout(this._fireEnableClick.bind(this), 50); } - this._zoomStartCoords = null; } + this._zoomStartCoords = null; + } ) .on('zoom', () => { - this._zoomTransform = d3.event.transform; - if (!this._zoomStartCoords) { - this._zoomStartCoords = this._zoomTransform; - this.fire('disable-click'); - } - this._zoomed = true; - d3.select(this.$.root).attr('transform', d3.event.transform.toString()); - this.x = d3.event.transform.x; - this.y = d3.event.transform.y; - // Notify the minimap. - this.minimap.zoom(d3.event.transform); + this._zoomTransform = d3.event.transform; + if (!this._zoomStartCoords) { + this._zoomStartCoords = this._zoomTransform; + this.fire('disable-click'); } - ); + this._zoomed = true; + d3.select(this.$.root).attr('transform', d3.event.transform.toString()); + this.x = d3.event.transform.x; + this.y = d3.event.transform.y; + // Notify the minimap. + this.minimap.zoom(d3.event.transform); + }); d3.select(this.$.svg).call(this._addEventListener.bind(this)).on('dblclick.zoom', null); d3.select(window).on('resize', () => { - // Notify the minimap that the user's window was resized. - // The minimap will figure out the new dimensions of the main svg - // and will use the existing translate and scale params. - this.minimap.zoom(); - } - ); + // Notify the minimap that the user's window was resized. + // The minimap will figure out the new dimensions of the main svg + // and will use the existing translate and scale params. + this.minimap.zoom(); + }); // Initialize the minimap. this.minimap = (this.$.minimap as any).init( this.$.svg, @@ -557,9 +541,9 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im this.$.svg, this.$.root, this._zoom, - function (): void { + (): void => { this._zoomed = false; - }.bind(this), + }, ); } @@ -605,14 +589,6 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im delete this._nodeGroupIndex[n]; } - addEdgeGroup(n, selection): void { - this._edgeGroupIndex[n] = selection; - } - - getEdgeGroup(e): any { - return this._edgeGroupIndex[e]; - } - /** * Update node and annotation node of the given name. * @param {String} n node name @@ -628,8 +604,7 @@ class TfGraphScene2 extends LegacyElementMixin(DarkModeMixin(PolymerElement)) im } if ( node.node.type === (tf_graph.NodeType.META || tf_graph.NodeType.API_LIST || tf_graph.NodeType.MULTI_COLLECTION) && - (node.node as any).associatedFunction && - !node.isLibraryFunction + (node.node as any).associatedFunction ) { // The node is that of a function call. Also link the node within the // function library. This clarifies to the user that the library function diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph.ts index 78c19e1f69126077ba518fe71811590f5d9dcacc..f4eac6ec2eb46f4ac203b2cbbf4a97357361e4e9 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph/tf-graph.ts @@ -480,9 +480,9 @@ class TfGraph extends LegacyElementMixin(PolymerElement) { async _parentNodeToggleExpand(event): Promise { const nodeName = event.detail.nodeData.node.name; - const matched_node_link = event.detail.nodeData.node.matchedNodeLink; - if (matched_node_link) { - let matched = matched_node_link[matched_node_link.length - 1]; + const matchedNodeLink = event.detail.nodeData.node.matchedNodeLink; + if (matchedNodeLink) { + let matched = matchedNodeLink[matchedNodeLink.length - 1]; this.set('selectedNode', matched); } else { const params = new URLSearchParams(); @@ -525,7 +525,7 @@ class TfGraph extends LegacyElementMixin(PolymerElement) { const graphPath = `subgraph?${String(params)}`; const arrayBuffer = await fetchPbTxt(graphPath); // 等待 fetchPbTxt 完成 const graphDef = await parseGraphPbTxt(arrayBuffer); // 等待 parseGraphPbTxt 完成 - const slimGraph = await tf_graph.build(graphDef, tf_graph.DefaultBuildParams, undefined); // 等待 tf_graph.build 完成 + const slimGraph = await tf_graph.build(graphDef, tf_graph.defaultBuildParams, undefined); // 等待 tf_graph.build 完成 tf_hierarchy.update(tempHierarchy.hierarchy, slimGraph, nodeName); tempHierarchy.buildSubhierarchy(nodeName, slimGraph); renderNode.expanded = !renderNode.expanded; @@ -563,55 +563,4 @@ class TfGraph extends LegacyElementMixin(PolymerElement) { // Rebuild the render hierarchy. this._buildRenderHierarchy(this.graphHierarchy); } - - _deselectPreviousEdge(): void { - const selectedSelector = `.${tf_graph_scene.Class.Edge.SELECTED}`; - const selectedEdge = this.$.scene.shadowRoot?.querySelector(selectedSelector); - const selectedPaths = this.$.scene.shadowRoot?.querySelectorAll('path.edgeline'); - // Visually mark the previously selected edge (if any) as deselected. - if (!!selectedEdge) { - d3.select(selectedEdge) - .classed(tf_graph_scene.Class.Edge.SELECTED, false) - .each((d: any, i) => { - // Reset its marker. - if (d.label && selectedPaths) { - const paths = d3.selectAll(selectedPaths); - if (d.label.startMarkerId) { - paths.style('marker-start', `url(#${d.label.startMarkerId})`); - } - if (d.label.endMarkerId) { - paths.style('marker-end', `url(#${d.label.endMarkerId})`); - } - } - }); - } - } - - _updateMarkerOfSelectedEdge(selectedEdge, isSelected): void { - if (selectedEdge.label) { - const statsName = isSelected ? 'selected-' : 'highlighted-'; - // The marker will vary based on the direction of the edge. - const markerId = selectedEdge.label.startMarkerId || selectedEdge.label.endMarkerId; - if (markerId) { - // Find the corresponding marker for a selected edge. - const selectedMarkerId = markerId.replace('dataflow-', statsName); - let selectedMarker = this.$.scene.shadowRoot?.querySelector(`#${selectedMarkerId}`) as HTMLElement; - if (!selectedMarker) { - // The marker for a selected edge of this size does not exist yet. Create it. - const originalMarker = this.$.scene.shadowRoot?.querySelector(`#${markerId}`); - selectedMarker = originalMarker?.cloneNode(true) as HTMLElement; - selectedMarker.setAttribute('id', selectedMarkerId); - selectedMarker.classList.add(`${statsName}arrowhead`); - originalMarker?.parentNode?.appendChild(selectedMarker); - } - // Make the path use this new marker while it is selected. - const markerAttribute = selectedEdge.label.startMarkerId ? 'marker-start' : 'marker-end'; - if (isSelected) { - this._lastSelectedEdgeGroup.selectAll('path.edgeline').style(markerAttribute, `url(#${selectedMarkerId})`); - } else { - this._lastHighlightedEdgeGroup.selectAll('path.edgeline').style(markerAttribute, `url(#${selectedMarkerId})`); - } - } - } - } } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_board/tf-graph-board.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_board/tf-graph-board.ts index 39f7ec831fc6d23a5ad0ab1dfd68bb92275804e2..407f42924d0d6fc1da033218d380df3477febc7b 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_board/tf-graph-board.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_board/tf-graph-board.ts @@ -98,7 +98,6 @@ class TfGraphBoard extends LegacyElementMixin(PolymerElement) { } #tab-info { - /* height: 30%; */ background-color: #ffffff; border-top: 2px solidrgb(153, 152, 152); } @@ -201,7 +200,7 @@ class TfGraphBoard extends LegacyElementMixin(PolymerElement) { graph: tf_graph.MergedSlimGraph; @property({ type: Object }) - hierarchyParams: tf_graph_hierarchy.HierarchyParams = tf_graph_hierarchy.DefaultHierarchyParams; + hierarchyParams: tf_graph_hierarchy.HierarchyParams = tf_graph_hierarchy.defaultHierarchyParams; /** * A number between 0 and 100 denoting the % of progress @@ -220,18 +219,6 @@ class TfGraphBoard extends LegacyElementMixin(PolymerElement) { @property({ type: Object, notify: true }) renderHierarchy: tf_graph_render.MergedRenderGraphInfo; - // Whether debugger data is enabled for this instance of Tensorboard. - @property({ type: Boolean }) - debuggerDataEnabled: boolean; - - @property({ type: Array, notify: true }) - // An array of alerts (in chronological order) provided by debugging libraries on when bad - // values (NaN, +/- Inf) appear. - debuggerNumericAlerts: unknown[]; - - @property({ type: Boolean, notify: true }) - allStepsModeEnabled: boolean = false; - @property({ type: Object }) menu: any; @@ -273,6 +260,8 @@ class TfGraphBoard extends LegacyElementMixin(PolymerElement) { @property({ type: Object }) tooltips: object; + + @property({ type: String }) selectNodeCopy: string = ''; ready(): void { @@ -307,8 +296,4 @@ class TfGraphBoard extends LegacyElementMixin(PolymerElement) { } return result; } - - _onNodeInclusionToggled(event): void { - (this.$.graph as any).nodeToggleExtract(event.detail.name); - } } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/contextmenu.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/contextmenu.ts index f6ba4aeaa653275afb4d1ae2718f7b8f06c6fe6d..b7442b4a3d77e099fa77cd5b241724068788fb68 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/contextmenu.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/contextmenu.ts @@ -118,7 +118,7 @@ export function getMenu(sceneElement: TfGraphScene, nodeData): () => Promise Promise { const titleText = getTitleText(item.communications_type); menuOptions.push({ text: titleText, action: 'rank' }); @@ -157,7 +156,7 @@ export function getMenu(sceneElement: TfGraphScene, nodeData): () => Promise { if (d.action === 'expand') { - sceneElement.fire('parent-node-toggle-expand', { nodeData }); + sceneElement.fire('parent-node-toggle-expand', { nodeData }); } maybeCloseMenu(); }) diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/edge.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/edge.ts index 09f3a6a93e8a179bbc5d7b7b3a1a2fd9ca5b3db7..fd81b44b562d7b2378a65a440f39f5eec21eeab3 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/edge.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/edge.ts @@ -97,32 +97,6 @@ export function buildGroup(sceneGroup, graph: graphlib.Graph, sceneElement: TfGr d.label.edgeGroup = edgeGroup; // index node group for quick highlighting sceneComponent._edgeGroupIndex[getEdgeKey(d)] = edgeGroup; - - edgeGroup - .on('click', (dClick) => { - // Stop this event's propagation so that it isn't also considered - // a graph-select. - (d3.event).stopPropagation(); - sceneComponent.fire('edge-select', { - edgeData: dClick, - edgeGroup: edgeGroup, - }); - }) - .on('mouseover', (dMouseOver) => { - sceneElement.fire('edge-highlight', { - edgeData: dMouseOver, - edgeGroup: edgeGroup, - }); - }) - .on('mouseout', (dMouseOut) => { - sceneElement.fire('edge-unhighlight', { - edgeData: dMouseOut, - edgeGroup: edgeGroup, - }); - }); - // Add line during enter because we're assuming that type of line - // normally does not change. - appendEdge(edgeGroup, d, sceneComponent); }) .merge(edgeGroups) .each(function () { @@ -167,6 +141,7 @@ export function getLabelForBaseEdge(baseEdge: BaseEdge, renderInfo: render.Rende }) .join(TENSOR_SHAPE_DELIM); } + /** * Creates the label for the given metaedge. If the metaedge consists * of only 1 tensor, and it's shape is known, the label will contain that @@ -179,89 +154,7 @@ export function getLabelForEdge(metaedge: Metaedge, renderInfo: render.RenderGra ? `${metaedge.baseEdgeList.length}tensors` : getLabelForBaseEdge(metaedge.baseEdgeList[0], renderInfo); } -/** - * Computes the index into a set of points that constitute a path for which the - * distance along the path from the initial point is as large as possible - * without exceeding the length. This function was introduced after the - * native getPathSegAtLength method got deprecated by SVG 2. - * @param points Array of path control points. A point has x and y properties. - * Must be of length at least 2. - * @param length The length (float). - * @param lineFunc A function that takes points and returns the "d" attribute - * of a path made from connecting the points. - * @return The index into the points array. - */ -function getPathSegmentIndexAtLength( - points: render.Point[], - length: number, - lineFunc: (points: render.Point[]) => string, -): number { - const path = document.createElementNS(tf_graph_common.SVG_NAMESPACE, 'path'); - for (let i = 1; i < points.length; i++) { - path.setAttribute('d', lineFunc(points.slice(0, i))); - if (path.getTotalLength() > length) { - // This many points has already exceeded the length. - return i - 1; - } - } - // The entire path is shorter than the specified length. - return points.length - 1; -} -/** - * Shortens the path enought such that the tip of the start/end marker will - * point to the start/end of the path. The marker can be of arbitrary size. - * - * @param points Array of path control points. - * @param marker D3 selection of the svg element. - * @param isStart Is the marker a `start-marker`. If false, the marker is - * an `end-marker`. - * @return The new array of control points. - */ -function adjustPathPointsForMarker( - points: render.Point[], - marker: d3.Selection, - isStart: boolean, -): render.Point[] { - let lineFunc = d3 - .line() - .x((d) => d.x) - .y((d) => d.y); - let path = d3.select(document.createElementNS('http://www.w3.org/2000/svg', 'path')).attr('d', lineFunc(points)); - let markerWidth = Number(marker.attr('markerWidth')); - let viewBox = marker.attr('viewBox').split(' ').map(Number); - let viewBoxWidth = viewBox[2] - viewBox[0]; - let refX = Number(marker.attr('refX')); - let pathNode = path.node(); - if (isStart) { - // The edge flows downwards. Do not make the edge go the whole way, lest we - // clobber the arrowhead. - const fractionStickingOut = 1 - (refX / viewBoxWidth); - const length = markerWidth * fractionStickingOut; - const point = pathNode.getPointAtLength(length); - // Figure out how many segments of the path we need to remove in order - // to shorten the path. - // @ts-expect-error TS2345: Argument of type 'Line' is not assignable to parameter of type '(points: Point[]) => string'. - const segIndex = getPathSegmentIndexAtLength(points, length, lineFunc); - // Update the very first segment. - points[segIndex - 1] = { x: point.x, y: point.y }; - // Ignore every point before segIndex - 1. - return points.slice(segIndex - 1); - } else { - // The edge flows upwards. Do not make the edge go the whole way, lest we - // clobber the arrowhead. - const fractionStickingOut = 1 - refX / viewBoxWidth; - const length = pathNode.getTotalLength() - (markerWidth * fractionStickingOut); - const point = pathNode.getPointAtLength(length); - // Figure out how many segments of the path we need to remove in order - // to shorten the path. - // @ts-expect-error TS2345: Argument of type 'Line' is not assignable to parameter of type '(points: Point[]) => string'. - const segIndex = getPathSegmentIndexAtLength(points, length, lineFunc); - // Update the very last segment. - points[segIndex] = { x: point.x, y: point.y }; - // Ignore every point after segIndex. - return points.slice(0, segIndex + 1); - } -} + /** * For a given d3 selection and data object, create a path to represent the * edge described in d.label. @@ -330,8 +223,6 @@ export function appendEdge( // We have no information to show on this edge. return; } - // Put edge label in the middle of edge only if the edge is thick enough. - let baseline = strokeWidth > CENTER_EDGE_LABEL_MIN_STROKE_WIDTH ? 'central' : 'text-after-edge'; edgeGroup .append('text') .append('textPath') @@ -341,6 +232,7 @@ export function appendEdge( .attr('dominant-baseline', 'central') .text(labelForEdge); } + export const interpolate: d3.Line<{ x: number; y: number; @@ -356,68 +248,11 @@ export const interpolate: d3.Line<{ .y((d) => { return d.y; }); -/** - * Returns a tween interpolator for the endpoint of an edge path. - */ -function getEdgePathInterpolator( - component: HTMLElement, - renderPath: SVGPathElement, - d: EdgeData, - i: number, - a: SVGPathElement[], -): ((t: number) => string) | ((t: any) => string | null) { - let renderMetaedgeInfo = d.label; - let adjoiningMetaedge = renderMetaedgeInfo.adjoiningMetaedge; - let points = renderMetaedgeInfo.points; - // Adjust the path so that start/end markers point to the end - // of the path. - const { shadowRoot } = component; - if (d.label.startMarkerId) { - points = adjustPathPointsForMarker( - points, - d3.select(shadowRoot?.querySelector(`#${d.label.startMarkerId}`) as Element), - true, - ); - } - if (d.label.endMarkerId) { - points = adjustPathPointsForMarker( - points, - d3.select(shadowRoot?.querySelector(`#${d.label.endMarkerId}`) as Element), - false, - ); - } - if (!adjoiningMetaedge) { - return d3.interpolate(a, interpolate(points) ?? ''); - } - // Get the adjoining path that matches the adjoining metaedge. - let adjoiningPath = (adjoiningMetaedge.edgeGroup.node()).firstChild; - // Find the desired SVGPoint along the adjoining path, then convert those - // coordinates into the space of the renderPath using its Current - // Transformation Matrix (CTM). - let inbound = renderMetaedgeInfo.metaedge?.inbound; - return function (t): string | null { - let adjoiningPoint = adjoiningPath - .getPointAtLength(inbound ? adjoiningPath.getTotalLength() : 0) - .matrixTransform(adjoiningPath.getCTM() as DOMMatrixInit) - .matrixTransform(renderPath.getCTM()?.inverse()); - // Update the relevant point in the renderMetaedgeInfo's points list, then - // re-interpolate the path. - let index = inbound ? 0 : points.length - 1; - points[index].x = adjoiningPoint.x; - points[index].y = adjoiningPoint.y; - let dPath = interpolate(points); - return dPath; - }; -} + function position(component: HTMLElement, edgeGroup: HTMLElement): void { - d3.select(edgeGroup) - .select(`path.${Class.Edge.LINE}`) - .transition() - // @ts-expect-error TS2769: No overload matches this call. complicated return type mismatch issue - .attrTween('d', function (d: EdgeData, i: number, a: SVGPathElement[]) { - return getEdgePathInterpolator(component, this as SVGPathElement, d, i, a); - }); + d3.select(edgeGroup).select(`path.${Class.Edge.LINE}`).transition(); } + /** * For a given d3 selection and data object, mark the edge as a control * dependency if it contains only control edges. diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/graph.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/graph.ts index 7a29671a1d4cdfb6582e6f287d16fea24ddc3614..830f50d6dd34f456fc01ab9d69b06550fe574027 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/graph.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/graph.ts @@ -66,11 +66,6 @@ export enum InclusionType { EXCLUDE = 1, UNSPECIFIED = 2, } -/** Indicates if a series is to be grouped in the graph when rendered. */ -export enum SeriesGroupingType { - GROUP = 0, - UNGROUP = 1, -} /** Attribute key reserved for the shapes of the output tensors. */ const OUTPUT_SHAPES_KEY = '_output_shapes'; /** @@ -221,108 +216,9 @@ export interface OpNode extends Node { [key: string]: string; }; } -export interface BridgeNode extends Node { - /** - * Whether this bridge node represents edges coming into its parent node. - */ - inbound: boolean; -} -/** - * A node that is used when there are more than the maximum number of allowed - * annotations hanging off of a node. This node represents an ellipsis - * annotation, indicating a number of additional annotations. - */ -export interface EllipsisNode extends Node { - /** - * The number of nodes this ellipsis represents. - */ - numMoreNodes: number; - /** - * Sets the number of nodes this ellipsis represents and changes the node - * name accordingly. - */ - setNumMoreNodes: (numNodes: number) => void; -} + export interface GroupNode extends Node { - /** - * The metagraph contains nodes and metaedges between the immediate children - * of this group. The node label objects may be other GroupNodes (like - * SeriesNodes and Metanodes) or individual OpNodes. All edge label objects - * are Metaedges, each of which contains references to the original - * BaseEdge(s) from which it was created. - */ metagraph: graphlib.Graph; - /** - * The bridgegraph contains only edges which link immediate children of this - * group with nodes outside of the metagraph. As in the metagraph, all edge - * label objects are Metaedges which contain references to the original - * BaseEdge(s) that contribute to it. - * - * For a Metaedge in the bridgegraph, its external endpoint will be the same - * as the metagraph edge from which it came. This is most easily explained - * by example. - * - * Consider an original graph that contains a BaseEdge A/B/C->Z/Y/X. - * - * +-------+ (BaseEdge) +-------+ - * | A/B/C |>----------------->| Z/Y/X | - * +-------+ +-------+ - * - * When we construct the Root's metagraph, it will contain nodes for A and Z, - * and a Metaedge A->Z. The A->Z Metaedge will contain the original BaseEdge - * A/B/C->Z/Y/X in its baseEdgeGraph. The Root's bridgegraph will always be - * empty. - * - * +---+ (Root.metagraph edge) +---+ - * | A |>--------------------------->| Z | - * +---+ +---+ - * - * Now consider the Metanode A. Its metagraph will contain a Metanode for A/B - * and no edges. A's bridgegraph will have one Metaedge from A/B->Z, which - * was derived from the Root's Metaedge A->Z. That Metaedge will contain the - * original BaseEdge in its baseEdgeGraph. - * - * +---------+ - * | A | - * | +---+ | (A.bridgegraph edge) +---+ - * | | B |>---------------------------->| Z | - * | +---+ | +---+ - * +---------+ - * - * Finally, consider the Metanode A/B. Its metagraph will contain a Metanode - * for A/B/C and again no edges. A/B's bridgegraph will have one Metaedge - * from A/B/C->Z, which was derived from A's bridgegraph Metaedge A/B->Z. - * As before, the A/B/C->Z Metaedge will contain the original BaseEdge in its - * baseEdgeGraph. - * - * +---------------+ - * | A | - * | +---------+ | - * | | B | | - * | | +---+ | | (A/B.bridgegraph edge) +---+ - * | | | C |>----------------------------------->| Z | - * | | +---+ | | +---+ - * | +---------+ | - * +---------------+ - * - * Likewise, under the Metanode Z and Z/Y, to compute the bridgegraph, we'll - * end up with Metaedges A->Z/Y and A->Z/Y/X respectively. So the original - * BaseEdge A/B/C->Z/Y/X becomes four different Metaedges in four different - * bridgegraphs: - * - * + A/B->Z in GroupNode A's bridgegraph, - * + A/B/C->Z in GroupNode A/B's bridgegraph, - * + A->Z/Y in GroupNode Z's bridgegraph, and - * + A->Z/Y/X in GroupNode Z/Y's bridgegraph. - * - * Considering any BaseEdge then, if N is the number of path segments in the - * source and M is the number of path segments in the destination, then the - * total number of bridgegraph edges you could create would be (N-1)(M-1). - * - * For this reason, it is computationally expensive to generate all the - * bridgegraphs for all the Metanodes, and instead they should be computed - * on demand as needed. - */ bridgegraph: graphlib.Graph; /** * Flag indicating whether this GroupNode's metagraph contains any edges that @@ -359,54 +255,7 @@ export interface Metanode extends GroupNode { /** Return name of all leaves inside a metanode. */ leaves: () => string[]; } -export interface SeriesNode extends GroupNode { - hasLoop: boolean; - prefix: string; - suffix: string; - clusterId: number; - ids: number[]; - parent: string; -} -export class EllipsisNodeImpl implements EllipsisNode { - name: string; - numMoreNodes: number; - type: NodeType; - isGroupNode: boolean; - cardinality: number; - parentNode: Node | null; - include: InclusionType; - inputData: { - [key: string]: any; - }; - outputData: { - [key: string]: any; - }; - suggestions: { - [key: string]: string; - }; - nodeAttributes: { - [key: string]: any; - }; - /** - * Constructs a new ellipsis annotation node. - * - * @param numNodes The number of additional annotations this node represents. - */ - constructor(numNodes: number) { - this.type = NodeType.ELLIPSIS; - this.isGroupNode = false; - this.cardinality = 1; - this.parentNode = null; - this.setNumMoreNodes(numNodes); - this.include = InclusionType.UNSPECIFIED; - } - - setNumMoreNodes(numNodes: number): void { - this.numMoreNodes = numNodes; - this.name = `... ${numNodes} more`; - } -} /** * A label object for nodes in the full graph and leaf nodes in the render * graph. @@ -671,86 +520,6 @@ export class MetaedgeImpl implements Metaedge { h.maxMetaEdgeSize = Math.max(h.maxMetaEdgeSize, this.totalSize); } } -export function createSeriesNode( - prefix: string, - suffix: string, - parent: string, - clusterId: number, - name: string, - graphOptions: LabeledGraphOptions, -): SeriesNode { - return new SeriesNodeImpl(prefix, suffix, parent, clusterId, name, graphOptions); -} - -export function getSeriesNodeName( - prefix: string, - suffix: string, - parent: string, - startId?: number, - endId?: number, -): string { - let numRepresentation = `${typeof startId !== 'undefined' && typeof endId !== 'undefined' ? `[${startId}-${endId}]` : '#'}`; - let pattern = prefix + numRepresentation + suffix; - return `${parent ? `${parent}/` : ''}${pattern}`; -} - -class SeriesNodeImpl implements SeriesNode { - name: string; - type: NodeType; - hasLoop: boolean; - prefix: string; - suffix: string; - clusterId: number; - ids: number[]; - parent: string; - isGroupNode: boolean; - cardinality: number; - metagraph: graphlib.Graph; - bridgegraph: graphlib.Graph; - parentNode: Node | null; - hasNonControlEdges: boolean; - include: InclusionType; - inputData: { - [key: string]: any; - }; - outputData: { - [key: string]: any; - }; - stackData: []; - matchedNodeLink: []; - suggestions: { - [key: string]: string; - }; - nodeAttributes: { - [key: string]: any; - }; - - constructor( - prefix: string, - suffix: string, - parent: string, - clusterId: number, - name: string, - graphOptions: LabeledGraphOptions, - ) { - this.name = name || getSeriesNodeName(prefix, suffix, parent); - this.type = NodeType.SERIES; - this.hasLoop = false; - this.prefix = prefix; - this.suffix = suffix; - this.clusterId = clusterId; - this.ids = []; - this.parent = parent; - this.isGroupNode = true; - this.cardinality = 0; - this.metagraph = createGraph(name, GraphType.SERIES, graphOptions); - // bridgegraph must be constructed lazily-see hierarchy.getBridgegraph() - this.bridgegraph = null; - this.parentNode = null; - this.hasNonControlEdges = false; - this.include = InclusionType.UNSPECIFIED; - } -} /** * Extracts the shapes of the output tensors from the attr property in the @@ -874,7 +643,7 @@ function addEdgeToGraphByAttr(graph: SlimGraph, node: OpNode | Metanode, edgeInf } } -export const DefaultBuildParams: BuildParams = { +export const defaultBuildParams: BuildParams = { enableEmbedding: true, inEmbeddingTypes: ['Const'], outEmbeddingTypes: ['^[a-zA-Z]+Summary$'], @@ -1186,12 +955,7 @@ export function hasSimilarDegreeSequence(graph1: graphlib.Graph, graph2: graphli * For example, if the name is 'a/b/c', the returned path is * ['a', 'a/b', 'a/b/c']. */ -export function getHierarchicalPath( - name: string, - seriesNames?: { - [name: string]: string; - }, -): string[] { +export function getHierarchicalPath(name: string): string[] { let path: string[] = []; let i = name.indexOf(NAMESPACE_DELIM); // Push all parent portions of the path. @@ -1199,14 +963,6 @@ export function getHierarchicalPath( path.push(name.substring(0, i)); i = name.indexOf(NAMESPACE_DELIM, i + 1); } - // If the node's path is under a series, then add the series node name to the - // hierarchical path as the parent of the leaf. - if (seriesNames) { - let seriesName = seriesNames[name]; - if (seriesName) { - path.push(seriesName); - } - } // Push the leaf of the path. path.push(name); return path; diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/hierarchy.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/hierarchy.ts index 0468e0df56806217e96a35e865e75bd4b5ca13f4..5104f9b458a6b174a16d49a4b8060e237eec57b3 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/hierarchy.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/hierarchy.ts @@ -27,19 +27,15 @@ import { createGraph, createMetaedge, createMetanode, - createSeriesNode, Edges, - getSeriesNodeName, GraphType, GroupNode, Metaedge, MetaedgeImpl, Metanode, Node, - NodeType, OpNode, ROOT_NAME, - SeriesNode, SlimGraph, MetanodeImpl, } from './graph'; @@ -52,9 +48,6 @@ export enum HierarchyEvent { TEMPLATES_UPDATED = 0, } -// A map from the name of a series node to its grouping type. -type SeriesGroupMap = Map; - // Including both the NPU and the benchmark hierarchy. export interface MergedHierarchy { npu: Hierarchy; @@ -87,40 +80,17 @@ export class Hierarchy extends tf_graph_util.Dispatcher { private index: { [nodeName: string]: GroupNode | OpNode; }; - private readonly seriesGroupMap: SeriesGroupMap; constructor(params: HierarchyParams) { super(); this.graphOptions.compound = true; this.graphOptions.rankdir = params.rankDirection; this.root = createMetanode(ROOT_NAME, this.graphOptions); - this.seriesGroupMap = new Map(params.seriesMap); - /** - * @type {Object} Dictionary object that maps node name to the node - * (could be op-node, metanode, or series-node) - */ this.index = {}; this.index[ROOT_NAME] = this.root; this.orderings = {}; } - getSeriesGroupType(nodeName: string): tf_graph.SeriesGroupingType { - // If grouping was not specified, assume it should be grouped by default. - return this.seriesGroupMap.get(nodeName) ?? tf_graph.SeriesGroupingType.GROUP; - } - - setSeriesGroupType(nodeName: string, groupType: tf_graph.SeriesGroupingType): SeriesGroupMap { - return this.seriesGroupMap.set(nodeName, groupType); - } - - buildSeriesGroupMapToggled(nodeName: string): Map { - const newGroupType = - this.getSeriesGroupType(nodeName) === tf_graph.SeriesGroupingType.GROUP - ? tf_graph.SeriesGroupingType.UNGROUP - : tf_graph.SeriesGroupingType.GROUP; - return new Map([...this.seriesGroupMap, [nodeName, newGroupType]]); - } - getNodeMap(): { [nodeName: string]: GroupNode | OpNode; } { @@ -135,77 +105,6 @@ export class Hierarchy extends tf_graph_util.Dispatcher { this.index[name] = node; } - /** - * Given the name of a node in this hierarchy, get its bridgegraph, creating - * it on the fly if necessary. If the node is not a GroupNode, then this - * method returns null. If the provided name does not map to a node in the - * hierarchy, an error will be thrown. - */ - getBridgegraph(nodeName: string): graphlib.Graph { - let node = this.index[nodeName]; - if (!node) { - throw Error(`Could not find node in hierarchy: ${nodeName}`); - } - if (!('metagraph' in node)) { - return null; - } - let groupNode = node; - if (groupNode.bridgegraph) { - return groupNode.bridgegraph; - } - let bridgegraph = createGraph('BRIDGEGRAPH', GraphType.BRIDGE, this.graphOptions); - groupNode.bridgegraph = bridgegraph; - if (!node.parentNode || !('metagraph' in node.parentNode)) { - return bridgegraph; - } - let parentNode = node.parentNode; - let parentMetagraph = parentNode.metagraph; - let parentBridgegraph = this.getBridgegraph(parentNode.name); - // For each of the parent node's two Metaedge containing graphs, process - // each Metaedge involving this node. - _.each([parentMetagraph, parentBridgegraph], (parentGraph) => { - parentGraph - .edges() - .filter((e) => e.v === nodeName || e.w === nodeName) - .forEach((parentEdgeObj) => { - let inbound = parentEdgeObj.w === nodeName; - let parentMetaedge = parentGraph.edge(parentEdgeObj); - // The parent's Metaedge represents some number of underlying - // BaseEdges from the original full graph. For each of those, we need - // to determine which immediate child is involved and make sure - // there's a Metaedge in the bridgegraph that covers it. - _.each(parentMetaedge.baseEdgeList, (baseEdge) => { - // Based on the direction, figure out which is the descendant node - // and which is the 'other' node (sibling of parent or ancestor). - let [descendantName, otherName] = inbound ? [baseEdge.w, parentEdgeObj.v] : [baseEdge.v, parentEdgeObj.w]; - // Determine the immediate child containing this descendant node. - if (nodeName !== descendantName) { - let childName = this.getChildName(nodeName, descendantName); - if (!childName) { - return; - } - // Look for an existing Metaedge in the bridgegraph (or create a - // new one) that covers the relationship between child and other. - let bridgeEdgeObj = { - v: inbound ? otherName : childName, - w: inbound ? childName : otherName, - }; - let bridgeMetaedge = bridgegraph.edge(bridgeEdgeObj); - if (!bridgeMetaedge) { - bridgeMetaedge = createMetaedge(bridgeEdgeObj.v, bridgeEdgeObj.w) as any; - bridgeMetaedge.inbound = inbound; - bridgegraph.setEdge(bridgeEdgeObj.v, bridgeEdgeObj.w, bridgeMetaedge, baseEdge.attr?.id); - } - // Copy the BaseEdge from the parent's Metaedge into this - // bridgegraph Metaedge. - bridgeMetaedge.addBaseEdge(baseEdge, this); - } - }); - }); - }); - return bridgegraph; - } - /** Given the name of a node, return its incoming metaedges. */ getPredecessors(nodeName: string): Edges { let node = this.index[nodeName]; @@ -380,9 +279,7 @@ export class Hierarchy extends tf_graph_util.Dispatcher { } let parentNode = node.parentNode; let metagraph = parentNode.metagraph; - let bridgegraph = this.getBridgegraph(parentNode.name); findEdgeTargetsInGraph(metagraph, node, inEdges, edges); - findEdgeTargetsInGraph(bridgegraph, node, inEdges, edges); return edges; } } @@ -410,24 +307,12 @@ function findEdgeTargetsInGraph(graph: graphlib.Graph, node: Node, inbound: bool export interface HierarchyParams { verifyTemplate: boolean; - seriesNodeMinSize: number; - // The initial map of explicit series group types. - seriesMap: SeriesGroupMap; - // This string is supplied to dagre as the 'rankdir' property for laying out - // the graph. TB, BT, LR, or RL. The default is 'BT' (bottom to top). rankDirection: string; - // Whether to detect numeric patterns for series nodes using entire names of - // nodes. If false, only uses numeric suffixes to find patterns to collapse - // into series nodes. - useGeneralizedSeriesPatterns: boolean; } -export const DefaultHierarchyParams: HierarchyParams = { +export const defaultHierarchyParams: HierarchyParams = { verifyTemplate: true, - seriesNodeMinSize: 5, - seriesMap: new Map(), rankDirection: 'TB', - useGeneralizedSeriesPatterns: false, }; /** @@ -440,9 +325,6 @@ export function build( tracker?: ProgressTracker, ): Promise { const h = new Hierarchy(params); - const seriesNames: { - [name: string]: string; - } = {}; return tf_graph_util .runAsyncTask( 'Adding nodes', @@ -453,26 +335,6 @@ export function build( tracker, tb_debug.GraphDebugEventId.HIERARCHY_ADD_NODES, ) - .then(() => { - return tf_graph_util.runAsyncTask( - 'Detect series', - 30, - () => { - if (params.seriesNodeMinSize > 0) { - groupSeries( - h.root, - h, - seriesNames, - params.seriesNodeMinSize, - params.seriesMap, - params.useGeneralizedSeriesPatterns, - ); - } - }, - tracker, - tb_debug.GraphDebugEventId.HIERARCHY_DETECT_SERIES, - ); - }) .then(() => { return tf_graph_util.runAsyncTask( 'Adding edges', @@ -569,395 +431,3 @@ function addEdgesInVis(h: Hierarchy, graph: SlimGraph, nodeName: string): void { metaedge.addBaseEdge(baseEdge, h, true); }); } - -/** - * Using the hierarchy template information, detect series in the provided - * metanode. For each detected series, create a new SeriesNode - * and remove series members from the metanode's metagraph and move them to - * the new series node's metagraph. - * - * @param metanode - * @param hierarchy - * @param seriesNames Map of node names to their series they are contained in. - * This should be provided empty and is populated by this method. - * @param threshold If the series has this many nodes or more, then group them - * into a series. - * @param map Map of series names to their series grouping type, if one has - * been set. - * @param useGeneralizedSeriesPatterns Whether to use find patterns for series - * nodes using any parts of names of nodes. If false, only uses patterns - * discovered within numeric suffixes of nodes names. - * @return A dictionary from node name to series node name that contains the - * node. - */ -function groupSeries( - metanode: Metanode, - hierarchy: Hierarchy, - seriesNames: { - [name: string]: string; - }, - threshold: number, - seriesMap: SeriesGroupMap, - useGeneralizedSeriesPatterns: boolean, -): void { - let metagraph = metanode.metagraph; - _.each(metagraph.nodes(), (n) => { - let child = metagraph.node(n); - if (child.type === (tf_graph.NodeType.META || tf_graph.NodeType.MULTI_COLLECTION || tf_graph.NodeType.API_LIST)) { - groupSeries( - child as unknown as Metanode, - hierarchy, - seriesNames, - threshold, - seriesMap, - useGeneralizedSeriesPatterns, - ); - } - }); - let clusters = clusterNodes(metagraph); - const detectSeriesMethod = useGeneralizedSeriesPatterns - ? detectSeriesAnywhereInNodeName - : detectSeriesUsingNumericSuffixes; - let seriesDict = detectSeriesMethod(clusters, metagraph, hierarchy.graphOptions); - // Add each series node to the graph and add its grouped children to its own - // metagraph. - _.each(seriesDict, (seriesNode: SeriesNode, seriesName: string) => { - let nodeMemberNames = seriesNode.metagraph.nodes(); - _.each(nodeMemberNames, (n) => { - let child = metagraph.node(n) as any; - if (!child.owningSeries) { - child.owningSeries = seriesName; - } - }); - // If the series contains less than the threshold number of nodes, then set - // this series to be shown ungrouped in the map. - if ( - nodeMemberNames.length < threshold && - hierarchy.getSeriesGroupType(seriesNode.name) === tf_graph.SeriesGroupingType.GROUP - ) { - hierarchy.setSeriesGroupType(seriesNode.name, tf_graph.SeriesGroupingType.UNGROUP); - } - // If the series is in the map as ungrouped then do not group the series. - if (hierarchy.getSeriesGroupType(seriesNode.name) === tf_graph.SeriesGroupingType.UNGROUP) { - return; - } - hierarchy.setNode(seriesName, seriesNode); // add to the index - metagraph.setNode(seriesName, seriesNode); - _.each(nodeMemberNames, (n) => { - let child = metagraph.node(n) as any; - seriesNode.metagraph.setNode(n, child); - seriesNode.parentNode = child.parentNode; - seriesNode.cardinality++; - child.parentNode = seriesNode; - seriesNames[n] = seriesName; - // Remove now-grouped node from its original parent's metagraph. - metagraph.removeNode(n); - }); - }); -} - -/** - * Cluster op-nodes with similar op. This examines only the direct children of - * the metagraph, does not recursively check descendants. - * @return A map from op to a list of node names. - */ -function clusterNodes(metagraph: graphlib.Graph): { - [clusterId: string]: string[]; -} { - let result: { - [clusterId: string]: string[]; - } = {}; - return _.reduce( - metagraph.nodes(), - ( - clusters: { - [clusterId: string]: string[]; - }, - n: string, - ) => { - let child = metagraph.node(n); - if (child.type === (NodeType.META || NodeType.MULTI_COLLECTION || NodeType.API_LIST)) { - // skip metanodes - return clusters; - } - let template = (child as any).op; - if (template) { - clusters[template] = clusters[template] || []; - clusters[template].push(child.name); - } - return clusters; - }, - result, - ); -} - -/** - * For each cluster of op-nodes based op type, try to detect groupings. - * Infer series name using by trying to find pattern '' towards the end - * of node names. - * - * @param clusters Dictionary output from clusterNodes(). - * @param metagraph - * @return A dictionary from series name => seriesNode - */ -function detectSeriesUsingNumericSuffixes( - clusters: { - [clusterId: string]: string[]; - }, - metagraph: graphlib.Graph, - graphOptions: tf_graph.LabeledGraphOptions, -): { - [seriesName: string]: SeriesNode; -} { - let seriesDict: { - [seriesName: string]: SeriesNode; - } = {}; - _.each(clusters, (members, clusterId: string) => { - if (members.length <= 1) { - return; - } // isolated clusters can't make series - /** @type {Object} A dictionary mapping seriesName to seriesInfoArray, - * which is an array that contains objects with name, id, prefix, suffix, - * and parent properties. - */ - let candidatesDict: { - [seriesName: string]: SeriesNode[]; - } = {}; - // Group all nodes that have the same name, with the exception of a - // number at the end of the name after an underscore, which is allowed to - // vary. - _.each(members, (name: string) => { - const isGroup = name.charAt(name.length - 1) === '*'; - const namepath = name.split('/'); - const leaf = namepath[namepath.length - 1]; - const parent = namepath.slice(0, namepath.length - 1).join('/'); - const matches = leaf.match(/^(?\D*)(?\d+)$/); - - let prefix; - let id; - let suffix = ''; - if (matches) { - // if found '' in the name, assign id. - prefix = matches[1]; // the front non-numeric characters - id = matches[2]; // the digits - } else { - // for node without '_', make them zero-th items. - prefix = isGroup ? leaf.substr(0, leaf.length - 1) : leaf; - id = 0; - suffix = isGroup ? '*' : ''; - } - const seriesName = getSeriesNodeName(prefix, suffix, parent); - candidatesDict[seriesName] = candidatesDict[seriesName] || []; - const seriesNode = createSeriesNode(prefix, suffix, parent, Number(id), name, graphOptions); - candidatesDict[seriesName].push(seriesNode); - }); - // In each group of nodes, group nodes in bunches that have monotonically - // increasing numbers in their names. Each of these bunches is a series. - _.each(candidatesDict, (seriesInfoArray: SeriesNode[], seriesName) => { - if (seriesInfoArray.length < 2) { - return; - } - seriesInfoArray.sort((a, b) => { - return Number(a.clusterId) - Number(b.clusterId); - }); - // Loop through the nodes sorted by its detected series number, grouping - // all nodes with monotonically-increasing series numbers. - let seriesNodes = [seriesInfoArray[0]]; - for (let index = 1; index < seriesInfoArray.length; index++) { - let nextNode = seriesInfoArray[index]; - if (nextNode.clusterId === seriesNodes[seriesNodes.length - 1].clusterId + 1) { - seriesNodes.push(nextNode); - continue; - } - addSeriesToDict(seriesNodes, seriesDict, Number(clusterId), metagraph, graphOptions); - seriesNodes = [nextNode]; - } - addSeriesToDict(seriesNodes, seriesDict, Number(clusterId), metagraph, graphOptions); - }); - }); - return seriesDict; -} - -/** - * For each cluster of op-nodes based op type, try to detect groupings. - * Infer series name using by trying to find a pattern of numbers - * anywhere within node names. - * - * @param clusters Dictionary output from clusterNodes(). - * @param metagraph - * @return A dictionary from series name => seriesNode - */ -function detectSeriesAnywhereInNodeName( - clusters: { - [clusterId: string]: string[]; - }, - metagraph: graphlib.Graph, - graphOptions: tf_graph.LabeledGraphOptions, -): { - [seriesName: string]: SeriesNode; -} { - let seriesDict: { - [seriesName: string]: SeriesNode; - } = {}; - _.each(clusters, (members, clusterId: string) => { - if (members.length <= 1) { - return; - } // isolated clusters can't make series - /** - * @type {Object} A dictionary mapping a series name to a SeriesNode. - */ - let forwardDict: { - [seriesName: string]: SeriesNode; - } = {}; - /** - * @type {Object} A dictionary mapping member name to an array of series - * names this member could potentially be grouped under and the - * corresponding ids. - */ - let reverseDict: { - [seriesName: string]: any[]; - } = {}; - // Group all nodes that have the same name, with the exception of a - // number at the end of the name after an underscore, which is allowed to - // vary. - _.each(members, (name: string) => { - let isGroup = name.charAt(name.length - 1) === '*'; - let namepath = name.split('/'); - let leaf = namepath[namepath.length - 1]; - let parent = namepath.slice(0, namepath.length - 1).join('/'); - const numRegex = /(?\d+)/g; - let matches = []; - let matchResult; - let prefix; - let id; - let suffix; - let seriesName; - let matched = 0; - // Scan over the entire leaf name and match any possible numbers, - // and put the results into corresponding dictionaries. - while ((matchResult = numRegex.exec(leaf))) { - ++matched; - prefix = leaf.slice(0, matchResult.index); - id = matchResult[0]; - suffix = leaf.slice(matchResult.index + matchResult[0].length); - seriesName = getSeriesNodeName(prefix, suffix, parent); - forwardDict[seriesName] = forwardDict[seriesName]; - if (!forwardDict[seriesName]) { - forwardDict[seriesName] = createSeriesNode(prefix, suffix, parent, Number(id), name, graphOptions); - } - forwardDict[seriesName].ids.push(id); - reverseDict[name] = reverseDict[name] || []; - reverseDict[name].push([seriesName, id]); - } - if (matched < 1) { - prefix = isGroup ? leaf.substr(0, leaf.length - 1) : leaf; - id = 0; - suffix = isGroup ? '*' : ''; - seriesName = getSeriesNodeName(prefix, suffix, parent); - forwardDict[seriesName] = forwardDict[seriesName]; - if (!forwardDict[seriesName]) { - forwardDict[seriesName] = createSeriesNode(prefix, suffix, parent, Number(id), name, graphOptions); - } - forwardDict[seriesName].ids.push(id); - reverseDict[name] = reverseDict[name] || []; - reverseDict[name].push([seriesName, id]); - } - }); - /** @type {Object} A dictionary mapping seriesName to seriesInfoArray, - * which is an array that contains objects with name, id, prefix, suffix, - * and parent properties. - */ - let candidatesDict: { - [seriesName: string]: SeriesNode[]; - } = {}; - // For each of the member, put it into the maximum possible series, - // and create candidatesDict accordingly. - _.each(reverseDict, (seriesNameIdArray, name) => { - seriesNameIdArray.sort((a, b) => { - return forwardDict[b[0]].ids.length - forwardDict[a[0]].ids.length; - }); - let seriesName = seriesNameIdArray[0][0]; - let id = seriesNameIdArray[0][1]; - candidatesDict[seriesName] = candidatesDict[seriesName] || []; - const namepath = name.split('/'); - const leaf = namepath[namepath.length - 1]; - const parent = namepath.slice(0, namepath.length - 1).join('/'); - let seriesNode = createSeriesNode( - forwardDict[seriesName].prefix, - forwardDict[seriesName].suffix, - parent, - Number(id), - name, - graphOptions, - ); - candidatesDict[seriesName].push(seriesNode); - }); - // In each group of nodes, group nodes in bunches that have monotonically - // increasing numbers in their names. Each of these bunches is a series. - _.each(candidatesDict, (seriesInfoArray: SeriesNode[], seriesName) => { - if (seriesInfoArray.length < 2) { - return; - } - seriesInfoArray.sort((a, b) => { - return Number(a.clusterId) - Number(b.clusterId); - }); - // Loop through the nodes sorted by its detected series number, grouping - // all nodes with monotonically-increasing series numbers. - let seriesNodes = [seriesInfoArray[0]]; - for (let index = 1; index < seriesInfoArray.length; index++) { - let nextNode = seriesInfoArray[index]; - if (nextNode.clusterId === seriesNodes[seriesNodes.length - 1].clusterId + 1) { - seriesNodes.push(nextNode); - continue; - } - addSeriesToDict(seriesNodes, seriesDict, Number(clusterId), metagraph, graphOptions); - seriesNodes = [nextNode]; - } - addSeriesToDict(seriesNodes, seriesDict, Number(clusterId), metagraph, graphOptions); - }); - }); - return seriesDict; -} - -/** - * Add a series to the provided dictionary mapping series names to series. - * - * @param seriesNodes the nodes in the series. Contains - * name, id, prefix, suffix and parent properties of the node. - * @param seriesDict the dictionary of series - * @param clusterId ID of the template of the nodes of the series - * @param metagraph - * @param graphOptions - */ -function addSeriesToDict( - seriesNodes: SeriesNode[], - seriesDict: { - [seriesName: string]: SeriesNode; - }, - clusterId: number, - metagraph: graphlib.Graph, - graphOptions: tf_graph.LabeledGraphOptions, -): void { - if (seriesNodes.length > 1) { - let curSeriesName = getSeriesNodeName( - seriesNodes[0].prefix, - seriesNodes[0].suffix, - seriesNodes[0].parent, - seriesNodes[0].clusterId, - seriesNodes[seriesNodes.length - 1].clusterId, - ); - let curSeriesNode = createSeriesNode( - seriesNodes[0].prefix, - seriesNodes[0].suffix, - seriesNodes[0].parent, - clusterId, - curSeriesName, - graphOptions, - ); - _.each(seriesNodes, (node) => { - curSeriesNode.ids.push(node.clusterId); - curSeriesNode.metagraph.setNode(node.name, metagraph.node(node.name)); - }); - seriesDict[curSeriesName] = curSeriesNode; - } -} diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/layout.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/layout.ts index 08f441b6abcca6e62d6426e324cfee3a73181d00..03d2b0b61d1e23a65b29892bc8e3b083cac7cbbf 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/layout.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/layout.ts @@ -42,26 +42,6 @@ export const PARAMS = { */ edgeSep: 5, }, - /** Graph parameter for metanode. */ - series: { - /** - * Dagre's nodesep param - number of pixels that - * separate nodes horizontally in the layout. - * - */ - nodeSep: 5, - /** - * Dagre's ranksep param - number of pixels - * between each rank in the layout. - * - */ - rankSep: 25, - /** - * Dagre's edgesep param - number of pixels that separate - * edges horizontally in the layout. - */ - edgeSep: 5, - }, /** * Padding is used to correctly position the graph SVG inside of its parent * element. The padding amounts are applied using an SVG transform of X and @@ -85,13 +65,6 @@ export const PARAMS = { /** Y-space between each extracted node. */ extractYOffset: 20, }, - series: { - paddingTop: 10, - paddingBottom: 10, - paddingLeft: 10, - paddingRight: 10, - labelHeight: 10, - }, }, nodeSize: { /** Size of meta nodes. */ @@ -106,7 +79,7 @@ export const PARAMS = { /** The radius of the circle denoting the expand button. */ expandButtonRadius: 3, }, - multi_collection: { + multiCollection: { radius: 5, width: 60, maxLabelWidth: 200, @@ -117,7 +90,7 @@ export const PARAMS = { /** The radius of the circle denoting the expand button. */ expandButtonRadius: 3, }, - api_list: { + apiList: { radius: 5, width: 60, maxLabelWidth: 200, @@ -136,52 +109,16 @@ export const PARAMS = { labelOffset: -12, maxLabelWidth: 40, }, - /** Size of series nodes. */ - series: { - expanded: { - // For expanded series nodes, width and height will be - // computed to account for the subscene. - radius: 10, - labelOffset: 0, - }, - vertical: { - // When unexpanded, series whose underlying metagraphs contain - // one or more non-control edges will show as a vertical stack - // of ellipses. - width: 16, - height: 13, - labelOffset: -13, - }, - horizontal: { - // When unexpanded, series whose underlying metagraphs contain - // no non-control edges will show as a horizontal stack of - // ellipses. - width: 24, - height: 8, - radius: 10, - labelOffset: -10, - }, - }, - /** Size of bridge nodes. */ - bridge: { - // NOTE: bridge nodes will normally be invisible, but they must - // take up some space so that the layout step leaves room for - // their edges. - width: 20, - height: 20, - radius: 2, - labelOffset: 0, - }, }, shortcutSize: { /** Size of shortcuts for op nodes */ op: { width: 10, height: 4 }, /** Size of shortcuts for meta nodes */ meta: { width: 12, height: 4, radius: 1 }, - /** Size of shortcuts for series nodes */ - series: { width: 14, height: 4 }, - multi_collection: { width: 12, height: 4, radius: 1 }, - api_list: { width: 12, height: 4, radius: 1 }, + /** Size of shortcuts for multiCollection nodes */ + multiCollection: { width: 12, height: 4, radius: 1 }, + /** Size of shortcuts for apiList nodes */ + apiList: { width: 12, height: 4, radius: 1 }, }, annotations: { /** Maximum possible width of the bounding box for in annotations */ @@ -198,20 +135,6 @@ export const PARAMS = { maxLabelWidth: 40, }, constant: { size: { width: 4, height: 4 } }, - series: { - /** Maximum number of repeated item for unexpanded series node. */ - maxStackCount: 3, - /** - * Positioning offset ratio for collapsed stack - * of parallel series (series without edges between its members). - */ - parallelStackOffsetRatio: 0.2, - /** - * Positioning offset ratio for collapsed stack - * of tower series (series with edges between its members). - */ - towerStackOffsetRatio: 0.5, - }, minimap: { /** The maximum width/height the minimap can have. */ size: 150, @@ -242,8 +165,6 @@ export function layoutScene(renderNodeInfo: render.RenderGroupNodeInfo): void { // Update position of its children nodes and edges if (renderNodeInfo.node.type === NodeType.META) { layoutMetanode(renderNodeInfo, 10); - } else if (renderNodeInfo.node.type === NodeType.SERIES) { - layoutSeriesNode(renderNodeInfo); } else if (renderNodeInfo.node.type === NodeType.MULTI_COLLECTION) { layoutMetanode(renderNodeInfo, 10); } else if (renderNodeInfo.node.type === NodeType.API_LIST) { @@ -292,9 +213,6 @@ function layoutChildren(renderNodeInfo: render.RenderGroupNodeInfo): void { case NodeType.OP: _.extend(childNodeInfo, PARAMS.nodeSize.op); break; - case NodeType.BRIDGE: - _.extend(childNodeInfo, PARAMS.nodeSize.bridge); - break; case NodeType.META: case NodeType.MULTI_COLLECTION: case NodeType.API_LIST: @@ -311,19 +229,6 @@ function layoutChildren(renderNodeInfo: render.RenderGroupNodeInfo): void { layoutScene(childGroupNodeInfo); // Recursively layout its subscene. } break; - case NodeType.SERIES: - if (childNodeInfo.expanded) { - _.extend(childNodeInfo, PARAMS.nodeSize.series.expanded); - let childGroupNodeInfo = childNodeInfo; - layoutScene(childGroupNodeInfo); // Recursively layout its subscene. - } else { - let childGroupNodeInfo = childNodeInfo; - let seriesParams = childGroupNodeInfo.node.hasNonControlEdges - ? PARAMS.nodeSize.series.vertical - : PARAMS.nodeSize.series.horizontal; - _.extend(childNodeInfo, seriesParams); - } - break; default: throw Error(`Unrecognized node type: ${childNodeInfo.node.type}`); } @@ -348,25 +253,6 @@ function dagreLayout(graph: graphlib.Graph, params): { height: number; width: nu ranksep: params.rankSep, edgesep: params.edgeSep, }); - let bridgeNodeNames: any[] = []; - let nonBridgeNodeNames: any[] = []; - // Split out nodes into bridge and non-bridge nodes, and calculate the total - // width we should use for bridge nodes. - _.each(graph.nodes(), (nodeName) => { - let nodeInfo = graph.node(nodeName); - if (nodeInfo.node.type === NodeType.BRIDGE) { - bridgeNodeNames.push(nodeName); - } else { - nonBridgeNodeNames.push(nodeName); - } - }); - // If there are no non-bridge nodes, then the graph has zero size. - if (!nonBridgeNodeNames.length) { - return { - width: 0, - height: 0, - }; - } dagre.layout(graph); // Calculate the true bounding box of the graph by iterating over nodes and // edges rather than accepting dagre's word for it. In particular, we should @@ -376,7 +262,7 @@ function dagreLayout(graph: graphlib.Graph, params): { height: number; width: nu let minY = Infinity; let maxX = -Infinity; let maxY = -Infinity; - _.each(nonBridgeNodeNames, (nodeName) => { + _.each(graph.nodes(), (nodeName) => { let nodeInfo = graph.node(nodeName); let w = 0.5 * nodeInfo.width; let x1 = nodeInfo.x - w; @@ -498,23 +384,7 @@ function layoutMetanode(renderNodeInfo: render.RenderGroupNodeInfo, rankSep: num // Determine the whole metanode's height (from top to bottom). renderNodeInfo.height = renderNodeInfo.paddingTop + renderNodeInfo.coreBox.height + renderNodeInfo.paddingBottom; } -/** - * Calculate layout for series node's core graph. Only called for an expanded - * series. - */ -function layoutSeriesNode(node: render.RenderGroupNodeInfo): void { - let graph = node.coreGraph; - let params = PARAMS.subscene.series; - _.extend(node, params); - // Layout the core. - _.extend(node.coreBox, dagreLayout(node.coreGraph, PARAMS.graph.series)); - _.each(graph.nodes(), (nodeName) => { - graph.node(nodeName).excluded = false; - }); - // Series do not have in/outExtractBox so no need to include them here. - node.width = node.coreBox.width + params.paddingLeft + params.paddingRight; - node.height = node.coreBox.height + params.paddingTop + params.paddingBottom; -} + /** * Calculate layout for annotations of a given node. * This will modify positions of the given node and its annotations. @@ -641,12 +511,10 @@ function sizeAnnotation(a: render.Annotation): void { _.extend(a, PARAMS.shortcutSize.op); } else if (a.node.type === NodeType.META) { _.extend(a, PARAMS.shortcutSize.meta); - } else if (a.node.type === NodeType.SERIES) { - _.extend(a, PARAMS.shortcutSize.series); } else if (a.node.type === NodeType.MULTI_COLLECTION) { - _.extend(a, PARAMS.shortcutSize.multi_collection); + _.extend(a, PARAMS.shortcutSize.multiCollection); } else if (a.node.type === NodeType.API_LIST) { - _.extend(a, PARAMS.shortcutSize.api_list); + _.extend(a, PARAMS.shortcutSize.apiList); } else { throw Error(`Invalid node type: ${a.node.type}`); } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/loader.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/loader.ts index fb11fff7d758bb50dba817a525cf36c279d88cad..2e7462c78ce0079d3e2779398f4d15ccd29b2646 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/loader.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/loader.ts @@ -27,7 +27,7 @@ export function fetchAndConstructHierarchicalGraph( tracker: ProgressTracker, remotePath: string | null, pbTxtFile: Blob | null, - hierarchyParams: hierarchy.HierarchyParams = hierarchy.DefaultHierarchyParams, + hierarchyParams: hierarchy.HierarchyParams = hierarchy.defaultHierarchyParams, ): Promise { const dataTracker = tf_graph_util.getSubtaskTracker(tracker, 30, 'Data'); const graphTracker = tf_graph_util.getSubtaskTracker(tracker, 20, 'Graph'); @@ -37,7 +37,7 @@ export function fetchAndConstructHierarchicalGraph( .then( (graph): any => { if (graph.node.length !== 2) { - return tf_graph.build(graph, tf_graph.DefaultBuildParams, graphTracker); + return tf_graph.build(graph, tf_graph.defaultBuildParams, graphTracker); } const npuGraph: GraphDef = { node: [] }; const benchGraph: GraphDef = { node: [] }; @@ -50,14 +50,14 @@ export function fetchAndConstructHierarchicalGraph( benchGraph.node.push(graph.node[0]); } return Promise.all([ - tf_graph.build(npuGraph, tf_graph.DefaultBuildParams, graphTracker), - tf_graph.build(benchGraph, tf_graph.DefaultBuildParams, graphTracker), + tf_graph.build(npuGraph, tf_graph.defaultBuildParams, graphTracker), + tf_graph.build(benchGraph, tf_graph.defaultBuildParams, graphTracker), ]); }, () => { throw new Error( 'Malformed GraphDef. This can sometimes be caused by ' + - 'a bad network connection or invalid inputting files ', + 'a bad network connection or invalid inputting files ', ); }, ) diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/node.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/node.ts index f126183b0b65d73144600670fe1e71b1722c3033..d1cc4e9cf7ca70f52d0216f50162c7908443c16f 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/node.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/node.ts @@ -23,7 +23,7 @@ import { Class, FontSizeInPx, selectChild, selectOrCreateChild } from './common' import * as contextmenu from './contextmenu'; import * as edge from './edge'; import * as tf_graph from './graph'; -import { MetanodeImpl, Node, NodeType, OpNode, OpNodeImpl, SeriesNode } from './graph'; +import { MetanodeImpl, Node, NodeType, OpNode, OpNodeImpl } from './graph'; import * as layout from './layout'; import * as render from './render'; import { RenderNodeInfo } from './render'; @@ -435,30 +435,9 @@ export function buildShape(nodeGroup, d, nodeClassName: string): d3.Selectiond; - if (groupNodeInfo.coreGraph) { - stampType = groupNodeInfo.node.hasNonControlEdges ? 'vertical' : 'horizontal'; - } - let classList = [Class.Node.COLOR_TARGET]; - if (groupNodeInfo.isFadedOut) { - classList.push('faded-ellipse'); - } - tf_graph_common - .selectOrCreateChild(shapeGroup, 'use', classList) - .attr('xlink:href', `#op-series-${stampType}-stamp`); - tf_graph_common - .selectOrCreateChild(shapeGroup, 'rect', Class.Node.COLOR_TARGET) - .attr('rx', d.radius) - .attr('ry', d.radius); - break; - } case NodeType.META: case NodeType.MULTI_COLLECTION: case NodeType.API_LIST: @@ -478,12 +457,6 @@ export function nodeClass(d: render.RenderNodeInfo): string { return Class.OPNODE; case NodeType.META: return Class.METANODE; - case NodeType.SERIES: - return Class.SERIESNODE; - case NodeType.BRIDGE: - return Class.BRIDGENODE; - case NodeType.ELLIPSIS: - return Class.ELLIPSISNODE; case NodeType.MULTI_COLLECTION: return Class.MULTI_COLLECTION; case NodeType.API_LIST: @@ -536,27 +509,6 @@ function position(nodeGroup, d: render.RenderNodeInfo): void { } break; } - case NodeType.SERIES: { - let shape = tf_graph_scene.selectChild(shapeGroup, 'use'); - if (d.expanded) { - tf_graph_scene.positionRect(shape, d.x, d.y, d.width, d.height); - subscenePosition(nodeGroup, d); - // put label on top - labelPosition(nodeGroup, cx, d.y, (-d.height / 2) + (d.labelHeight / 2)); - } else { - tf_graph_scene.positionRect(shape, cx, d.y, d.coreBox.width, d.coreBox.height); - labelPosition(nodeGroup, cx, d.y, d.labelOffset); - } - break; - } - case NodeType.BRIDGE: { - // position shape - // NOTE: In reality, these will not be visible, but it helps to put them - // in the correct position for debugging purposes. - let shape = tf_graph_scene.selectChild(shapeGroup, 'rect'); - tf_graph_scene.positionRect(shape, d.x, d.y, d.width, d.height); - break; - } case NodeType.MULTI_COLLECTION: case NodeType.API_LIST: { // position shape @@ -691,16 +643,14 @@ export function stylize( sceneElement: TfGraphScene, nodeClassName?, ): void { - const resolvedNodeClassName = nodeClassName || Class.Node.SHAPE || Class.Node.OUTER; + const resolvedNodeClassName = nodeClassName || Class.Node.SHAPE || Class.Node.OUTER; const isHighlighted = sceneElement.isNodeHighlighted(renderInfo.node.name); const isSelected = sceneElement.isNodeSelected(renderInfo.node.name); - const isExtract = renderInfo.isInExtract || renderInfo.isOutExtract || renderInfo.isLibraryFunction; const isExpanded = renderInfo.expanded && resolvedNodeClassName !== Class.Annotation.NODE; const isFadedOut = renderInfo.isFadedOut; const isLinked = sceneElement.isNodeLinked(renderInfo.node.name); nodeGroup.classed('highlighted', isHighlighted); nodeGroup.classed('selected', isSelected); - nodeGroup.classed('extract', isExtract); nodeGroup.classed('expanded', isExpanded); nodeGroup.classed('faded', isFadedOut); nodeGroup.classed('linked', isLinked); @@ -1314,12 +1264,6 @@ export function buildGroupForScene( }, Array(), ); - if (renderNode.node.type === NodeType.SERIES) { - // For series, we want the first item on top, so reverse the array so - // the first item in the series becomes last item in the top, and thus - // is rendered on the top. - coreNodes.reverse(); - } // Create the layer of edges for this scene (paths). edge.buildGroup(coreGroup, renderNode.coreGraph, sceneElement); // Create the layer of nodes for this scene (ellipses, rects etc). diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/parser.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/parser.ts index 1d09184187cf444d00f587b047209211556f72fd..ad3047b2572e9eb9f5cc8c5f7c558cb2b6d02ae1 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/parser.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/parser.ts @@ -50,38 +50,7 @@ export function fetchPbTxt(filepath: string): Promise { }); }); } -/** - * Fetches the metadata file, parses it and returns a promise of the result. - */ -export function fetchAndParseMetadata( - path: string, - tracker: ProgressTracker, -): Promise { - return tf_graph_util - .runTask( - 'Reading metadata pbtxt', - 40, - () => { - if (path == null) { - return Promise.resolve(null); - } - return fetchPbTxt(path); - }, - tracker, - tb_debug.GraphDebugEventId.FETCH_METADATA_PBTXT_BYTES, - ) - .then((arrayBuffer: ArrayBuffer | null) => { - return tf_graph_util.runAsyncPromiseTask( - 'Parsing metadata.pbtxt', - 60, - () => { - return arrayBuffer != null ? parseStatsPbTxt(arrayBuffer) : Promise.resolve(null); - }, - tracker, - tb_debug.GraphDebugEventId.PARSE_METADATA_PBTXT_INTO_OBJECT, - ); - }); -} + /** * Fetches the graph file, parses it and returns a promise of the result. The * result will be undefined if the graph is empty. @@ -215,27 +184,12 @@ const GRAPH_REPEATED_FIELDS: { 'node.attr.value.tensor.string_val': true, 'node.attr.value.tensor.tensor_shape.dim': true, }; -const METADATA_REPEATED_FIELDS: { - [attrPath: string]: boolean; -} = { - 'step_stats.dev_stats': true, - 'step_stats.dev_stats.node_stats': true, - 'step_stats.dev_stats.node_stats.output': true, - 'step_stats.dev_stats.node_stats.memory': true, - 'step_stats.dev_stats.node_stats.output.tensor_description.shape.dim': true, -}; /** * Parses an ArrayBuffer of a proto txt file into a raw Graph object. */ export function parseGraphPbTxt(input: ArrayBuffer): Promise { return parsePbtxtFile(input, GRAPH_REPEATED_FIELDS); } -/** - * Parses an ArrayBuffer of a proto txt file into a StepStats object. - */ -export function parseStatsPbTxt(input: ArrayBuffer): Promise { - return parsePbtxtFile(input, METADATA_REPEATED_FIELDS).then((obj) => obj.step_stats); -} /** * Parses a ArrayBuffer of a proto txt file into javascript object. * diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/proto.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/proto.ts index 3e34fe429be7ca8b3182dc20d5c66a73aba42470..b8209271c97592049c6e7bfdee24e38a9e1e91a7 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/proto.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/proto.ts @@ -72,34 +72,6 @@ export interface EdgeInfo { value: Record; }[]; } -/** - * Specifies an argument. An argument is either an input or an output of a - * function. There are thus 2 types of arguments: input_args and output_args. - * Nodes outside a function call connect to arguments. The graph explorer - * creates nodes for all arguments within a function. - */ -export interface ArgDef { - name: string; - type: string; -} -/** - * Describes the signature of a function - its name, inputs, and outputs. - */ -export interface OpDef { - name: string; - input_arg: ArgDef[]; - output_arg: ArgDef[]; -} -/** - * Describes a single function within the library. - */ -export interface FunctionDef { - // The definition of the function's name, arguments, return values, - // attrs etc. - signature: OpDef; - // A list of nodes in the function. - node_def: NodeDef[]; -} /** * TensorFlow graph definition as defined in the graph.proto file. */ @@ -109,113 +81,3 @@ export interface GraphDef { // The information of the list of edges. edge?: EdgeInfo[]; } -/** - * Generic graph as defined in the graph_explorer.proto file. - */ -export interface GenericGraph { - /** List of nodes in the graph */ - node: GenericNode[]; - /** List of nodes in the graph */ - edge: GenericEdge[]; - /** List of attributes that describe/modify the operation. */ - attr: Array<{ - [key: string]: any; - }>; -} -/** - * GenericEdge corresponds to the Edge message in graph_explorer.proto. - */ -export interface GenericEdge { - /** Name of the source node. */ - source: string; - /** Name of the target node. */ - target: string; - /** Attributes of the edge. */ - edge_attr: Array<{ - [key: string]: any; - }>; -} -/** - * GenericNode corresponds to the Node message in graph_explorer.proto. - */ -export interface GenericNode { - /** Name of the node */ - name: string; - /** Attributes of a leaf node or leaf nodes within a metanode. */ - node_attr: Array<{ - [key: string]: any; - }>; - /** Attributes of a metanode. */ - metanode_attr: Array<{ - [key: string]: any; - }>; -} -export interface DevStat { - device: string; - node_stats: NodeExecStats[]; -} -/** - * TensorFlow stats file definition as defined in the stats proto file. - */ -export interface StepStats { - dev_stats: DevStat[]; -} -/** - * TensorFlow stats for a node as defined in the step_stats proto file. - */ -export interface NodeExecStats { - node_name: string; - // The next 4 properties are currently stored as string in json - // and must be parsed. - all_start_micros: number; - op_start_rel_micros: number; - op_end_rel_micros: number; - all_end_rel_micros: number; - memory: { - allocator_name: string; - total_bytes: number; // Stored as string in json and should be parsed. - peak_bytes: number; // Stored as string in json and should be parsed. - }[]; - /** Output sizes recorded for a single execution of a graph node */ - output: NodeOutput[]; - timeline_label: string; - scheduled_micros: string; - thread_id: string; -} -/** - * Description for the output tensor(s) of an operation in the graph as - * defined in the step_stats.proto file. - */ -export interface NodeOutput { - slot: number; // Stored as string in json and should be parsed. - tensor_description: { - /** Data type of tensor elements */ - dtype: string; - /** Shape of the tensor */ - shape: { - /** - * Dimensions of the tensor, such as [{name: 'input', size: 30}, - * {name: 'output', size: 40}] for a 30 x 40 2D tensor. The names - * are optional. The order of entries in 'dim' matters: It indicates - * the layout of the values in the tensor in-memory representation. - */ - dim: { - /** Size of the tensor in that dimension */ - size: number; // Stored as string in json and should be parsed. - /** Optional name of the tensor dimension */ - name?: string; - }[]; - }; - /** Information about the size and allocator used for the data */ - allocation_description: { - // The next 2 properties are stored as string in json and - // should be parsed. - /** Total number of bytes requested */ - requested_bytes: number; - /** Total number of bytes allocated, if known */ - allocated_bytes?: number; - /** Name of the allocator used */ - allocator_name: string; - }; - }; -} diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/render.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/render.ts index bfeecbcfe1fdb2a7496c98cb7b96a058f262475e..d453430b6e565478ed675ffd847a65c1127f90bb 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/render.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/render.ts @@ -24,15 +24,11 @@ import * as _ from 'lodash'; import { NPU_PREFIX, BENCH_PREFIX, EDGE_WIDTH_SIZE_BASED_SCALE } from './common'; import * as tf_graph from './graph'; import { - BridgeNode, createGraph, - EllipsisNode, getHierarchicalPath, GraphType, GroupNode, - InclusionType, Metaedge, - MetaedgeImpl, Metanode, Node, NodeType, @@ -71,50 +67,8 @@ export const MetanodeColors = { */ DEFAULT_FILL: '#d9d9d9', DEFAULT_STROKE: '#a6a6a6', - SATURATION: 0.6, - LIGHTNESS: 0.85, - /** - * Neutral color to use when the node is expanded (used when coloring by - * compute time, memory and device). - */ - EXPANDED_COLOR: '#f0f0f0', - /** - * Standard hue values for node color palette. - */ - HUES: [220, 100, 180, 40, 20, 340, 260, 300, 140, 60], - STRUCTURE_PALETTE(id: number, lightened?: boolean): string { - // The code below is a flexible way to computationally create a set - // of colors that go well together. - let hues = MetanodeColors.HUES; - let n = hues.length; - let hue = hues[id % n]; - let m = Math.sin((hue * Math.PI) / 360); - let sat = lightened ? 30 : 90 - (60 * m); - let light = lightened ? 95 : 80; - return d3.hsl(hue, 0.01 * sat, 0.01 * light).toString(); - }, - DEVICE_PALETTE(index: number): string { - return MetanodeColors.STRUCTURE_PALETTE(index); - }, - XLA_CLUSTER_PALETTE(index: number): string { - return MetanodeColors.STRUCTURE_PALETTE(index); - }, - UNKNOWN: '#eee', GRADIENT_OUTLINE: '#888', }; -/** - * Color parameters for op nodes. - */ -export const SeriesNodeColors = { - DEFAULT_FILL: 'white', - DEFAULT_STROKE: '#b2b2b2', -}; -/** - * Function that computes edge thickness in pixels. - */ -export interface EdgeThicknessFunction { - (edgeData: EdgeData, edgeClass: string): number; -} /** * Function that computes edge label strings. This function accepts a Metaedge, * which could actually encapsulate several base edges. For instance, several @@ -130,66 +84,6 @@ export interface EdgeLabelFunction { * Parameters that affect how the graph is rendered on the screen. */ const PARAMS = { - /** - * The minimum number of nodes for a graph to have in order for high in and - * out degree nodes to be extracted in auxiliary. The aim here is to prevent - * nodes from being extracted from small graphs. - */ - minNodeCountForExtraction: 15, - /** - * The minimum in or out degree a node must have in order to be possibly - * extracted. - */ - minDegreeForExtraction: 5, - /** - * Maximum number of control edges a node can have before they aren't - * displayed. - */ - maxControlDegree: 4, - /** - * Maximum in (for outbound bridge paths) or out (for inbound bridge paths) - * degree of a node allowed for a bridge path to be rendered to it from a - * subhierarchy of nodes. Having a max prevents having too many nodes emanate - * from a subhierarchy and crowding up. - */ - maxBridgePathDegree: 4, - /** - * Types patterns for predefined out-extract nodes, which are - * sink-like nodes that will be extracted from the main graph. - */ - outExtractTypes: ['NoOp'], - /** - * Types patterns for predefined in-extract nodes, which are - * source-like nodes that will be extracted from the main graph. - */ - inExtractTypes: [], - /** - * When removing edges from a high degree node, remove all of its edges if - * detachAllEdgesForHighDegree is true. Otherwise remove all in-edges if - * the node has high in-degree, or all out-edges if the node has high - * out-degree. - */ - detachAllEdgesForHighDegree: true, - /** - * After extracting high in/out degree nodes and predefined - * source-like/sink-like, extract isolated nodes to the side - * if this extractIsolatedNodesWithAnnotationsOnOneSide is true. - */ - extractIsolatedNodesWithAnnotationsOnOneSide: true, - /** - * Whether to add bridge nodes and edges to the core when building the - * subhierarchy of an expanded metanode. See buildSubhierarchy(). - */ - enableBridgegraph: true, - /** - * 2 colors, for the minimum and maximum value respectively, whenever we - * have a gradient scale. - */ - minMaxColors: ['#fff5f0', '#fb6a4a'], - /** - * Maximum number of annotations to be displayed on a node before an - * ellipsis is used. - */ maxAnnotations: 5, }; /** @@ -339,10 +233,6 @@ export class RenderGraphInfo { return nodeName; } - setDepth(depth: number): void { - setGroupNodeDepth(this.root, Number(depth)); - } - /** * Returns true if the renderNode is an isolated node within its parent node. */ @@ -360,15 +250,6 @@ export class RenderGraphInfo { return !!found; } - /** - * Returns a list of ops that have been rendered so far for this graph. More - * ops may later be rendered if the user expands nodes for instance. The list - * returned here can only stay the same size or grow on successive calls. - */ - getNamesOfRenderedOps(): string[] { - return this.renderedOpNames; - } - buildSubhierarchy(nodeName: string, subGraph: tf_graph.SlimGraph | undefined = undefined): void { // Terminate if the rendering hierarchy was already constructed // for this node. @@ -380,7 +261,7 @@ export class RenderGraphInfo { this.hasSubhierarchy[nodeName] = true; let renderNodeInfo = this.index[nodeName]; // If it is not a meta node or a series node, don't do anything. - const excludedTypes = [NodeType.META, NodeType.MULTI_COLLECTION, NodeType.API_LIST, NodeType.SERIES]; + const excludedTypes = [NodeType.META, NodeType.MULTI_COLLECTION, NodeType.API_LIST]; if (!excludedTypes.includes(renderNodeInfo.node.type)) { return; } @@ -432,235 +313,19 @@ export class RenderGraphInfo { }); } }); - // Add render metaedge info for edges in the metagraph. - _.each(metagraph.edges(), (edgeObj) => { - if (edgeObj.v.includes(tf_graph.NAMESPACE_DELIM) || edgeObj.w.includes(tf_graph.NAMESPACE_DELIM)) { - let inbound = edgeObj.w.includes(tf_graph.NAMESPACE_DELIM); - if (inbound) { - let pathNames = edgeObj.w.split(tf_graph.NAMESPACE_DELIM); - this.toRenderEdgeObjs.push({ - v: edgeObj.v, - w: pathNames[pathNames.length - 1], - id: edgeObj.name, - edge: metagraph.edge(edgeObj), - }); - } else { - let pathNames = edgeObj.v.split(tf_graph.NAMESPACE_DELIM); - this.toRenderEdgeObjs.push({ - v: pathNames[pathNames.length - 1], - w: edgeObj.w, - id: edgeObj.name, - edge: metagraph.edge(edgeObj), - }); - } - return; - } - let metaedge = metagraph.edge(edgeObj); - let renderMetaedgeInfo = new RenderMetaedgeInfo(metaedge as any); - renderMetaedgeInfo.isFadedOut = this.index[edgeObj.v].isFadedOut || this.index[edgeObj.w].isFadedOut; - coreGraph.setEdge(edgeObj.v, edgeObj.w, renderMetaedgeInfo, edgeObj.name); - }); // Look up the parent node's render information and short circuit if none. let parentNode = renderGroupNodeInfo.node.parentNode; if (!parentNode) { return; } - // Utility function for computing the name of a bridge node. - let getBridgeNodeName = (inbound, ...rest): string => rest.concat([inbound ? 'IN' : 'OUT']).join('~~'); - if (subGraph) { - const subNodes = Object.keys(subGraph.metaNodes).concat(Object.keys(subGraph.nodes)); - renderNodeInfo.node.cardinality += subNodes.length; - const parentMetagraph = (parentNode as GroupNode).metagraph; - const parentBridgegraph = (parentNode as GroupNode).bridgegraph; - _.each(subNodes, (subName) => { - this.toRenderEdgeObjs - .filter((e) => e.v === subName || e.w === subName) - .forEach((item) => { - const edgeObj = item.edge; - const inbound = item.w === subName; - const edgeIO = inbound - ? [edgeObj.v?.split(tf_graph.NAMESPACE_DELIM)[0], nodeName] - : [nodeName, edgeObj.w?.split(tf_graph.NAMESPACE_DELIM)[0]]; - let bridgeMetaedge = parentMetagraph.edge(...edgeIO, item.id); - if (!bridgeMetaedge) { - bridgeMetaedge = parentBridgegraph.edge(...edgeIO, item.id); - if (!bridgeMetaedge) { - return; - } - } - _.each(edgeObj.baseEdgeList, (baseEdge) => { - let name = inbound ? baseEdge.v : baseEdge.w; - if (baseEdge.attr) { - baseEdge.attr._path = name; - } else { - baseEdge.attr = { _path: name }; - } - if (inbound) { - baseEdge.v = name?.split(tf_graph.NAMESPACE_DELIM).pop(); - baseEdge.w = subName; - } else { - baseEdge.v = subName; - baseEdge.w = name?.split(tf_graph.NAMESPACE_DELIM).pop(); - } - bridgeMetaedge.addBaseEdge(baseEdge, this.hierarchy, true); - }); - }); - }); - } - // Remove rendered edges to save memory. - this.toRenderEdgeObjs = this.toRenderEdgeObjs.filter((e) => !this.index[e.v] || !this.index[e.w]); - // Build out the bridgegraph. - let bridgegraph = this.hierarchy.getBridgegraph(nodeName); - // Look for popular nodes so we can make annotations instead of paths. - let otherCounts = { - // Counts of edges coming INTO other nodes by name (outgoing from self). - in: < - { - [nodeName: string]: number; - } - >{}, - // Counts of edges going OUT from other nodes by name (coming into self). - out: < - { - [nodeName: string]: number; - } - >{}, - // Counts of all control edges involving other nodes by name. - control: < - { - [nodeName: string]: number; - } - >{}, - }; - _.each(bridgegraph.edges(), (e) => { - // An edge is inbound if its destination node is in the metagraph. - let inbound = !!metagraph.node(e.w); - let otherName = inbound ? e.v : e.w; - let metaedge = bridgegraph.edge(e); - if (!metaedge.numRegularEdges) { - otherCounts.control[otherName] = (otherCounts.control[otherName] || 0) + 1; - } else if (inbound) { - otherCounts.out[otherName] = (otherCounts.out[otherName] || 0) + 1; - } else { - otherCounts.in[otherName] = (otherCounts.in[otherName] || 0) + 1; - } - }); - // For each bridge container (IN and/or OUT), add structural edges between - // terminal nodes and that container. A terminal node is one which has no - // non-bridge edges in the direction of the container. - // - // For example, consider a Metanode A which contains two child nodes A/B - // and A/C. Let's say it has one edge in the metagraph from A/B->A/C, and - // one edge in the bridgegraph from Z->A/C. - // - // At this point, we've added a container bridge node IN to house all - // incoming bridge nodes. We've also added a bridge node Z' (with parent IN) - // to A, and a bridge edge from Z'->C. - // - // +----------------------+ - // | A +---+ | - // | +------>| C | | - // | | +---+ | - // | | ^ | - // | | | | - // | | +----|----+ | - // | | | IN | | | - // | +---+ | +---+ | | - // | | B | | | Z'| | | - // | +---+ | +---+ | | - // | +---------+ | - // +----------------------+ - // - // With no other help, dagre would lay out B and Z' on the same level, - // because both of them have no incoming edges. In other words, B is a - // terminal node in the INCOMING direction. - // - // But we want to force dagre to lay out Z' (and everything in IN) lower - // than all non-bridge nodes, so that there's enough room for the bridge - // edges after they've been adjusted to meet up with paths coming in from - // outside. - // - // To force Z' (and all other bridge nodes) to be lowest in the graph, we - // identify terminal nodes like B and give them structural edges to - // a new structural bridge node S which we add to IN. - // - // +----------------------+ - // | A +---+ | - // | +--->| C | | - // | | +---+ | - // | +---+ ^ | - // | | B | | | - // | +---+ | | - // | ^ | | - // | | | | - // | +----|------|----+ | - // | |IN | | | | - // | | +---+ +---+ | | - // | | | S | | Z'| | | - // | | +---+ +---+ | | - // | +----------------+ | - // +----------------------+ - // - // This ensures that dagre will lay out the bridge containers strictly at - // the ends of the graph. The structural edges will never be seen in the - // visualization except as a debugging aid. _.each([true, false], (inbound) => { - let bridgeContainerName = getBridgeNodeName(inbound, nodeName); - let bridgeContainerInfo = coreGraph.node(bridgeContainerName); - if (!bridgeContainerInfo) { - return; - } _.each(coreGraph.nodes(), (childName) => { - // Short-circuit if this child is a bridge node or it's not a terminal - // node in the direction we're interested in. - let childNodeInfo = coreGraph.node(childName); - if (childNodeInfo.node.type === NodeType.BRIDGE) { - return; - } let isTerminal = inbound ? !coreGraph.predecessors(childName)?.length : !coreGraph.successors(childName)?.length; if (!isTerminal) { return; } - // Find or create a bridge node in the container for all structural - // metaedges. It would have been nice to skip this step and simply - // set a metaedge between the terminal node and the container node, but - // in that case, something about the graph upsets dagre.layout()'s - // longestPath algorithm (was getting errors due to an undefined). - let structuralNodeName = getBridgeNodeName(inbound, nodeName, 'STRUCTURAL_TARGET'); - let structuralRenderInfo = coreGraph.node(structuralNodeName); - if (!structuralRenderInfo) { - let bridgeNode: BridgeNode = { - // Important Node properties. - name: structuralNodeName, - type: NodeType.BRIDGE, - // Unimportant Node properties. - isGroupNode: false, - cardinality: 1, - parentNode: null, - include: InclusionType.UNSPECIFIED, - // BridgeNode properties. - inbound: inbound, - inputData: {}, - outputData: {}, - suggestions: {}, - nodeAttributes: {}, - }; - structuralRenderInfo = new RenderNodeInfo(bridgeNode); - structuralRenderInfo.structural = true; - this.index[structuralNodeName] = structuralRenderInfo as any; - coreGraph.setNode(structuralNodeName, structuralRenderInfo); - bridgeContainerInfo.node.cardinality++; - coreGraph.setParent(structuralNodeName, bridgeContainerName); - } - // Create the structural Metaedge and insert it. - let structuralMetaedgeInfo = new RenderMetaedgeInfo(null); - structuralMetaedgeInfo.structural = true; - structuralMetaedgeInfo.weight--; // Reduce weight for dagre layout. - inbound - ? coreGraph.setEdge(structuralNodeName, childName, structuralMetaedgeInfo) - : coreGraph.setEdge(childName, structuralNodeName, structuralMetaedgeInfo); }); }); } @@ -846,31 +511,6 @@ export class AnnotationList { this.list = []; this.nodeNames = {}; } - - /** - * Append an annotation to the list, or a stand-in ellipsis annotation instead - * if this would make it too many. - */ - push(annotation: Annotation): void { - if (annotation.node.name in this.nodeNames) { - return; // Skip duplicate annotation. - } - this.nodeNames[annotation.node.name] = true; - if (this.list.length < PARAMS.maxAnnotations) { - this.list.push(annotation); - return; - } - let lastAnnotation = this.list[this.list.length - 1]; - if (lastAnnotation.annotationType === AnnotationType.ELLIPSIS) { - let ellipsisNode = lastAnnotation.node; - ellipsisNode.setNumMoreNodes(++ellipsisNode.numMoreNodes); - return; - } - let ellipsisNode = new tf_graph.EllipsisNodeImpl(1); - this.list.push( - new Annotation(ellipsisNode, new RenderNodeInfo(ellipsisNode), null, AnnotationType.ELLIPSIS, annotation.isIn), - ); - } } /** * Contains rendering information about a node in the hierarchical graph. @@ -943,21 +583,6 @@ export class RenderNodeInfo { paddingLeft: number; paddingRight: number; paddingBottom: number; - /** - * Whether a node is extracted as source-like (having high out-degree or - * matching predefined in-extract pattern.) - */ - isInExtract: boolean; - /** - * Whether a node is extracted as sink-like (having high in-degree or matching - * predefined out-extract pattern.) - */ - isOutExtract: boolean; - /** - * Whether a node represents a function template within the library, in which - * case it should be rendered in a special scene group. - */ - isLibraryFunction: boolean; /** * Whether this node is faded out. Used when displaying stats. */ @@ -990,8 +615,6 @@ export class RenderNodeInfo { this.paddingLeft = 0; this.paddingRight = 0; this.paddingBottom = 0; - this.isInExtract = false; - this.isOutExtract = false; this.coreBox = { width: 0, height: 0 }; // By default, we don't fade nodes out. Default to false for safety. this.isFadedOut = false; @@ -1038,10 +661,6 @@ export class RenderNodeInfo { } } } - - isInCore(): boolean { - return !this.isInExtract && !this.isOutExtract && !this.isLibraryFunction; - } } /** * Contains rendering information about a Metaedge from the underlying @@ -1131,7 +750,6 @@ function setGraphDepth(graph: graphlib.Graph, depth: number): void { case NodeType.META: case NodeType.MULTI_COLLECTION: case NodeType.API_LIST: - case NodeType.SERIES: setGroupNodeDepth(child, depth - 1); break; default: @@ -1188,165 +806,3 @@ function setGroupNodeDepth(renderInfo: RenderGroupNodeInfo, depth: number): void setGraphDepth(renderInfo.coreGraph, depth); } } -/** - * Remove an edge from the graph and add annotations to both ends of the edge. - * - * @param The core graph. - * @param v Source name. - * @param w Sink name. - */ -function createShortcut(graph: graphlib.Graph, v: string, w: string): void { - let src = graph.node(v) as any; - let sink = graph.node(w) as any; - let edge = graph.edge(v, w) as any; - // If either of the nodes is explicitly included in the main graph and - // both nodes are in the main graph then do not create the shortcut - // and instead keep the real edge. - const isInclude = src.node.include === InclusionType.INCLUDE || sink.node.include === InclusionType.INCLUDE; - const isExclude = src.node.include === InclusionType.EXCLUDE || sink.node.include === InclusionType.EXCLUDE; - if (isInclude && !isExclude) { - return; - } - - // Add each annotation. - addOutAnnotation(src, sink.node, sink, edge, AnnotationType.SHORTCUT); - addInAnnotation(sink, src.node, src, edge, AnnotationType.SHORTCUT); - // Remove the edge from the core graph. - graph.removeEdge(v, w); -} -/** - * Remove edges from a node, and set its isOutExtract property to true, - * and remove the node and move it to isolatedOutExtract. - * - * If detachAllEdgesForHighDegree or forceDetach is true, extract all of its - * edges. Otherwise, only extract all in-edges. - */ -function makeOutExtract(renderNode: RenderGroupNodeInfo, n: string, forceDetach?: boolean): void { - let graph = renderNode.coreGraph; - let child = graph.node(n) as any; - child.isOutExtract = true; - _.each(graph.predecessors(n), (p, index) => { - createShortcut(graph, p, n); - }); - if (PARAMS.detachAllEdgesForHighDegree || forceDetach) { - _.each(graph.successors(n), (s, index) => { - createShortcut(graph, n, s); - }); - } - // Remove the node from the core graph if it no longer has neighbors. - if (graph.neighbors(n)?.length === 0) { - child.node.include = InclusionType.EXCLUDE; - renderNode.isolatedOutExtract.push(child); - graph.removeNode(n); - } -} -/** - * Remove edges from a node, set its isInExtract property to true, - * and remove the node and move it to isolatedInExtract. - * - * If detachAllEdgesForHighDegree or forceDetach is true, extract all of its - * edges. Otherwise, only remove all out-edges. - */ -export function makeInExtract(renderNode: RenderGroupNodeInfo, n: string, forceDetach?: boolean): void { - let graph = renderNode.coreGraph; - let child = graph.node(n) as any; - child.isInExtract = true; - _.each(graph.successors(n), (s, index) => { - createShortcut(graph, n, s); - }); - if (PARAMS.detachAllEdgesForHighDegree || forceDetach) { - _.each(graph.predecessors(n), (p, index) => { - createShortcut(graph, p, n); - }); - } - // Remove the node from the core graph if it no longer has neighbors. - if (graph.neighbors(n)?.length === 0) { - child.node.include = InclusionType.EXCLUDE; - renderNode.isolatedInExtract.push(child); - graph.removeNode(n); - } -} -/** - * Check whether the node's type is a member of the given list of types. - * - * @param node Node. - * @param types List of type to match. - */ -function hasTypeIn(node: Node, types: string[]): boolean { - if (node.type === NodeType.OP) { - for (let i = 0; i < types.length; i++) { - if ((node).op === types[i]) { - return true; - } - } - } else if (node.type === NodeType.META) { - let rootOpNode = (node).getRootOp(); - if (rootOpNode) { - for (let i = 0; i < types.length; i++) { - if (rootOpNode.op === types[i]) { - return true; - } - } - } - } - return false; -} -/** - * Given an integer, picks a hue that is far apart from other colors. - * The formula for picking color that avoid collision is: - * hue = (color range * golden ratio * index) % color range - */ -export function mapIndexToHue(id: number): number { - let GOLDEN_RATIO = 1.61803398875; - // Hue of 0 is reserved for the gray nodes. - let MIN_HUE = 1; - let MAX_HUE = 359; - let COLOR_RANGE = MAX_HUE - MIN_HUE; - return MIN_HUE + ((COLOR_RANGE * GOLDEN_RATIO * id) % COLOR_RANGE); -} -/** - * Remove edges and add to annotation instead. - * - * For root node, consider predefined types for source and sink. - * We do not extract predefined type from non-root so that Variables and the - * sgd node (op type = 'NoOp') do not get extract from inside own group. - * - * The order of extraction is important here as swapping the order can totally - * screw up the graph layout. - * - * @param {Render.Node} renderNode Node to manipulate. - * nodes from the main graph. If false, only exclude predefined nodes. - */ -/** - * Expands nodes in the graph until the desired node is visible. - * - * @param scene The scene polymer component. - * @param renderHierarchy The render hierarchy. - * @param tensorName The name of a tensor. - * @return A string that is the name of the node representing the given tensor. - * Note that the original tensor name might differ from this returned node - * name. Specifically, for instance, the tensor name usually ends with an - * output slot index (such as :0), while the node name lacks that suffix. - */ -export function expandUntilNodeIsShown(scene, renderHierarchy: RenderGraphInfo, tensorName: string): string { - const splitTensorName = tensorName.split('/'); - // Graph names do not take into account the output slot. Strip it. - const lastNodeNameMatch = splitTensorName[splitTensorName.length - 1].match(/(?.*)\w+/); - if (lastNodeNameMatch?.length === 2) { - splitTensorName[splitTensorName.length - 1] = lastNodeNameMatch?.[1]; - } - let nodeName = splitTensorName[0]; - let renderNode = renderHierarchy.getRenderNodeByName(nodeName); - for (let i = 1; i < splitTensorName.length; i++) { - // Op nodes are not expandable. - if (renderNode.node.type === tf_graph.NodeType.OP) { - break; - } - renderHierarchy.buildSubhierarchy(nodeName); - renderNode.expanded = true; - scene.setNodeExpanded(renderNode); - nodeName += `/${splitTensorName[i]}`; - renderNode = renderHierarchy.getRenderNodeByName(nodeName); - } - return renderNode.node.name; -} diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/scene.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/scene.ts index 9ed02cea768db94a860010d1c3f6e02c675ea2c4..3898a2d476810c1684efbcf55ee638cb9b463de3 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/scene.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/scene.ts @@ -16,9 +16,8 @@ Copyright (c) 2025, Huawei Technologies. Adapt to the model hierarchical visualization data collected by the msprobe tool ==============================================================================*/ import * as d3 from 'd3'; -import * as PolymerDom from '../polymer/dom'; -import { Class as _Class, selectChild as _selectChild, SVG_NAMESPACE } from './common'; -import { NodeType, OpNode } from './graph'; +import { Class as _Class, selectChild as _selectChild } from './common'; +import { NodeType } from './graph'; import * as layout from './layout'; import * as render from './render'; @@ -30,66 +29,6 @@ export const Class = _Class; */ const MINIMAP_BOX_WIDTH = 320; const MINIMAP_BOX_HEIGHT = 150; -/** - * A health pill encapsulates an overview of tensor element values. The value - * field is a list of 12 numbers that shed light on the status of the tensor. - * Visualized in health pills are the 3rd through 8th (inclusive) numbers of - * health pill values. Those 6 numbers are counts of tensor elements that fall - * under -Inf, negative, 0, positive, +Inf, NaN (in that order). - * - * Please keep this interface consistent with HealthPillDatum within - * backend.ts. - */ -export interface HealthPill { - device_name: string; - node_name: string; - output_slot: number; - dtype: string; - shape: number[]; - value: number[]; - wall_time: number; - step: number; -} -interface HealthPillNumericStats { - min: number; - max: number; - mean: number; - stddev: number; -} -/** - * Encapsulates how to render a single entry in a health pill. Each entry - * corresponds to a category of tensor element values. - */ -export interface HealthPillEntry { - background_color: string; - label: string; -} -export const healthPillEntries: HealthPillEntry[] = [ - { - background_color: '#CC2F2C', - label: 'NaN', - }, - { - background_color: '#FF8D00', - label: '-∞', - }, - { - background_color: '#EAEAEA', - label: '-', - }, - { - background_color: '#A5A5A5', - label: '0', - }, - { - background_color: '#262626', - label: '+', - }, - { - background_color: '#003ED4', - label: '+∞', - }, -]; /** * Helper method for fitting the graph in the svg view. * @@ -201,7 +140,7 @@ export function position(sceneGroup, renderNode: render.RenderGroupNodeInfo): vo // expanded metanodes, the graphs are below the labels. Do not shift them // down for series nodes as series nodes don't have labels inside of their // bounding boxes. - let yTranslate = renderNode.node.type === NodeType.SERIES ? 0 : layout.PARAMS.subscene.meta.labelHeight; + let yTranslate = layout.PARAMS.subscene.meta.labelHeight; // core translate(selectChild(sceneGroup, 'g', Class.Scene.CORE), 0, yTranslate); // in-extract @@ -274,24 +213,7 @@ export function positionRect(rect, cx: number, cy: number, width: number, height .attr('width', width) .attr('height', height); } -/** - * Positions a triangle and sizes it. - * @param polygon polygon to set position of. - * @param cx Center x. - * @param cy Center y. - * @param width Width of bounding box for triangle. - * @param height Height of bounding box for triangle. - */ -export function positionTriangle(polygon, cx, cy, width, height): void { - const halfHeight = height / 2; - const halfWidth = width / 2; - const points = [ - [cx, cy - halfHeight], - [cx + halfWidth, cy + halfHeight], - [cx - halfWidth, cy + halfHeight], - ]; - polygon.transition().attr('points', points.map((point) => point.join(',')).join(' ')); -} + /** * Helper for setting position of a svg expand/collapse button * @param button container group @@ -306,13 +228,6 @@ export function positionButton(button, renderNode: render.RenderNodeInfo): void let height = renderNode.expanded ? renderNode.height : renderNode.coreBox.height; let x = cx + (width / 2) - 6; let y = renderNode.y - (height / 2) + 6; - - // For unexpanded series nodes, the button has special placement due - // to the unique visuals of this group node. - if (renderNode.node.type === NodeType.SERIES && !renderNode.expanded) { - x += 10; - y -= 2; - } let translateStr = `translate(${x},${y})`; button.selectAll('path').transition().attr('transform', translateStr); button.select('circle').transition().attr({ cx: x, cy: y, r: layout.PARAMS.nodeSize.meta.expandButtonRadius }); diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-graph-icon.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-graph-icon.ts index 6d42c6acb0a637fa249dbdcff49f2a74d1e96325..ad3300be29fedc7bb576e5a57988898409fc629f 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-graph-icon.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-graph-icon.ts @@ -18,13 +18,12 @@ import { html, PolymerElement } from '@polymer/polymer'; import { DarkModeMixin } from '../polymer/dark_mode_mixin'; import { LegacyElementMixin } from '../polymer/legacy_element_mixin'; import '../tf_dashboard_common/tensorboard-color'; -import { MetanodeColors, OpNodeColors, SeriesNodeColors } from './render'; +import { MetanodeColors, OpNodeColors } from './render'; export enum GraphIconType { CONST = 'CONST', META = 'META', OP = 'OP', - SERIES = 'SERIES', SUMMARY = 'SUMMARY', MULTI_COLLECTION = 'MULTI_COLLECTION', API_LIST = 'API_LIST', @@ -64,47 +63,9 @@ class TfGraphIcon extends LegacyElementMixin(DarkModeMixin(PolymerElement)) { - - - - - - - - - - - - - - - - - - - - - - - - - - - `; @property({ type: String }) @@ -230,8 +163,6 @@ class TfGraphIcon extends LegacyElementMixin(DarkModeMixin(PolymerElement)) { switch (type) { case GraphIconType.META: return MetanodeColors.DEFAULT_FILL; - case GraphIconType.SERIES: - return SeriesNodeColors.DEFAULT_FILL; default: return OpNodeColors.DEFAULT_FILL; } @@ -247,8 +178,6 @@ class TfGraphIcon extends LegacyElementMixin(DarkModeMixin(PolymerElement)) { switch (type) { case GraphIconType.META: return MetanodeColors.DEFAULT_STROKE; - case GraphIconType.SERIES: - return SeriesNodeColors.DEFAULT_STROKE; default: return OpNodeColors.DEFAULT_STROKE; } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-node-icon.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-node-icon.ts index 6da65e0b1a7b479dda2aa37dd6626810c6aa36ff..f1c4fb5bb21cdb07a4a46f395866f236c0d64328 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-node-icon.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_common/tf-node-icon.ts @@ -148,8 +148,6 @@ class TfNodeIcon extends LegacyElementMixin(PolymerElement) { } case tf_graph.NodeType.META: return GraphIconType.META; - case tf_graph.NodeType.SERIES: - return GraphIconType.SERIES; default: } } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_color_select/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_color_select/index.ts index 9fca3e97fafed63fb8c326701797d086215f831c..b9e5e1c4f90a5a573141b1b6b253cd73e8bd6ab9 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_color_select/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_color_select/index.ts @@ -31,8 +31,7 @@ const UNMATCHED_NODE_NAME = '无匹配节点'; @customElement('tf-color-select') class Legend extends LegacyElementMixin(DarkModeMixin(PolymerElement)) { // 定义模板 - static get template(): HTMLTemplateElement { - return html` + static readonly template = html` - -
-

注意:匹配结束后需要点击保存按钮,将操作后数据更新到文件中,否则操作无效

- 保存 - + static readonly template = html` + + +
+

注意:匹配结束后需要点击保存按钮,将操作后数据更新到文件中,否则操作无效

+ 保存 + +
+
+

未匹配节点

+ + +
+ 点击匹配
-
-

未匹配节点

- - -
- 点击匹配 -
+
+
+

已匹配节点

+ + +
+ 取消匹配
-
-

已匹配节点

- - -
- 取消匹配 -
-
- - `; - } +
+ + `; @property({ type: Object }) unmatched: any = []; diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_manual_match/useMatched.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_manual_match/useMatched.ts index e2d26dabebc2b922bcd5955e09c4257880af0d7e..0ff91499eb42758e3c54c7dc723e1b09bba84260 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_manual_match/useMatched.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_manual_match/useMatched.ts @@ -115,7 +115,7 @@ const useMatched = (): UseMatchedType => { if (isEmpty(npuNodeName) || isEmpty(benchNodeName)) { return { success: false, - error:'调试侧节点或标杆节点为空' + error: '调试侧节点或标杆节点为空', }; } const metaData = { @@ -162,7 +162,7 @@ const useMatched = (): UseMatchedType => { if (isEmpty(npuNodeName) || isEmpty(benchNodeName)) { return { success: false, - error:'调试侧节点或标杆节点为空' + error: '调试侧节点或标杆节点为空', }; } const metaData = { diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_search_combox/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_search_combox/index.ts index a593a1fc04c0e74dfd5f358d1978f7761a044e21..234a43188ce4801c44a6025d94f16f4260b6b447 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_search_combox/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/tf_search_combox/index.ts @@ -25,75 +25,68 @@ import { customElement, property } from '@polymer/decorators'; import '@vaadin/progress-bar'; @customElement('tf-search-combox') class Legend extends PolymerElement { - static get shadowRootOptions(): { mode: string } { - return { mode: 'open' }; // 确保启用了 Shadow DOM - } - // 定义模板 - static get template(): HTMLTemplateElement { - return html` - -
- - - -
- `; - } - + static readonly template = html` + +
+ + + +
+ `; @property({ type: Object }) onSelectChange!: () => void; @@ -112,7 +105,6 @@ class Legend extends PolymerElement { // 选择列表中的下一个节点 _selectNext(): void { - if (!this.isCompareGraph) { Notification.show('提示:单图节点不支持匹配', { position: 'middle', diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/ts_linkage_search_combox/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/ts_linkage_search_combox/index.ts index 57ea58f22729309e71e325f0ef29500a3effcff0..ce28f3f825a09a3819db58b815057adcdbaa1b1c 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/ts_linkage_search_combox/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/components/ts_linkage_search_combox/index.ts @@ -17,7 +17,7 @@ import '@vaadin/button'; import '@vaadin/details'; import '@vaadin/combo-box'; -import '@vaadin/vaadin-select'; +import '@vaadin/select'; import '@vaadin/text-field'; import { NPU_PREFIX, BENCH_PREFIX } from '../../../tf_graph_common/common'; import { PolymerElement, html } from '@polymer/polymer'; @@ -27,96 +27,90 @@ import * as tf_graph_render from '../../../tf_graph_common/render'; import '../tf_search_combox/index'; @customElement('tf-linkage-search-combox') class Legend extends PolymerElement { - static get shadowRootOptions(): { mode: string } { - return { mode: 'open' }; // 确保启用了 Shadow DOM - } - // 定义模板 - static get template(): HTMLTemplateElement { - return html` - -
-
- - -
-
- -
+ static readonly template = html` + +
+
+ +
- `; - } +
+ +
+
+ `; @property({ type: Object }) renderHierarchy: tf_graph_render.MergedRenderGraphInfo = {} as any; @@ -172,7 +166,7 @@ class Legend extends PolymerElement { this.set('isCompareGraph', isCompareGraphTemp); } - _onSelectedMenuNode = () => { + _onSelectedMenuNode = (): void => { let prefix = ''; if (this.isCompareGraph) { if (this.selectedSide === '0') { diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/tf-graph-controls.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/tf-graph-controls.ts index 5fbae194789264c4bcf15d94fece54a273852ecb..bf4cb416df5f19bc8e5697ef715d472584ea31e3 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/tf-graph-controls.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_controls/tf-graph-controls.ts @@ -18,10 +18,9 @@ Adapt to the model hierarchical visualization data collected by the msprobe tool import '@vaadin/icon'; import '@vaadin/icons'; import '@vaadin/details'; -import '@vaadin/vaadin-combo-box'; -import '@vaadin/vaadin-select'; +import '@vaadin/select'; import './components/ts_linkage_search_combox/index'; -import { customElement, property, observe } from '@polymer/decorators'; +import { customElement, property } from '@polymer/decorators'; import { html, PolymerElement } from '@polymer/polymer'; import * as _ from 'lodash'; import { DarkModeMixin } from '../polymer/dark_mode_mixin'; @@ -30,7 +29,7 @@ import './components/tf_manual_match/index'; import './components/tf_color_select/index'; import { LegacyElementMixin } from '../polymer/legacy_element_mixin'; import '../tf_dashboard_common/tensorboard-color'; -import { SelectionType, NPU_PREFIX, BENCH_PREFIX } from '../tf_graph_common/common'; +import { SelectionType } from '../tf_graph_common/common'; import * as tf_graph_proto from '../tf_graph_common/proto'; import * as tf_graph_render from '../tf_graph_common/render'; import '../tf_graph_common/tf-graph-icon'; @@ -635,10 +634,14 @@ class TfGraphControls extends LegacyElementMixin(DarkModeMixin(PolymerElement)) // MicroStep 选择 和 Step选择 @property({ type: Number }) _selectedMicroStep: number = -1; + + @property({ type: Number }) _selectedStep: number = -1; @property({ type: Object }) microsteps: any; + + @property({ type: Object }) steplist: any; // 目录,全量节点数据,支撑各种节点的搜索 @@ -814,12 +817,8 @@ class TfGraphControls extends LegacyElementMixin(DarkModeMixin(PolymerElement)) _getDefaultSelectionType(): SelectionType { const { datasets: newDatasets, _selectedRunIndex: run, _selectedTagIndex: tag } = this; - function shouldSkip(datasets: any, run: any, tag: any): boolean { - return ( - !newDatasets || !newDatasets[run] || !(newDatasets[run] as any).tags[tag] || (newDatasets[run] as any).tags[tag].opGraph - ); - } - if (shouldSkip(newDatasets, run, tag)) { + const shouldSkip = !newDatasets || !newDatasets[run] || !(newDatasets[run] as any).tags[tag] || (newDatasets[run] as any).tags[tag].opGraph; + if (shouldSkip) { return SelectionType.OP_GRAPH; } const datasetForRun = newDatasets[run] as any; diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_dashboard/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_dashboard/index.ts index 2848f927a8482e5386a794111d5ba215fd239a58..fa2edb2180fe9a3bf8849c30396ab73abf6d2c72 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_dashboard/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_dashboard/index.ts @@ -20,7 +20,6 @@ import { customElement, observe, property } from '@polymer/decorators'; import { html, PolymerElement } from '@polymer/polymer'; import '../polymer/irons_and_papers'; import { LegacyElementMixin } from '../polymer/legacy_element_mixin'; -import { Canceller } from '../tf_backend/canceller'; import { RequestManager } from '../tf_backend/requestManager'; import '../tf_dashboard_common/tf-dashboard-layout'; import * as tf_storage from '../tf_storage'; @@ -44,15 +43,6 @@ const RUN_STORAGE_KEY = 'run'; * profile: boolean, * }} */ -const TagItem = {}; -/** - * TODO(stephanwlee): Convert this to proper type when converting to TypeScript. - * @typedef {{ - * name: string, - * tags: !Array, - * }} - */ -const RunItem = {}; /** * tf-graph-dashboard displays a graph from a TensorFlow run. @@ -182,9 +172,7 @@ class TfGraphDashboard extends LegacyElementMixin(PolymerElement) { `; - /** - * @type {!Array} - */ + @property({ type: Array }) _datasets: any[] = []; @@ -200,9 +188,6 @@ class TfGraphDashboard extends LegacyElementMixin(PolymerElement) { @property({ type: Object }) _requestManager: RequestManager = new RequestManager(); - @property({ type: Object }) - _canceller: Canceller = new Canceller(); - @property({ type: Boolean }) _debuggerDataEnabled: boolean; diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_debugger_data_card/tf-graph-debugger-data-card.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_debugger_data_card/tf-graph-debugger-data-card.ts index f1004ad482c3ab95d513e093506b00607d23602d..8feb67818602b62026cc41f399b4be5cebd3cc98 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_debugger_data_card/tf-graph-debugger-data-card.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_debugger_data_card/tf-graph-debugger-data-card.ts @@ -301,35 +301,6 @@ class TfGraphDebuggerDataCard extends LegacyElementMixin(PolymerElement) { @property({ type: Boolean, notify: true }) allStepsModeEnabled: any; - ready(): void { - super.ready(); - let mainContainer = document.getElementById('mainContainer'); - let scrollbarContainer = document.querySelector('tf-dashboard-layout .scrollbar') as HTMLElement | null; - if (mainContainer && scrollbarContainer) { - // If this component is being used inside of TensorBoard's dashboard layout, it may easily - // cause the dashboard layout element to overflow, giving the user 2 scroll bars. Prevent - // that by hiding whatever content overflows - the user will have to expand the viewport to - // use this debugging card. - mainContainer.style.overflow = 'hidden'; - scrollbarContainer.style.overflow = 'hidden'; - } - } - - _healthPillsAvailable(debuggerDataEnabled: any, nodeNamesToHealthPills: any): any { - // So long as there is a mapping (even if empty) from node name to health pills, show the - // legend and slider. We do that because, even if no health pills exist at the current step, - // the user may desire to change steps, and the slider must show for the user to do that. - return debuggerDataEnabled && nodeNamesToHealthPills; - } - - _computeTensorCountString(healthPillValuesForSelectedNode: any, valueIndex: any): any { - if (!healthPillValuesForSelectedNode) { - // No health pill data is available. - return ''; - } - return healthPillValuesForSelectedNode[valueIndex].toFixed(0); - } - @computed( 'nodeNamesToHealthPills', 'healthPillStepIndex', @@ -433,10 +404,6 @@ class TfGraphDebuggerDataCard extends LegacyElementMixin(PolymerElement) { return 0; } - _hasDebuggerNumericAlerts(debuggerNumericAlerts: any): any { - return debuggerNumericAlerts?.length; - } - @observe('debuggerNumericAlerts') _updateAlertsList(): void { let debuggerNumericAlerts = this.debuggerNumericAlerts; @@ -495,6 +462,39 @@ class TfGraphDebuggerDataCard extends LegacyElementMixin(PolymerElement) { } } + override ready(): void { + super.ready(); + let mainContainer = document.getElementById('mainContainer'); + let scrollbarContainer = document.querySelector('tf-dashboard-layout .scrollbar') as HTMLElement | null; + if (mainContainer && scrollbarContainer) { + // If this component is being used inside of TensorBoard's dashboard layout, it may easily + // cause the dashboard layout element to overflow, giving the user 2 scroll bars. Prevent + // that by hiding whatever content overflows - the user will have to expand the viewport to + // use this debugging card. + mainContainer.style.overflow = 'hidden'; + scrollbarContainer.style.overflow = 'hidden'; + } + } + + _hasDebuggerNumericAlerts(debuggerNumericAlerts: any): any { + return debuggerNumericAlerts?.length; + } + + _healthPillsAvailable(debuggerDataEnabled: any, nodeNamesToHealthPills: any): any { + // So long as there is a mapping (even if empty) from node name to health pills, show the + // legend and slider. We do that because, even if no health pills exist at the current step, + // the user may desire to change steps, and the slider must show for the user to do that. + return debuggerDataEnabled && nodeNamesToHealthPills; + } + + _computeTensorCountString(healthPillValuesForSelectedNode: any, valueIndex: any): any { + if (!healthPillValuesForSelectedNode) { + // No health pill data is available. + return ''; + } + return healthPillValuesForSelectedNode[valueIndex].toFixed(0); + } + // Adds a listener to an element, so that when that element is clicked, the tensor with // tensorName expands. _addOpExpansionListener(clickableElement: any, tensorName: any): void { diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_loader/tf-graph-dashboard-loader.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_loader/tf-graph-dashboard-loader.ts index 58dc7350d0fd0ec0328f04121651b0a17648cb4c..8059bcb79b453e6d59de9a70057a0427d30a8408 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_loader/tf-graph-dashboard-loader.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_loader/tf-graph-dashboard-loader.ts @@ -33,13 +33,13 @@ interface GraphRunTag { } interface Components { - Menu: object; - ToolTip: ''; - Colors: object; - OverflowCheck: boolean; - MicroSteps: number; - StepList: []; - UnMatchedNode: []; + menu: object; + tooltips: string; + colors: object; + overflowCheck: boolean; + microSteps: number; + stepList: []; + unMatchedNode: []; match: []; } /** @@ -53,6 +53,8 @@ interface Components { */ @customElement('tf-graph-dashboard-loader') class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { + static readonly _template = null; + @property({ type: Array }) datasets: any[]; @@ -75,7 +77,7 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { selectedFile: object; @property({ type: Object }) - hierarchyParams = tf_graph_hierarchy.DefaultHierarchyParams; + hierarchyParams = tf_graph_hierarchy.defaultHierarchyParams; @property({ type: Object, @@ -100,32 +102,27 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { @property({ type: Object }) _graphRunTag: GraphRunTag; - override _template = null; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) menu: object; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) colorset: object; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) tooltips: object; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) colors: any; @@ -138,34 +135,43 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) microsteps: any; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) steplist: any; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) unmatched: object; @property({ type: Object, - readOnly: true, // readonly so outsider can't change this via binding notify: true, }) matchedlist: object; - getColors(): any { - return this.colors; + @observe('selectedFile') + _selectedFileChanged(): void { + let e = this.selectedFile; + if (!e) { + return; + } + const target = (e as any).target as HTMLInputElement; + const file = target.files?.[0]; + if (!file) { + return; + } + // Clear out the value of the file chooser. This ensures that if the user + // selects the same file, we'll re-read it. + target.value = ''; + this._fetchAndConstructHierarchicalGraph(null, file); } @observe('selection') @@ -180,6 +186,9 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { }); } + getColors(): any { + return this.colors; + } _setCompoments(componentsPath): Promise { return new Promise(async (resolve, reject) => { this.set('progress', { @@ -212,7 +221,7 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { } }.bind(this); - const fetchTask = async function (): Promise { + const fetchTask = async (): Promise => { let componentsStr; try { componentsStr = await tf_graph_parser.fetchPbTxt(componentsPath); @@ -225,13 +234,13 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { shouldBreak = true; // 正常流程也停止定时器 let components: Components = { - Menu: [], - ToolTip: '', - Colors: {}, - OverflowCheck: false, - MicroSteps: 0, - StepList: [], - UnMatchedNode: [], + menu: [], + tooltips: '', + colors: {}, + overflowCheck: false, + microSteps: 0, + stepList: [], + unMatchedNode: [], match: [], }; @@ -250,32 +259,31 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { ); return; } - // 后续处理逻辑... - const entries = Object.entries(components.ToolTip); + const entries = Object.entries(components.tooltips || {}); const toolTipObject = Object.fromEntries(entries); - this._setMenu(components.Menu); - this._setTooltips(toolTipObject); - this._setColors(components.Colors); - this.set('overflowcheck', components.OverflowCheck); - this._setColorset(Object.entries(components.Colors)); - this._setUnmatched(components.UnMatchedNode); - this._setMatchedlist(components.match); + this.set('menu', components.menu); + this.set('tooltips', toolTipObject); + this.set('colors', components.colors); + this.set('overflowcheck', components.overflowCheck); + this.set('colorset', Object.entries(components.colors || {})); + this.set('unmatched', components.unMatchedNode); + this.set('matchedlist', components.match); - tf_graph_node.getColors(components.Colors); + tf_graph_node.getColors(components.colors); - const microstepsCount = Number(components.MicroSteps); + const microstepsCount = Number(components.microSteps); if (microstepsCount) { const microstepsArray = ['ALL', ...Array.from({ length: microstepsCount }, (_, index) => index)]; - this._setMicrosteps(microstepsArray); + this.set('microsteps', microstepsArray); } else { - this._setMicrosteps([]); + this.set('microsteps', []); } - const steplistCount = Number(components.MicroSteps); - this._setSteplist(steplistCount ? components.StepList : []); + const steplistCount = Number(components.microSteps); + this.set('steplist', steplistCount ? components.stepList : []); resolve(); - }.bind(this); + } // 同时启动定时器和 fetch 任务 await Promise.all([timerTask(), fetchTask()]); @@ -288,7 +296,7 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { case tf_graph_common.SelectionType.OP_GRAPH: case tf_graph_common.SelectionType.CONCEPTUAL_GRAPH: { // Clear stats about the previous graph. - this.set('outStats', null) + this.set('outStats', null); const params = new URLSearchParams(); params.set('run', run); params.set('conceptual', String(selectionType === tf_graph_common.SelectionType.CONCEPTUAL_GRAPH)); @@ -313,20 +321,6 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { } } - _readAndParseMetadata(path: string): void { - // Reset the progress bar to 0. - this.set('progress', { - value: 0, - msg: '', - }); - let tracker = tf_graph_util.getTracker(this); - tf_graph_parser.fetchAndParseMetadata(path, tracker).then( - (stats) => { - this.set('outStats', stats) - } - ); - } - _fetchAndConstructHierarchicalGraph(path: string | null, pbTxtFile?: Blob): Promise { // Reset the progress bar to 0. this.set('progress', { @@ -341,28 +335,10 @@ class TfGraphDashboardLoader extends LegacyElementMixin(PolymerElement) { pbTxtFile !== undefined ? pbTxtFile : null, this.hierarchyParams, ) - .then( - function ({ graph, graphHierarchy }): void { - this._setOutGraph(graph); - this._setOutGraphHierarchy(graphHierarchy); - }.bind(this), + .then(({ graph, graphHierarchy }): void => { + this._setOutGraph(graph); + this._setOutGraphHierarchy(graphHierarchy); + }, ); } - - @observe('selectedFile') - _selectedFileChanged(): void { - let e = this.selectedFile; - if (!e) { - return; - } - const target = (e as any).target as HTMLInputElement; - const file = target.files?.[0]; - if (!file) { - return; - } - // Clear out the value of the file chooser. This ensures that if the user - // selects the same file, we'll re-read it. - target.value = ''; - this._fetchAndConstructHierarchicalGraph(null, file); - } } diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_resize_height/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_resize_height/index.ts index 6c8dddba9101de7a313fef5ce8b9b80721317537..d569317564fc4a16e1a965ccb2cd8386cf51f787 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_resize_height/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_resize_height/index.ts @@ -19,43 +19,41 @@ import { customElement, property, observe } from '@polymer/decorators'; @customElement('tf-resize-height') class ResizableTabsheet extends PolymerElement { - static get template(): HTMLTemplateElement { - return html` - + .resize-handle:hover { + background-color: hsl(214, 100%, 43%); + height: 4px; + } + -
-
- -
- `; - } +
+
+ +
+ `; @property({ type: Number, diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaadin_table/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaadin_table/index.ts index 289ed28a9239ab84d70ec241bfdb0d97f800d99d..ff03bc2e051be53f7c33d88f0b9d55a7da52dd28 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaadin_table/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaadin_table/index.ts @@ -21,84 +21,82 @@ import '@vaadin/tooltip'; import type { GridEventContext } from '@vaadin/grid'; @customElement('tf-vaadin-table') class TfVaadinTable extends PolymerElement { - static get template(): HTMLTemplateElement { - return html` - - - - `; - } + static readonly template = html` + + + + `; @property({ type: Object }) syncGrid?: HTMLElement; // 点击高亮需要同步的表格元素 diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaddin_text_table/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaddin_text_table/index.ts index ac6dec3e1ecbc167e2d6c003b2ef95457ed097f1..9386f9735f771825e4fd2a02f61a392e80818b87 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaddin_text_table/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/components/tf_vaddin_text_table/index.ts @@ -22,77 +22,75 @@ import type { GridEventContext } from '@vaadin/grid'; import { Notification } from '@vaadin/notification'; @customElement('tf-vaadin-text-table') class TfVaadinTable extends PolymerElement { - static get template(): HTMLTemplateElement { - return html` - - - - `; - } + static readonly template = html` + + + + `; @property({ type: Object }) syncGrid!: HTMLElement; // 点击高亮需要同步的表格元素 diff --git a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/index.ts b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/index.ts index d3b38e9da9264db79aad06d35ed20c27d7e667ee..3951193c5d13246df5ca1340b5bbe255b32d1b0c 100644 --- a/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/index.ts +++ b/plugins/tensorboard-plugins/tb_graph_ascend/fe/src/tf_graph_node_info/index.ts @@ -30,8 +30,7 @@ import { BENCH_PREFIX, NPU_PREFIX } from '../tf_graph_common/common'; @customElement('tf-graph-vaadin-tab') class TfGraphNodeInfo extends PolymerElement { - static get template(): HTMLTemplateElement { - return html` + static readonly template = html` - +