Commit 638f0371 authored by 徐生海's avatar 徐生海

Initial commit

parent 80cb2d98
Pipeline #156 failed with stages
## ide
# 忽略操作系统生成的文件
DS_Store
# 忽略日志文件
*.log
**/.vs
**/.idea
work.md
__pycache__/
*.py[cod]
$__pycache__$
/logs/
/Resource/
/dist/
/build/
# 忽略环境变量文件
env
# 忽略依赖文件夹
node_modules/
\ No newline at end of file
#!D:/IDE/anaconda3/envs/Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName:AppBackEndBusiness.py
@Description:
@Author:XSH
@Time:2025/11/15 11:30
@Department:研发部
@Copyright:©2025 乐辰生物
"""
from AppInterfaces.EventInterfaces import AppEventInterface #
from AppInterfaces.EventInterfaces import EventBusInterface #
from AppInterfaces.TaskPoolInterface import TaskPoolInterface #
from AppBackEnd.BackEndEventBus.CameraFocusingPool import CameraFocusingPool #
from AppBackEnd.BackEndEventBus.CameraScanningPool import CameraScanningPool #
from AppBackEnd.BackEndEventBus.OnlyDrawPool import OnlyDrawPool #
from AppBackEnd.BackEndEventBus.SlideFocusingPool import SlideFocusingPool #
from AppBackEnd.BackEndEventBus.SlideScanningPool import SlideScanningPool #
from AppBackEnd.BackEndEventBus.WebServerPool import WebServerPool #
from AppBackEnd.BackEndEventBus.WebSocketPool import WebSocketPool #
from AppBackEnd.BackEndEventBus.CellFocusingPool import CellFocusingPool #
from AppBackEnd.BackEndEventBus.AppEventBusPool import AppEventBusPool #
from AppBackEnd.BackEndEventBus.AppTaskPool import AppTaskPool #
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
#!D:\IDE\Anaconda3\envs\Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName : AppEventBusBusiness.py
@Account : Administrator
@Time : 2025/9/3 13:10
@Author : xsh
@Description:
"""
# from AppInterfaces.ThreadPoolInterface import ThreadPoolInterface, PoolUtil #
# from AppBackEnd.BackEndEventBus.AppTaskPool import AppTaskPool
# from AppBackEnd.BackEndEventBus.AppTaskController import AppTaskController
# from AppBackEnd.BackEndEventBus.SlideFocusingPool import SlideFocusingPool #
# from AppBackEnd.BackEndEventBus.SlideScanningPool import SlideScanningPool #
# from AppBackEnd.BackEndEventBus.CameraScanningPool import CameraScanningPool #
# from AppBackEnd.BackEndEventBus.CameraFocusingPool import CameraFocusingPool #
# from AppBackEnd.BackEndEventBus.GlobalWebServerPool import GlobalWebServerPool #
# from AppBackEnd.BackEndEventBus.AppEventBusPool import AppEventBusPool #
# from AppBackEnd.BackEndEventBus.ProcessCellFocusingPool import ProcessCellFocusingPool #
\ No newline at end of file
This diff is collapsed.
#!D:\IDE\Anaconda3\envs\Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName : AppWebAPIBusiness.py
@Account : Administrator
@Time : 2025/9/3 13:07
@Author : xsh
@Description:
"""
from AppBackEnd.WebAPIBusiness.ConnectionStatusBusiness import ConnectionStatusBusiness
from AppBackEnd.WebAPIBusiness.ExitScanningBusiness import ExitScanningBusiness
from AppBackEnd.WebAPIBusiness.JumpScanningBusiness import JumpScanningBusiness
from AppBackEnd.WebAPIBusiness.PauseScanningBusiness import PauseScanningBusiness
from AppBackEnd.WebAPIBusiness.StartScanningBusiness import StartScanningBusiness
from AppBackEnd.WebAPIBusiness.StopScanningBusiness import StopScanningBusiness
from AppBackEnd.WebAPIBusiness.ScanningStatusBusiness import ScanningStatusBusiness
from AppBackEnd.WebAPIBusiness.ScanningDataBusiness import ScanningDataBusiness
from AppBackEnd.WebAPIBusiness.ScanningCompleteBusiness import ScanningCompleteBusiness
from AppBackEnd.WebAPIBusiness.ChamberStatusBusiness import ChamberStatusBusiness
from AppBackEnd.WebAPIBusiness.SelectScanTemplateBusiness import SelectScanTemplateBusiness
from AppBackEnd.WebAPIBusiness.AppendScanTemplateBusiness import AppendScanTemplateBusiness
from AppBackEnd.WebAPIBusiness.RemoveScanTemplateBusiness import RemoveScanTemplateBusiness
from AppBackEnd.WebAPIBusiness.UpdateScanTemplateBusiness import UpdateScanTemplateBusiness
from AppBackEnd.WebAPIBusiness.SelectClassifierBusiness import SelectClassifierBusiness
from AppBackEnd.WebAPIBusiness.ClearPreviewBusiness import ClearPreviewBusiness
from AppBackEnd.WebAPIBusiness.PushTemplateBusiness import PushTemplateBusiness
from AppBackEnd.WebAPIBusiness.GetCustomData import GetCustomData
from AppBackEnd.WebAPIBusiness.SetCustomData import SetCustomData
from AppBackEnd.WebAPIBusiness.ChangedLanguageBusiness import ChangedLanguageBusiness
\ No newline at end of file
#!D:/IDE/anaconda3/envs/Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName:AppWebBusiness.py
@Description:
@Author:XSH
@Time:2025/12/3 12:12
@Department:研发部
@Copyright:©2025 乐辰生物
"""
from AppBackEnd.WebBusinessInterface import WebBusinessInterface #
from AppBackEnd.WebAPIBusiness.AppendScanTemplateBusiness import AppendScanTemplateBusiness #
from AppBackEnd.WebAPIBusiness.ClearWarningBusiness import ClearWarningBusiness #
from AppBackEnd.WebAPIBusiness.ChamberStatusBusiness import ChamberStatusBusiness #
from AppBackEnd.WebAPIBusiness.ChangedLanguageBusiness import ChangedLanguageBusiness #
from AppBackEnd.WebAPIBusiness.ClearPreviewBusiness import ClearPreviewBusiness #
from AppBackEnd.WebAPIBusiness.ConnectionStatusBusiness import ConnectionStatusBusiness #
from AppBackEnd.WebAPIBusiness.DropSlideTableTrayBusiness import DropSlideTableTrayBusiness #
from AppBackEnd.WebAPIBusiness.ExitScanningBusiness import ExitScanningBusiness #
from AppBackEnd.WebAPIBusiness.GetCustomData import GetCustomData #
from AppBackEnd.WebAPIBusiness.JumpScanningBusiness import JumpScanningBusiness #
from AppBackEnd.WebAPIBusiness.PauseScanningBusiness import PauseScanningBusiness #
from AppBackEnd.WebAPIBusiness.PushTemplateBusiness import PushTemplateBusiness #
from AppBackEnd.WebAPIBusiness.RemoveScanTemplateBusiness import RemoveScanTemplateBusiness #
from AppBackEnd.WebAPIBusiness.ScanningDataBusiness import ScanningDataBusiness #
from AppBackEnd.WebAPIBusiness.ScanningStatusBusiness import ScanningStatusBusiness #
from AppBackEnd.WebAPIBusiness.SelectScanTemplateBusiness import SelectScanTemplateBusiness #
from AppBackEnd.WebAPIBusiness.SelectClassifierBusiness import SelectClassifierBusiness #
from AppBackEnd.WebAPIBusiness.SetCustomData import SetCustomData #
from AppBackEnd.WebAPIBusiness.StartScanningBusiness import StartScanningBusiness #
from AppBackEnd.WebAPIBusiness.StopScanningBusiness import StopScanningBusiness #
from AppBackEnd.WebAPIBusiness.UpdateScanTemplateBusiness import UpdateScanTemplateBusiness #
from AppBackEnd.WebAPIBusiness.NoneWebAPIBusiness import NoneWebAPIBusiness #
from AppBackEnd.WebAPIBusiness.WebAPIFactory import WebAPIFactory #
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#!D:\IDE\Anaconda3\envs\Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName : SlideTableDropBusiness.py
@Account : Administrator
@Time : 2025/9/3 10:23
@Author : xsh
@Description:
"""
from PyQt5 import Qt
from abc import abstractmethod, abstractclassmethod, abstractstaticmethod
from AppInterfaces.utils import *
from AppSettings.utils import *
from AppCore.Levels import *
from AppCore.Managers import *
from AppCore.Impls import *
from AppCore.Requests import *
from AppCore.DBModels import *
from AppUtils.utils import *
from AppCore.Events import *
from AppBackEnd.AppEventBusBusiness import *
from AppCore.Readers import *
from AppSettings.AppGlobalStatus import AppGlobalStatus, AppStatus
from AppSettings.AppGlobalAlgorithm import AppGlobalAlgorithm
from AppCore.AppAlgorithms.ImageAlgorithm import ImageAlgorithm
from AppBackEnd.AppBusinessController import AppBusinessController, AppBusinessInterface
class SlideTableDropBusiness(Qt.QObject, AppBusinessController, SingletonInterface):
Locker : Qt.QMutex = Qt.QMutex()
@classmethod
def GetInstance(cls, *args, **kwargs) -> 'SlideTableDropBusiness':
return super(SlideTableDropBusiness, cls).GetInstance(*args, **kwargs)
def __init__(self, parent: AppBusinessInterface = None):
super(SlideTableDropBusiness, self).__init__(parent=parent if parent is not None else parent.m_Control)
self.initialize()
self.ScanLevel = ScanStatusLevel.DropTraySlide_Status
self.initModules(parent)
def initModules(self, parent: AppBusinessInterface):
if isinstance(parent, AppBusinessInterface):
self.Config = parent.config #
self.SystemConfig = parent.system #
self.HardWare = parent.devices #
self.GlobalStatus = parent.status #
self.Application = parent.application #
self.Algorithm = parent.algorithm #
self.EventBus = parent.eventBus #
self.Process = parent.process #
self.HitBotConfig = parent.hitbotConfig #
def isValid(self) -> bool:
return self.hasHitBot and self.hasGlobalStatus and self.hasSystemConfig and self.hasConfig
@property
def isAvailable(self) -> bool:
return self.hasHitBot and self.hitbot.isAvailable
def Done(self, ChamberNumber: int, *args, **kwargs):
isWrong: int = RECODE_FAILURE
self.status.setScanningStatus(self.ScanLevel)
isSafe : bool = AppConvert.ObjectConvert(kwargs.get('isSafe' , True), bool)
RowNumber : int = AppConvert.ObjectConvert(kwargs.get('RowNumber' , None), int)
TrayNumber : int = AppConvert.ObjectConvert(kwargs.get('TrayNumber' , None), int)
isExit : bool = AppConvert.ObjectConvert(kwargs.get('isExit' , True), bool)
try:
if isinstance(ChamberNumber, int) and isinstance(RowNumber, int) and isinstance(TrayNumber, int):
isWrong = self.SlideTableSampleDropping(ChamberNumber, RowNumber, TrayNumber, isSafe, isExit)
except Exception as e:
AppUtils.print_Exception(e)
if self.status.isExit:
self.status.setScanningStatus(ScanStatusLevel.FinishScanning_Status)
# elif self.status.isJumpScanning():
# self.status.setScanningStatus(ScanStatusLevel.JumpScanning_Status)
elif not ScanStatusLevel.isHitBotWarning(self.status.scanning_level):
self.status.changedChamberScanningStatus(ChamberNumber, RowNumber, ScanStatusLevel.DropTraySlide_Warning_Status)
self.status.setScanningStatus(ScanStatusLevel.DropTraySlide_Warning_Status)
return
def WaitDone(self, ChamberNumber: int, *args, **kwargs) -> int:
isWrong: int = RECODE_FAILURE
self.status.setScanningStatus(self.ScanLevel)
isSafe : bool = AppConvert.ObjectConvert(kwargs.get('isSafe' , True), bool )
RowNumber : int = AppConvert.ObjectConvert(kwargs.get('RowNumber' , None), int )
TrayNumber : int = AppConvert.ObjectConvert(kwargs.get('TrayNumber' , None), int )
isExit : bool = AppConvert.ObjectConvert(kwargs.get('isExit' , True), bool )
try:
if isinstance(ChamberNumber, int) and isinstance(RowNumber, int) and isinstance(TrayNumber, int):
isWrong = self.SlideTableSampleDropping(ChamberNumber, RowNumber, TrayNumber, isSafe, isExit)
except Exception as e:
AppUtils.print_Exception(e)
if self.status.isExit:
self.status.setScanningStatus(ScanStatusLevel.FinishScanning_Status)
# elif RECODE_SUCCEED == isWrong:
# self.status.setScanningStatus(self.ScanLevel)
elif not ScanStatusLevel.isHitBotWarning(self.status.scanning_level):
self.status.changedChamberScanningStatus(ChamberNumber, RowNumber, ScanStatusLevel.DropTraySlide_Warning_Status)
self.status.setScanningStatus(ScanStatusLevel.DropTraySlide_Warning_Status)
return isWrong
def SlideTableSampleDropping(self, chamber_number: int, row_number: int, tray_number: int, isSafe: bool = True, isExit: bool = True) -> int:
isWrong : int
self.status.setSlideTableStatus(chamber_number, row_number, tray_number)
isWrong = self.readySlideTableSampleDropping(chamber_number, row_number, tray_number)
if RECODE_SUCCEED != isWrong:
return isWrong
if isSafe:
self.hitbot.moveToSafePosition()
"""处理暂停 退出"""
while self.status.waitForPauseRunning():
AppTimeLoop.processEvents(self.system.WarningWaitTimes())
if isExit:
if self.status.waitForExitRunning():
if isSafe:
self.hitbot.moveToSafePosition()
return RECODE_SUCCEED
isWrong = self.waitForSlideTableDroping(chamber_number, row_number, tray_number)
tray_status: bool = RECODE_SUCCEED == isWrong and not ScanStatusLevel.isHitBotAlarm(self.status.scanning_level)
self.status.setTrayStatus(tray_number, tray_status)
if RECODE_SUCCEED == isWrong:
"""如果所有动作完成 把夹爪状态改为0 """
self.hitbotConfig.setIsClamp(False)
else:
"""如果所有动作完成 把夹爪状态改为0 """
self.hitbotConfig.setIsClamp(True)
self.status.setSlideTableStatus(chamber_number, row_number, tray_number)
"""如果机械臂错误 直接退出"""
if ScanStatusLevel.isHitBotAlarm(self.status.scanning_level):
return RECODE_FAILURE
if isSafe and RECODE_SUCCEED == isWrong:
self.hitbot.moveToSafePosition()
"""处理暂停 退出"""
while self.status.waitForPauseRunning():
AppTimeLoop.processEvents(self.system.WarningWaitTimes())
if isExit:
if self.status.waitForExitRunning():
return RECODE_SUCCEED
return isWrong
def readySlideTableSampleDropping(self, chamber_number: int, row_number: int, tray_number: int) -> int:
isWrong : int = RECODE_FAILURE
MinChamberNumber : int
MaxChamberNumber : int
MinRowNumber : int
MaxRowNumber : int
MinRowNumber , MaxRowNumber = self.system.getRowRange ()
MinChamberNumber, MaxChamberNumber = self.system.getChamberRange ()
if MinChamberNumber <= chamber_number <= MaxChamberNumber and MinRowNumber <= row_number <= MaxRowNumber:
try:
"""如果当前夹抓没有夹到玻片 退出"""
if not self.hitbotConfig.hitbotIsClamp():
if not self.hitbot.IsGrab():
return RECODE_FAILURE
self.hitbotConfig.setIsClamp(True)
if not self.isValid():
return RECODE_FAILURE
if not self.isAvailable:
return RECODE_FAILURE
isWrong = RECODE_SUCCEED
except Exception as e:
AppUtils.print_Exception(e)
return isWrong
This diff is collapsed.
#!D:/IDE/anaconda3/envs/Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName:__init__.py.py
@Description:
@Author:XSH
@Time:2025/11/15 12:59
@Department:研发部
@Copyright:©2025 乐辰生物
"""
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#!D:/IDE/anaconda3/envs/Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@FileName:__init__.py.py
@Description:
@Author:XSH
@Time:2025/11/15 11:31
@Department:研发部
@Copyright:©2025 乐辰生物
"""
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
#!D:\IDE\Anaconda3\envs\Microscope_Scan python
# -*- coding: UTF-8 -*-
"""
@Author: Administrator
@FileName: __init__.py.py
@DateTime: 2025/5/28 16:40
@SoftWare: PyCharm
@Author :xsh
"""
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment