# cython:language_level=3
import json
import sys
import threading
import time
from collections import deque
from queue import Queue
if 82 - 82: Iii1i
from autobahn . twisted . websocket import WebSocketServerFactory , WebSocketServerProtocol
from twisted . internet import reactor
from twisted . internet . defer import Deferred
from twisted . python import log
if 87 - 87: Ii % i1i1i1111I . Oo / OooOoo * I1Ii1I1 - I1I
from . mMonitorInfo import mMonitorInfo
from . wgpacket import wgGlobal
if 81 - 81: i1 + ooOOO / oOo0O00 * i1iiIII111 * IiIIii11Ii
if 84 - 84: ooo000 - Ooo0Ooo + iI1iII1I1I1i . IIiIIiIi11I1
if 98 - 98: I11iiIi11i1I % oOO
websocketpwd = None
if 31 - 31: i1I
if 9 - 9: IiI11Ii111 / oOo0O00 / IiIIii11Ii - I11iiIi11i1I - iI1iII1I1I1i
class WGWSServerProtocol ( WebSocketServerProtocol ) :
 connectionlist = [ ]
 count = 0
 WSMessageQueue = None
 bStartBroad = 0
 taskqueueWGWSServerProtocol = Queue ( )
 if 16 - 16: i1i1i1111I / i1iiIII111
 if 3 - 3: i1 % i1 % i1i1i1111I . Ii * i1
 if 9 - 9: i1iiIII111
 if 10 - 10: ooOOO / IIiIIiIi11I1 * oOO / i1I / i1I
 def __init__ ( self ) :
  mMonitorInfo . ws = WGWSServerProtocol
  self . is_closed = Deferred ( )
  self . is_open = Deferred ( )
  if 61 - 61: Ooo0Ooo - I1I
  if WGWSServerProtocol . bStartBroad == 0 :
   WGWSServerProtocol . WSMessageQueue = deque ( )
   WGWSServerProtocol . bStartBroad = 1
   iIIIII1i111i = threading . Thread ( target = WGWSServerProtocol . broadcastRealize )
   iIIIII1i111i . start ( )
   if 8 - 8: i1iiIII111 * i1 . I1I / oOO
   if 58 - 58: I1Ii1I1 - ooOOO
   if 60 - 60: iI1iII1I1I1i . oOO
   if 13 - 13: oOO
   if 2 - 2: i1
   if 22 - 22: IIiIIiIi11I1 - ooo000 / I1Ii1I1 . ooo000
   if 1 - 1: iI1iII1I1I1i + Ooo0Ooo + oOO * IIiIIiIi11I1
   if 20 - 20: I1I + Ii
   if 75 - 75: Ii % i1iiIII111 * Ii . IIiIIiIi11I1 % I11iiIi11i1I % I1Ii1I1
   if 8 - 8: I1Ii1I1 . IiI11Ii111 . i1 . Oo - i1I
   if 32 - 32: Ii % i1i1i1111I % i1I - I11iiIi11i1I % i1iiIII111
   if 34 - 34: i1iiIII111 * i1
   if 34 - 34: oOo0O00 / i1iiIII111 - Iii1i . iI1iII1I1I1i
   if 80 - 80: i1i1i1111I . I1I % ooOOO % IiIIii11Ii / i1i1i1111I
   if 32 - 32: I1Ii1I1 + oOO - oOo0O00
   if 79 - 79: Iii1i % oOO * Oo + ooOOO / Oo . oOO
   if 20 - 20: IiI11Ii111 + i1iiIII111 / I1I
   if 88 - 88: I11iiIi11i1I + ooOOO - i1i1i1111I . Ooo0Ooo * Ii + Iii1i
   if 43 - 43: ooOOO * I1Ii1I1
   if 95 - 95: Ooo0Ooo % Iii1i % i1i1i1111I . OooOoo
   if 70 - 70: IiIIii11Ii
   if 75 - 75: Ooo0Ooo / Ii / IiIIii11Ii + IiIIii11Ii . I1I
   if 88 - 88: Oo * IiIIii11Ii
 staticmethod
 if 100 - 100: IiI11Ii111 - OooOoo * I1Ii1I1 / Ooo0Ooo / Iii1i
 def timeInfo ( info = None ) :
  if 23 - 23: Ooo0Ooo + i1 * I1Ii1I1 + Oo * Ii - IIiIIiIi11I1
  if 29 - 29: IiIIii11Ii - oOo0O00
  if 30 - 30: I1I . ooo000
  OOO = """[
          {
            "SN": 0,
            "RefreshTime": """ + "'{}'" . format ( time . strftime ( '%Y-%m-%d %H:%M:%S' ) ) + """
          }
        ]"""
  if 83 - 83: oOO - Iii1i + ooOOO . i1I / ooOOO
  OOO = """[
          {
            "SN": 0,
            "RefreshTime": """ + "{}" . format ( time . strftime ( '"%Y-%m-%d %H:%M:%S"' ) ) + """
          }
        ]"""
  return bytes ( OOO , encoding = 'utf8' )
  if 5 - 5: IiI11Ii111
 def sendDoorStatusInfo ( self ) :
  OOO00oO0oOo0O = [ ]
  OOO = mMonitorInfo . getAllControllerDSInfoBy20 ( OOO00oO0oOo0O )
  if OOO is not None :
   self . sendMessage ( OOO )
   while OOO is not None :
    OOO = mMonitorInfo . getAllControllerDSInfoBy20 ( OOO00oO0oOo0O )
    if OOO is not None :
     self . sendMessage ( OOO )
    else :
     break
  else :
   self . sendMessage ( WGWSServerProtocol . timeInfo ( ) )
   if 1 - 1: I1I % Ooo0Ooo + i1iiIII111 . i1iiIII111 % Oo
 def onOpen ( self ) :
  if 93 - 93: oOo0O00 % Ooo0Ooo * i1iiIII111
  if 52 - 52: oOO + I1I / ooo000 - I1Ii1I1 * i1I % oOo0O00
  if self not in WGWSServerProtocol . connectionlist :
   WGWSServerProtocol . connectionlist . append ( self )
   if 52 - 52: oOo0O00 . I1I + i1I - i1iiIII111 % iI1iII1I1I1i
   if 57 - 57: I1I * IIiIIiIi11I1 % I1Ii1I1 * i1i1i1111I
   if 37 - 37: IiI11Ii111 * i1i1i1111I + oOo0O00 / I1I / OooOoo
   if 4 - 4: i1
   if 61 - 61: iI1iII1I1I1i . i1I - ooo000 / ooo000 - i1
   if 19 - 19: Iii1i * Ooo0Ooo . I1Ii1I1 / I11iiIi11i1I * Ii - oOO
   if 32 - 32: iI1iII1I1I1i
   if 18 - 18: I11iiIi11i1I * IiI11Ii111 % iI1iII1I1I1i + IiI11Ii111
  self . sendDoorStatusInfo ( )
  if 93 - 93: oOO - I1Ii1I1 - IIiIIiIi11I1 * ooOOO - i1
  self . is_open = Deferred ( )
  WGWSServerProtocol . count = len ( WGWSServerProtocol . connectionlist )
  if 82 - 82: IIiIIiIi11I1 % i1 * ooOOO
 @ staticmethod
 def broadcast ( message ) :
  if WGWSServerProtocol . count > 0 :
   WGWSServerProtocol . WSMessageQueue . append ( message )
   if WGWSServerProtocol . taskqueueWGWSServerProtocol . empty ( ) :
    WGWSServerProtocol . taskqueueWGWSServerProtocol . put ( "WGWSServerProtocol" )
    if 57 - 57: oOo0O00
    if 31 - 31: i1iiIII111 + i1i1i1111I % OooOoo
    if 20 - 20: OooOoo - I1I
    if 9 - 9: i1iiIII111 - iI1iII1I1I1i % Ii - I1I
 @ staticmethod
 def broadcastRealize ( ) :
  O0o0OOoOOOO = 0
  pass
  while True :
   if WGWSServerProtocol . WSMessageQueue . __len__ ( ) <= 0 :
    time . sleep ( 0.001 )
    try :
     IIIIi = WGWSServerProtocol . taskqueueWGWSServerProtocol . get (
 block = True )
     WGWSServerProtocol . taskqueueWGWSServerProtocol . task_done ( )
    except Exception as O0O0oOo00oO0 :
     pass
    continue
   if WGWSServerProtocol . WSMessageQueue . __len__ ( ) > O0o0OOoOOOO :
    O0o0OOoOOOO = WGWSServerProtocol . WSMessageQueue . __len__ ( )
    pass
   iIiIiiIIIiII = WGWSServerProtocol . WSMessageQueue . popleft ( )
   if 44 - 44: Ooo0Ooo + i1i1i1111I + Iii1i - oOO
   if 7 - 7: i1i1i1111I / Ii * Iii1i
   i1iI1i = [ ]
   for IIIi1111iiIi1 in WGWSServerProtocol . connectionlist :
    if 4 - 4: ooo000 % I1I - i1i1i1111I
    try :
     IIIi1111iiIi1 . sendMessage ( iIiIiiIIIiII )
     if 76 - 76: i1 * oOo0O00 . IiI11Ii111 * i1I . IiIIii11Ii . oOO
     if 55 - 55: i1i1i1111I + i1iiIII111 % Ooo0Ooo . Oo - IiIIii11Ii - iI1iII1I1I1i
     if 91 - 91: I1Ii1I1 - I11iiIi11i1I
    except Exception as OO00OOooO :
     pass
     if 58 - 58: i1I - IiI11Ii111
     if 86 - 86: Iii1i + i1iiIII111 - IIiIIiIi11I1 / I1I
     if 46 - 46: ooOOO + ooOOO % oOO
     mMonitorInfo . wglog ( "1501" )
     mMonitorInfo . wglog ( OO00OOooO )
     if 2 - 2: i1i1i1111I / Ooo0Ooo / oOO - IIiIIiIi11I1 / IIiIIiIi11I1
     i1iI1i . append ( IIIi1111iiIi1 )
   if len ( i1iI1i ) > 0 :
    for IIIi1111iiIi1 in i1iI1i :
     try :
      WGWSServerProtocol . connectionlist . remove ( IIIi1111iiIi1 )
      del IIIi1111iiIi1
     except Exception as OO00OOooO :
      pass
      if 58 - 58: i1i1i1111I
      if 38 - 38: i1 - oOo0O00
   WGWSServerProtocol . count = len ( WGWSServerProtocol . connectionlist )
   if 85 - 85: IIiIIiIi11I1 + I11iiIi11i1I % Ooo0Ooo + oOO * i1iiIII111
   if 46 - 46: ooOOO - ooOOO + Oo / I1I * Oo + oOO
 def onClose ( self , wasClean , code , reason ) :
  if 98 - 98: I1I / IIiIIiIi11I1 / i1I + IiI11Ii111 % Oo + I1I
  try :
   if 38 - 38: I1Ii1I1 + oOo0O00
   if 2 - 2: OooOoo % Ii + oOO . OooOoo + IIiIIiIi11I1 * Oo
   if self in WGWSServerProtocol . connectionlist :
    WGWSServerProtocol . connectionlist . remove ( self )
    if 2 - 2: IIiIIiIi11I1 + iI1iII1I1I1i - I1Ii1I1 + ooOOO . IIiIIiIi11I1
    if 15 - 15: ooo000
    if 63 - 63: i1I
  except Exception as i1Ii :
   pass
   if 32 - 32: oOO
   if 98 - 98: IiI11Ii111 % i1 % ooo000 % iI1iII1I1I1i
   if 57 - 57: Ooo0Ooo % i1I + IiI11Ii111
   mMonitorInfo . wglog ( "1502" )
   mMonitorInfo . wglog ( i1Ii )
   if 8 - 8: Oo * I1I / i1i1i1111I + i1 / I1Ii1I1
   if 71 - 71: I1Ii1I1
  WGWSServerProtocol . count = len ( WGWSServerProtocol . connectionlist )
  if 1 - 1: IiI11Ii111 - oOo0O00 - i1 . oOo0O00
 def onConnect ( self , request ) :
  if 91 - 91: iI1iII1I1I1i * i1 . ooOOO
  if 81 - 81: I1I * Oo - i1 % OooOoo * ooOOO
  if 19 - 19: Ii
  if 22 - 22: i1I % iI1iII1I1I1i + Oo
  if 60 - 60: ooo000 + I11iiIi11i1I + IIiIIiIi11I1 % i1i1i1111I - Ii % Ooo0Ooo
  try :
   if not wgGlobal . checkwhitelist (
 self . transport . getPeer ( ) . host ) :
    self . transport . abortConnection ( )
    return
  except Exception as OoiI1iiI11IIi1 :
   pass
   if 56 - 56: i1i1i1111I - IiIIii11Ii - i1iiIII111 - Oo + i1iiIII111 / Ooo0Ooo
   mMonitorInfo . wglog ( "1303b" )
   mMonitorInfo . wglog ( OoiI1iiI11IIi1 )
  pass
  if 89 - 89: ooo000 + Ii % i1i1i1111I - i1iiIII111
 def onMessage ( self , payload , isBinary ) :
  if 33 - 33: ooo000 . Iii1i % oOO
  if 60 - 60: I1I . IiIIii11Ii % IIiIIiIi11I1 % iI1iII1I1I1i
  if 98 - 98: I1I
  if 35 - 35: oOo0O00 / IIiIIiIi11I1 - Iii1i . IiI11Ii111 * i1
  if 91 - 91: oOO + Iii1i
  if 71 - 71: i1 . iI1iII1I1I1i . OooOoo . IIiIIiIi11I1
  if ( isBinary ) :
   pass
  else :
   if self not in WGWSServerProtocol . connectionlist :
    WGWSServerProtocol . connectionlist . append ( self )
    if 92 - 92: ooOOO % IIiIIiIi11I1 - IIiIIiIi11I1
    if 32 - 32: OooOoo % I1I - I11iiIi11i1I % OooOoo
    if 9 - 9: i1iiIII111 - ooOOO % Iii1i
    if 37 - 37: i1I + IIiIIiIi11I1 % iI1iII1I1I1i / IIiIIiIi11I1 % i1iiIII111 + oOO
    if 98 - 98: iI1iII1I1I1i - I1I + i1 * ooo000 % i1
    if 100 - 100: i1iiIII111 . IIiIIiIi11I1 * ooo000 * ooo000
    if 85 - 85: IIiIIiIi11I1 / OooOoo . i1I % Oo + Oo - I11iiIi11i1I
    if 59 - 59: OooOoo
    if 53 - 53: i1i1i1111I / ooOOO - IiI11Ii111 + ooo000 * i1i1i1111I * i1iiIII111
   O0O0o0oo00Oo = False
   if ( 1 > 0 ) :
    I11 = dict ( )
    I1Ii = payload
    try :
     if 6 - 6: oOo0O00 . IiIIii11Ii + Ooo0Ooo
     if 19 - 19: Ooo0Ooo % i1I
     I11 = json . loads ( I1Ii . decode ( "utf-8" ) . replace ( '%20' , ' ' ) . replace ( '&nbsp' , ' ' ) )
     O0O0o0oo00Oo = True
    except Exception as i1Ii :
     pass
     if 88 - 88: I1Ii1I1 / i1i1i1111I
     if 79 - 79: i1 % i1I - i1 / iI1iII1I1I1i
     try :
      from twisted . web . http import parse_qs
      O0oOO0 = parse_qs ( I1Ii . decode ( 'utf-8' ) )
      for iI1I1I1II in O0oOO0 :
       I11 [ iI1I1I1II ] = O0oOO0 [ iI1I1I1II ] [ 0 ]
     except Exception as OO00OOooO :
      pass
      pass
      if 39 - 39: IIiIIiIi11I1 - Oo
    II1I1Ii1IIi = True
    if 73 - 73: Ii * IIiIIiIi11I1 % i1 + IiIIii11Ii % I1I / IiI11Ii111
    if 33 - 33: OooOoo * Oo * Ii * iI1iII1I1I1i + i1I . IiIIii11Ii
    iI1Iii = True
    if not ( ( "jsonrpc" in I11 ) and ( "method" in I11 ) and ( "id" in I11 ) ) :
     II1I1Ii1IIi = False
    elif not ( "params" in I11 ) :
     if 17 - 17: I11iiIi11i1I + ooOOO % ooOOO / oOo0O00 - i1iiIII111
     if I11 [ 'method' ] not in [ 'ManualRefresh' ] :
      II1I1Ii1IIi = False
     else :
      iI1Iii = False
    elif I11 [ 'jsonrpc' ] != '2.0' :
     II1I1Ii1IIi = False
     if 15 - 15: OooOoo . ooo000 / IiIIii11Ii % i1i1i1111I
     if 51 - 51: ooOOO
    elif I11 [ 'id' ] is None :
     II1I1Ii1IIi = False
    elif I11 [ 'params' ] is None :
     II1I1Ii1IIi = False
    if not ( websocketpwd is None ) :
     if 'websocketpwd' not in I11 :
      II1I1Ii1IIi = False
      if 69 - 69: iI1iII1I1I1i
     elif not ( websocketpwd == I11 [ 'websocketpwd' ] ) :
      if 48 - 48: ooOOO * ooo000 % IiIIii11Ii * i1 . Iii1i - IiI11Ii111
      II1I1Ii1IIi = False
      if 72 - 72: i1 % i1i1i1111I * iI1iII1I1I1i
    if II1I1Ii1IIi :
     if 90 - 90: Ooo0Ooo * OooOoo . Ii
     if 5 - 5: Oo - i1 . oOO
     if 18 - 18: IiIIii11Ii - oOO * i1I - OooOoo
     o0OOo0OoO = None
     if iI1Iii :
      oo0O00O = I11 [ 'params' ]
      IiiIi1 = json . dumps ( oo0O00O , ensure_ascii = False )
      if 28 - 28: IiI11Ii111 * Ii . i1 + i1I / i1i1i1111I / oOO
      if 27 - 27: i1 / OooOoo + Iii1i % OooOoo + OooOoo
      if 70 - 70: Oo / Iii1i * OooOoo
      if O0O0o0oo00Oo :
       if 2 - 2: i1I / Iii1i + I1Ii1I1
       o0OOo0OoO = ( json . JSONDecoder ( ) . decode ( IiiIi1 ) ) [ 0 ]
      else :
       if 34 - 34: OooOoo
       o0OOo0OoO = json . JSONDecoder ( ) . decode ( json . JSONDecoder ( ) . decode ( IiiIi1 ) ) [ 0 ]
      if 'ControllerSN' not in o0OOo0OoO :
       II1I1Ii1IIi = False
      else :
       if 95 - 95: Oo % i1i1i1111I * iI1iII1I1I1i - IiIIii11Ii
       pass
       if 66 - 66: iI1iII1I1I1i . i1 % Ii % I11iiIi11i1I * oOo0O00
       if 59 - 59: Ii . ooo000 - Oo - iI1iII1I1I1i - i1i1i1111I . i1iiIII111
       if 78 - 78: OooOoo . ooOOO
       if 80 - 80: oOO % i1iiIII111 * IiI11Ii111 - oOo0O00 % I11iiIi11i1I - IiI11Ii111
       if 56 - 56: Oo
    if II1I1Ii1IIi :
     if I11 [ 'method' ] == "ManualRefresh" :
      if 84 - 84: I1I % iI1iII1I1I1i - Ooo0Ooo / iI1iII1I1I1i + Ooo0Ooo - Oo
      if 41 - 41: ooOOO + OooOoo + IIiIIiIi11I1 * i1i1i1111I
      if 12 - 12: i1i1i1111I
      if 56 - 56: IiIIii11Ii
      if 17 - 17: i1I . oOO % Oo + IiIIii11Ii - Ooo0Ooo
      if 93 - 93: oOo0O00
      self . sendDoorStatusInfo ( )
     elif I11 [ 'method' ] == "RemoteOpenDoor" :
      O00 = 0 if 'DoorNO' not in o0OOo0OoO else o0OOo0OoO [ 'DoorNO' ]
      iIiiI1IiI1iI = 1 if 'InExit' not in o0OOo0OoO else o0OOo0OoO [ 'InExit' ]
      IiOOooo00 = 0 if 'VirtualCardNO' not in o0OOo0OoO else o0OOo0OoO [ 'VirtualCardNO' ]
      if 52 - 52: OooOoo
      mMonitorInfo . wgControllerCenter . DealOpenDoorFromWEBSocket ( o0OOo0OoO [ 'ControllerSN' ] , O00 , iIiiI1IiI1iI ,
 IiOOooo00 )
      if 95 - 95: i1i1i1111I . I11iiIi11i1I * ooo000 / iI1iII1I1I1i - I1Ii1I1 + IiIIii11Ii
  WGWSServerProtocol . count = len ( WGWSServerProtocol . connectionlist )
  if 40 - 40: i1I + i1i1i1111I % OooOoo . IiI11Ii111 / i1i1i1111I . ooOOO
 @ staticmethod
 def dealHeartBeat ( ) :
  if 57 - 57: IIiIIiIi11I1 - iI1iII1I1I1i % ooOOO - I11iiIi11i1I / IiIIii11Ii . Ooo0Ooo
  if 15 - 15: i1I * I11iiIi11i1I - oOo0O00
  if 6 - 6: IiI11Ii111 - Ii
  if 1 - 1: I1I + OooOoo
  if 98 - 98: i1iiIII111 + Iii1i . IIiIIiIi11I1
  if 96 - 96: OooOoo / oOO - i1 * I11iiIi11i1I
  if 72 - 72: i1i1i1111I + Ii - Iii1i - i1i1i1111I - i1I + Ooo0Ooo
  if 74 - 74: Ooo0Ooo * Oo + Iii1i - i1iiIII111
  if 22 - 22: IiIIii11Ii - Ooo0Ooo . i1 . i1I - ooo000
  if 68 - 68: ooo000
  if 40 - 40: i1 + I1Ii1I1 + I11iiIi11i1I . Oo * I11iiIi11i1I % I1I
  if 100 - 100: OooOoo + Oo / OooOoo
  if 33 - 33: IiI11Ii111 / OooOoo
  if 98 - 98: I1Ii1I1 . IIiIIiIi11I1 * i1I - iI1iII1I1I1i % i1I * IiI11Ii111
  OOO00oO0oOo0O = [ ]
  OOO = mMonitorInfo . getAllControllerDSInfoBy20 ( OOO00oO0oOo0O )
  if OOO is not None :
   WGWSServerProtocol . broadcast ( OOO )
   while OOO is not None :
    OOO = mMonitorInfo . getAllControllerDSInfoBy20 ( OOO00oO0oOo0O )
    if OOO is not None :
     WGWSServerProtocol . broadcast ( OOO )
    else :
     break
  else :
   WGWSServerProtocol . broadcast ( WGWSServerProtocol . timeInfo ( "" ) )
   if 42 - 42: OooOoo + i1i1i1111I - iI1iII1I1I1i - oOo0O00 * i1I + Ii
   if 46 - 46: oOo0O00 . iI1iII1I1I1i - Ii . oOo0O00 + i1i1i1111I
   if 83 - 83: IiI11Ii111
   if 77 - 77: iI1iII1I1I1i - oOO % Ii * i1I - I1I
import configparser
if 42 - 42: I11iiIi11i1I - Ii / Oo - i1i1i1111I + I11iiIi11i1I
cpwebsocket = configparser . ConfigParser ( allow_no_value = True )
cpwebsocket . read ( wgGlobal . wgcloudpath1001configfileName , encoding = "utf-8-sig" )
if cpwebsocket . has_section ( 'wgconf' ) :
 config = cpwebsocket . items ( "wgconf" )
 if cpwebsocket . has_option ( 'wgconf' , 'websocketpwd' ) :
  websocketpwd = cpwebsocket [ 'wgconf' ] [ 'websocketpwd' ]
  if 83 - 83: i1 . iI1iII1I1I1i
if __name__ == "__main__" :
 mMonitorInfo . printCHS ( "Configure in the wgconfig.ini file [UTF-8 format]... websocketServer Start" )
 if 57 - 57: IiI11Ii111 % IiIIii11Ii / oOo0O00 + Ooo0Ooo - i1iiIII111
 if 87 - 87: i1iiIII111 . i1iiIII111 . oOO . ooo000 * oOo0O00
 mMonitorInfo . printCHS (
 "start websocketServer Start [{0:s}.{1:d}  udp]" . format ( wgGlobal . dataserverIP , wgGlobal . dataserverPort ) )
 log . startLogging ( sys . stdout )
 factory = WebSocketServerFactory ( "ws://{0:s}:{1:d}" . format ( wgGlobal . dataserverIP , wgGlobal . dataserverPort ) )
 if 33 - 33: IiI11Ii111 * i1iiIII111 / i1I . OooOoo * oOo0O00 + ooo000
 factory . protocol = WGWSServerProtocol
 factory . doStart ( )
 reactor . listenTCP ( wgGlobal . dataserverPort , factory )
 reactor . run ( )
# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
