plotly-cloud 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plotly_cloud/__init__.py +3 -0
- plotly_cloud/_api_types.py +37 -0
- plotly_cloud/_changes.py +77 -0
- plotly_cloud/_cloud_env.py +93 -0
- plotly_cloud/_commands.py +880 -0
- plotly_cloud/_definitions.py +109 -0
- plotly_cloud/_deploy.py +470 -0
- plotly_cloud/_devtool_hooks.py +61 -0
- plotly_cloud/_devtool_publish_rpc.py +294 -0
- plotly_cloud/_oauth.py +335 -0
- plotly_cloud/_parser.py +171 -0
- plotly_cloud/cli.py +300 -0
- plotly_cloud/cloud-env.toml +6 -0
- plotly_cloud/cloud_devtools.css +1 -0
- plotly_cloud/cloud_devtools.js +15 -0
- plotly_cloud/exceptions.py +198 -0
- plotly_cloud-0.1.0.dist-info/METADATA +294 -0
- plotly_cloud-0.1.0.dist-info/RECORD +21 -0
- plotly_cloud-0.1.0.dist-info/WHEEL +4 -0
- plotly_cloud-0.1.0.dist-info/entry_points.txt +5 -0
- plotly_cloud-0.1.0.dist-info/licenses/LICENSE +21 -0
plotly_cloud/_parser.py
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Simple argument parser to replace argparse."""
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from typing import Any, List
|
|
5
|
+
|
|
6
|
+
from plotly_cloud._definitions import CommandArgument
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ParsedArguments:
|
|
10
|
+
"""Simple namespace for parsed command arguments."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, **kwargs: Any) -> None:
|
|
13
|
+
object.__setattr__(self, "_data", kwargs)
|
|
14
|
+
|
|
15
|
+
def __getattribute__(self, name: str) -> Any:
|
|
16
|
+
"""Get attribute from internal data storage."""
|
|
17
|
+
if name == "_data":
|
|
18
|
+
return object.__getattribute__(self, name)
|
|
19
|
+
data = object.__getattribute__(self, "_data")
|
|
20
|
+
if name in data:
|
|
21
|
+
return data[name]
|
|
22
|
+
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
|
|
23
|
+
|
|
24
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
|
25
|
+
"""Set attribute in internal data storage."""
|
|
26
|
+
if name == "_data":
|
|
27
|
+
object.__setattr__(self, name, value)
|
|
28
|
+
else:
|
|
29
|
+
if not hasattr(self, "_data"):
|
|
30
|
+
object.__setattr__(self, "_data", {})
|
|
31
|
+
self._data[name] = value
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def parse_group_and_command() -> tuple[str, str, int]:
|
|
35
|
+
"""Parse group and command from command line.
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
Tuple of (group, command, start_index) where start_index is where to start parsing args
|
|
39
|
+
"""
|
|
40
|
+
args = sys.argv[1:]
|
|
41
|
+
|
|
42
|
+
# Parse group and command first (if present)
|
|
43
|
+
if len(args) >= 2 and not args[0].startswith("-") and not args[1].startswith("-"):
|
|
44
|
+
return args[0], args[1], 3 # Skip group and command for further parsing
|
|
45
|
+
elif len(args) >= 1 and not args[0].startswith("-"):
|
|
46
|
+
return args[0], "help", 2 # Default to help if only group provided
|
|
47
|
+
else:
|
|
48
|
+
return "help", "help", 1 # Default to help if no group provided
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def parse_args(command_arguments: List[CommandArgument], args_index=3) -> ParsedArguments:
|
|
52
|
+
"""Parse command line arguments starting after group and command.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
command_arguments: List of CommandArgument definitions
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
ParsedArguments with all argument keys set
|
|
59
|
+
"""
|
|
60
|
+
# Start parsing after group and command (sys.argv[3:])
|
|
61
|
+
args = sys.argv[args_index:]
|
|
62
|
+
result = {}
|
|
63
|
+
|
|
64
|
+
# Separate positional and optional arguments
|
|
65
|
+
positional_args = [arg for arg in command_arguments if not arg["name"].startswith("-")]
|
|
66
|
+
optional_args = [arg for arg in command_arguments if arg["name"].startswith("-")]
|
|
67
|
+
|
|
68
|
+
# Initialize all arguments with their defaults
|
|
69
|
+
for arg_spec in command_arguments:
|
|
70
|
+
name = arg_spec["name"]
|
|
71
|
+
# Convert argument name to dictionary key (remove -- and convert - to _)
|
|
72
|
+
if name.startswith("--"):
|
|
73
|
+
key = name[2:].replace("-", "_")
|
|
74
|
+
elif name.startswith("-"):
|
|
75
|
+
key = name[1:].replace("-", "_")
|
|
76
|
+
else:
|
|
77
|
+
key = name.replace("-", "_")
|
|
78
|
+
|
|
79
|
+
result[key] = arg_spec.get("default")
|
|
80
|
+
|
|
81
|
+
# Add global verbose flag and help flag
|
|
82
|
+
result["verbose"] = False
|
|
83
|
+
result["help"] = False
|
|
84
|
+
|
|
85
|
+
# Check if the first argument is "help" and handle it specially
|
|
86
|
+
if len(args) > 0 and args[0] == "help":
|
|
87
|
+
result["help"] = True
|
|
88
|
+
args = args[1:] # Skip the "help" argument
|
|
89
|
+
|
|
90
|
+
# Track positional arguments
|
|
91
|
+
positional_index = 0
|
|
92
|
+
i = 0
|
|
93
|
+
while i < len(args):
|
|
94
|
+
arg = args[i]
|
|
95
|
+
|
|
96
|
+
if arg in ["--verbose", "-v"]:
|
|
97
|
+
result["verbose"] = True
|
|
98
|
+
i += 1
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
if arg in ["--help", "-h"]:
|
|
102
|
+
result["help"] = True
|
|
103
|
+
i += 1
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
# Check if this is an optional argument
|
|
107
|
+
if arg.startswith("-"):
|
|
108
|
+
# Find matching optional argument specification
|
|
109
|
+
arg_spec = None
|
|
110
|
+
for spec in optional_args:
|
|
111
|
+
if spec["name"] == arg:
|
|
112
|
+
arg_spec = spec
|
|
113
|
+
break
|
|
114
|
+
|
|
115
|
+
if not arg_spec:
|
|
116
|
+
# Skip unknown arguments for now
|
|
117
|
+
i += 1
|
|
118
|
+
continue
|
|
119
|
+
|
|
120
|
+
# Get the key name
|
|
121
|
+
name = arg_spec["name"]
|
|
122
|
+
if name.startswith("--"):
|
|
123
|
+
key = name[2:].replace("-", "_")
|
|
124
|
+
elif name.startswith("-"):
|
|
125
|
+
key = name[1:].replace("-", "_")
|
|
126
|
+
else:
|
|
127
|
+
key = name.replace("-", "_")
|
|
128
|
+
|
|
129
|
+
action = arg_spec.get("action", "store")
|
|
130
|
+
|
|
131
|
+
if action == "store_true":
|
|
132
|
+
result[key] = True
|
|
133
|
+
i += 1
|
|
134
|
+
elif action == "store":
|
|
135
|
+
# Get the next argument as the value
|
|
136
|
+
if i + 1 < len(args):
|
|
137
|
+
value = args[i + 1]
|
|
138
|
+
arg_type = arg_spec.get("type")
|
|
139
|
+
if arg_type and callable(arg_type):
|
|
140
|
+
try:
|
|
141
|
+
value = arg_type(value)
|
|
142
|
+
except (ValueError, TypeError):
|
|
143
|
+
pass # Keep as string if conversion fails
|
|
144
|
+
result[key] = value
|
|
145
|
+
i += 2
|
|
146
|
+
else:
|
|
147
|
+
i += 1
|
|
148
|
+
else:
|
|
149
|
+
i += 1
|
|
150
|
+
else:
|
|
151
|
+
# This is a positional argument
|
|
152
|
+
if positional_index < len(positional_args):
|
|
153
|
+
arg_spec = positional_args[positional_index]
|
|
154
|
+
name = arg_spec["name"]
|
|
155
|
+
key = name.replace("-", "_")
|
|
156
|
+
|
|
157
|
+
# Apply type conversion if specified
|
|
158
|
+
value = arg
|
|
159
|
+
arg_type = arg_spec.get("type")
|
|
160
|
+
if arg_type and callable(arg_type):
|
|
161
|
+
try:
|
|
162
|
+
value = arg_type(value)
|
|
163
|
+
except (ValueError, TypeError):
|
|
164
|
+
pass # Keep as string if conversion fails
|
|
165
|
+
|
|
166
|
+
result[key] = value
|
|
167
|
+
positional_index += 1
|
|
168
|
+
|
|
169
|
+
i += 1
|
|
170
|
+
|
|
171
|
+
return ParsedArguments(**result)
|
plotly_cloud/cli.py
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"""Main CLI entry point for Plotly Cloud."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import logging
|
|
5
|
+
import sys
|
|
6
|
+
import textwrap
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from typing import Union
|
|
9
|
+
|
|
10
|
+
import nest_asyncio
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from rich.panel import Panel
|
|
13
|
+
|
|
14
|
+
from plotly_cloud._commands import BaseCommand, CommandRegistry
|
|
15
|
+
from plotly_cloud._definitions import CommandArgument, HelpPanelStyle
|
|
16
|
+
from plotly_cloud._parser import parse_args, parse_group_and_command
|
|
17
|
+
from plotly_cloud.exceptions import PlotlyCloudError
|
|
18
|
+
|
|
19
|
+
# Suppress asyncio task exception warnings during Flask reloads
|
|
20
|
+
# These occur when Flask's werkzeug reloader terminates the process
|
|
21
|
+
logging.getLogger("asyncio").setLevel(logging.CRITICAL)
|
|
22
|
+
|
|
23
|
+
console = Console()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def create_help_panel(arguments: Sequence[Union[CommandArgument, dict]], title: str, style: HelpPanelStyle) -> None:
|
|
27
|
+
"""Create a Rich panel for command arguments with proper styling and layout."""
|
|
28
|
+
formatted_lines = []
|
|
29
|
+
|
|
30
|
+
for arg in arguments:
|
|
31
|
+
# Format the argument name with padding and color
|
|
32
|
+
arg_name = arg["name"].ljust(style["argument_width"])
|
|
33
|
+
formatted_arg = f"[{style['argument_color']}]{arg_name}[/{style['argument_color']}]"
|
|
34
|
+
|
|
35
|
+
# Format description with color and wrap to terminal width
|
|
36
|
+
max_width = console.width - style["argument_width"] - 4 # Account for padding and spacing
|
|
37
|
+
wrapper = textwrap.TextWrapper(width=max_width)
|
|
38
|
+
wrapped_desc = wrapper.fill(arg["help"])
|
|
39
|
+
description = f"[{style['description_color']}]{wrapped_desc}[/{style['description_color']}]"
|
|
40
|
+
|
|
41
|
+
# Combine argument and description on same line
|
|
42
|
+
arg_line = f"{formatted_arg} {description}"
|
|
43
|
+
formatted_lines.append(arg_line)
|
|
44
|
+
|
|
45
|
+
arg_default = arg.get("default")
|
|
46
|
+
|
|
47
|
+
# Add default value on separate line if present
|
|
48
|
+
if arg_default is not None:
|
|
49
|
+
default_text = (
|
|
50
|
+
f"[{style['description_color']}]{''.ljust(style['argument_width'])} "
|
|
51
|
+
f"(default: {arg_default})[/{style['description_color']}]"
|
|
52
|
+
)
|
|
53
|
+
formatted_lines.append(default_text)
|
|
54
|
+
|
|
55
|
+
content = "\n".join(formatted_lines)
|
|
56
|
+
panel = Panel(
|
|
57
|
+
content,
|
|
58
|
+
title=title,
|
|
59
|
+
title_align="left",
|
|
60
|
+
border_style=style["border_style"],
|
|
61
|
+
padding=(0, 1),
|
|
62
|
+
)
|
|
63
|
+
console.print(panel)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def create_error_panel(content, title="✗ Error"):
|
|
67
|
+
console.print()
|
|
68
|
+
panel = Panel(
|
|
69
|
+
content,
|
|
70
|
+
title=title,
|
|
71
|
+
title_align="left",
|
|
72
|
+
border_style="red",
|
|
73
|
+
padding=(0, 1),
|
|
74
|
+
)
|
|
75
|
+
console.print(panel)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def print_main_help(show_banner=True) -> None:
|
|
79
|
+
"""Print main help with ASCII art and command groups."""
|
|
80
|
+
# Add ASCII art for main command
|
|
81
|
+
ascii_art = """[blue]
|
|
82
|
+
██████╗ ██╗ ██████╗ ████████╗██╗ ██╗ ██╗
|
|
83
|
+
██╔══██╗██║ ██╔═══██╗╚══██╔══╝██║ ╚██╗ ██╔╝
|
|
84
|
+
██████╔╝██║ ██║ ██║ ██║ ██║ ╚████╔╝
|
|
85
|
+
██╔═══╝ ██║ ██║ ██║ ██║ ██║ ╚██╔╝
|
|
86
|
+
██║ ███████╗╚██████╔╝ ██║ ███████╗██║
|
|
87
|
+
╚═╝ ╚══════╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝[/blue]
|
|
88
|
+
[cyan] 📊 Interactive Data Visualization Platform 📈[/cyan]
|
|
89
|
+
|
|
90
|
+
[dim]Publish and manage your Dash applications with ease[/dim]
|
|
91
|
+
|
|
92
|
+
"""
|
|
93
|
+
if show_banner:
|
|
94
|
+
console.print(ascii_art)
|
|
95
|
+
|
|
96
|
+
# Show command groups
|
|
97
|
+
for group_name, group in CommandRegistry.commands.items():
|
|
98
|
+
commands = []
|
|
99
|
+
for cmd_name, cmd_class in group["commands"].items():
|
|
100
|
+
commands.append({"name": f"{group_name} {cmd_name}", "help": cmd_class.short_description})
|
|
101
|
+
|
|
102
|
+
commands_style: HelpPanelStyle = {
|
|
103
|
+
"border_style": "dim blue",
|
|
104
|
+
"argument_color": "yellow",
|
|
105
|
+
"description_color": "dim",
|
|
106
|
+
"argument_width": 32,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
panel_title = f"{group_name.upper()} COMMANDS"
|
|
110
|
+
create_help_panel(commands, panel_title, commands_style)
|
|
111
|
+
|
|
112
|
+
# Show global options
|
|
113
|
+
global_options = [
|
|
114
|
+
{
|
|
115
|
+
"name": "--verbose, -v",
|
|
116
|
+
"help": "Enable verbose output with detailed error information",
|
|
117
|
+
},
|
|
118
|
+
{"name": "--help, -h", "help": "Show this help message and exit"},
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
options_style: HelpPanelStyle = {
|
|
122
|
+
"border_style": "dim white",
|
|
123
|
+
"argument_color": "yellow",
|
|
124
|
+
"description_color": "dim",
|
|
125
|
+
"argument_width": 32,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
create_help_panel(global_options, "GLOBAL OPTIONS", options_style)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def print_group_help(group_name: str) -> None:
|
|
132
|
+
"""Print help for a specific group."""
|
|
133
|
+
group = CommandRegistry.commands.get(group_name)
|
|
134
|
+
if not group:
|
|
135
|
+
create_error_panel(
|
|
136
|
+
f"Unknown command group: [yellow]'{group_name}[/yellow]'\n\n"
|
|
137
|
+
f"Available groups: [cyan]{', '.join(CommandRegistry.commands.keys())}[/cyan]"
|
|
138
|
+
)
|
|
139
|
+
sys.exit(1)
|
|
140
|
+
|
|
141
|
+
# Type guard to ensure group is not None
|
|
142
|
+
assert group is not None
|
|
143
|
+
|
|
144
|
+
# Create commands list for the panel
|
|
145
|
+
commands = []
|
|
146
|
+
for cmd_name, cmd_class in group["commands"].items():
|
|
147
|
+
commands.append({"name": f"{group_name} {cmd_name}", "help": cmd_class.short_description})
|
|
148
|
+
|
|
149
|
+
# Define style for group help
|
|
150
|
+
group_style: HelpPanelStyle = {
|
|
151
|
+
"border_style": "dim blue",
|
|
152
|
+
"argument_color": "yellow",
|
|
153
|
+
"description_color": "dim",
|
|
154
|
+
"argument_width": 32,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
panel_title = f"{group_name.upper()} COMMANDS"
|
|
158
|
+
create_help_panel(commands, panel_title, group_style)
|
|
159
|
+
|
|
160
|
+
console.print(f"\nUse 'plotly {group_name} <command> --help' for more information about a command.")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def print_command_help(command_class: BaseCommand, group: str, command: str) -> None:
|
|
164
|
+
"""Print help for a specific command."""
|
|
165
|
+
console.print(f"\n[bold blue]plotly {group} {command}[/bold blue]\n")
|
|
166
|
+
|
|
167
|
+
if command_class.description:
|
|
168
|
+
console.print(f"{command_class.description}\n")
|
|
169
|
+
|
|
170
|
+
# Use the PlotlyHelpFormatter logic for command arguments
|
|
171
|
+
if command_class.arguments:
|
|
172
|
+
# Define styles
|
|
173
|
+
args_style: HelpPanelStyle = {
|
|
174
|
+
"border_style": "dim blue",
|
|
175
|
+
"argument_color": "yellow",
|
|
176
|
+
"description_color": "dim",
|
|
177
|
+
"argument_width": 32,
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
options_style: HelpPanelStyle = {
|
|
181
|
+
"border_style": "dim white",
|
|
182
|
+
"argument_color": "yellow",
|
|
183
|
+
"description_color": "dim",
|
|
184
|
+
"argument_width": 32,
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
# Separate positional and optional arguments
|
|
188
|
+
positional_args = [arg for arg in command_class.arguments if not arg["name"].startswith("-")]
|
|
189
|
+
optional_args = [arg for arg in command_class.arguments if arg["name"].startswith("-")]
|
|
190
|
+
|
|
191
|
+
# Create panels for arguments
|
|
192
|
+
if positional_args:
|
|
193
|
+
create_help_panel(positional_args, "ARGUMENTS", args_style)
|
|
194
|
+
|
|
195
|
+
if optional_args:
|
|
196
|
+
create_help_panel(optional_args, "OPTIONS", options_style)
|
|
197
|
+
|
|
198
|
+
# Show global options
|
|
199
|
+
global_options = [
|
|
200
|
+
{
|
|
201
|
+
"name": "--verbose, -v",
|
|
202
|
+
"help": "Enable verbose output with detailed error information",
|
|
203
|
+
},
|
|
204
|
+
{"name": "--help, -h", "help": "Show this help message and exit"},
|
|
205
|
+
]
|
|
206
|
+
|
|
207
|
+
options_style: HelpPanelStyle = {
|
|
208
|
+
"border_style": "dim white",
|
|
209
|
+
"argument_color": "yellow",
|
|
210
|
+
"description_color": "dim",
|
|
211
|
+
"argument_width": 32,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
create_help_panel(global_options, "GLOBAL OPTIONS", options_style)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def main() -> None:
|
|
218
|
+
"""Main CLI entry point."""
|
|
219
|
+
# Allow to run multiple calls to asyncio run.
|
|
220
|
+
nest_asyncio.apply()
|
|
221
|
+
|
|
222
|
+
# Parse group and command
|
|
223
|
+
group, command, args_index = parse_group_and_command()
|
|
224
|
+
|
|
225
|
+
# Handle help command
|
|
226
|
+
if group == "help" or command == "help":
|
|
227
|
+
if group == "help" and command == "help":
|
|
228
|
+
# Show main help
|
|
229
|
+
print_main_help()
|
|
230
|
+
sys.exit(0)
|
|
231
|
+
elif command == "help":
|
|
232
|
+
# Show group help
|
|
233
|
+
print_group_help(group)
|
|
234
|
+
sys.exit(0)
|
|
235
|
+
|
|
236
|
+
try:
|
|
237
|
+
# Find the command group
|
|
238
|
+
group_data = CommandRegistry.commands.get(group)
|
|
239
|
+
|
|
240
|
+
# Check if group exists
|
|
241
|
+
if group_data is None:
|
|
242
|
+
create_error_panel(
|
|
243
|
+
f"Unknown command group: [yellow]'{group}'[/yellow]\n\n"
|
|
244
|
+
f"Available groups: [cyan]{', '.join(CommandRegistry.commands.keys())}[/cyan]\n\n"
|
|
245
|
+
f"Use [cyan]'plotly --help'[/cyan] to see all available commands."
|
|
246
|
+
)
|
|
247
|
+
sys.exit(1)
|
|
248
|
+
|
|
249
|
+
# Type guard to ensure group_data is not None
|
|
250
|
+
assert group_data is not None
|
|
251
|
+
|
|
252
|
+
# Find the command in the group
|
|
253
|
+
command_class = group_data["commands"].get(command)
|
|
254
|
+
if not command_class:
|
|
255
|
+
create_error_panel(
|
|
256
|
+
f"Unknown command: {group} {command}\n\n"
|
|
257
|
+
f"Available commands in [yellow]'{group}'[/yellow]: "
|
|
258
|
+
f"[cyan]{', '.join(group_data['commands'].keys())}[/cyan]"
|
|
259
|
+
)
|
|
260
|
+
sys.exit(1)
|
|
261
|
+
|
|
262
|
+
# Type guard to ensure command_class is not None
|
|
263
|
+
assert command_class is not None
|
|
264
|
+
|
|
265
|
+
# Parse arguments specific to this command
|
|
266
|
+
command_args = parse_args(command_class.arguments)
|
|
267
|
+
|
|
268
|
+
# Handle command help
|
|
269
|
+
if command_args.help:
|
|
270
|
+
print_command_help(command_class, group, command)
|
|
271
|
+
sys.exit(0)
|
|
272
|
+
|
|
273
|
+
# Execute the command
|
|
274
|
+
asyncio.run(command_class.execute(command_args))
|
|
275
|
+
|
|
276
|
+
except KeyboardInterrupt:
|
|
277
|
+
sys.exit(1)
|
|
278
|
+
except PlotlyCloudError as e:
|
|
279
|
+
# Display custom exceptions in a red panel with class name as title
|
|
280
|
+
args = parse_args([], args_index)
|
|
281
|
+
if args.verbose:
|
|
282
|
+
console.print_exception()
|
|
283
|
+
else:
|
|
284
|
+
content = str(e)
|
|
285
|
+
if e.details:
|
|
286
|
+
content += f"\n\n{e.details}"
|
|
287
|
+
create_error_panel(content, f"✗ {e.__class__.__name__}")
|
|
288
|
+
sys.exit(1)
|
|
289
|
+
except Exception as e:
|
|
290
|
+
# Fallback for unexpected exceptions
|
|
291
|
+
args = parse_args([], args_index)
|
|
292
|
+
if args.verbose:
|
|
293
|
+
console.print_exception()
|
|
294
|
+
else:
|
|
295
|
+
create_error_panel(str(e), "✗ Unexpected Error")
|
|
296
|
+
sys.exit(1)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
if __name__ == "__main__":
|
|
300
|
+
main()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.plotly-cloud-publish-container{position:relative;font-family:Verdana,Geneva,sans-serif}.plotly-cloud-publish-button{cursor:pointer}.plotly-cloud-publish-button:hover{color:#7f4bc4}.plotly-cloud-publish-modal-overlay{position:absolute;bottom:100%;left:-2px;z-index:10000;margin-bottom:2px}.plotly-cloud-publish-modal-content{width:552px;background:#fff;border:1px solid #d1d5db;border-radius:4px 4px 0 0;box-shadow:0 -4px 6px #00000014;overflow:hidden}.plotly-cloud-publish-modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e5e5e5;background:#f9fafb}.plotly-cloud-publish-modal-header h3{margin:0;color:#333}.plotly-cloud-publish-modal-close{background:none;border:none;font-size:24px;cursor:pointer;color:#666;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center}.plotly-cloud-publish-modal-close:hover{color:#333}.plotly-cloud-publish-modal-body{padding:20px;color:#000!important;font-weight:100}button.plotly-cloud-publish-modal-button{display:inline-flex;align-items:center;gap:6px;padding:6px 10px!important;border-radius:4px!important;font-size:12px!important;font-weight:600;cursor:pointer;border:1px solid transparent;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent;background:#f3f4f6;color:#374151}.plotly-cloud-publish-modal-button:disabled{cursor:not-allowed;opacity:.5}button.plotly-cloud-btn-primary{background:#8b5cf6!important;color:#fff;border-color:#7c3aed!important}button.plotly-cloud-btn-primary:disabled{background:#d1d5db!important;color:#9ca3af!important;border-color:#d1d5db!important}button.plotly-cloud-btn-secondary{background:#fff;border:none;color:#8b5cf6!important;font-weight:100}.plotly-cloud-button-bar{display:flex;justify-content:flex-end;align-items:center}.plotly-cloud-publish-signin{display:flex;justify-content:space-between;align-items:center}.plotly-cloud-name-input-label{font-weight:600;color:#374151;font-size:12px;margin-bottom:6px}.plotly-cloud-name-input-field{margin-bottom:12px;width:calc(100% - 8px)}.plotly-cloud-name-input-field:disabled{background-color:#fcfcfc;color:#a1a1aa;cursor:not-allowed;border:1px solid #e4e4e7}.plotly-cloud-status-info{display:flex;border-radius:5px;margin-bottom:12px;align-items:center;padding:6px;font-size:12px!important}.plotly-cloud-status-red{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.plotly-cloud-status-description{font-size:12px!important;margin-left:8px}.plotly-cloud-status-title{font-weight:700}.plotly-cloud-status-green{background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0}.plotly-cloud-status-red .plotly-cloud-status-title{color:#a10}.plotly-cloud-status-green .plotly-cloud-status-title{color:#065f46}.plotly-cloud-status-gray{background:#f9fafb;color:#000;border:1px solid #dadada}.plotly-cloud-status-gray .plotly-cloud-status-title{color:#2e2e2e}.plotly-cloud-green-icon{color:#10b981!important}.plotly-cloud-red-icon{color:#ef4444}.plotly-cloud-gray-icon{color:#9ca3af}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.plotly-cloud-spin{animation:spin 2s linear infinite}.plotly-cloud-confirm-code{margin-top:1rem}.plotly-cloud-user-code{color:#8b5cf6;font-weight:700}button.plotly-cloud-logout{padding-left:0!important}.plotly-cloud-error{display:flex;border-radius:5px;margin-bottom:12px;align-items:center;padding:6px;font-size:12px!important;background:#fef2f2;color:#991b1b;border:1px solid #fecaca}.plotly-cloud-size-error{display:block;border-radius:5px;margin-bottom:12px;padding:12px;font-size:13px!important;font-weight:500;background:#fef2f2;color:#991b1b;border:1px solid #fecaca;line-height:1.5}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const React = window.React; const ReactDOM = window.ReactDOM;
|
|
2
|
+
"use strict";var plotly_cloud_publish_component=(()=>{var ga=Object.create;var Z=Object.defineProperty;var Sa=Object.getOwnPropertyDescriptor;var ha=Object.getOwnPropertyNames;var Ca=Object.getPrototypeOf,wa=Object.prototype.hasOwnProperty;var So=(o,a)=>()=>(a||o((a={exports:{}}).exports,a),a.exports),La=(o,a)=>{for(var s in a)Z(o,s,{get:a[s],enumerable:!0})},xo=(o,a,s,r)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of ha(a))!wa.call(o,n)&&n!==s&&Z(o,n,{get:()=>a[n],enumerable:!(r=Sa(a,n))||r.enumerable});return o};var e=(o,a,s)=>(s=o!=null?ga(Ca(o)):{},xo(a||!o||!o.__esModule?Z(s,"default",{value:o,enumerable:!0}):s,o)),Aa=o=>xo(Z({},"__esModule",{value:!0}),o);var c=So((qa,Uo)=>{Uo.exports=React});var Eo=So(_=>{"use strict";var ba=c(),Pa=Symbol.for("react.element"),ka=Symbol.for("react.fragment"),Ta=Object.prototype.hasOwnProperty,ya=ba.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Fa={key:!0,ref:!0,__self:!0,__source:!0};function vo(o,a,s){var r,n={},L=null,T=null;s!==void 0&&(L=""+s),a.key!==void 0&&(L=""+a.key),a.ref!==void 0&&(T=a.ref);for(r in a)Ta.call(a,r)&&!Fa.hasOwnProperty(r)&&(n[r]=a[r]);if(o&&o.defaultProps)for(r in a=o.defaultProps,a)n[r]===void 0&&(n[r]=a[r]);return{$$typeof:Pa,type:o,key:L,ref:T,props:n,_owner:ya.current}}_.Fragment=ka;_.jsx=vo;_.jsxs=vo});var h=So((Va,Go)=>{"use strict";Go.exports=Eo()});var Ea={};La(Ea,{PlotlyCloudPublishComponent:()=>Co});var t=e(c());var M=e(h()),Ba=({title:o,onClose:a,children:s})=>(0,M.jsx)("div",{className:"plotly-cloud-publish-modal-overlay",children:(0,M.jsxs)("div",{className:"plotly-cloud-publish-modal-content",children:[(0,M.jsxs)("div",{className:"plotly-cloud-publish-modal-header",children:[(0,M.jsx)("h3",{children:o},"modal-title"),(0,M.jsx)("button",{className:"plotly-cloud-publish-modal-close",onClick:a,children:"\xD7"},"modal-close")]}),(0,M.jsx)("div",{className:"plotly-cloud-publish-modal-body",children:s},"modal-body")]})}),Oo=Ba;var qo=e(c()),k=e(h()),Da=o=>{let[a,s]=(0,qo.useState)(o.waiting);return(0,k.jsx)("div",{className:"plotly-cloud-publish-signin",children:a?(0,k.jsxs)("div",{children:[o.verificationUrlComplete?(0,k.jsxs)("div",{children:["A browser window should open for sign-in."," ",(0,k.jsx)("a",{href:o.verificationUrlComplete,target:"_blank",rel:"noopener noreferrer",children:"Click here"})," ","if it doesn't open automatically."]}):(0,k.jsx)("div",{children:"Preparing sign-in..."}),o.userCode?(0,k.jsxs)("div",{className:"plotly-cloud-confirm-code",children:["Confirm your device code"," ",(0,k.jsx)("span",{className:"plotly-cloud-user-code",children:o.userCode})," ","when prompted."]}):null]}):(0,k.jsxs)(k.Fragment,{children:[(0,k.jsx)("span",{children:"Sign in to publish your app to Plotly Cloud."}),(0,k.jsx)("button",{className:"plotly-cloud-publish-modal-button plotly-cloud-btn-primary",onClick:()=>{s(!0),o.onSignIn()},children:"Sign In"})]})})},Wo=Da;var Ha=o=>{let a=async r=>await(await fetch(`${o}_plotly_cloud_publish`,{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})).json(),s=r=>n=>a({operation:r,data:n});return{initialize:s("initialize"),authenticate:s("authenticate"),auth_poll:s("auth_poll"),publish:s("publish"),status:s("status"),wait_auth:s("wait_auth"),logout:s("logout")}},Vo=Ha;var zo=e(c()),D=e(h()),Ma=({initialAppName:o="",onCancel:a,onPublish:s,sizeError:r=""})=>{let[n,L]=(0,zo.useState)(o);return(0,D.jsxs)("div",{className:"plotly-cloud-name-input",children:[r&&(0,D.jsx)("div",{className:"plotly-cloud-size-error",children:r}),(0,D.jsx)("div",{className:"plotly-cloud-name-input-label",children:"App Name"}),(0,D.jsxs)("form",{onSubmit:A=>{A.preventDefault(),n.trim()&&!r&&s(n.trim())},children:[(0,D.jsx)("input",{type:"text",value:n,onChange:A=>L(A.target.value),placeholder:"My Dash App",className:"plotly-cloud-name-input-field",disabled:!!r}),(0,D.jsx)("div",{className:"plotly-cloud-button-bar",children:(0,D.jsx)("button",{type:"submit",disabled:!n.trim()||!!r,className:"plotly-cloud-publish-modal-button plotly-cloud-btn-primary",children:"Publish App"})})]})]})},Zo=Ma;var po=e(c());var l=e(c(),1),_o=new Map([["bold",l.createElement(l.Fragment,null,l.createElement("path",{d:"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z"}))],["duotone",l.createElement(l.Fragment,null,l.createElement("path",{d:"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z",opacity:"0.2"}),l.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["fill",l.createElement(l.Fragment,null,l.createElement("path",{d:"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z"}))],["light",l.createElement(l.Fragment,null,l.createElement("path",{d:"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z"}))],["regular",l.createElement(l.Fragment,null,l.createElement("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"}))],["thin",l.createElement(l.Fragment,null,l.createElement("path",{d:"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z"}))]]);var m=e(c(),1),Xo=new Map([["bold",m.createElement(m.Fragment,null,m.createElement("path",{d:"M236,128a108,108,0,0,1-216,0c0-42.52,24.73-81.34,63-98.9A12,12,0,1,1,93,50.91C63.24,64.57,44,94.83,44,128a84,84,0,0,0,168,0c0-33.17-19.24-63.43-49-77.09A12,12,0,1,1,173,29.1C211.27,46.66,236,85.48,236,128Z"}))],["duotone",m.createElement(m.Fragment,null,m.createElement("path",{d:"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z",opacity:"0.2"}),m.createElement("path",{d:"M232,128a104,104,0,0,1-208,0c0-41,23.81-78.36,60.66-95.27a8,8,0,0,1,6.68,14.54C60.15,61.59,40,93.27,40,128a88,88,0,0,0,176,0c0-34.73-20.15-66.41-51.34-80.73a8,8,0,0,1,6.68-14.54C208.19,49.64,232,87,232,128Z"}))],["fill",m.createElement(m.Fragment,null,m.createElement("path",{d:"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,176A72,72,0,0,1,92,65.64a8,8,0,0,1,8,13.85,56,56,0,1,0,56,0,8,8,0,0,1,8-13.85A72,72,0,0,1,128,200Z"}))],["light",m.createElement(m.Fragment,null,m.createElement("path",{d:"M230,128a102,102,0,0,1-204,0c0-40.18,23.35-76.86,59.5-93.45a6,6,0,0,1,5,10.9C58.61,60.09,38,92.49,38,128a90,90,0,0,0,180,0c0-35.51-20.61-67.91-52.5-82.55a6,6,0,0,1,5-10.9C206.65,51.14,230,87.82,230,128Z"}))],["regular",m.createElement(m.Fragment,null,m.createElement("path",{d:"M232,128a104,104,0,0,1-208,0c0-41,23.81-78.36,60.66-95.27a8,8,0,0,1,6.68,14.54C60.15,61.59,40,93.27,40,128a88,88,0,0,0,176,0c0-34.73-20.15-66.41-51.34-80.73a8,8,0,0,1,6.68-14.54C208.19,49.64,232,87,232,128Z"}))],["thin",m.createElement(m.Fragment,null,m.createElement("path",{d:"M228,128a100,100,0,0,1-200,0c0-39.4,22.9-75.37,58.33-91.63a4,4,0,1,1,3.34,7.27C57.07,58.6,36,91.71,36,128a92,92,0,0,0,184,0c0-36.29-21.07-69.4-53.67-84.36a4,4,0,1,1,3.34-7.27C205.1,52.63,228,88.6,228,128Z"}))]]);var p=e(c(),1),Jo=new Map([["bold",p.createElement(p.Fragment,null,p.createElement("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm40.49-92.49a12,12,0,0,1,0,17l-48,48a12,12,0,0,1-17,0l-24-24a12,12,0,1,1,17-17L144,143l39.51-39.52A12,12,0,0,1,200.49,103.51Z"}))],["duotone",p.createElement(p.Fragment,null,p.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),p.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"}))],["fill",p.createElement(p.Fragment,null,p.createElement("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-50.27-6.86-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35a8,8,0,0,1,11.32,11.32Z"}))],["light",p.createElement(p.Fragment,null,p.createElement("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm36.24-94.24a6,6,0,0,1,0,8.48l-48,48a6,6,0,0,1-8.48,0l-24-24a6,6,0,0,1,8.48-8.48L144,151.51l43.76-43.75A6,6,0,0,1,196.24,107.76Z"}))],["regular",p.createElement(p.Fragment,null,p.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm37.66-93.66a8,8,0,0,1,0,11.32l-48,48a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L144,148.69l42.34-42.35A8,8,0,0,1,197.66,106.34Z"}))],["thin",p.createElement(p.Fragment,null,p.createElement("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm34.83-94.83a4,4,0,0,1,0,5.66l-48,48a4,4,0,0,1-5.66,0l-24-24a4,4,0,0,1,5.66-5.66L144,154.34l45.17-45.17A4,4,0,0,1,194.83,109.17Z"}))]]);var I=e(c(),1),Ko=new Map([["bold",I.createElement(I.Fragment,null,I.createElement("path",{d:"M56.88,31.93A12,12,0,1,0,39.12,48.07L71.79,84A68,68,0,0,0,72,220h88a91.26,91.26,0,0,0,30.66-5.24l8.46,9.31a12,12,0,0,0,17.76-16.14ZM160,196H72a44,44,0,0,1-1.8-87.95A91.91,91.91,0,0,0,68,128a12,12,0,0,0,24,0,68.22,68.22,0,0,1,2.66-18.84l77.88,85.67A68.67,68.67,0,0,1,160,196Zm92-68a91.32,91.32,0,0,1-17.53,54,12,12,0,1,1-19.41-14.11,68,68,0,0,0-89.57-98.53,12,12,0,0,1-12.2-20.66A92,92,0,0,1,252,128Z"}))],["duotone",I.createElement(I.Fragment,null,I.createElement("path",{d:"M240,128a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.74l0,.1A80,80,0,0,1,240,128Z",opacity:"0.2"}),I.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["fill",I.createElement(I.Fragment,null,I.createElement("path",{d:"M248,128.72A87.74,87.74,0,0,1,222.41,190a4,4,0,0,1-5.77-.16L103.78,65.67a4,4,0,0,1,.39-5.76A87.82,87.82,0,0,1,160.87,40C209.15,40.47,248.38,80.43,248,128.72ZM53.92,34.62A8,8,0,1,0,42.08,45.38L81.33,88.56l-.06.11A64,64,0,0,0,8,153c.53,35.12,29.84,63,65,63h87a87.65,87.65,0,0,0,31.78-5.95l10.3,11.33a8,8,0,0,0,11.33.52,8.32,8.32,0,0,0,.29-11.52Z"}))],["light",I.createElement(I.Fragment,null,I.createElement("path",{d:"M52.44,36A6,6,0,0,0,43.56,44l40.18,44.2c-.45.87-.9,1.75-1.32,2.64A62,62,0,1,0,72,214h88a85.23,85.23,0,0,0,32.35-6.3L203.56,220a6,6,0,0,0,8.88-8.08ZM160,202H72a50,50,0,1,1,5.9-99.64A86.25,86.25,0,0,0,74,128a6,6,0,0,0,12,0,73.92,73.92,0,0,1,6.44-30.2l91.22,100.34A73.65,73.65,0,0,1,160,202Zm86-74a85.85,85.85,0,0,1-21.85,57.27,6,6,0,0,1-4.47,2,6,6,0,0,1-4.47-10,74,74,0,0,0-99-108.92,6,6,0,1,1-7.11-9.67A86,86,0,0,1,246,128Z"}))],["regular",I.createElement(I.Fragment,null,I.createElement("path",{d:"M53.92,34.62A8,8,0,1,0,42.08,45.38L81.32,88.55l-.06.12A65,65,0,0,0,72,88a64,64,0,0,0,0,128h88a87.34,87.34,0,0,0,31.8-5.93l10.28,11.31a8,8,0,1,0,11.84-10.76ZM160,200H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.3.12A88.4,88.4,0,0,0,72,128a8,8,0,0,0,16,0,72.25,72.25,0,0,1,5.06-26.54l87,95.7A71.66,71.66,0,0,1,160,200Zm88-72a87.89,87.89,0,0,1-22.35,58.61A8,8,0,0,1,213.71,176,72,72,0,0,0,117.37,70a8,8,0,0,1-9.48-12.89A88,88,0,0,1,248,128Z"}))],["thin",I.createElement(I.Fragment,null,I.createElement("path",{d:"M51,37.31A4,4,0,0,0,45,42.69L86.16,87.93q-1.38,2.55-2.59,5.19A60,60,0,1,0,72,212h88a83.19,83.19,0,0,0,32.88-6.69L205,218.69a4,4,0,1,0,5.92-5.38ZM160,204H72a52,52,0,0,1,0-104,52.92,52.92,0,0,1,8.54.72A84.21,84.21,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,0,1,7.9-33.76L187.13,199A75.37,75.37,0,0,1,160,204Zm84-76a83.86,83.86,0,0,1-21.34,55.94,4,4,0,1,1-6-5.33A76,76,0,0,0,115,66.75a4,4,0,0,1-4.74-6.45A84,84,0,0,1,244,128Z"}))]]);var f=e(c(),1),Qo=new Map([["bold",f.createElement(f.Fragment,null,f.createElement("path",{d:"M160,36A92.09,92.09,0,0,0,79,84.36,68,68,0,1,0,72,220h88a92,92,0,0,0,0-184Zm0,160H72a44,44,0,0,1-1.82-88A91.86,91.86,0,0,0,68,128a12,12,0,0,0,24,0,68,68,0,1,1,68,68Zm32.49-79.51L177,132l15.52,15.51a12,12,0,0,1-17,17L160,149l-15.51,15.52a12,12,0,1,1-17-17L143,132l-15.52-15.51a12,12,0,1,1,17-17L160,115l15.51-15.52a12,12,0,0,1,17,17Z"}))],["duotone",f.createElement(f.Fragment,null,f.createElement("path",{d:"M240,127.62a80,80,0,0,1-80,80H72A56,56,0,1,1,85.92,97.36l0,.1A80,80,0,0,1,240,127.62Z",opacity:"0.2"}),f.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm29.66-82.34L171.31,136l18.35,18.34a8,8,0,0,1-11.32,11.32L160,147.31l-18.34,18.35a8,8,0,0,1-11.32-11.32L148.69,136l-18.35-18.34a8,8,0,0,1,11.32-11.32L160,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32Z"}))],["fill",f.createElement(f.Fragment,null,f.createElement("path",{d:"M247.93,124.52C246.11,77.54,207.07,40,160.06,40A88.1,88.1,0,0,0,81.29,88.67h0A87.48,87.48,0,0,0,72,127.73,8.18,8.18,0,0,1,64.57,136,8,8,0,0,1,56,128a103.66,103.66,0,0,1,5.34-32.92,4,4,0,0,0-4.75-5.18A64.09,64.09,0,0,0,8,152c0,35.19,29.75,64,65,64H160A88.09,88.09,0,0,0,247.93,124.52Zm-58.27,29.82a8,8,0,0,1-11.32,11.32L160,147.31l-18.34,18.35a8,8,0,0,1-11.32-11.32L148.69,136l-18.35-18.34a8,8,0,0,1,11.32-11.32L160,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32L171.31,136Z"}))],["light",f.createElement(f.Fragment,null,f.createElement("path",{d:"M160,42A86.11,86.11,0,0,0,82.43,90.88,62,62,0,1,0,72,214h88a86,86,0,0,0,0-172Zm0,160H72a50,50,0,0,1,0-100,50.67,50.67,0,0,1,5.91.35A85.61,85.61,0,0,0,74,128a6,6,0,0,0,12,0,74,74,0,1,1,74,74Zm28.24-85.76L168.48,136l19.76,19.76a6,6,0,1,1-8.48,8.48L160,144.48l-19.76,19.76a6,6,0,0,1-8.48-8.48L151.52,136l-19.76-19.76a6,6,0,0,1,8.48-8.48L160,127.52l19.76-19.76a6,6,0,0,1,8.48,8.48Z"}))],["regular",f.createElement(f.Fragment,null,f.createElement("path",{d:"M160,40A88.09,88.09,0,0,0,81.29,88.67,64,64,0,1,0,72,216h88a88,88,0,0,0,0-176Zm0,160H72a48,48,0,0,1,0-96c1.1,0,2.2,0,3.29.11A88,88,0,0,0,72,128a8,8,0,0,0,16,0,72,72,0,1,1,72,72Zm29.66-82.34L171.31,136l18.35,18.34a8,8,0,0,1-11.32,11.32L160,147.31l-18.34,18.35a8,8,0,0,1-11.32-11.32L148.69,136l-18.35-18.34a8,8,0,0,1,11.32-11.32L160,124.69l18.34-18.35a8,8,0,0,1,11.32,11.32Z"}))],["thin",f.createElement(f.Fragment,null,f.createElement("path",{d:"M160,44A84.11,84.11,0,0,0,83.59,93.12,60.71,60.71,0,0,0,72,92a60,60,0,0,0,0,120h88a84,84,0,0,0,0-168Zm0,160H72a52,52,0,1,1,8.55-103.3A83.66,83.66,0,0,0,76,128a4,4,0,0,0,8,0,76,76,0,1,1,76,76Zm26.83-89.17L165.66,136l21.17,21.17a4,4,0,0,1-5.66,5.66L160,141.66l-21.17,21.17a4,4,0,0,1-5.66-5.66L154.34,136l-21.17-21.17a4,4,0,0,1,5.66-5.66L160,130.34l21.17-21.17a4,4,0,1,1,5.66,5.66Z"}))]]);var u=e(c(),1),jo=new Map([["bold",u.createElement(u.Fragment,null,u.createElement("path",{d:"M128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,80a28,28,0,1,1,28-28A28,28,0,0,1,128,156Zm92-27.21v-1.58l14-17.51a12,12,0,0,0,2.23-10.59A111.75,111.75,0,0,0,225,71.89,12,12,0,0,0,215.89,66L193.61,63.5l-1.11-1.11L190,40.1A12,12,0,0,0,184.11,31a111.67,111.67,0,0,0-27.23-11.27A12,12,0,0,0,146.3,22L128.79,36h-1.58L109.7,22a12,12,0,0,0-10.59-2.23A111.75,111.75,0,0,0,71.89,31.05,12,12,0,0,0,66,40.11L63.5,62.39,62.39,63.5,40.1,66A12,12,0,0,0,31,71.89,111.67,111.67,0,0,0,19.77,99.12,12,12,0,0,0,22,109.7l14,17.51v1.58L22,146.3a12,12,0,0,0-2.23,10.59,111.75,111.75,0,0,0,11.29,27.22A12,12,0,0,0,40.11,190l22.28,2.48,1.11,1.11L66,215.9A12,12,0,0,0,71.89,225a111.67,111.67,0,0,0,27.23,11.27A12,12,0,0,0,109.7,234l17.51-14h1.58l17.51,14a12,12,0,0,0,10.59,2.23A111.75,111.75,0,0,0,184.11,225a12,12,0,0,0,5.91-9.06l2.48-22.28,1.11-1.11L215.9,190a12,12,0,0,0,9.06-5.91,111.67,111.67,0,0,0,11.27-27.23A12,12,0,0,0,234,146.3Zm-24.12-4.89a70.1,70.1,0,0,1,0,8.2,12,12,0,0,0,2.61,8.22l12.84,16.05A86.47,86.47,0,0,1,207,166.86l-20.43,2.27a12,12,0,0,0-7.65,4,69,69,0,0,1-5.8,5.8,12,12,0,0,0-4,7.65L166.86,207a86.47,86.47,0,0,1-10.49,4.35l-16.05-12.85a12,12,0,0,0-7.5-2.62c-.24,0-.48,0-.72,0a70.1,70.1,0,0,1-8.2,0,12.06,12.06,0,0,0-8.22,2.6L99.63,211.33A86.47,86.47,0,0,1,89.14,207l-2.27-20.43a12,12,0,0,0-4-7.65,69,69,0,0,1-5.8-5.8,12,12,0,0,0-7.65-4L49,166.86a86.47,86.47,0,0,1-4.35-10.49l12.84-16.05a12,12,0,0,0,2.61-8.22,70.1,70.1,0,0,1,0-8.2,12,12,0,0,0-2.61-8.22L44.67,99.63A86.47,86.47,0,0,1,49,89.14l20.43-2.27a12,12,0,0,0,7.65-4,69,69,0,0,1,5.8-5.8,12,12,0,0,0,4-7.65L89.14,49a86.47,86.47,0,0,1,10.49-4.35l16.05,12.85a12.06,12.06,0,0,0,8.22,2.6,70.1,70.1,0,0,1,8.2,0,12,12,0,0,0,8.22-2.6l16.05-12.85A86.47,86.47,0,0,1,166.86,49l2.27,20.43a12,12,0,0,0,4,7.65,69,69,0,0,1,5.8,5.8,12,12,0,0,0,7.65,4L207,89.14a86.47,86.47,0,0,1,4.35,10.49l-12.84,16.05A12,12,0,0,0,195.88,123.9Z"}))],["duotone",u.createElement(u.Fragment,null,u.createElement("path",{d:"M207.86,123.18l16.78-21a99.14,99.14,0,0,0-10.07-24.29l-26.7-3a81,81,0,0,0-6.81-6.81l-3-26.71a99.43,99.43,0,0,0-24.3-10l-21,16.77a81.59,81.59,0,0,0-9.64,0l-21-16.78A99.14,99.14,0,0,0,77.91,41.43l-3,26.7a81,81,0,0,0-6.81,6.81l-26.71,3a99.43,99.43,0,0,0-10,24.3l16.77,21a81.59,81.59,0,0,0,0,9.64l-16.78,21a99.14,99.14,0,0,0,10.07,24.29l26.7,3a81,81,0,0,0,6.81,6.81l3,26.71a99.43,99.43,0,0,0,24.3,10l21-16.77a81.59,81.59,0,0,0,9.64,0l21,16.78a99.14,99.14,0,0,0,24.29-10.07l3-26.7a81,81,0,0,0,6.81-6.81l26.71-3a99.43,99.43,0,0,0,10-24.3l-16.77-21A81.59,81.59,0,0,0,207.86,123.18ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z",opacity:"0.2"}),u.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8.06,8.06,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8.06,8.06,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["fill",u.createElement(u.Fragment,null,u.createElement("path",{d:"M216,130.16q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"}))],["light",u.createElement(u.Fragment,null,u.createElement("path",{d:"M128,82a46,46,0,1,0,46,46A46.06,46.06,0,0,0,128,82Zm0,80a34,34,0,1,1,34-34A34,34,0,0,1,128,162ZM214,130.84c.06-1.89.06-3.79,0-5.68L229.33,106a6,6,0,0,0,1.11-5.29A105.34,105.34,0,0,0,219.76,74.9a6,6,0,0,0-4.53-3l-24.45-2.71q-1.93-2.07-4-4l-2.72-24.46a6,6,0,0,0-3-4.53,105.65,105.65,0,0,0-25.77-10.66A6,6,0,0,0,150,26.68l-19.2,15.37c-1.89-.06-3.79-.06-5.68,0L106,26.67a6,6,0,0,0-5.29-1.11A105.34,105.34,0,0,0,74.9,36.24a6,6,0,0,0-3,4.53L69.23,65.22q-2.07,1.94-4,4L40.76,72a6,6,0,0,0-4.53,3,105.65,105.65,0,0,0-10.66,25.77A6,6,0,0,0,26.68,106l15.37,19.2c-.06,1.89-.06,3.79,0,5.68L26.67,150.05a6,6,0,0,0-1.11,5.29A105.34,105.34,0,0,0,36.24,181.1a6,6,0,0,0,4.53,3l24.45,2.71q1.94,2.07,4,4L72,215.24a6,6,0,0,0,3,4.53,105.65,105.65,0,0,0,25.77,10.66,6,6,0,0,0,5.29-1.11L125.16,214c1.89.06,3.79.06,5.68,0l19.21,15.38a6,6,0,0,0,3.75,1.31,6.2,6.2,0,0,0,1.54-.2,105.34,105.34,0,0,0,25.76-10.68,6,6,0,0,0,3-4.53l2.71-24.45q2.07-1.93,4-4l24.46-2.72a6,6,0,0,0,4.53-3,105.49,105.49,0,0,0,10.66-25.77,6,6,0,0,0-1.11-5.29Zm-3.1,41.63-23.64,2.63a6,6,0,0,0-3.82,2,75.14,75.14,0,0,1-6.31,6.31,6,6,0,0,0-2,3.82l-2.63,23.63A94.28,94.28,0,0,1,155.14,218l-18.57-14.86a6,6,0,0,0-3.75-1.31h-.36a78.07,78.07,0,0,1-8.92,0,6,6,0,0,0-4.11,1.3L100.87,218a94.13,94.13,0,0,1-17.34-7.17L80.9,187.21a6,6,0,0,0-2-3.82,75.14,75.14,0,0,1-6.31-6.31,6,6,0,0,0-3.82-2l-23.63-2.63A94.28,94.28,0,0,1,38,155.14l14.86-18.57a6,6,0,0,0,1.3-4.11,78.07,78.07,0,0,1,0-8.92,6,6,0,0,0-1.3-4.11L38,100.87a94.13,94.13,0,0,1,7.17-17.34L68.79,80.9a6,6,0,0,0,3.82-2,75.14,75.14,0,0,1,6.31-6.31,6,6,0,0,0,2-3.82l2.63-23.63A94.28,94.28,0,0,1,100.86,38l18.57,14.86a6,6,0,0,0,4.11,1.3,78.07,78.07,0,0,1,8.92,0,6,6,0,0,0,4.11-1.3L155.13,38a94.13,94.13,0,0,1,17.34,7.17l2.63,23.64a6,6,0,0,0,2,3.82,75.14,75.14,0,0,1,6.31,6.31,6,6,0,0,0,3.82,2l23.63,2.63A94.28,94.28,0,0,1,218,100.86l-14.86,18.57a6,6,0,0,0-1.3,4.11,78.07,78.07,0,0,1,0,8.92,6,6,0,0,0,1.3,4.11L218,155.13A94.13,94.13,0,0,1,210.85,172.47Z"}))],["regular",u.createElement(u.Fragment,null,u.createElement("path",{d:"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"}))],["thin",u.createElement(u.Fragment,null,u.createElement("path",{d:"M128,84a44,44,0,1,0,44,44A44.05,44.05,0,0,0,128,84Zm0,80a36,36,0,1,1,36-36A36,36,0,0,1,128,164Zm83.93-32.49q.13-3.51,0-7l15.83-19.79a4,4,0,0,0,.75-3.53A103.64,103.64,0,0,0,218,75.9a4,4,0,0,0-3-2l-25.19-2.8c-1.58-1.71-3.24-3.37-4.95-4.95L182.07,41a4,4,0,0,0-2-3A104,104,0,0,0,154.82,27.5a4,4,0,0,0-3.53.74L131.51,44.07q-3.51-.14-7,0L104.7,28.24a4,4,0,0,0-3.53-.75A103.64,103.64,0,0,0,75.9,38a4,4,0,0,0-2,3l-2.8,25.19c-1.71,1.58-3.37,3.24-4.95,4.95L41,73.93a4,4,0,0,0-3,2A104,104,0,0,0,27.5,101.18a4,4,0,0,0,.74,3.53l15.83,19.78q-.14,3.51,0,7L28.24,151.3a4,4,0,0,0-.75,3.53A103.64,103.64,0,0,0,38,180.1a4,4,0,0,0,3,2l25.19,2.8c1.58,1.71,3.24,3.37,4.95,4.95l2.8,25.2a4,4,0,0,0,2,3,104,104,0,0,0,25.28,10.46,4,4,0,0,0,3.53-.74l19.78-15.83q3.51.13,7,0l19.79,15.83a4,4,0,0,0,2.5.88,4,4,0,0,0,1-.13A103.64,103.64,0,0,0,180.1,218a4,4,0,0,0,2-3l2.8-25.19c1.71-1.58,3.37-3.24,4.95-4.95l25.2-2.8a4,4,0,0,0,3-2,104,104,0,0,0,10.46-25.28,4,4,0,0,0-.74-3.53Zm.17,42.83-24.67,2.74a4,4,0,0,0-2.55,1.32,76.2,76.2,0,0,1-6.48,6.48,4,4,0,0,0-1.32,2.55l-2.74,24.66a95.45,95.45,0,0,1-19.64,8.15l-19.38-15.51a4,4,0,0,0-2.5-.87h-.24a73.67,73.67,0,0,1-9.16,0,4,4,0,0,0-2.74.87l-19.37,15.5a95.33,95.33,0,0,1-19.65-8.13l-2.74-24.67a4,4,0,0,0-1.32-2.55,76.2,76.2,0,0,1-6.48-6.48,4,4,0,0,0-2.55-1.32l-24.66-2.74a95.45,95.45,0,0,1-8.15-19.64l15.51-19.38a4,4,0,0,0,.87-2.74,77.76,77.76,0,0,1,0-9.16,4,4,0,0,0-.87-2.74l-15.5-19.37A95.33,95.33,0,0,1,43.9,81.66l24.67-2.74a4,4,0,0,0,2.55-1.32,76.2,76.2,0,0,1,6.48-6.48,4,4,0,0,0,1.32-2.55l2.74-24.66a95.45,95.45,0,0,1,19.64-8.15l19.38,15.51a4,4,0,0,0,2.74.87,73.67,73.67,0,0,1,9.16,0,4,4,0,0,0,2.74-.87l19.37-15.5a95.33,95.33,0,0,1,19.65,8.13l2.74,24.67a4,4,0,0,0,1.32,2.55,76.2,76.2,0,0,1,6.48,6.48,4,4,0,0,0,2.55,1.32l24.66,2.74a95.45,95.45,0,0,1,8.15,19.64l-15.51,19.38a4,4,0,0,0-.87,2.74,77.76,77.76,0,0,1,0,9.16,4,4,0,0,0,.87,2.74l15.5,19.37A95.33,95.33,0,0,1,212.1,174.34Z"}))]]);var d=e(c(),1),Yo=new Map([["bold",d.createElement(d.Fragment,null,d.createElement("path",{d:"M124,216a12,12,0,0,1-12,12H48a12,12,0,0,1-12-12V40A12,12,0,0,1,48,28h64a12,12,0,0,1,0,24H60V204h52A12,12,0,0,1,124,216Zm108.49-96.49-40-40a12,12,0,0,0-17,17L195,116H112a12,12,0,0,0,0,24h83l-19.52,19.51a12,12,0,0,0,17,17l40-40A12,12,0,0,0,232.49,119.51Z"}))],["duotone",d.createElement(d.Fragment,null,d.createElement("path",{d:"M224,56V200a16,16,0,0,1-16,16H48V40H208A16,16,0,0,1,224,56Z",opacity:"0.2"}),d.createElement("path",{d:"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z"}))],["fill",d.createElement(d.Fragment,null,d.createElement("path",{d:"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40A8,8,0,0,0,176,88v32H112a8,8,0,0,0,0,16h64v32a8,8,0,0,0,13.66,5.66l40-40A8,8,0,0,0,229.66,122.34Z"}))],["light",d.createElement(d.Fragment,null,d.createElement("path",{d:"M118,216a6,6,0,0,1-6,6H48a6,6,0,0,1-6-6V40a6,6,0,0,1,6-6h64a6,6,0,0,1,0,12H54V210h58A6,6,0,0,1,118,216Zm110.24-92.24-40-40a6,6,0,0,0-8.48,8.48L209.51,122H112a6,6,0,0,0,0,12h97.51l-29.75,29.76a6,6,0,1,0,8.48,8.48l40-40A6,6,0,0,0,228.24,123.76Z"}))],["regular",d.createElement(d.Fragment,null,d.createElement("path",{d:"M120,216a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h64a8,8,0,0,1,0,16H56V208h56A8,8,0,0,1,120,216Zm109.66-93.66-40-40a8,8,0,0,0-11.32,11.32L204.69,120H112a8,8,0,0,0,0,16h92.69l-26.35,26.34a8,8,0,0,0,11.32,11.32l40-40A8,8,0,0,0,229.66,122.34Z"}))],["thin",d.createElement(d.Fragment,null,d.createElement("path",{d:"M116,216a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V40a4,4,0,0,1,4-4h64a4,4,0,0,1,0,8H52V212h60A4,4,0,0,1,116,216Zm110.83-90.83-40-40a4,4,0,0,0-5.66,5.66L214.34,124H112a4,4,0,0,0,0,8H214.34l-33.17,33.17a4,4,0,0,0,5.66,5.66l40-40A4,4,0,0,0,226.83,125.17Z"}))]]);var g=e(c(),1),$o=new Map([["bold",g.createElement(g.Fragment,null,g.createElement("path",{d:"M240.26,186.1,152.81,34.23h0a28.74,28.74,0,0,0-49.62,0L15.74,186.1a27.45,27.45,0,0,0,0,27.71A28.31,28.31,0,0,0,40.55,228h174.9a28.31,28.31,0,0,0,24.79-14.19A27.45,27.45,0,0,0,240.26,186.1Zm-20.8,15.7a4.46,4.46,0,0,1-4,2.2H40.55a4.46,4.46,0,0,1-4-2.2,3.56,3.56,0,0,1,0-3.73L124,46.2a4.77,4.77,0,0,1,8,0l87.44,151.87A3.56,3.56,0,0,1,219.46,201.8ZM116,136V104a12,12,0,0,1,24,0v32a12,12,0,0,1-24,0Zm28,40a16,16,0,1,1-16-16A16,16,0,0,1,144,176Z"}))],["duotone",g.createElement(g.Fragment,null,g.createElement("path",{d:"M215.46,216H40.54C27.92,216,20,202.79,26.13,192.09L113.59,40.22c6.3-11,22.52-11,28.82,0l87.46,151.87C236,202.79,228.08,216,215.46,216Z",opacity:"0.2"}),g.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["fill",g.createElement(g.Fragment,null,g.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z"}))],["light",g.createElement(g.Fragment,null,g.createElement("path",{d:"M235.07,189.09,147.61,37.22h0a22.75,22.75,0,0,0-39.22,0L20.93,189.09a21.53,21.53,0,0,0,0,21.72A22.35,22.35,0,0,0,40.55,222h174.9a22.35,22.35,0,0,0,19.6-11.19A21.53,21.53,0,0,0,235.07,189.09ZM224.66,204.8a10.46,10.46,0,0,1-9.21,5.2H40.55a10.46,10.46,0,0,1-9.21-5.2,9.51,9.51,0,0,1,0-9.72L118.79,43.21a10.75,10.75,0,0,1,18.42,0l87.46,151.87A9.51,9.51,0,0,1,224.66,204.8ZM122,144V104a6,6,0,0,1,12,0v40a6,6,0,0,1-12,0Zm16,36a10,10,0,1,1-10-10A10,10,0,0,1,138,180Z"}))],["regular",g.createElement(g.Fragment,null,g.createElement("path",{d:"M236.8,188.09,149.35,36.22h0a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM222.93,203.8a8.5,8.5,0,0,1-7.48,4.2H40.55a8.5,8.5,0,0,1-7.48-4.2,7.59,7.59,0,0,1,0-7.72L120.52,44.21a8.75,8.75,0,0,1,15,0l87.45,151.87A7.59,7.59,0,0,1,222.93,203.8ZM120,144V104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,180Z"}))],["thin",g.createElement(g.Fragment,null,g.createElement("path",{d:"M233.34,190.09,145.88,38.22h0a20.75,20.75,0,0,0-35.76,0L22.66,190.09a19.52,19.52,0,0,0,0,19.71A20.36,20.36,0,0,0,40.54,220H215.46a20.36,20.36,0,0,0,17.86-10.2A19.52,19.52,0,0,0,233.34,190.09ZM226.4,205.8a12.47,12.47,0,0,1-10.94,6.2H40.54a12.47,12.47,0,0,1-10.94-6.2,11.45,11.45,0,0,1,0-11.72L117.05,42.21a12.76,12.76,0,0,1,21.9,0L226.4,194.08A11.45,11.45,0,0,1,226.4,205.8ZM124,144V104a4,4,0,0,1,8,0v40a4,4,0,0,1-8,0Zm12,36a8,8,0,1,1-8-8A8,8,0,0,1,136,180Z"}))]]);var R=e(c(),1);var oa=e(c(),1),aa=(0,oa.createContext)({color:"currentColor",size:"1em",weight:"regular",mirrored:!1});var C=R.forwardRef((o,a)=>{let{alt:s,color:r,size:n,weight:L,mirrored:T,children:A,weights:b,...v}=o,{color:E="currentColor",size:N,weight:G="regular",mirrored:x=!1,...O}=R.useContext(aa);return R.createElement("svg",{ref:a,xmlns:"http://www.w3.org/2000/svg",width:n??N,height:n??N,fill:r??E,viewBox:"0 0 256 256",transform:T||x?"scale(-1, 1)":void 0,...O,...v},!!s&&R.createElement("title",null,s),A,b.get(L??G))});C.displayName="IconBase";var X=e(c(),1);var J=X.forwardRef((o,a)=>X.createElement(C,{ref:a,...o,weights:_o}));J.displayName="ArrowSquareOutIcon";var K=e(c(),1);var Q=K.forwardRef((o,a)=>K.createElement(C,{ref:a,...o,weights:Xo}));Q.displayName="CircleNotchIcon";var j=e(c(),1);var Y=j.forwardRef((o,a)=>j.createElement(C,{ref:a,...o,weights:Jo}));Y.displayName="CloudCheckIcon";var $=e(c(),1);var oo=$.forwardRef((o,a)=>$.createElement(C,{ref:a,...o,weights:Ko}));oo.displayName="CloudSlashIcon";var ao=e(c(),1);var ro=ao.forwardRef((o,a)=>ao.createElement(C,{ref:a,...o,weights:Qo}));ro.displayName="CloudXIcon";var so=e(c(),1);var eo=so.forwardRef((o,a)=>so.createElement(C,{ref:a,...o,weights:jo}));eo.displayName="GearIcon";var no=e(c(),1);var io=no.forwardRef((o,a)=>no.createElement(C,{ref:a,...o,weights:Yo}));io.displayName="SignOutIcon";var to=e(c(),1);var co=to.forwardRef((o,a)=>to.createElement(C,{ref:a,...o,weights:$o}));co.displayName="WarningIcon";var ra=e(h()),Ra=o=>(0,ra.jsx)(Q,{size:o.size,className:"plotly-cloud-spin plotly-cloud-gray-icon",weight:"bold"}),lo=Ra;var q=e(h()),Na=({status:o,size:a=16,isButtonIcon:s})=>o==="BUILDING"||o==="STARTING"||o==="unknown"?(0,q.jsx)(lo,{size:a}):o==="RUNNING"?(0,q.jsx)(Y,{size:a,className:"plotly-cloud-green-icon",weight:s?"fill":"duotone"}):o==="new"?(0,q.jsx)(oo,{size:a,className:"plotly-cloud-gray-icon",weight:s?"fill":"duotone"}):(0,q.jsx)(ro,{size:a,className:"plotly-cloud-red-icon",weight:"duotone"}),mo=Na;var S=e(h()),xa=({status:o,onPublish:a,isUpdate:s,publishing:r,onCancel:n,onLogout:L,appUrl:T,sizeError:A=""})=>{let b=()=>{n&&n()},v=()=>{window.open(T,"_blank")},[E,N,G]=(0,po.useMemo)(()=>o==="BUILDING"||o==="STARTING"?["App is building","Wait for your app to finish publishing before publishing again","gray"]:o==="RUNNING"?["App is live","Your app is running in Plotly Cloud.","green"]:["App is stopped","Start your app by publishing again or starting it in the app manager","red"],[o]),[x,O]=(0,po.useMemo)(()=>r?s?["Open Settings in Plotly Cloud","Republishing",""]:[null,"Publishing",""]:s?[(0,S.jsxs)("span",{children:[(0,S.jsx)(eo,{}),"\xA0Open Settings in Plotly Cloud"]}),"Republish"]:[null,"Publish",""],[r,s]),W=(0,po.useMemo)(()=>["BUILDING","STARTING"].includes(o)||!!A,[o,A]);return(0,S.jsxs)("div",{className:"plotly-cloud-status-banner",children:[A&&(0,S.jsx)("div",{className:"plotly-cloud-size-error",children:A}),(0,S.jsxs)("div",{className:`plotly-cloud-status-info plotly-cloud-status-${G}`,children:[(0,S.jsx)(mo,{status:o,size:20}),(0,S.jsxs)("div",{className:"plotly-cloud-status-description",children:[(0,S.jsx)("div",{className:"plotly-cloud-status-title",children:E}),(0,S.jsx)("div",{className:"plotly-cloud-status-text",children:N})]})]}),(0,S.jsxs)("div",{className:"plotly-cloud-button-bar",children:[(0,S.jsx)("div",{style:{flex:1},children:(0,S.jsxs)("button",{disabled:r,className:"plotly-cloud-publish-modal-button plotly-cloud-btn-secondary plotly-cloud-logout",onClick:L,children:[(0,S.jsx)(io,{}),"\xA0Logout"]})}),x?(0,S.jsx)("button",{type:"button",onClick:b,disabled:s?!1:r,className:"plotly-cloud-publish-modal-button plotly-cloud-btn-secondary",children:x}):null,T?(0,S.jsx)("button",{onClick:v,disabled:r,className:"plotly-cloud-publish-modal-button plotly-cloud-btn-secondary",children:(0,S.jsxs)("span",{children:[(0,S.jsx)(J,{}),"\xA0View App"]})}):null,(0,S.jsxs)("button",{type:"button",onClick:a,className:"plotly-cloud-publish-modal-button plotly-cloud-btn-primary",disabled:r||W,children:[r?(0,S.jsx)(lo,{size:12}):null,O]})]})]})},ho=xa;var Io=e(h()),Ua=({error:o})=>(0,Io.jsxs)("div",{className:"plotly-cloud-error",children:[(0,Io.jsx)(co,{className:"plotly-cloud-red-icon",size:24}),"\xA0",o]}),sa=Ua;function ea(o){switch(o){case"BUILDING":return 1e4;case"STARTING":return 7e3;case"CHECKING":case"STOPPING":return 15e3;case"RUNNING":return 18e4;case"FAILING":case"PENDING_ENTITLEMENTS":case"BUILD_COMPLETED":case"BUILD_FAILED":case"STOPPED":case"DEPLOYED_BY_OTHER_PLATFORM":return 6e4;default:return 6e4}}var w=e(h()),fo="cloud",va=()=>{let{popup:o,setPopup:a}=window.dash_component_api.devtool.useDevtool(),s=window.dash_component_api.devtool.useDevtoolMenuButtonClassName(fo),[r,n]=(0,t.useState)(""),[L,T]=(0,t.useState)(""),[A,b]=(0,t.useState)("initialize"),[v,E]=(0,t.useState)(!1),[N,G]=(0,t.useState)(""),[x,O]=(0,t.useState)(""),[W,V]=(0,t.useState)(!1),[na,uo]=(0,t.useState)(!1),[wo,ia]=(0,t.useState)(""),[ta,Lo]=(0,t.useState)(""),[Ao,bo]=(0,t.useState)(""),[F,H]=(0,t.useState)("unknown"),[Po,ko]=(0,t.useState)(0),[ca,la]=(0,t.useState)(1),[To,yo]=(0,t.useState)(-1),z=(0,t.useRef)(""),B=(0,t.useRef)(""),y=(0,t.useMemo)(()=>Vo("/"),[]),Fo=(0,t.useMemo)(()=>o===fo,[o]),go=()=>{a("")},ma=()=>{a(o===fo?"":fo)},Bo=()=>{y.logout().then(()=>{b("initialize")})},Do=()=>{E(!0),y.authenticate().then(i=>{i.error?n(i.error):(b("auth_poll"),G(i.result.user_code),O(i.result.verification_uri_complete),z.current=i.result.device_code,y.wait_auth().then(()=>{window.open(i.result.verification_uri_complete,"_blank"),yo(setTimeout(()=>{y.auth_poll({device_code:z.current}).then(Ho)},8e3))}))})},Ho=i=>{if(i.error)n(i.error);else{if(i.result.success){z.current="",B.current?(H("unknown"),b("update_app"),y.status({app_id:B.current}).then(U=>{H(U.result.status)})):b("enter_name");return}if(i.result.try_again){Do();return}let P=ca||1;i.result.delay&&(P=i.result.delay,la(P)),yo(setTimeout(()=>{y.auth_poll({device_code:z.current}).then(Ho)},1e3+P*1e3))}},pa=()=>{setTimeout(Do,2e3)};(0,t.useEffect)(()=>{A==="initialize"&&y.initialize().then(i=>{let{result:P,error:U}=i;U?n(U):(ia(P.app_path),Lo(P.app_name),H(P.status),bo(P.app_url),T(P.size_error||""),P.app_id&&(B.current=P.app_id),P?.authenticated?P.status==="new"?b("enter_name"):b("update_app"):b("sign_in"))})},[A,Fo]);let Ia=()=>{y.status({app_id:B.current}).then(fa)},fa=i=>{if(i.error){n(i.error);return}H(i.result.status),ko(Date.now()),i.result.status==="RUNNING"?(V(!1),uo(!0),b("update_app")):["BUILDING","STARTING"].includes(i.result.status)||(V(!1),b("update_app"))},Mo=i=>{if(i.error){n(i.error);return}b("status_poll"),B.current=i.result.app_id,bo(i.result.app_url),H("BUILDING"),ko(0)},ua=i=>{Lo(i),V(!0),uo(!1),H("BUILDING"),y.publish({app_path:wo,app_name:i}).then(Mo)},Ro=()=>{V(!0),uo(!0),H("BUILDING"),y.publish({app_id:B.current,app_path:wo}).then(Mo)};(0,t.useEffect)(()=>{if(!B.current||F==="unknown"||F==="new")return;let i=setInterval(()=>{let U=Date.now()-Po,da=ea(F);U>=da&&Ia()},1e3);return()=>{clearInterval(i)}},[B.current,F,Po]),(0,t.useEffect)(()=>()=>{To>0&&clearTimeout(To)}),(0,t.useEffect)(()=>{r&&F!=="error"&&H("error")},[r,F]);let No=()=>{window.open(`https://cloud.plotly.com/app/${B.current}/settings`,"_blank")};return(0,w.jsxs)(w.Fragment,{children:[(0,w.jsxs)("button",{className:s,onClick:ma,children:[(0,w.jsx)(mo,{status:F,isButtonIcon:!0}),"\xA0Plotly Cloud"]}),Fo?(0,w.jsx)(Oo,{title:"Plotly Cloud",onClose:go,children:r?(0,w.jsx)(sa,{error:r}):(()=>{switch(A){case"authenticate":case"auth_poll":case"sign_in":return(0,w.jsx)(Wo,{onSignIn:pa,waiting:v,userCode:N,verificationUrlComplete:x});case"enter_name":return(0,w.jsx)(Zo,{onPublish:ua,onCancel:go,initialAppName:ta,sizeError:L});case"update_app":return(0,w.jsx)(ho,{onPublish:Ro,status:F,isUpdate:!0,onCancel:No,appUrl:Ao,onLogout:Bo,sizeError:L});case"status_poll":case"publish":return(0,w.jsx)(ho,{publishing:W,onPublish:Ro,status:F,onCancel:W?No:go,isUpdate:na,appUrl:Ao,onLogout:Bo,sizeError:L});default:return(0,w.jsx)(w.Fragment,{})}})()},"publish-modal"):null]})},Co=va;typeof window<"u"&&(window.plotly_cloud_publish_component={PlotlyCloudPublishComponent:Co});return Aa(Ea);})();
|
|
3
|
+
/*! Bundled license information:
|
|
4
|
+
|
|
5
|
+
react/cjs/react-jsx-runtime.production.min.js:
|
|
6
|
+
(**
|
|
7
|
+
* @license React
|
|
8
|
+
* react-jsx-runtime.production.min.js
|
|
9
|
+
*
|
|
10
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
11
|
+
*
|
|
12
|
+
* This source code is licensed under the MIT license found in the
|
|
13
|
+
* LICENSE file in the root directory of this source tree.
|
|
14
|
+
*)
|
|
15
|
+
*/
|