Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cb5704e

Browse files
committed
Initial revision
1 parent 7cc5735 commit cb5704e

36 files changed

Lines changed: 8306 additions & 0 deletions
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
# copyright 1997 Just van Rossum, Letterror. [email protected]
2+
3+
import Splash
4+
5+
import FrameWork
6+
import WFrameWorkPatch
7+
import Win
8+
import W
9+
import os
10+
import macfs
11+
12+
class PythonIDE(WFrameWorkPatch.Application):
13+
14+
def __init__(self):
15+
self.preffilepath = ":Python:PythonIDE preferences"
16+
WFrameWorkPatch.Application.__init__(self, 'Pyth')
17+
import AE, AppleEvents
18+
19+
AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenApplication,
20+
self.ignoreevent)
21+
AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEPrintDocuments,
22+
self.ignoreevent)
23+
AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEOpenDocuments,
24+
self.opendocsevent)
25+
AE.AEInstallEventHandler(AppleEvents.kCoreEventClass, AppleEvents.kAEQuitApplication,
26+
self.quitevent)
27+
import PyConsole, PyEdit
28+
Splash.wait()
29+
PyConsole.installconsole()
30+
PyConsole.installoutput()
31+
import sys
32+
for path in sys.argv[1:]:
33+
self.opendoc(path)
34+
self.mainloop()
35+
36+
def makeusermenus(self):
37+
m = WFrameWorkPatch.Menu(self.menubar, "File")
38+
newitem = FrameWork.MenuItem(m, "New", "N", 'new')
39+
openitem = FrameWork.MenuItem(m, "OpenŠ", "O", 'open')
40+
FrameWork.Separator(m)
41+
closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
42+
saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
43+
saveasitem = FrameWork.MenuItem(m, "Save asŠ", None, 'save_as')
44+
FrameWork.Separator(m)
45+
quititem = FrameWork.MenuItem(m, "Quit", "Q", 'quit')
46+
47+
m = WFrameWorkPatch.Menu(self.menubar, "Edit")
48+
undoitem = FrameWork.MenuItem(m, "Undo", 'Z', "undo")
49+
FrameWork.Separator(m)
50+
cutitem = FrameWork.MenuItem(m, "Cut", 'X', "cut")
51+
copyitem = FrameWork.MenuItem(m, "Copy", "C", "copy")
52+
pasteitem = FrameWork.MenuItem(m, "Paste", "V", "paste")
53+
FrameWork.MenuItem(m, "Clear", None, "clear")
54+
FrameWork.Separator(m)
55+
selallitem = FrameWork.MenuItem(m, "Select all", "A", "selectall")
56+
sellineitem = FrameWork.MenuItem(m, "Select line", "L", "selectline")
57+
FrameWork.Separator(m)
58+
finditem = FrameWork.MenuItem(m, "FindŠ", "F", "find")
59+
findagainitem = FrameWork.MenuItem(m, "Find again", 'G', "findnext")
60+
enterselitem = FrameWork.MenuItem(m, "Enter search string", "E", "entersearchstring")
61+
replaceitem = FrameWork.MenuItem(m, "Replace", None, "replace")
62+
replacefinditem = FrameWork.MenuItem(m, "Replace & find again", 'T', "replacefind")
63+
FrameWork.Separator(m)
64+
shiftleftitem = FrameWork.MenuItem(m, "Shift left", "[", "shiftleft")
65+
shiftrightitem = FrameWork.MenuItem(m, "Shift right", "]", "shiftright")
66+
67+
m = WFrameWorkPatch.Menu(self.menubar, "Python")
68+
runitem = FrameWork.MenuItem(m, "Run window", "R", 'run')
69+
runselitem = FrameWork.MenuItem(m, "Run selection", None, 'runselection')
70+
FrameWork.Separator(m)
71+
moditem = FrameWork.MenuItem(m, "Module browserŠ", "M", self.domenu_modulebrowser)
72+
FrameWork.Separator(m)
73+
mm = FrameWork.SubMenu(m, "Preferences")
74+
FrameWork.MenuItem(mm, "Set Scripts folderŠ", None, self.do_setscriptsfolder)
75+
76+
self.openwindowsmenu = WFrameWorkPatch.Menu(self.menubar, 'Windows')
77+
self.makeopenwindowsmenu()
78+
self._menustocheck = [closeitem, saveitem, saveasitem,
79+
undoitem, cutitem, copyitem, pasteitem,
80+
selallitem, sellineitem,
81+
finditem, findagainitem, enterselitem, replaceitem, replacefinditem,
82+
shiftleftitem, shiftrightitem,
83+
runitem, runselitem]
84+
85+
prefs = self.getprefs()
86+
if prefs.scriptsfolder:
87+
fss, fss_changed = macfs.RawAlias(prefs.scriptsfolder).Resolve()
88+
self.scriptsfolder = fss.NewAlias()
89+
prefs.scriptsfolder = self.scriptsfolder.data
90+
self.scriptsfoldermodtime = fss.GetDates()[1]
91+
else:
92+
path = os.path.join(os.getcwd(), 'Scripts')
93+
if not os.path.exists(path):
94+
os.mkdir(path)
95+
fss = macfs.FSSpec(path)
96+
self.scriptsfolder = fss.NewAlias()
97+
self.scriptsfoldermodtime = fss.GetDates()[1]
98+
self._scripts = {}
99+
self.scriptsmenu = None
100+
self.makescriptsmenu()
101+
102+
def quitevent(self, theAppleEvent, theReply):
103+
import AE
104+
AE.AEInteractWithUser(50000000)
105+
self._quit()
106+
107+
def suspendresume(self, onoff):
108+
if onoff:
109+
fss, fss_changed = self.scriptsfolder.Resolve()
110+
modtime = fss.GetDates()[1]
111+
if self.scriptsfoldermodtime <> modtime or fss_changed:
112+
self.scriptsfoldermodtime = modtime
113+
W.SetCursor('watch')
114+
self.makescriptsmenu()
115+
116+
def ignoreevent(self, theAppleEvent, theReply):
117+
pass
118+
119+
def opendocsevent(self, theAppleEvent, theReply):
120+
W.SetCursor('watch')
121+
import aetools
122+
parameters, args = aetools.unpackevent(theAppleEvent)
123+
docs = parameters['----']
124+
if type(docs) <> type([]):
125+
docs = [docs]
126+
for doc in docs:
127+
fss, a = doc.Resolve()
128+
path = fss.as_pathname()
129+
self.opendoc(path)
130+
131+
def opendoc(self, path):
132+
fcreator, ftype = macfs.FSSpec(path).GetCreatorType()
133+
if ftype == 'TEXT':
134+
self.openscript(path)
135+
else:
136+
W.Message("Can¹t open file of type '%s'." % ftype)
137+
138+
def getabouttext(self):
139+
return "About Python IDEŠ"
140+
141+
def do_about(self, id, item, window, event):
142+
Splash.about()
143+
144+
def do_setscriptsfolder(self, *args):
145+
fss, ok = macfs.GetDirectory("Select Scripts Folder")
146+
if ok:
147+
prefs = self.getprefs()
148+
alis = fss.NewAlias()
149+
prefs.scriptsfolder = alis.data
150+
self.scriptsfolder = alis
151+
self.makescriptsmenu()
152+
prefs.save()
153+
154+
def domenu_modulebrowser(self, *args):
155+
W.SetCursor('watch')
156+
import ModuleBrowser
157+
ModuleBrowser.ModuleBrowser()
158+
159+
def domenu_open(self, *args):
160+
fss, ok = macfs.StandardGetFile("TEXT")
161+
if ok:
162+
self.openscript(fss.as_pathname())
163+
164+
def domenu_new(self, *args):
165+
W.SetCursor('watch')
166+
import PyEdit
167+
return PyEdit.Editor()
168+
169+
def makescriptsmenu(self):
170+
W.SetCursor('watch')
171+
if self._scripts:
172+
for id, item in self._scripts.keys():
173+
if self.menubar.menus.has_key(id):
174+
m = self.menubar.menus[id]
175+
m.delete()
176+
self._scripts = {}
177+
if self.scriptsmenu:
178+
if hasattr(self.scriptsmenu, 'id') and self.menubar.menus.has_key(self.scriptsmenu.id):
179+
self.scriptsmenu.delete()
180+
self.scriptsmenu = FrameWork.Menu(self.menubar, "Scripts")
181+
#FrameWork.MenuItem(self.scriptsmenu, "New script", None, self.domenu_new)
182+
#self.scriptsmenu.addseparator()
183+
fss, fss_changed = self.scriptsfolder.Resolve()
184+
self.scriptswalk(fss.as_pathname(), self.scriptsmenu)
185+
186+
def makeopenwindowsmenu(self):
187+
for i in range(len(self.openwindowsmenu.items)):
188+
self.openwindowsmenu.menu.DeleteMenuItem(1)
189+
self.openwindowsmenu.items = []
190+
windows = []
191+
self._openwindows = {}
192+
for window in self._windows.keys():
193+
title = window.GetWTitle()
194+
if not title:
195+
title = "<no title>"
196+
windows.append(title, window)
197+
windows.sort()
198+
for title, window in windows:
199+
item = FrameWork.MenuItem(self.openwindowsmenu, title, callback = self.domenu_openwindows)
200+
self._openwindows[item.item] = window
201+
self._openwindowscheckmark = 0
202+
self.checkopenwindowsmenu()
203+
204+
def domenu_openwindows(self, id, item, window, event):
205+
w = self._openwindows[item]
206+
w.ShowWindow()
207+
w.SelectWindow()
208+
209+
def domenu_quit(self):
210+
self._quit()
211+
212+
def domenu_save(self, *args):
213+
print "Save"
214+
215+
def _quit(self):
216+
import PyConsole, PyEdit
217+
PyConsole.console.writeprefs()
218+
PyEdit.searchengine.writeprefs()
219+
for window in self._windows.values():
220+
if window.close() > 0:
221+
return
222+
self.quitting = 1
223+
224+
PythonIDE()
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
(This file must be converted with BinHex 4.0)
2+
3+
:$&GTC'GPG(-ZFR0bB`"bFh*M8P0&4!%!N!F5HcQ*!*!%!3!!!"%3!!!3%!!!!@X
4+
*!!!!E'PZC@CTC@aNF`N!!!"6Bh*[E'aLBA*c"`!!!!aAD@4RCA4c,R*cFQ0bEfa
5+
c)&"bC@Cc1'XJ-LiiBMGi!!"bFh*M8P0&4!%!rj!%!*!5X6"P#!#3"K*lEhKc#!!
6+
!!'PZCQpdCAKdF`B!!!"#GA4dEfjc!`!!!(*eER-*!!!!FR9ZBR9dG'pZF``!!!"
7+
bG@jcC@aPBh4TEfjc$!!!!(*eER0PE'*eG(4[ER-%!!!!BQPZC(-%!!!!F(9cD(-
8+
0!!!!E@9ZG9pREh4[E'PZCA-*!!!!FfKTCR4XC3!!!-3!a!#3"3X!#`!4![m-!2r
9+
q!!!!5!!!!%J!N!F,!!X!N!8"!!S!N!8,!!X!N!#!"!#3"3X!#`#3#8J!!!")!*!
10+
&!J!"!!)!N!e(IP3!!!!#!!$rN!B!!Cb3"2rr!!)!N!X,!!X!N!8,!!X!!!#!!!!
11+
!S!!!!*J!!!#'!!!!NB!!!)4J!!#4J!!!KJ!!!*J!!!#J!!!!J!!!!2m!!!$%!-3
12+
!N!8,!!X!%3,r$!$rrJ!!!%J!!!")!*!(#`!,!*!&!3!+!*!&#`!,!*!!J!3!N!8
13+
,!!X!N!P)!!!!5!#3"3)!!3!#!*!04hq$!!!!!J!!rj!'!!'FN!6rr`!#!*!,#`!
14+
,!*!&#`!,!*!1UUUS!#4%B!!*%B!!!NB!!!#B!!!!)!#3#rm!!!",!%X!N!8,!!X
15+
4!3%!#J#3"3X!#j!!!!)!N!8,!!X!N!8,!!X!N!8,!!X!!!J!$!!1!!m!$i!2`!q
16+
!$`!1!!`!#!$r!!!!5`",!*!&#`!,%3%"!!S!N!8,!!Z3!!!#!*!&#`!,!*!&#`!
17+
,!*!&#`!,!*!)rq"r`$q!(`!1!!3!N!Ar!!!!53"*!*!&#J!+%3%"!!S!N!8+!!U
18+
3!!!#!*!&#J!+!*!&#J!+!*!&#J!+!!!3!"J!(!!H!"m!(`!H!"`!'!!3!2m!!!"
19+
*!%N!N!8+!!S4!3%!#J#3"3S!#T!!!!)!N!8+!!S!N!8+!!S!N!8+!!S!N!Mr`(q
20+
!2`!H!!`!N!Ar!!!#bQ!1!!"-4%9'!)!!N!C"q[rZ6R&1F@!!!!*19J!!,`XQEJ!
21+
)-#i!'QF1DejA3'G5DPK53'SXB!S[#dkk!'*BMf"),`Xr,J!-2bi!$LmZ!"![,J!
22+
8(bi!'%kk!&T2l`!5B#J[#cmZ!!`r,J!1,bi!%#mZ!"3I,J!B6VS"d%r[!"*J##m
23+
,6VS#,&L2*Pp1AL"I6qm!&%l3K'eKD@i!!!"19J!!6Pj1GBT0H8a%48C*EQPd!!!
24+
!6PEr[NMR(c!q,J!5*Qi!#L4Z!"C#E[r-I!"#E[r+5'lrr+Kd)&)[+!!)U(0#TkM
25+
B+Km["DKk,`ZSHdKZrqUSQ+LH,`ZSSdKZrpDS05JZrpC`%1#N)#lrfR)3iU!Y32r
26+
1)LlrhR33j+%Y3Ir5d)63J5e!rmBJ5U!T5Qi!&'F!!,Jf"f!5)&)JD!"3)&!--!!
27+
0-!"R$&*$-#i!&0"(X%0Zj$!$N!"(28$rc$`Z!"6F4ja$8dCb!G*$28(rbR3%e'X
28+
!!Mm#0"284$m#U*-J8L"S!&![%$m(2blrc+L&5NC[*(!%d'X!!Mm!-"2340"ZrmJ
29+
r!+L6)&)JD!"3,a!r,[r+2`DSK8KZrlj)HJ"mU'C)E[qqU*dr+`!#-#lrb0"!d&0
30+
53$m!U*-r+`!'-#lrb0"!d&053$m!U*%J5U!U5Li!#'FD,`Sr,J!82`F[,J!1,`X
31+
I,J!)6VS!3Nr[!")[,[rmU(-["DKj,`@Sf8KZrqUSQ8cI$2K1ANjeLNej6%4&4N4
32+
bBAF!!")3-C!3!%j@rqS[#dKZrrbSG#"Z!"BJ8#mS!!LSFd+RU0JQAbm,U(S[,J!
33+
+U(Y)E[rUU*LSRMmm!$+SR#mZ!!USSLmZrrbSFbm,U(N[#kMC5'lrkULC*Pp1ANj
34+
eMdej6%4&4NKTCfKXD@GSG!!!6PB!!%jH6R@,6AP-4%9'3fa[Ff8!N!9%!B!DF#C
35+
)*NS564**D!QB!BJ#3!)J!L!%%!3)#!3)"!J"J"[`2rJrqKrr(rp[rj!%rRrq2ri
36+
rr"rm$rJ(q!Ii!!N!#!!!!%3!N!30J"*`%N`55LJ++!*)!N!#)!)J""!%#!J%#!3
37+
)!*!%$B!Im"rm(rirrMrqIrjrrMrq2r`Ir!ri"rJ(q!!*!!J!!!"%!!!"J!'!!B!
38+
"J"')-BarrM'-%BJ"J!'!!B!"J!#3"!2!!m!$`!2!'pJlh(rqrrprrM[F'pJ$`!2
39+
!!m!$`!!!!!F!"`!!!2)!N!5!"!#3"4!!%!#3#8J!!!")!*!&!J!"!!)!N"%#!*!
40+
&%!!3!*!&!J#3"4!!%!#3#!)!!`!$J!2!!q!$m!2J!m!$J!-!!J#3#`)!!`!#J!*
41+
!!L!#%!)J!N!#J!-!!J#3$J)!!2q3"J!"QC!%rrm!!`#3$``!!!!2!!!!$F!!!!a
42+
`!!!0(!!!$%F!!!dF!!!-F!!!$F!!!!m!!!!-!*!4mJ#3")!%!*!&%!!3!*!*5!!
43+
!!%J!N!8#!!%!!J#3%3)!N!83!"!!N!8#!*!&%!!3!*!12rJIm!rJ"m!$J!%!N"8
44+
rq"!3##!%3!+!!3#3%J)!!2q3"J!"QC!%rrm!!`#3'Jrrrm!$4%F!!0%F!!!dF!!
45+
!$F!!!!-!N"R+!*!%J!)!N!83!"!!N!P)!!!!5!#3"3%!!3!"!*!4!J#3"4!!%!#
46+
3"3)!N!83!"!!N!J#!!-!!i!$`!2J!r!$i!2!!i!$!!)!N!X#!!-!!i!$`!2J!r!
47+
$i!2!!i!$!!)!N!i"!!$rN!B!!3#3#J)!!`!$J!2!!q!$m!2J!m!$J!-!!J#3#XS
48+
!N!5!!J#3"4!!%!#3#8J!!!")!*!&!3!"!!%!N"%#!*!&%!!3!*!&!J#3"4!!%!#
49+
3$Mri(r!2i!I!!i!"!*!92rJIm!rJ"m!$J!%!N")"!!$rN!B!!3#3%$ri(r!2i!I
50+
!!i!"!*!0"FjJ#J!!6%4&4J(A!!"1qJ9'6R919[r'51FI-#4Z!!Jk,J!-1#i!$LC
51+
Z!"!-4!!"E!K#8h!"B!!"L%KZrrbSG#"Zrr`@+!"'98m[#N*R2`@SKM!I2!"+4QF
52+
%[%4Z#$D&F!"J!!&FF!!3!`"!!#!r!+L)98m[#N*R2`@SKM!I2!#m4'i)0S9`!@!
53+
!!6B-4J!"E!K#8h!"B!!"+$e'rmC)E[r'5'lraMmm)!kTkdKZrmC)E[r'2c`3%+R
54+
V286rd%KZrp")E[r32c`J$URV5'lrd%KZrp!r2"!3UHXp4IrD5'lrfNKZrpSr2#!
55+
1UHY)E[rD5'lrfMmm%"#TkdKZrpT)E[rN2c`3$URV5'lrd%KZrq3r2"!%UHY)E[r
56+
'5'lrj$mm%!DTkdKZrq4)E[rZ2c`3%+RV5'lrlNKZrr)r2"!1UHY)E[rb2c`!&UR
57+
V5'lrmNKZrr)r2#J3UHXf,[rd98p"qJ"f5&#SM$!I2J"+3fi%GJ"J5P92,`T#Ccm
58+
$U)B`(p"(2!"96bm+3QF`!e*!2`#SKM!Id%Fk!,a%EJbi4@i)Z%9Q'P*$B"Dm4'm
59+
#8d0+3fi%GJ"J#,T%E,*53f#Z0S0`!8cI$2K1ANjeLh4bG@jMFh4bD@jR!!)"b8j
60+
@rrj)ja``*Qi!#$BZ!!`NEJ!11#S!"TKU!!)JEJ!8)&!JD!!)'LJ!4M!U!!*83$m
61+
!-",3EJ!52`#SNdKZrri`"&G!2`!r!bm,6VVpm%S!6qm!$'FJ,`Y#CcmZrrkSKEC
62+
Zrrj["MmmrmQSJh!!%!8r!+L)B!J[#d*R2`1SK8cI$$K1ANjeM%4bBAG8CAKd3f9
63+
XE!!!!%j@rkj)jam`*Qi!$$JZ!"BU,J!B5'lraUKd)%8J8#mS!!LSFeP2U0JJAbe
64+
)rqi[,[rZU(S[#kKl5'lrY+LBU*j+,J!)CJ!#(Lm,U+0)E[rDU$8J,[rDFK$LS#e
65+
!rr)Q,[rHiU-X,[rLiUBZ!0k$hSB-4!!'E3!"EL"&)&!YD!"3rp3JE[r8S#NNE[r
66+
8*&,8lJ!829,rdMeU!!,rXMeU!!6rf&b+A83Y5[qZ2!3Z#N*ZrrC+E[r5CeTC6cm
67+
Zrp+U(L"I*JK+JfG+)%-J8#eS!!Erq#eS!!Vrr%KZrrJr+`!#2a1SU%KZrrK#Cc!
68+
Zrrb3!'lrq#"&)&!b+!!3NN!`!H")lNM33H*!2`#SU%KZrrJ[!kSIGJ"J(J`b!!N
69+
`!'B82!053b"+d--Z#$!%N!"$28$rpQ!'8N1f4'hH5NCY!!#J)%8J8(!3d'J!!Y"
70+
Zrl)h3!!#)%8J8$!S!!,3E[rB0d!!"L"&)&!`+`!'X'J!"Qm+)%8J8$GS!!B!"M!
71+
V!!+`D`!'E"B["6mZrr3[#cm',blrVNkkrGK2l`!3)%8J8$!S!!,3E[rB0d!!!L"
72+
&)&!hD!!'!!B`+`!#X'X!"Q`@,`8r,[rd,`Xr,[rf,`G1Z[fH6qm!%#"&)&!hD!!
73+
'!!BJE[r8S#TJ(NT%CaS["6mZrr3[#cmm!!0"qJ$+5&"1Z[eZ6qm!%#e6rrJYD`!
74+
%rr`J45"3-#J!!Y"ZrpK63$e!rrT53$e!rriJ45"3##J!!!!4C`J),J!!rrPR$NK
75+
ZrmT"qJ#'5&#SCQ!-5'lrbN(k!)T)8+KQ5'lrbULG3QHSR%KZrrLSSULH5Li!#QB
76+
'5Li!#'FL)%8J8(!3d'J!!MG!!!)J45"30fJ!"J!'2c`!-ULF,`ZSSLmZrmDSFbm
77+
ZrqkSH5mZrqkSf8KZrl5SQ8cI$2K1ANjeLNej6%4&4N4bBAF!!#Jr2cm!%'CQ-$"
78+
QCM!`CQB`-'CQ-$!!%$!`CQB`-'CQ-$"QCM!`CQB!6PB!!%MR($!D,J!B*Qi!&$J
79+
Z!!if,J!-*'i!#$!Z!"TR3P0!C`T63'FJ8d"R0Q!d,`Sr!cm%,bi!%#m,(`9#*dk
80+
kr0C2l`!8B"S[#Mm$2`3[,J!3,`XI"4mm!!&1Z[bk6qm!&%cI$$K1AL"I6qm!&%l
81+
3K'eKD@i!N!C%!!!"!!1!"m!"!!%!!3"rr(rm!3!"!!%!"m!$J!%!!!!"!!1!"m!
82+
2i!rJ!i$rr[rqrrlrrJ1!$q!2i!I!!i!"!!!(!!F!!!%!!!!4%!!!%"!!!!&V"cG
83+
,$#RH!!!!(!$q!!035808!!8!)Na%48B!!3"U3e958`!$!)*MD@0Z!!-!XJ(8!!`
84+
!N!J"e3!B!!!!b!#3"!(@!#)!!!'3!!#3"!(A!$-!!!(I!*!%!GJ!3J!!!Li!N!3
85+
"f3"0!!!#H`#3"!(8!!!J!!,)!*!%!GF!B3!!#IB!N!3"e!"A)!!&PJ#3"!(9!&`
86+
J!!AH!*!%!GErr`!!"LB!N!3"errr!!!2b!#3"!(8rrm!!!CZ!*!%!GArr`!!"f3
87+
!N!3"e[rr!!!)@J#3"!(Arrm!!!NS!*!%#e4hEdaTEQ9-4%9'#f0XEh0PC'&bFQp
88+
h#@p`C@jKFR*[Ga"ME'pcC@4KFR*[Gh0[E'PN$Qp`C@jKFR*[Gh0[E'PN#Q&bFQp
89+
hFQPRD(3*BA*bEhGNEhGZ"%KKEQ3%4QPcG!Y#FQphFf9b6%4&4V4I:

0 commit comments

Comments
 (0)