@ -0,0 +1,3 @@ |
|||
# Default ignored files |
|||
/shelf/ |
|||
/workspace.xml |
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<module type="PYTHON_MODULE" version="4"> |
|||
<component name="NewModuleRootManager"> |
|||
<content url="file://$MODULE_DIR$" /> |
|||
<orderEntry type="inheritedJdk" /> |
|||
<orderEntry type="sourceFolder" forTests="false" /> |
|||
</component> |
|||
</module> |
@ -0,0 +1,6 @@ |
|||
<component name="InspectionProjectProfileManager"> |
|||
<settings> |
|||
<option name="USE_PROJECT_PROFILE" value="false" /> |
|||
<version value="1.0" /> |
|||
</settings> |
|||
</component> |
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="Black"> |
|||
<option name="sdkName" value="PyTorch" /> |
|||
</component> |
|||
<component name="ProjectRootManager" version="2" project-jdk-name="PyTorch" project-jdk-type="Python SDK" /> |
|||
<component name="PyCharmProfessionalAdvertiser"> |
|||
<option name="shown" value="true" /> |
|||
</component> |
|||
</project> |
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="ProjectModuleManager"> |
|||
<modules> |
|||
<module fileurl="file://$PROJECT_DIR$/.idea/FristProject.iml" filepath="$PROJECT_DIR$/.idea/FristProject.iml" /> |
|||
</modules> |
|||
</component> |
|||
</project> |
@ -0,0 +1,41 @@ |
|||
import pymysql |
|||
import sqlite3 |
|||
|
|||
class DBManager(): |
|||
#实例化数据库管理对象,并连接数据库 |
|||
def __init__(self,ip,prot,user,passwd): |
|||
pass |
|||
|
|||
#检查设备ID是否在数据库? |
|||
def checkDevID(self,cID): |
|||
pass |
|||
|
|||
def test(self): |
|||
# 建立数据库连接 |
|||
conn = pymysql.connect( |
|||
host='localhost', |
|||
port=3306, |
|||
user='username', |
|||
password='password', |
|||
database='database_name' |
|||
) |
|||
|
|||
# 创建游标对象 |
|||
cursor = conn.cursor() |
|||
|
|||
# 执行 SQL 查询 |
|||
query = "SELECT * FROM table_name" |
|||
cursor.execute(query) |
|||
|
|||
# 获取查询结果 |
|||
result = cursor.fetchall() |
|||
|
|||
# 输出结果 |
|||
for row in result: |
|||
print(row) |
|||
|
|||
# 关闭游标和连接 |
|||
cursor.close() |
|||
conn.close() |
|||
|
|||
|
@ -0,0 +1,25 @@ |
|||
''' |
|||
数据结构定义类 |
|||
''' |
|||
import ctypes |
|||
|
|||
''' |
|||
iDataType 0-心跳,1-设备端登录,2-手机端登录,3- |
|||
''' |
|||
class CSHeadMessage(ctypes.Structure): |
|||
_fields_ = [ |
|||
('Flag',ctypes.c_char * 4), |
|||
('iDataType',ctypes.c_int), |
|||
('iDataLen',ctypes.c_int) |
|||
] |
|||
|
|||
class CSDevLogin_Data(ctypes.Structure): |
|||
_fields_ = [('DID',ctypes.c_char * 32)] |
|||
|
|||
class CSAPPLogin_Data(ctypes.Structure): |
|||
_fields_ = [ |
|||
('username', ctypes.c_char * 32), |
|||
('passwd', ctypes.c_char * 32) |
|||
] |
|||
|
|||
|
@ -0,0 +1,172 @@ |
|||
import threading |
|||
import socket |
|||
import socketserver |
|||
from DataStruct import * |
|||
from util.MyLogger_logging import MyLogger |
|||
from DBManager import DBManager |
|||
import time |
|||
|
|||
m_BRun = False #线程运行标识 |
|||
''' |
|||
客户端SOCKET类 |
|||
''' |
|||
class ClientSocket(): |
|||
def __init__(self,strIP,strPort): |
|||
self.strIP = strIP |
|||
self.strPort = strPort |
|||
self.isOnline = True |
|||
self.strUserID = "" # userID 可以在字典层 |
|||
|
|||
''' |
|||
服务端SOCKET--Handler类--目前验证效果是一个客户端就是一个handler |
|||
使用一些全局变量 |
|||
''' |
|||
class SSocketHandler(socketserver.BaseRequestHandler): |
|||
|
|||
#重写handle,把上级类的对象传递到每个socket |
|||
def __init__(self, request, client_address, server,sc_manager): |
|||
#自定义初始化内容 |
|||
self.sc_manager = sc_manager #把管理类的对象传递到每个socket连接 |
|||
self.db_manager = sc_manager.myDBM #数据库连接类 |
|||
self.myID = "" #socket ID |
|||
self.log = MyLogger("SSocketHandler") |
|||
super().__init__(request, client_address, server) |
|||
|
|||
def getSendHead(self,itype): |
|||
if itype ==0: |
|||
data_to_send = CSHeadMessage() |
|||
data_to_send.Flag = b"TFTF" |
|||
data_to_send.iDataType = 0 |
|||
data_to_send.iDataLen = 0 |
|||
return data_to_send |
|||
|
|||
#对接收到的数据进行分析处理 --- 数据协议还没定好 |
|||
#-1非法数据,会断开连接 |
|||
def data_analyse(self,head,buffer): |
|||
if head.iDataType == 0: #心跳包 |
|||
#回个心跳包 |
|||
senddata = self.getSendHead(0) |
|||
self.request.sendall(senddata) |
|||
elif head.iDataType == 1: #设备端登录 -- 32个字节 -- 登录失败也退出 |
|||
# 处理登录信息,buffer应该为32长度的ID值,在数据库中查询已售设备清单,存在的则上线。 初步为此机制,后期要加强安全机制 |
|||
# 目前设备和用户使用同一个字典,后期可以分开 2024-04-07 |
|||
cID = self.db_manager.checkDevID(buffer) |
|||
self.log.debug("处理登录信息:{}".format(buffer)) |
|||
if cID: |
|||
self.myID = cID |
|||
#验证通过则添加设备客户端节点 |
|||
self.sc_manager.update_client_dict(1,cID,self) |
|||
self.log.debug("设备{}登录成功".format(cID)) |
|||
elif head.iDataType == 2: #app端等 --用户名和密码 -- 登录失败也退出 |
|||
user_data = CSAPPLogin_Data.from_buffer_copy(buffer) |
|||
self.log.debug("处理APP登录信息:{}--{}".format(user_data.username,user_data.passwd)) |
|||
else: |
|||
if self.myID == "": #在接收除了1和2的数据时,若没有登录,则关闭连接 |
|||
return -1 |
|||
elif head.iDataType == 3: |
|||
pass |
|||
elif head.iDataType == 4: |
|||
pass |
|||
else: |
|||
self.log.error("数据类型错误") |
|||
return -1 |
|||
return 1 |
|||
|
|||
|
|||
def handle(self): #接受到客户端连接会触发handle -- handle已经多线程 |
|||
print("conn is :", self.request) # conn |
|||
print("addr is :", self.client_address) # addr |
|||
self.request.settimeout(10*60) #单位秒 -- 客户端需要5分钟发送一次心跳包 |
|||
while self.sc_manager.m_BRun: |
|||
try: |
|||
# 先接收数据包头 |
|||
head_data = self.request.recv(ctypes.sizeof(CSHeadMessage)) #12个字节 |
|||
if not head_data or len(head_data) != ctypes.sizeof(CSHeadMessage): |
|||
self.log.debug("包头接收不完整,或客户端断开") |
|||
break |
|||
head = CSHeadMessage.from_buffer_copy(head_data) |
|||
if head.Flag == b"TFTF": |
|||
iDLen = head.iDataLen |
|||
irecvlen= 0 |
|||
buffer = b'' |
|||
while irecvlen < iDLen: |
|||
data = self.request.recv(1024) |
|||
if not data: |
|||
self.log.debug("客户端断开") |
|||
break |
|||
irecvlen += len(data) |
|||
buffer += data |
|||
#对数据进行分析处理 |
|||
ret = self.data_analyse(head,buffer) |
|||
if ret == -1: #未登录处理其他数据或登录失败,则进行报错和关闭socket连接 |
|||
self.log.info("该连接还未登录:{}".format(head_data)) |
|||
break |
|||
else: #非法的数据头,需要关闭socket连接 |
|||
self.log.info("接收到的数据非法:{}".format(head_data)) |
|||
break |
|||
except TimeoutError: |
|||
self.log.debug("socket接收数据超时") |
|||
break |
|||
except Exception as e: |
|||
self.log.error("Socket异常:{}".format(e)) |
|||
break |
|||
#需要更新客户端列表 -- 删除socket节点 --只有登录过维护过连接的需要删除 |
|||
if(self.myID != ""): |
|||
self.sc_manager.update_client_dict(0,self.myID,self) |
|||
self.log.info("handle结束")#?handle结束后,资源是否释放需要确认 |
|||
|
|||
class SocketManager(): |
|||
def __init__(self,iPort): |
|||
self.mylog = MyLogger("SocketManager") |
|||
self.client_dict = {} #socket列表 |
|||
self.lock = threading.Lock() #互斥锁 |
|||
self.m_BRun = True |
|||
self.iPort = iPort |
|||
|
|||
def __del__(self): |
|||
self.m_BRun = False |
|||
time.sleep(3) |
|||
|
|||
#itype:0-删除socket节点,1-添加socket节点 |
|||
#设备ID和用户ID都为不重复值 |
|||
def update_client_dict(self,itype,cID,csHandle): |
|||
with self.lock: |
|||
if itype == 0: #删除节点 |
|||
self.client_dict[cID].request.close() |
|||
del self.client_dict[cID] |
|||
elif itype == 1: #添加节点,先删后加 |
|||
if cID in self.client_dict: |
|||
self.client_dict[cID].request.close() |
|||
del self.client_dict[cID] |
|||
self.client_dict[cID] = csHandle |
|||
else: |
|||
self.mylog.error("有非预设值传入!") |
|||
|
|||
def startListen(self): |
|||
print("开始socket实例化") |
|||
ip_port = ("127.0.0.1", self.iPort) |
|||
self.s = socketserver.ThreadingTCPServer(ip_port, lambda *args, **kwargs: SSocketHandler(*args, **kwargs, |
|||
sc_manager=self)) |
|||
# s = socketserver.ThreadingTCPServer(ip_port, SSocketHandler) |
|||
self.s.serve_forever() |
|||
# ?待完善项,如何停止Server_socket的运行。 |
|||
|
|||
#创建socket对象,并执行工作 |
|||
def doWork(self): |
|||
#实例化数据库连接 |
|||
self.myDBM = DBManager("ip","prot","username","passwd") |
|||
|
|||
if not self.myDBM: |
|||
self.mylog.error("建立数据库连接失败!请检查程序") |
|||
return |
|||
#开始 |
|||
thread = threading.Thread(target=self.startListen) # 如果目标函数带括号,则代表已调研,返回的目标对象是函数执行的结果。 |
|||
print("开始启动线程了") |
|||
thread.start() |
|||
# 等待线程结束 |
|||
thread.join() |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
SocketM = SocketManager(18000) |
|||
SocketM.doWork() |
@ -0,0 +1,27 @@ |
|||
|
|||
#字典更新接口 |
|||
url: http://192.168.2.61/api/ |
|||
hyMD5: http://192.168.2.61/api/defaultMd5/download |
|||
hyfile: http://192.168.2.61/api/defaultPassword/download/ |
|||
hyget: http://192.168.2.61/api/defaultPassword/export/ |
|||
#主线程数 |
|||
concurrency: 6 #同时执行的子任务数,--线程数 |
|||
#超时配置 |
|||
TagTime: 60 #任务执行超时时间 |
|||
pocTime: 30 #一次poc执行超时时间,0不进行超时判断 |
|||
nmapTime: 10 #一次nmap执行超时时间,0不进行超时判断 |
|||
#日志记录 |
|||
file_log_level: INFO #是否记录日志 |
|||
show_log_level: DEBUG #日志记录级别 |
|||
log_dir: logs |
|||
#远程数据库 |
|||
mysql: |
|||
host: 192.168.2.54 |
|||
port: 3306 |
|||
user: root |
|||
pass: crnn@cz*** |
|||
db: sfind |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,4 @@ |
|||
2024-05-25_09-59-06-INFO-main:info |
|||
2024-05-25_10:00:46-INFO-main:info |
|||
2024-05-25_10:17:32-main-INFO:info |
|||
2024-05-25_16:16:27-main-INFO:info |
@ -0,0 +1,4 @@ |
|||
2024-05-25T09:33:17.757522+0800-INFO-main:111 |
|||
2024-05-25T09:41:26.638770+0800-INFO-main:info |
|||
2024-05-25T09:44:17.514570+0800-INFO-main:info |
|||
2024-05-25T09:45:10.481132+0800-INFO-main:info |
@ -0,0 +1,13 @@ |
|||
from util.ConfigManager import myCongif |
|||
from util.MyLogger_logger import LogHandler |
|||
|
|||
from web import create_app |
|||
|
|||
app = create_app() |
|||
|
|||
if __name__ == '__main__': |
|||
# logger = LogHandler().get_logger("main") |
|||
# logger.debug("debug") |
|||
# logger.info("info") |
|||
app.run(debug=True) |
|||
|
@ -0,0 +1,204 @@ |
|||
import torch |
|||
import cv2 |
|||
import numpy as np |
|||
import torch |
|||
import os |
|||
import importlib |
|||
from model.plugins.ModelBase import ModelBase |
|||
from loguru import logger |
|||
|
|||
''' |
|||
class ModelManager_tmp(): |
|||
def __init__(self): |
|||
print("ModelInit") |
|||
|
|||
def __del__(self): |
|||
print("ModelManager DEL") |
|||
|
|||
def __preprocess_image(self,image, cfg, bgr2rgb=True): |
|||
"""图片预处理""" |
|||
img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape']) |
|||
if bgr2rgb: |
|||
img = img[:, :, ::-1] |
|||
img = img.transpose(2, 0, 1) # HWC2CHW |
|||
img = np.ascontiguousarray(img, dtype=np.float32) |
|||
return img, scale_ratio, pad_size |
|||
|
|||
def __draw_bbox(self,bbox, img0, color, wt, names): |
|||
"""在图片上画预测框""" |
|||
det_result_str = '' |
|||
for idx, class_id in enumerate(bbox[:, 5]): |
|||
if float(bbox[idx][4] < float(0.05)): |
|||
continue |
|||
img0 = cv2.rectangle(img0, (int(bbox[idx][0]), int(bbox[idx][1])), (int(bbox[idx][2]), int(bbox[idx][3])), |
|||
color, wt) |
|||
img0 = cv2.putText(img0, str(idx) + ' ' + names[int(class_id)], (int(bbox[idx][0]), int(bbox[idx][1] + 16)), |
|||
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) |
|||
img0 = cv2.putText(img0, '{:.4f}'.format(bbox[idx][4]), (int(bbox[idx][0]), int(bbox[idx][1] + 32)), |
|||
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1) |
|||
det_result_str += '{} {} {} {} {} {}\n'.format( |
|||
names[bbox[idx][5]], str(bbox[idx][4]), bbox[idx][0], bbox[idx][1], bbox[idx][2], bbox[idx][3]) |
|||
return img0 |
|||
|
|||
def __get_labels_from_txt(self,path): |
|||
"""从txt文件获取图片标签""" |
|||
labels_dict = dict() |
|||
with open(path) as f: |
|||
for cat_id, label in enumerate(f.readlines()): |
|||
labels_dict[cat_id] = label.strip() |
|||
return labels_dict |
|||
|
|||
def __draw_prediction(self,pred, image, labels): |
|||
"""在图片上画出预测框并进行可视化展示""" |
|||
imgbox = widgets.Image(format='jpg', height=720, width=1280) |
|||
img_dw = self.__draw_bbox(pred, image, (0, 255, 0), 2, labels) |
|||
imgbox.value = cv2.imencode('.jpg', img_dw)[1].tobytes() |
|||
display(imgbox) |
|||
|
|||
def __infer_image(self,img_path, model, class_names, cfg): |
|||
"""图片推理""" |
|||
# 图片载入 |
|||
image = cv2.imread(img_path) |
|||
# 数据预处理 |
|||
img, scale_ratio, pad_size = self.__preprocess_image(image, cfg) |
|||
# 模型推理 |
|||
output = model.infer([img])[0] |
|||
|
|||
output = torch.tensor(output) |
|||
# 非极大值抑制后处理 |
|||
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) |
|||
pred_all = boxout[0].numpy() |
|||
# 预测坐标转换 |
|||
scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size)) |
|||
# 图片预测结果可视化 |
|||
self.__draw_prediction(pred_all, image, class_names) |
|||
|
|||
def __infer_frame_with_vis(self,image, model, labels_dict, cfg, bgr2rgb=True): |
|||
# 数据预处理 |
|||
img, scale_ratio, pad_size = self.__preprocess_image(image, cfg, bgr2rgb) |
|||
# 模型推理 |
|||
output = model.infer([img])[0] |
|||
|
|||
output = torch.tensor(output) |
|||
# 非极大值抑制后处理 |
|||
boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"]) |
|||
pred_all = boxout[0].numpy() |
|||
# 预测坐标转换 |
|||
scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size)) |
|||
# 图片预测结果可视化 |
|||
img_vis = self.__draw_bbox(pred_all, image, (0, 255, 0), 2, labels_dict) |
|||
return img_vis |
|||
|
|||
def __img2bytes(self,image): |
|||
"""将图片转换为字节码""" |
|||
return bytes(cv2.imencode('.jpg', image)[1]) |
|||
def __infer_camera(self,model, labels_dict, cfg): |
|||
"""外设摄像头实时推理""" |
|||
|
|||
def find_camera_index(): |
|||
max_index_to_check = 10 # Maximum index to check for camera |
|||
|
|||
for index in range(max_index_to_check): |
|||
cap = cv2.VideoCapture(index) |
|||
if cap.read()[0]: |
|||
cap.release() |
|||
return index |
|||
|
|||
# If no camera is found |
|||
raise ValueError("No camera found.") |
|||
|
|||
# 获取摄像头 --这里可以换成RTSP流 |
|||
camera_index = find_camera_index() |
|||
cap = cv2.VideoCapture(camera_index) |
|||
# 初始化可视化对象 |
|||
image_widget = widgets.Image(format='jpeg', width=1280, height=720) |
|||
display(image_widget) |
|||
while True: |
|||
# 对摄像头每一帧进行推理和可视化 |
|||
_, img_frame = cap.read() |
|||
image_pred = self.__infer_frame_with_vis(img_frame, model, labels_dict, cfg) |
|||
image_widget.value = self.__img2bytes(image_pred) |
|||
|
|||
def __infer_video(self,video_path, model, labels_dict, cfg): |
|||
"""视频推理""" |
|||
image_widget = widgets.Image(format='jpeg', width=800, height=600) |
|||
display(image_widget) |
|||
|
|||
# 读入视频 |
|||
cap = cv2.VideoCapture(video_path) |
|||
while True: |
|||
ret, img_frame = cap.read() |
|||
if not ret: |
|||
break |
|||
# 对视频帧进行推理 |
|||
image_pred = self.__infer_frame_with_vis(img_frame, model, labels_dict, cfg, bgr2rgb=True) |
|||
image_widget.value = self.__img2bytes(image_pred) |
|||
|
|||
def startWork(self,infer_mode,file_paht = ""): |
|||
cfg = { |
|||
'conf_thres': 0.4, # 模型置信度阈值,阈值越低,得到的预测框越多 |
|||
'iou_thres': 0.5, # IOU阈值,高于这个阈值的重叠预测框会被过滤掉 |
|||
'input_shape': [640, 640], # 模型输入尺寸 |
|||
} |
|||
|
|||
model_path = 'yolo.om' |
|||
label_path = './coco_names.txt' |
|||
# 初始化推理模型 |
|||
model = InferSession(0, model_path) |
|||
labels_dict = self.__get_labels_from_txt(label_path) |
|||
|
|||
#执行验证 |
|||
if infer_mode == 'image': |
|||
img_path = 'world_cup.jpg' |
|||
self.__infer_image(img_path, model, labels_dict, cfg) |
|||
elif infer_mode == 'camera': |
|||
self.__infer_camera(model, labels_dict, cfg) |
|||
elif infer_mode == 'video': |
|||
video_path = 'racing.mp4' |
|||
self.__infer_video(video_path, model, labels_dict, cfg) |
|||
''' |
|||
|
|||
''' |
|||
算法实现类,实现算法执行线程,根据配内容,以线程方式执行算法模块 |
|||
''' |
|||
class ModelManager(): |
|||
def __init__(self): |
|||
print("ModelManager init") |
|||
|
|||
def __del__(self): |
|||
print("ModelManager del") |
|||
|
|||
def doWork(self): |
|||
pass |
|||
|
|||
#动态导入文件 -- 方法二 -- 相对推荐使用该方法 但spec感觉没什么用 |
|||
def import_source(spec, plgpath): |
|||
module = None |
|||
if os.path.exists(plgpath): |
|||
module_spec = importlib.util.spec_from_file_location(spec, plgpath) |
|||
module = importlib.util.module_from_spec(module_spec) |
|||
module_spec.loader.exec_module(module) |
|||
else: |
|||
logger.error("{}文件不存在".format(plgpath)) |
|||
return module |
|||
|
|||
#plgpath 为list [poc][file_name][name] |
|||
def run_plugin(plgpath, target,copy_flag=True): |
|||
module = import_source("", plgpath) |
|||
if module: |
|||
classname = "Model" |
|||
plg = getattr(module, classname)() |
|||
if not isinstance(plg, ModelBase): |
|||
raise Exception("{} not rx_Model".format(plg)) |
|||
new_plg = plg |
|||
result = new_plg.doWork("","","","") # 执行plugin基类的run, 返回结果 |
|||
return result |
|||
else: |
|||
print("模型加载失败") |
|||
return None |
|||
|
|||
def test(): |
|||
run_plugin("plugins/RYRQ_Model.py","") |
|||
|
|||
if __name__ == "__main__": |
|||
test() |
@ -0,0 +1,9 @@ |
|||
from model.plugins.ModelBase import ModelBase |
|||
|
|||
class Model(ModelBase): |
|||
def __init__(self): |
|||
super().__init__() |
|||
pass |
|||
|
|||
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True): |
|||
print("AQM_Model") |
@ -0,0 +1,17 @@ |
|||
from abc import abstractmethod |
|||
|
|||
class ModelBase(object): |
|||
def __init__(self): |
|||
pass |
|||
|
|||
def __del__(self): |
|||
pass |
|||
|
|||
''' |
|||
模型处理的标准接口 |
|||
1.输入标准化 |
|||
2.输出标准化 |
|||
''' |
|||
@abstractmethod |
|||
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True): |
|||
pass |
@ -0,0 +1,5 @@ |
|||
from model.plugins.ModelBase import ModelBase |
|||
|
|||
class Model(ModelBase): |
|||
def doWork(self,image,mode,class_name,cfg,isdraw_box=False,bgr2rgb=True): |
|||
print("RYRQ_Model") |
@ -0,0 +1,54 @@ |
|||
#!/usr/bin/env python |
|||
# -*- coding:utf-8 -*- |
|||
__author__ = 'ZL' |
|||
|
|||
import yaml,os |
|||
|
|||
class ConfigManager(): |
|||
def __init__(self,congif_path='config.yaml'): |
|||
self.ok = False |
|||
if os.path.exists(congif_path): |
|||
self.file_path = congif_path |
|||
self.data = self.read_yaml() |
|||
self.ok = True |
|||
else: |
|||
congif_path = "../" + congif_path |
|||
if os.path.exists(congif_path): |
|||
self.file_path = congif_path |
|||
self.data = self.read_yaml() |
|||
self.ok = True |
|||
else: |
|||
raise Exception('没有找到%s文件路径'%congif_path) |
|||
print("ConfigManager实例化") |
|||
|
|||
def __del__(self): |
|||
print("ConfigManager销毁") |
|||
|
|||
#已调整方案--配置文件的初始化工作放到构造函数中处理。 |
|||
def my_init(self,file_path): |
|||
if os.path.exists(file_path): |
|||
self.file_path = file_path |
|||
self.data = self.read_yaml() |
|||
self.ok = True |
|||
else: |
|||
raise Exception('没有找到%s文件路径'%file_path) |
|||
|
|||
def read_yaml(self): |
|||
with open(self.file_path,'r',encoding='utf_8') as f: |
|||
p = f.read() |
|||
return p |
|||
|
|||
def get_data(self,pwd=None): |
|||
if self.ok: |
|||
result = yaml.load(self.data,Loader=yaml.FullLoader) |
|||
if pwd == None: |
|||
return result |
|||
else: |
|||
return result.get(pwd) |
|||
|
|||
#这种方法实现的单例优点是简单,但不能动态创建实例,程序加载时就已实例化。 |
|||
myCongif = ConfigManager() |
|||
|
|||
if __name__ == '__main__': |
|||
r = myCongif.get_data('url') |
|||
print(r) |
@ -0,0 +1,73 @@ |
|||
from loguru import logger |
|||
import os |
|||
from functools import wraps |
|||
from util.ConfigManager import myCongif |
|||
|
|||
''' |
|||
@logger.catch() 异常捕获注解 |
|||
---- |
|||
TRACE 5 |
|||
DEBUG 10 |
|||
INFO 20 |
|||
SUCCESS 25 |
|||
WARNING 30 |
|||
ERROR 40 |
|||
CRITICAL 50 |
|||
---- |
|||
''' |
|||
#singleton--使用装饰器来保障单一实例的好处是能够动态加载,但线程不安全 |
|||
def singleton(cls): |
|||
instances = {} |
|||
@wraps(cls) |
|||
def get_instance(*args, **kwargs): |
|||
if cls not in instances: |
|||
instances[cls] = cls(*args, **kwargs) |
|||
return instances[cls] |
|||
return get_instance |
|||
|
|||
@singleton |
|||
class LogHandler(): |
|||
def __init__(self, log_dir=myCongif.get_data('log_dir')): |
|||
# 确保日志目录存在 |
|||
if not os.path.exists(log_dir): |
|||
os.makedirs(log_dir) |
|||
# 清除所有以前的处理器 |
|||
logger.remove() |
|||
# 配置控制台输出 |
|||
logger.add(lambda msg: print(msg, end=""), |
|||
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}", |
|||
level=myCongif.get_data('show_log_level')) |
|||
# 配置文件输出 |
|||
logger.add("logs/{time:YYYY-MM-DD}.log", rotation="00:00", retention="90 days", |
|||
format="{time:YYYY-MM-DD_HH:mm:ss}-{extra[caller]}-{level}:{message}", |
|||
level=myCongif.get_data('file_log_level')) |
|||
|
|||
def get_logger(self, caller): |
|||
# 返回一个带有调用者信息的logger |
|||
return logger.bind(caller=caller) |
|||
|
|||
# 示例类A |
|||
class ClassA: |
|||
def __init__(self): |
|||
self.logger = LogHandler().get_logger("ClassA") |
|||
|
|||
def do_something(self): |
|||
self.logger.warning("ClassA is doing something.") |
|||
|
|||
|
|||
# 示例类B |
|||
class ClassB: |
|||
def __init__(self): |
|||
self.logger = LogHandler().get_logger("ClassB") |
|||
|
|||
def do_something(self): |
|||
self.logger.error("ClassB is doing something.") |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
a = ClassA() |
|||
b = ClassB() |
|||
r = myCongif.get_data('url') |
|||
print(r) |
|||
a.do_something() |
|||
b.do_something() |
@ -0,0 +1,42 @@ |
|||
import logging |
|||
''' |
|||
日志记录方案暂时使用logger来实现--2024-5-25-zl |
|||
''' |
|||
class MyLogger: |
|||
_loggers = {} |
|||
|
|||
def __new__(cls, name='my_logger', level=logging.DEBUG): |
|||
if name not in cls._loggers: |
|||
cls._loggers[name] = super().__new__(cls) |
|||
return cls._loggers[name] |
|||
|
|||
def __init__(self, name='my_logger', level=logging.DEBUG): #logging.INFO |
|||
if not hasattr(self,'logger'): |
|||
self.logger = logging.getLogger(name) |
|||
self.logger.setLevel(level) |
|||
# 创建一个handler,用于写入日志文件 |
|||
file_handler = logging.FileHandler('../log/my_app.log') |
|||
file_handler.setLevel(logging.info) |
|||
|
|||
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') |
|||
console_handler = logging.StreamHandler() |
|||
console_handler.setFormatter(formatter) |
|||
self.logger.addHandler(console_handler) |
|||
|
|||
def info(self, message): |
|||
self.logger.info(message) |
|||
|
|||
def error(self, message): |
|||
self.logger.error(message) |
|||
|
|||
def warning(self, message): |
|||
self.logger.warning(message) |
|||
|
|||
def debug(self, message): |
|||
self.logger.debug(message) |
|||
|
|||
# 使用示例 |
|||
if __name__ == "__main__": |
|||
logger = MyLogger() |
|||
logger.info("This is an info message") |
|||
logger.error("This is an error message") |
@ -0,0 +1,2 @@ |
|||
2024-05-25_10:00:34-WARNING-ClassA:ClassA is doing something. |
|||
2024-05-25_10:00:34-ERROR-ClassB:ClassB is doing something. |
@ -0,0 +1,16 @@ |
|||
2024-05-24T17:33:38.578964+0800 INFO ClassA is doing something. ClassA |
|||
2024-05-24T17:33:38.578964+0800 INFO ClassB is doing something. ClassB |
|||
2024-05-24T17:46:27.219835+0800 INFO ClassA is doing something. ClassA |
|||
2024-05-24T17:46:27.220833+0800 INFO ClassB is doing something. ClassB |
|||
2024-05-24T17:47:54.316369+0800 WARNING ClassA is doing something. ClassA |
|||
2024-05-24T17:47:54.316369+0800 ERROR ClassB is doing something. ClassB |
|||
2024-05-24T18:09:02.525386+0800 WARNING ClassA is doing something. ClassA |
|||
2024-05-24T18:09:02.525386+0800 ERROR ClassB is doing something. ClassB |
|||
2024-05-24T18:10:02.546333+0800-WARNING-ClassA:ClassA is doing something. |
|||
2024-05-24T18:10:02.547467+0800-ERROR-ClassB:ClassB is doing something. |
|||
2024-05-25T09:13:06.400538+0800-WARNING-ClassA:ClassA is doing something. |
|||
2024-05-25T09:13:06.400538+0800-ERROR-ClassB:ClassB is doing something. |
|||
2024-05-25T09:27:15.187474+0800-WARNING-ClassA:ClassA is doing something. |
|||
2024-05-25T09:27:15.187474+0800-ERROR-ClassB:ClassB is doing something. |
|||
2024-05-25T09:33:41.352180+0800-WARNING-ClassA:ClassA is doing something. |
|||
2024-05-25T09:33:41.353189+0800-ERROR-ClassB:ClassB is doing something. |
@ -0,0 +1,213 @@ |
|||
import os |
|||
import sqlite3 |
|||
import cv2 |
|||
import asyncio |
|||
import av |
|||
from aiohttp import web |
|||
from quart import Quart, render_template, request, jsonify,send_from_directory |
|||
from aiortc import RTCPeerConnection, RTCSessionDescription, VideoStreamTrack, RTCConfiguration, RTCIceServer |
|||
from fractions import Fraction |
|||
from .main import main as main_blueprint |
|||
|
|||
#app.config['SECRET_KEY'] = 'mysecret' #密钥 --需要放配置文件 |
|||
#socketio = SocketIO(app) |
|||
|
|||
''' |
|||
************************ |
|||
功能函数 |
|||
''' |
|||
rtsp_url = 'rtsp://127.0.0.1/live1' |
|||
#-------------------基于WEBRTC实现拉流 |
|||
pcs = set() #创建一个空的集合,去重复且无序 |
|||
|
|||
def create_app(): |
|||
app = Quart(__name__) |
|||
# 注册蓝图 |
|||
app.register_blueprint(main_blueprint) |
|||
return app |
|||
|
|||
class VideoTransformTrack(VideoStreamTrack): |
|||
kind = "video" |
|||
|
|||
def __init__(self): |
|||
super().__init__() |
|||
self.cap = cv2.VideoCapture('rtsp://127.0.0.1/live1') |
|||
if not self.cap.isOpened(): |
|||
raise Exception("Unable to open video source") |
|||
# Set desired resolution and frame rate |
|||
# self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) # Set width to 1280 |
|||
# self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) # Set height to 720 |
|||
# self.cap.set(cv2.CAP_PROP_FPS, 30) # Set frame rate to 30 FPS |
|||
self.frame_rate = int(self.cap.get(cv2.CAP_PROP_FPS)) or 30 # Default to 30 if unable to get FPS |
|||
self.time_base = Fraction(1, self.frame_rate) |
|||
|
|||
async def recv(self): |
|||
ret, frame = self.cap.read() |
|||
if not ret: |
|||
raise Exception("Unable to read frame") |
|||
# Convert frame to RGB |
|||
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) |
|||
# Convert to VideoFrame |
|||
video_frame = av.VideoFrame.from_ndarray(frame_rgb, format="rgb24") |
|||
# Set timestamp |
|||
video_frame.pts = int(self.cap.get(cv2.CAP_PROP_POS_FRAMES)) |
|||
video_frame.time_base = self.time_base |
|||
return video_frame |
|||
|
|||
''' |
|||
************************ |
|||
页面路由 |
|||
''' |
|||
@app.route('/') |
|||
async def index(): |
|||
#return await render_template('登录.html') |
|||
return await render_template('登录.html') |
|||
|
|||
@app.route('/favicon.ico') |
|||
async def favicon(): |
|||
return await send_from_directory('static', 'favicon.ico') |
|||
|
|||
@app.route('/<html>') |
|||
async def get_html(html): |
|||
return await render_template(html) |
|||
|
|||
#--------------------webrtc----------------- |
|||
async def server(pc, offer): |
|||
# 监听 RTC 连接状态 |
|||
@pc.on("connectionstatechange") |
|||
async def on_connectionstatechange(): |
|||
print("Connection state is %s" % pc.connectionState) |
|||
# 当 RTC 连接中断后将连接关闭 |
|||
if pc.connectionState == "failed": |
|||
await pc.close() |
|||
pcs.discard(pc) |
|||
|
|||
# 监听客户端发来的视频流 |
|||
@pc.on("track") |
|||
def on_track(track): |
|||
print("======= received track: ", track) |
|||
if track.kind == "video": |
|||
# # 对视频流进行人脸替换 |
|||
# t = FaceSwapper(track) |
|||
# 绑定替换后的视频流 |
|||
pc.addTrack(track) |
|||
|
|||
# 记录客户端 SDP |
|||
await pc.setRemoteDescription(offer) |
|||
# 生成本地 SDP |
|||
answer = await pc.createAnswer() |
|||
# 记录本地 SDP |
|||
await pc.setLocalDescription(answer) |
|||
|
|||
|
|||
@app.route('/offer', methods=['POST']) |
|||
async def offer(): |
|||
#接收客户端的连接请求 |
|||
params = await request.json |
|||
#params = await request.json() |
|||
print(params) |
|||
#提取客户端发来的SDP,生成服务器端的SDP |
|||
offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"]) |
|||
# Configure ICE servers if necessary |
|||
#config = RTCConfiguration([RTCIceServer(urls=['stun:stun.voiparound.com'])]) |
|||
pc = RTCPeerConnection() #实例化一个rtcp对象 |
|||
pcs.add(pc) #集合中添加一个对象,若已存在则不添加 |
|||
print(pc) |
|||
@pc.on("datachannel") |
|||
def on_datachannel(channel): |
|||
@channel.on("message") |
|||
def on_message(message): |
|||
if isinstance(message, str) and message.startswith("ping"): |
|||
channel.send("pong" + message[4:]) |
|||
|
|||
#监听RTC连接状态 |
|||
@pc.on("iconnectionstatechange") #当ice连接状态发生变化时 |
|||
async def iconnectionstatechange(): |
|||
if pc.iceConnectionState == "failed": |
|||
await pc.close() |
|||
pcs.discard(pc) #移除对象 |
|||
|
|||
# 添加视频轨道 |
|||
video_track = VideoTransformTrack() |
|||
pc.addTrack(video_track) |
|||
print("完成视频轨道的添加") |
|||
# 记录客户端 SDP |
|||
await pc.setRemoteDescription(offer) |
|||
# 生成本地 SDP |
|||
answer = await pc.createAnswer() |
|||
# 记录本地 SDP |
|||
await pc.setLocalDescription(answer) |
|||
|
|||
return jsonify({ |
|||
"sdp": pc.localDescription.sdp, |
|||
"type": pc.localDescription.type |
|||
}) |
|||
|
|||
@app.route('/shutdown', methods=['POST']) |
|||
async def shutdown(): |
|||
coros = [pc.close() for pc in pcs] |
|||
await asyncio.gather(*coros) |
|||
pcs.clear() |
|||
return 'Server shutting down...' |
|||
|
|||
'''3333 |
|||
各种配置文件路由 |
|||
''' |
|||
@app.route('/data/<file>') |
|||
async def data(file): |
|||
return await send_from_directory('static/data',file) |
|||
|
|||
@app.route('/files/<path:subdir>/<file>') |
|||
async def files(subdir,file): |
|||
return await send_from_directory(os.path.join('static/files', subdir),file) |
|||
|
|||
@app.route('/images/<path:subdir>/<file>') |
|||
async def images(subdir,file): |
|||
return await send_from_directory(os.path.join('static/images', subdir),file) |
|||
|
|||
@app.route('/resources/<file>') |
|||
async def resources(file): |
|||
return await send_from_directory('static/resources',file) |
|||
|
|||
@app.route('/resources/<path:subdir>/<file>') |
|||
async def resources_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('static/resources', subdir),file) |
|||
|
|||
@app.route('/resources/css/<path:subdir>/<file>') |
|||
async def resources_css_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('static/resources/css', subdir),file) |
|||
|
|||
@app.route('/resources/scripts/<path:subdir>/<file>') |
|||
async def resources_scripts_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('static/resources/scripts', subdir),file) |
|||
|
|||
''' |
|||
后端数据接口 |
|||
''' |
|||
@app.route('/submit', methods=['POST']) |
|||
def submit(): |
|||
if request.method == 'POST': |
|||
suggestion = request.form['suggestion'] |
|||
file = request.files['attachment'] |
|||
|
|||
if file: |
|||
filename = file.filename |
|||
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) |
|||
|
|||
# 将意见和附件的文件名保存到数据库 |
|||
conn = sqlite3.connect(DB_NAME) |
|||
cursor = conn.cursor() |
|||
cursor.execute('INSERT INTO suggestions (suggestion, attachment_filename) VALUES (?, ?)', |
|||
(suggestion, filename)) |
|||
conn.commit() |
|||
conn.close() |
|||
|
|||
return "Thanks for your suggestion and attachment! Data saved to the database." |
|||
|
|||
|
|||
# 如果没有附件上传的逻辑处理 |
|||
return "Data saved!" |
|||
|
|||
if __name__ == '__main__': |
|||
#app.run(debug=True) |
|||
app.run(debug=True, host='0.0.0.0', port=5000) |
@ -0,0 +1,5 @@ |
|||
from quart import Blueprint |
|||
|
|||
main = Blueprint('main', __name__) |
|||
|
|||
from . import routes |
@ -0,0 +1,10 @@ |
|||
from quart import render_template |
|||
from . import main |
|||
|
|||
@main.route('/') |
|||
async def index(): |
|||
return await render_template('index.html') |
|||
|
|||
@main.route('/about') |
|||
async def about(): |
|||
return await render_template('about.html') |
@ -0,0 +1,7 @@ |
|||
$axure.loadDocument( |
|||
(function() { |
|||
var _ = function() { var r={},a=arguments; for(var i=0; i<a.length; i+=2) r[a[i]]=a[i+1]; return r; } |
|||
var _creator = function() { return _(b,_(c,d,e,f,g,d,h,d,i,d,j,k,l,d,m,f,n,f,o,d,p,f),q,_(r,[_(s,t,u,v,w,x,y,z),_(s,A,u,B,w,x,y,C),_(s,D,u,E,w,x,y,F),_(s,G,u,H,w,x,y,I),_(s,J,u,K,w,x,y,L),_(s,M,u,N,w,x,y,O)]),P,[Q,R,S],T,[U,V,W],X,_(Y,Z),ba,_(bb,_(s,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,_(bm,bn,bo,bp,bq,br),bs,bt,bu,f,bv,bw,bx,bi,by,bi,bz,bA,bB,f,bC,_(bD,bE,bF,bE),bG,_(bH,bE,bI,bE),bJ,d,bK,f,bL,bc,bM,_(bm,bn,bo,bN),bO,_(bm,bn,bo,bP),bQ,bR,bS,bn,bq,bR,bT,bU,bV,bW,bX,bY,bZ,ca,cb,ca,cc,ca,cd,ca,ce,_(),cf,null,cg,null,ch,bU,ci,_(cj,f,ck,cl,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cv,_(cj,f,ck,bE,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cw,_(cj,f,ck,br,cm,br,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cx)),cy,cz),cA,_(cB,_(s,cC),cD,_(s,cE),cf,_(s,cF,bQ,bU),cG,_(s,cH,bT,bk),cI,_(s,cJ,bl,_(bm,bn,bo,bN,bq,br),bQ,bU,bT,bk,bM,_(bm,bn,bo,cK)),cL,_(s,cM,bs,cN,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cS,_(s,cT,bs,cU,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cV,_(s,cW,bs,cX,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cY,_(s,cZ,bs,da,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),db,_(s,dc,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dd,_(s,de,bs,df,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dg,_(s,dh,bs,da,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),di,_(s,dj,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dk,_(s,dl,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,bY),dn,_(s,dp,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),dq,_(s,dr,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),ds,_(s,dt,bv,cQ,bX,cR),du,_(s,dv,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,bY),dw,_(s,dx),dy,_(s,dz,bM,_(bm,bn,bo,cP)),dA,_(s,dB,bl,_(bm,bn,bo,dC,bq,br)),dD,_(s,dE,bM,_(bm,bn,bo,dF)),dG,_(s,dH,bM,_(bm,bn,bo,bN)),dI,_(s,dJ,bQ,bU,bM,_(bm,bn,bo,bp)),dK,_(s,dL)),dM,_(dN,cE,dO,cW,dP,dh)));}; |
|||
var b="configuration",c="showPageNotes",d=true,e="showPageNoteNames",f=false,g="showAnnotations",h="showAnnotationsSidebar",i="showConsole",j="linkStyle",k="displayMultipleTargetsOnly",l="linkFlowsToPages",m="linkFlowsToPagesNewWindow",n="useLabels",o="useViews",p="loadFeedbackPlugin",q="sitemap",r="rootNodes",s="id",t="f8hzm0",u="pageName",v="登录",w="type",x="Wireframe",y="url",z="登录.html",A="tm5q63",B="实时预览",C="实时预览.html",D="20xynf",E="通道管理",F="通道管理.html",G="ey1jts",H="算法管理",I="算法管理.html",J="idexti",K="系统管理",L="系统管理.html",M="su6kdn",N="用户管理",O="用户管理.html",P="additionalJs",Q="plugins/sitemap/sitemap.js",R="plugins/page_notes/page_notes.js",S="plugins/debug/debug.js",T="additionalCss",U="plugins/sitemap/styles/sitemap.css",V="plugins/page_notes/styles/page_notes.css",W="plugins/debug/styles/debug.css",X="globalVariables",Y="onloadvariable",Z="",ba="stylesheet",bb="defaultStyle",bc="627587b6038d43cca051c114ac41ad32",bd="fontName",be="'Arial Normal', 'Arial', sans-serif",bf="fontWeight",bg="400",bh="fontStyle",bi="normal",bj="fontStretch",bk="5",bl="foreGroundFill",bm="fillType",bn="solid",bo="color",bp=0xFF333333,bq="opacity",br=1,bs="fontSize",bt="13px",bu="underline",bv="horizontalAlignment",bw="center",bx="lineSpacing",by="characterSpacing",bz="letterCase",bA="none",bB="strikethrough",bC="location",bD="x",bE=0,bF="y",bG="size",bH="width",bI="height",bJ="visible",bK="limbo",bL="baseStyle",bM="fill",bN=0xFFFFFFFF,bO="borderFill",bP=0xFF797979,bQ="borderWidth",bR="1",bS="linePattern",bT="cornerRadius",bU="0",bV="borderVisibility",bW="all",bX="verticalAlignment",bY="middle",bZ="paddingLeft",ca="2",cb="paddingTop",cc="paddingRight",cd="paddingBottom",ce="stateStyles",cf="image",cg="imageFilter",ch="rotation",ci="outerShadow",cj="on",ck="offsetX",cl=5,cm="offsetY",cn="blurRadius",co="spread",cp="r",cq=0,cr="g",cs="b",ct="a",cu=0.349019607843137,cv="innerShadow",cw="textShadow",cx=0.647058823529412,cy="viewOverride",cz="19e82109f102476f933582835c373474",cA="customStyles",cB="box_1",cC="4b7bfc596114427989e10bb0b557d0ce",cD="shape",cE="40519e9ec4264601bfb12c514e4f4867",cF="75a91ee5b9d042cfa01b8d565fe289c0",cG="button",cH="c9f35713a1cf4e91a0f2dbac65e6fb5c",cI="primary_button",cJ="cd64754845384de3872fb4a066432c1f",cK=0xFF169BD5,cL="heading_1",cM="1111111151944dfba49f67fd55eb1f88",cN="32px",cO="bold",cP=0xFFFFFF,cQ="left",cR="top",cS="heading_2",cT="b3a15c9ddde04520be40f94c8168891e",cU="24px",cV="heading_3",cW="8c7a4c5ad69a4369a5f7788171ac0b32",cX="18px",cY="heading_4",cZ="e995c891077945c89c0b5fe110d15a0b",da="14px",db="heading_5",dc="386b19ef4be143bd9b6c392ded969f89",dd="heading_6",de="fc3b9a13b5574fa098ef0a1db9aac861",df="10px",dg="label",dh="2285372321d148ec80932747449c36c9",di="paragraph",dj="4988d43d80b44008a4a415096f1632af",dk="text_field",dl="44157808f2934100b68f2394a66b2bba",dm=0xFF000000,dn="droplist",dp="85f724022aae41c594175ddac9c289eb",dq="list_box",dr="d5a74867db1f49ceb7c59e94129aa67a",ds="radio_button",dt="4eb5516f311c4bdfa0cb11d7ea75084e",du="tree_node",dv="93a4c3353b6f4562af635b7116d6bf94",dw="table_cell",dx="33ea2511485c479dbf973af3302f2352",dy="menu_item",dz="2036b2baccbc41f0b9263a6981a11a42",dA="form_hint",dB="4889d666e8ad4c5e81e59863039a5cc0",dC=0xFF999999,dD="form_disabled",dE="9bd0236217a94d89b0314c8c7fc75f16",dF=0xFFF0F0F0,dG="flow_shape",dH="caddf88798f04a469d3bb16589ed2a5d",dI="icon",dJ="26c731cb771b44a88eb8b6e97e78c80e",dK="ellipse",dL="78a26aa073ac4ed2b3c192ce4be8b862",dM="duplicateStyles",dN="55037c00beca4ab981fb8ff744aa5f75",dO="aa017f6a23d447e8a77c4c2eea3d335c",dP="4eea517f5eec41269a0db429802a7adf"; |
|||
return _creator(); |
|||
})()); |
@ -0,0 +1,105 @@ |
|||
.ax_default { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#333333; |
|||
vertical-align:none; |
|||
text-align:center; |
|||
line-height:normal; |
|||
text-transform:none; |
|||
} |
|||
.box_1 { |
|||
} |
|||
.shape { |
|||
} |
|||
.image { |
|||
} |
|||
.button { |
|||
} |
|||
.primary_button { |
|||
color:#FFFFFF; |
|||
} |
|||
.heading_1 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:32px; |
|||
text-align:left; |
|||
} |
|||
.heading_2 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:24px; |
|||
text-align:left; |
|||
} |
|||
.heading_3 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:18px; |
|||
text-align:left; |
|||
} |
|||
.heading_4 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:14px; |
|||
text-align:left; |
|||
} |
|||
.heading_5 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
text-align:left; |
|||
} |
|||
.heading_6 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:10px; |
|||
text-align:left; |
|||
} |
|||
.label { |
|||
font-size:14px; |
|||
text-align:left; |
|||
} |
|||
.paragraph { |
|||
text-align:left; |
|||
} |
|||
.text_field { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.droplist { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.list_box { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.radio_button { |
|||
text-align:left; |
|||
} |
|||
.tree_node { |
|||
text-align:left; |
|||
} |
|||
.table_cell { |
|||
} |
|||
.menu_item { |
|||
} |
|||
.form_hint { |
|||
color:#999999; |
|||
} |
|||
.form_disabled { |
|||
} |
|||
.flow_shape { |
|||
} |
|||
.icon { |
|||
} |
|||
.ellipse { |
|||
} |
|||
textarea, select, input, button { outline: none; } |
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,7 @@ |
|||
$axure.loadCurrentPage( |
|||
(function() { |
|||
var _ = function() { var r={},a=arguments; for(var i=0; i<a.length; i+=2) r[a[i]]=a[i+1]; return r; } |
|||
var _creator = function() { return _(b,c,d,e,f,_(g,h,i,_(j,k,l,k)),m,[],n,_(h,o),p,[q],r,_(s,t,u,v,g,w,x,_(),y,[],z,_(A,B,C,D,E,_(F,G,H,I),J,null,K,L,L,M,N,O,null,P,Q,R,S,T,U,V,Q,W,X,Y,_(F,G,H,Z),ba,Q,bb,X,bc,_(bd,be,bf,bg,bh,bg,bi,bg,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,bp)),i,_(j,k,l,k)),bq,_(),br,_(),bs,_(bt,[_(bu,bv,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,bD,l,bE),A,bF),bq,_(),bG,_(),bH,be),_(bu,bI,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,bD,l,bJ),A,bF,E,_(F,G,H,bK),Y,_(F,G,H,bL)),bq,_(),bG,_(),bH,be),_(bu,bM,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,bP,l,bQ),A,bR,bS,_(bT,bU,bV,bW),bX,bY),bq,_(),bG,_(),bH,be),_(bu,bZ,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,ca,l,cb),A,cc,bS,_(bT,cd,bV,ce)),bq,_(),bG,_(),bH,be),_(bu,cf,bw,h,bx,cg,u,bz,bA,bz,bB,bC,z,_(A,ch,V,Q,i,_(j,ci,l,cj),E,_(F,G,H,ck),Y,_(F,G,H,cl),bc,_(bd,be,bf,k,bh,k,bi,cm,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,cn)),co,_(bd,be,bf,k,bh,k,bi,cm,bj,k,H,_(bk,bl,bm,bl,bn,bl,bo,cn)),bS,_(bT,cp,bV,cq)),bq,_(),bG,_(),cr,_(cs,ct),bH,be),_(bu,cu,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cv,l,cq),A,cw,bS,_(bT,cx,bV,cy)),bq,_(),bG,_(),bH,be),_(bu,cz,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cC,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cL)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cO,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cP,l,cq),A,cw,bS,_(bT,cQ,bV,cR)),bq,_(),bG,_(),bH,be),_(bu,cS,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cC,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cT)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cU,bw,h,bx,cA,u,cB,bA,cB,bB,bC,z,_(i,_(j,cV,l,cD),cE,_(cF,_(A,cG),cH,_(A,cI)),A,cJ,bS,_(bT,cK,bV,cW)),cM,be,bq,_(),bG,_(),cN,h),_(bu,cX,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(bN,bO,i,_(j,cv,l,cq),A,cw,bS,_(bT,cx,bV,cY)),bq,_(),bG,_(),bH,be),_(bu,cZ,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,da,l,cj),A,db,bS,_(bT,cx,bV,dc),bX,dd),bq,_(),bG,_(),br,_(de,_(df,dg,dh,di,dj,[_(dh,h,dk,h,dl,be,dm,dn,dp,[_(dq,dr,dh,ds,dt,du,dv,_(dw,_(h,ds)),dx,_(dy,r,b,dz,dA,bC),dB,dC)])])),dD,bC,bH,be),_(bu,dE,bw,h,bx,dF,u,dG,bA,dG,bB,bC,z,_(i,_(j,da,l,dH),A,dI,J,null,bS,_(bT,dJ,bV,dK)),bq,_(),bG,_(),cr,_(cs,dL)),_(bu,dM,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(i,_(j,da,l,cj),A,dN,bS,_(bT,dJ,bV,dc),bX,dd),bq,_(),bG,_(),bH,be),_(bu,dO,bw,h,bx,by,u,bz,bA,bz,bB,bC,z,_(dP,_(F,G,H,dQ,dR,dS),i,_(j,dT,l,dU),A,dV,bS,_(bT,dW,bV,dX)),bq,_(),bG,_(),bH,be)])),dY,_(),dZ,_(ea,_(eb,ec),ed,_(eb,ee),ef,_(eb,eg),eh,_(eb,ei),ej,_(eb,ek),el,_(eb,em),en,_(eb,eo),ep,_(eb,eq),er,_(eb,es),et,_(eb,eu),ev,_(eb,ew),ex,_(eb,ey),ez,_(eb,eA),eB,_(eb,eC),eD,_(eb,eE)));}; |
|||
var b="url",c="登录.html",d="generationDate",e=new Date(1716520879185.01),f="defaultAdaptiveView",g="name",h="",i="size",j="width",k=0,l="height",m="adaptiveViews",n="sketchKeys",o="s0",p="variables",q="OnLoadVariable",r="page",s="packageId",t="7ecba5060add4e8c88625127aa952ee2",u="type",v="Axure:Page",w="登录",x="notes",y="annotations",z="style",A="baseStyle",B="627587b6038d43cca051c114ac41ad32",C="pageAlignment",D="center",E="fill",F="fillType",G="solid",H="color",I=0xFFFFFFFF,J="image",K="imageAlignment",L="near",M="imageRepeat",N="auto",O="favicon",P="sketchFactor",Q="0",R="colorStyle",S="appliedColor",T="fontName",U="Applied Font",V="borderWidth",W="borderVisibility",X="all",Y="borderFill",Z=0xFF797979,ba="cornerRadius",bb="cornerVisibility",bc="outerShadow",bd="on",be=false,bf="offsetX",bg=5,bh="offsetY",bi="blurRadius",bj="spread",bk="r",bl=0,bm="g",bn="b",bo="a",bp=0.349019607843137,bq="adaptiveStyles",br="interactionMap",bs="diagram",bt="objects",bu="id",bv="c5bc1d2efee44f68879fd659e38e9747",bw="label",bx="friendlyType",by="Rectangle",bz="vectorShape",bA="styleType",bB="visible",bC=true,bD=1280,bE=800,bF="caddf88798f04a469d3bb16589ed2a5d",bG="imageOverrides",bH="generateCompound",bI="2c24030b551d41378f944055f4a44c64",bJ=90,bK=0xFF02A7F0,bL=0xFF81D3F8,bM="fad482ab9b5c46c1952d5aad4ea0a508",bN="fontWeight",bO="700",bP=254,bQ=45,bR="1111111151944dfba49f67fd55eb1f88",bS="location",bT="x",bU=61,bV="y",bW=23,bX="fontSize",bY="40px",bZ="bb91b2fe6e994c93abaa1907c4f474e4",ca=289,cb=21,cc="8c7a4c5ad69a4369a5f7788171ac0b32",cd=496,ce=750,cf="fd8428de1c954a7fb54cb8b737fa8cb8",cg="Shape",ch="26c731cb771b44a88eb8b6e97e78c80e",ci=35,cj=40,ck=0xFF000000,cl=0xFFFFFF,cm=10,cn=0.313725490196078,co="innerShadow",cp=1165,cq=28,cr="images",cs="normal~",ct="images/登录/u4.svg",cu="81dff38c4abb4c299d032505ce1bd3b8",cv=96,cw="b3a15c9ddde04520be40f94c8168891e",cx=427,cy=265,cz="214f4eb955814b23864a6056e1b34ac4",cA="Text Field",cB="textBox",cC=300,cD=25,cE="stateStyles",cF="hint",cG="4889d666e8ad4c5e81e59863039a5cc0",cH="disabled",cI="9bd0236217a94d89b0314c8c7fc75f16",cJ="44157808f2934100b68f2394a66b2bba",cK=553,cL=266,cM="HideHintOnFocused",cN="placeholderText",cO="c1e2c2c547d34189a097fc5a573d1e84",cP=72,cQ=451,cR=343,cS="79ffc447be8549799643c1ef0b212546",cT=345,cU="ddb9300483dd4254bdfbb4ca5ff5723c",cV=136,cW=423,cX="c309227fa1ce48a0b2b15877b05adacb",cY=421,cZ="c17788f3902d49daa20fbbe38be1daa4",da=140,db="cd64754845384de3872fb4a066432c1f",dc=521,dd="18px",de="onClick",df="eventType",dg="OnClick",dh="description",di="Click or Tap",dj="cases",dk="conditionString",dl="isNewIfGroup",dm="caseColorHex",dn="AB68FF",dp="actions",dq="action",dr="linkWindow",ds="Open 实时预览 in Current Window",dt="displayName",du="Open Link",dv="actionInfoDescriptions",dw="实时预览",dx="target",dy="targetType",dz="实时预览.html",dA="includeVariables",dB="linkType",dC="current",dD="tabbable",dE="476ed508a0e641c3821a489ba050926d",dF="Image",dG="imageBox",dH=47,dI="75a91ee5b9d042cfa01b8d565fe289c0",dJ=713,dK=412,dL="images/登录/u12.png",dM="24c27214a4004ee3becff6c24ff7cfe3",dN="c9f35713a1cf4e91a0f2dbac65e6fb5c",dO="70009ea6695547be8b66debf61616908",dP="foreGroundFill",dQ=0xFFD9001B,dR="opacity",dS=1,dT=196,dU=16,dV="2285372321d148ec80932747449c36c9",dW=657,dX=581,dY="masters",dZ="objectPaths",ea="c5bc1d2efee44f68879fd659e38e9747",eb="scriptId",ec="u0",ed="2c24030b551d41378f944055f4a44c64",ee="u1",ef="fad482ab9b5c46c1952d5aad4ea0a508",eg="u2",eh="bb91b2fe6e994c93abaa1907c4f474e4",ei="u3",ej="fd8428de1c954a7fb54cb8b737fa8cb8",ek="u4",el="81dff38c4abb4c299d032505ce1bd3b8",em="u5",en="214f4eb955814b23864a6056e1b34ac4",eo="u6",ep="c1e2c2c547d34189a097fc5a573d1e84",eq="u7",er="79ffc447be8549799643c1ef0b212546",es="u8",et="ddb9300483dd4254bdfbb4ca5ff5723c",eu="u9",ev="c309227fa1ce48a0b2b15877b05adacb",ew="u10",ex="c17788f3902d49daa20fbbe38be1daa4",ey="u11",ez="476ed508a0e641c3821a489ba050926d",eA="u12",eB="24c27214a4004ee3becff6c24ff7cfe3",eC="u13",eD="70009ea6695547be8b66debf61616908",eE="u14"; |
|||
return _creator(); |
|||
})()); |
@ -0,0 +1,763 @@ |
|||
body { |
|||
margin:0px; |
|||
background-image:none; |
|||
position:relative; |
|||
left:0px; |
|||
width:1280px; |
|||
margin-left:auto; |
|||
margin-right:auto; |
|||
text-align:left; |
|||
} |
|||
.form_sketch { |
|||
border-color:transparent; |
|||
background-color:transparent; |
|||
} |
|||
#base { |
|||
position:absolute; |
|||
z-index:0; |
|||
} |
|||
#u0_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:1280px; |
|||
height:800px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u0 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:1280px; |
|||
height:800px; |
|||
display:flex; |
|||
} |
|||
#u0 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u0_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
visibility:hidden; |
|||
} |
|||
#u1_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:1280px; |
|||
height:90px; |
|||
background:inherit; |
|||
background-color:rgba(2, 167, 240, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(129, 211, 248, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u1 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:1280px; |
|||
height:90px; |
|||
display:flex; |
|||
} |
|||
#u1 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u1_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
visibility:hidden; |
|||
} |
|||
#u2_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:254px; |
|||
height:45px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
font-size:40px; |
|||
} |
|||
#u2 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:61px; |
|||
top:23px; |
|||
width:254px; |
|||
height:45px; |
|||
display:flex; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
font-size:40px; |
|||
} |
|||
#u2 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u2_text { |
|||
border-width:0px; |
|||
white-space:nowrap; |
|||
text-transform:none; |
|||
} |
|||
#u3_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:289px; |
|||
height:21px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u3 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:496px; |
|||
top:750px; |
|||
width:289px; |
|||
height:21px; |
|||
display:flex; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u3 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u3_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
} |
|||
#u4_img { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:35px; |
|||
height:40px; |
|||
} |
|||
#u4 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:1165px; |
|||
top:28px; |
|||
width:35px; |
|||
height:40px; |
|||
display:flex; |
|||
} |
|||
#u4 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u4_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
visibility:hidden; |
|||
} |
|||
#u5_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:96px; |
|||
height:28px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u5 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:427px; |
|||
top:265px; |
|||
width:96px; |
|||
height:28px; |
|||
display:flex; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u5 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u5_text { |
|||
border-width:0px; |
|||
white-space:nowrap; |
|||
text-transform:none; |
|||
} |
|||
#u6_input { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u6_input.disabled { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u6_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u6 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:553px; |
|||
top:266px; |
|||
width:300px; |
|||
height:25px; |
|||
display:flex; |
|||
} |
|||
#u6 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u6_div.disabled { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(240, 240, 240, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u6.disabled { |
|||
} |
|||
#u7_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:72px; |
|||
height:28px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u7 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:451px; |
|||
top:343px; |
|||
width:72px; |
|||
height:28px; |
|||
display:flex; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u7 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u7_text { |
|||
border-width:0px; |
|||
white-space:nowrap; |
|||
text-transform:none; |
|||
} |
|||
#u8_input { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u8_input.disabled { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u8_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u8 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:553px; |
|||
top:345px; |
|||
width:300px; |
|||
height:25px; |
|||
display:flex; |
|||
} |
|||
#u8 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u8_div.disabled { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:300px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(240, 240, 240, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u8.disabled { |
|||
} |
|||
#u9_input { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:136px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u9_input.disabled { |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:136px; |
|||
height:25px; |
|||
padding:2px 2px 2px 2px; |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#000000; |
|||
vertical-align:none; |
|||
text-align:left; |
|||
text-transform:none; |
|||
background-color:transparent; |
|||
border-color:transparent; |
|||
} |
|||
#u9_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:136px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u9 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:553px; |
|||
top:423px; |
|||
width:136px; |
|||
height:25px; |
|||
display:flex; |
|||
} |
|||
#u9 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u9_div.disabled { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:136px; |
|||
height:25px; |
|||
background:inherit; |
|||
background-color:rgba(240, 240, 240, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
} |
|||
#u9.disabled { |
|||
} |
|||
#u10_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:96px; |
|||
height:28px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u10 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:427px; |
|||
top:421px; |
|||
width:96px; |
|||
height:28px; |
|||
display:flex; |
|||
font-family:'Arial Negreta', 'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:700; |
|||
font-style:normal; |
|||
} |
|||
#u10 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u10_text { |
|||
border-width:0px; |
|||
white-space:nowrap; |
|||
text-transform:none; |
|||
} |
|||
#u11_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:140px; |
|||
height:40px; |
|||
background:inherit; |
|||
background-color:rgba(22, 155, 213, 1); |
|||
border:none; |
|||
border-radius:5px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-size:18px; |
|||
} |
|||
#u11 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:427px; |
|||
top:521px; |
|||
width:140px; |
|||
height:40px; |
|||
display:flex; |
|||
font-size:18px; |
|||
} |
|||
#u11 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u11_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
} |
|||
#u12_img { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:140px; |
|||
height:47px; |
|||
} |
|||
#u12 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:713px; |
|||
top:412px; |
|||
width:140px; |
|||
height:47px; |
|||
display:flex; |
|||
} |
|||
#u12 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u12_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
visibility:hidden; |
|||
} |
|||
#u13_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:140px; |
|||
height:40px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 1); |
|||
box-sizing:border-box; |
|||
border-width:1px; |
|||
border-style:solid; |
|||
border-color:rgba(121, 121, 121, 1); |
|||
border-radius:5px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
font-size:18px; |
|||
} |
|||
#u13 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:713px; |
|||
top:521px; |
|||
width:140px; |
|||
height:40px; |
|||
display:flex; |
|||
font-size:18px; |
|||
} |
|||
#u13 .text { |
|||
position:absolute; |
|||
align-self:center; |
|||
padding:2px 2px 2px 2px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u13_text { |
|||
border-width:0px; |
|||
word-wrap:break-word; |
|||
text-transform:none; |
|||
} |
|||
#u14_div { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:0px; |
|||
top:0px; |
|||
width:196px; |
|||
height:16px; |
|||
background:inherit; |
|||
background-color:rgba(255, 255, 255, 0); |
|||
border:none; |
|||
border-radius:0px; |
|||
-moz-box-shadow:none; |
|||
-webkit-box-shadow:none; |
|||
box-shadow:none; |
|||
color:#D9001B; |
|||
} |
|||
#u14 { |
|||
border-width:0px; |
|||
position:absolute; |
|||
left:657px; |
|||
top:581px; |
|||
width:196px; |
|||
height:16px; |
|||
display:flex; |
|||
color:#D9001B; |
|||
} |
|||
#u14 .text { |
|||
position:absolute; |
|||
align-self:flex-start; |
|||
padding:0px 0px 0px 0px; |
|||
box-sizing:border-box; |
|||
width:100%; |
|||
} |
|||
#u14_text { |
|||
border-width:0px; |
|||
white-space:nowrap; |
|||
text-transform:none; |
|||
} |
After Width: | Height: | Size: 429 B |
After Width: | Height: | Size: 278 B |
After Width: | Height: | Size: 283 B |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 175 B |
After Width: | Height: | Size: 176 B |
After Width: | Height: | Size: 152 B |
After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 152 B |
After Width: | Height: | Size: 257 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 156 B |
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 156 B |
After Width: | Height: | Size: 260 B |
After Width: | Height: | Size: 222 B |
After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 232 KiB |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="35px" height="40px" xmlns="http://www.w3.org/2000/svg"> |
|||
<g transform="matrix(1 0 0 1 -1165 -28 )"> |
|||
<path d="M 34.767578125 28.9192708333333 C 34.9225260416667 30.2300347222222 35 31.6232638888889 35 33.0989583333333 C 35 34.9913194444444 34.4303385416667 36.6145833333333 33.291015625 37.96875 C 32.1516927083333 39.3229166666667 30.7799479166667 40 29.17578125 40 L 5.82421875 40 C 4.22005208333333 40 2.84830729166667 39.3229166666667 1.708984375 37.96875 C 0.569661458333333 36.6145833333333 0 34.9913194444444 0 33.0989583333333 C 0 31.6232638888889 0.0774739583333335 30.2300347222222 0.232421875 28.9192708333333 C 0.387369791666667 27.6085069444444 0.674479166666667 26.2890625 1.09375 24.9609375 C 1.51302083333333 23.6328125 2.04622395833333 22.4956597222222 2.693359375 21.5494791666667 C 3.34049479166667 20.6032986111111 4.197265625 19.8307291666667 5.263671875 19.2317708333333 C 6.330078125 18.6328125 7.55598958333333 18.3333333333333 8.94140625 18.3333333333333 C 11.3294270833333 20.5555555555556 14.1822916666667 21.6666666666667 17.5 21.6666666666667 C 20.8177083333333 21.6666666666667 23.6705729166667 20.5555555555556 26.05859375 18.3333333333333 C 27.4440104166667 18.3333333333333 28.669921875 18.6328125 29.736328125 19.2317708333333 C 30.802734375 19.8307291666667 31.6595052083333 20.6032986111111 32.306640625 21.5494791666667 C 32.9537760416667 22.4956597222222 33.4869791666667 23.6328125 33.90625 24.9609375 C 34.3255208333333 26.2890625 34.6126302083333 27.6085069444444 34.767578125 28.9192708333333 Z M 24.923828125 2.9296875 C 26.974609375 4.8828125 28 7.23958333333333 28 10 C 28 12.7604166666667 26.974609375 15.1171875 24.923828125 17.0703125 C 22.873046875 19.0234375 20.3984375 20 17.5 20 C 14.6015625 20 12.126953125 19.0234375 10.076171875 17.0703125 C 8.025390625 15.1171875 7 12.7604166666667 7 10 C 7 7.23958333333333 8.025390625 4.8828125 10.076171875 2.9296875 C 12.126953125 0.9765625 14.6015625 0 17.5 0 C 20.3984375 0 22.873046875 0.9765625 24.923828125 2.9296875 Z " fill-rule="nonzero" fill="#000000" stroke="none" transform="matrix(1 0 0 1 1165 28 )" /> |
|||
</g> |
|||
</svg> |
After Width: | Height: | Size: 153 B |
After Width: | Height: | Size: 231 B |
After Width: | Height: | Size: 240 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 214 B |
After Width: | Height: | Size: 157 B |
After Width: | Height: | Size: 236 B |
After Width: | Height: | Size: 245 B |
After Width: | Height: | Size: 217 B |
After Width: | Height: | Size: 217 B |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 216 69.5 C 214.32 69.5 213 68.18 213 66.5 C 213 64.82 214.32 63.5 216 63.5 C 217.68 63.5 219 64.82 219 66.5 C 219 68.18 217.68 69.5 216 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 60.5 C 219.36 60.5 222 63.14 222 66.5 C 222 69.86 219.36 72.5 216 72.5 C 212.64 72.5 210 69.86 210 66.5 C 210 63.14 212.64 60.5 216 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 216 61 C 219.08 61 221.5 63.42 221.5 66.5 C 221.5 69.58 219.08 72 216 72 C 212.92 72 210.5 69.58 210.5 66.5 C 210.5 63.42 212.92 61 216 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 216 69.5 C 214.32 69.5 213 68.18 213 66.5 C 213 64.82 214.32 63.5 216 63.5 C 217.68 63.5 219 64.82 219 66.5 C 219 68.18 217.68 69.5 216 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 304 69.5 C 302.32 69.5 301 68.18 301 66.5 C 301 64.82 302.32 63.5 304 63.5 C 305.68 63.5 307 64.82 307 66.5 C 307 68.18 305.68 69.5 304 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 60.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 60.5 C 307.36 60.5 310 63.14 310 66.5 C 310 69.86 307.36 72.5 304 72.5 C 300.64 72.5 298 69.86 298 66.5 C 298 63.14 300.64 60.5 304 60.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 304 61 C 307.08 61 309.5 63.42 309.5 66.5 C 309.5 69.58 307.08 72 304 72 C 300.92 72 298.5 69.58 298.5 66.5 C 298.5 63.42 300.92 61 304 61 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 304 69.5 C 302.32 69.5 301 68.18 301 66.5 C 301 64.82 302.32 63.5 304 63.5 C 305.68 63.5 307 64.82 307 66.5 C 307 68.18 305.68 69.5 304 69.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 216 120.5 C 214.32 120.5 213 119.18 213 117.5 C 213 115.82 214.32 114.5 216 114.5 C 217.68 114.5 219 115.82 219 117.5 C 219 119.18 217.68 120.5 216 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="210 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 216 111.5 C 219.36 111.5 222 114.14 222 117.5 C 222 120.86 219.36 123.5 216 123.5 C 212.64 123.5 210 120.86 210 117.5 C 210 114.14 212.64 111.5 216 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 216 112 C 219.08 112 221.5 114.42 221.5 117.5 C 221.5 120.58 219.08 123 216 123 C 212.92 123 210.5 120.58 210.5 117.5 C 210.5 114.42 212.92 112 216 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 216 120.5 C 214.32 120.5 213 119.18 213 117.5 C 213 115.82 214.32 114.5 216 114.5 C 217.68 114.5 219 115.82 219 117.5 C 219 119.18 217.68 120.5 216 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#ffffff" stroke="none" /> |
|||
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 304 120.5 C 302.32 120.5 301 119.18 301 117.5 C 301 115.82 302.32 114.5 304 114.5 C 305.68 114.5 307 115.82 307 117.5 C 307 119.18 305.68 120.5 304 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<svg version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="12px" height="12px" viewBox="298 111.5 12 12" xmlns="http://www.w3.org/2000/svg"> |
|||
<path d="M 304 111.5 C 307.36 111.5 310 114.14 310 117.5 C 310 120.86 307.36 123.5 304 123.5 C 300.64 123.5 298 120.86 298 117.5 C 298 114.14 300.64 111.5 304 111.5 Z " fill-rule="nonzero" fill="#f0f0f0" stroke="none" /> |
|||
<path d="M 304 112 C 307.08 112 309.5 114.42 309.5 117.5 C 309.5 120.58 307.08 123 304 123 C 300.92 123 298.5 120.58 298.5 117.5 C 298.5 114.42 300.92 112 304 112 Z " stroke-width="1" stroke="#797979" fill="none" /> |
|||
<path d="M 304 120.5 C 302.32 120.5 301 119.18 301 117.5 C 301 115.82 302.32 114.5 304 114.5 C 305.68 114.5 307 115.82 307 117.5 C 307 119.18 305.68 120.5 304 120.5 " fill-rule="nonzero" fill="#797979" stroke="none" /> |
|||
</svg> |