From e4dd0282c7d981d9b4396a4924e981c7e6183428 Mon Sep 17 00:00:00 2001 From: missop Date: Sun, 13 Oct 2024 21:15:41 +0800 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=20task2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- members/missop/task2/bind-wallet.png | Bin 0 -> 278221 bytes members/missop/task2/index.md | 89 +++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 members/missop/task2/bind-wallet.png create mode 100644 members/missop/task2/index.md diff --git a/members/missop/task2/bind-wallet.png b/members/missop/task2/bind-wallet.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c13e40c960edcdc37c67880e620b49f45e00b2 GIT binary patch literal 278221 zcmeFZbyOVRx-AL`Nst7W;2K;KAP^+DySoHyXxs@N0t9!5Ai>>T1Hm=8LvVNZyV!Eh z8Sjq$?%TgT-ha2p=yXxtwW?~#_swt4SqYGn5q*V-hX?}$^GaMyNC5`s

PSi|6pq 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]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�$)oqh!9}fPeHvw%q3+pKSsNRha0o>z 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

f6B zCck*Pd2&44S{j-I!caXIIR>XCLo53zXbIC?`@w|1L$A;T!S?H8hIZ}=u}^u7OmQC6LiwG->Brxk5?2YxPI^TNYGHim$Q@9^&xAGq zzQd*i7)v;$y|e`bF8@XR>zt`VwD;)bomx*A@<; zEX4yF6hs`-mjM};jDhJ?ZOe^xzm$XTO5$HW0gZx!Sm2;G8T09^gX20|`fL89<7r*tf3V|INzSU^{PKT`x+XhkkOLY*()ArUL1Sri-n`QPU zGtfj7jq&`hDZ>pY6WCJ<^j<> zOIv7oTW+Y&y8<+t+W|HzDKHk7fg@li@C$UBA6gPV&x-O94g{owL?rJT0ss$FKMtp< z(qs#a8k!Dn);)^l)XWnCk9lQ1YN`Iavz2x|} zeN8IIz0clieR(6JOnV$!hW*z=CJ!F4(C|7oV+RYsKfi2#X=S!VA?2-PN^;@5!^hP! z>LrfGDn?86Elbdak_c%5!#p;L59O(a8Z$?w?dMhAraq&U8+_1?Jps%FkFxd44m~1k zx=UtGIVq!q!|>ZX+R#cRzI2{`^XVeH*;En?3|nLrh3J@`f5Hxg9Wb$k zWAhjom$J?lLHA*)7Zhu9Sk&*^(J#-CY`44hDvbX_p>fWjl%`<2R(fMtlNAKiCGug8 z(-7??9DKSh^T3tI+c{uu85dy+A{1cOWd)}M1JjDH`%lo!ONBV>0U2T(-zOmFU|`H@ zoT0-U%5QBnW(T#zKqXg-fW&kdNLBDUz}l_zv(-rRste1qgC4K}(s(}?U zV%|I;#emgpqSNXM-=oWz@9|BkljR93lK?*LE3HII6;@3us($(6Z2EBMz~nGi$z$F{ z_9BSa{04}cTtC90FUyoBtn{HZ$wc)7`}BrbL}B~!)aDh_j#H|Yyz3^|kqj`vp6X2= z|3vU(L&Hrv70u&)cEG&H!2v;7lyuGK*DgxRPbl~-ZZ7X`tyq7De{Hb|Zud$$uKZaq zzy2RfEdbG=o?2)_2v>0KWB9zItRKLr;)3OL%#ExPL*6^67RM5Z18ToEb;CMf$8 z3JwXb;P<&#B`&VNI`q6FmC);D6h6BC@WMG5{%+%gHc`TNa>)T+@0ISx4e*U0kMASJ zCa0WHk8l%$fItv;6QC0r^^6euRqsv6zsGtrS>DL?pBp3m`}O}CNe^k3 z>$=Te!V+Cs2ky0rC+nZ{aa7V+NtAY*2t*rb5`JVa?WLoD1Z?LO*iKmXB%OgbpXAei zjPQql-#$Ox=ke^YuNmteG?-mK2LCm=K&o{px~4QW6FtYD=I%>bQ zZLra8lz`00UF%6Wv35?{F?T+DD8}a37?}V2pi{Ejh~!$k!E**gus}F$vk4(RaPe7y z^htb@5&biq*8*l}bFp^{e7RSGE}?9ddeEDe#2HOns|AU>1L3!)A0z6YX5K0_%X&N%U+OTnwkv$`a>| zcaM;>chYE!=igh`y8nsn*^KY6kwLuy__kj>A?Z0XxBJ${-n3B+HY57#-Rm}^p&haz z+$=zI6WB#@_T;W3oCyoWFMqx7?oCj;2Ba9wdk+ds>Ag*u)|c1+=Qp$WSTIS$)Nl*y zE*jxNqs6Qf1gnbRUcTj)`Z6lvKIK_jKB9lax$cR;uU$gsl+#!(k99)_nFEHVrt&@I zUUkb7PmcJ3U3*cZiPf))1}G1Pb|9~IxlmsA@w@Ok65+oE;`EJo9LWSvX z$vNei$CaGWgUDWR-8~vC%FDFjRsJ=gv&}7?8f<8QM)$IE6b1J!wLLAj7yix_YyT5j zjJov2g~RJ=NB>i7=!L_J|77s)5m};Hcd^Wf8Qm|xghW~OT2~^oJQFbX{_@|+nmzAf?3&H)YKOqtlMhZ;Ez zYAN^d55={#VAhp#=VtfAd1!b`lRCkVKfWdUig87eUQ<(ZF)+?m%RXM_pB2!(a{(m# zj|IoY#i7+h88`UMnfKI&$N2FWEW6$2gM{Us^TL5Z9y9IWvwG6I8{i!>?4si5oF47S zaU{NVbNw6q@ui06oaZ!0;8&FdKc70!`POyMY)1KM^51cmQ8 zp8bzlP2=T4{7XuoG#ur4W^zSQoZYM?ITNBF1Q4`E{nue3w zkn>h6o1dZ49a745wRG#dhsjga}KMNI4)ma68kflq-koXDOs)W zpTm*0TWsH}22F+AcUk4gAb~rkD~$PNTRa}_q_}K9MR-7pE|Jq4LT!r{^990^ z6u+Dxl{skgQnkshBcT7M1~HVp275~0_Pff_|G>b%hd97g59>D)zJLU^NZ5gEf;bpN zSlHiiO%Ro-#Sz5GUkh<9tj{fOhP^lM&7BAOQD5(@t}H7tH*AP^=l5`qju{y?m?HcN zf|c-#2qUZm4*=F#nI!h;-|y-F=6}xVLf6GPGtFW9>pk(mT!!;@*h!ck;5M%N|MIaP zR~VTNpFXm_FHiGhD}4Hi!?MT!((e8|Ea2_Wtu{>X|I3&D zj10qD@agx(juIP=|2Krj@80C4=Md|EUdsP<%n=61udas^9HQlPbwr{WeqPT1>~;N! z!-Pw)w9lXF{2yNHhVM9{37<|+i>P1U9{%o5H+-5z8OT9O$9zqHbzlEk(7(H%Cvd*f z(ArY>ZGA`i-yYb{KgKN4X213FY)JZZ+JfcF7tnv`ENqwcftSfGXHm(|4;X( zwcY05Z2oUH-;j2Gx3~PvTK{JA|6SqxZ_)m5(f+$K^VeDH-)#Qt=kjwW`rXs~w`l*j zH~()jvOcmR|KID)ojte926HmX1+pDW0SE#b+*5U4b^1^4QU462Lh0qjSp@*>Gm-u0 zAJ*R*3@+ti-ea}zV?W_PB&a%r%X&PC#XE%vVFw(H*>E49Ul_K|?X^0IMpabW z9OMk!@mCpfiDB~-K@nj9i{OCI5rQatnE;c>VdTe7_D&5Yr^PugFT|3akcfGDLb89A zII}H}m?acn!W!$C{N$qC@VqBAnK(t92`3HdM(~NI0W7 z=dw0GN0P0Bo&sZ13c&ffVUY1=`{@|CKb}#*unYq008kk$38|$(9ts6SOG+j{abp3f zn9&*54H%C>0M1qqmp?fgzztTSHj6d^2RNu5nTyQZv6zbfkT{hR^P9pc6NhyC;y&4` zYRp%##$JzTO)3aY!vENz@-Ibl;Cm3uY!IMib_&Jm_xQIQ-yrs*I0WA=i_Y$zsgh z%xV}e>W{^eVhek>bF+aQ@={xxwK62Jyz0M;i_hIK&03)&Y%n83NMwV~(jj#BARv)7 z#SQlJG>rmW8w0SK1Jh{(@&L_|1Mq0|1&<^FK*Nkpeklg}Bf|aE_3#2N7Z+@t?ck$r zX=%w1bOPLPT1og~Dp->Y0`qiia)NbyQ?=c4$`npia^UR?o30$C@#`0GGQ=LsvjgK{ z&$hiNnVF=%zx-p+(|I*A1K)#!8~kwO)ESdX#kc~a#Km7@8shrA6ct|r;-oAosYF6* z1!P4k{dORTgkZ}PzFt7X1R_y3H_usMYSE8^XnLN8T)HSr|3`L7uO6|oGLq?*d^xAj zU#9xiMWlT=`kOrS%_^BYUk)tNjM=w*5NjLs1(RVrW=(sUwF~V5gFy%h1kDM!MyQn ziG3YnPdiP`cU-PuxR}%4RUxL{b*!ONp>zJntglKv@(8{MVfdDTE>>~EgerzY#L*rx zf_z)30FRCkO`4_#Rsb}Mix0PDQhhfMPS?-8@BpBs?F77itgeKVK1i9%g9y(>aFmux zD_$@HMcicrXHD zdELDn&2d>NLKyQUiXmW@T9B7ZT;%6C`{O2OjcPCB12K>D?AQYYL3I@egq1IX!)%d_DF-dTrEbSD+Z*U>@EVwgTh>PK@+}Wn zmHXG)eUGD&O{R7d3pe9t9cnOWd?d)qV*UN$y1kDeNWaa%!tPwzCm>3&^z#c!!7MTq z!MN>%5gnmeF?DHM-c0Rkn$xmz`!$zcm&dz`I)-sobY zfVNlV2Uf2|$=&?9OiTl=&T%GVX&xuTDieNTK%VzjU}2)3ffLqF*l-#9-RcoXIul5Z{j)L)2YO6|a$b~C z<|p6hG_xOA;_P`X86b99V>VT(IQ;ZU|ATjbc|wO$j+GtE$xWRehtU%Bv7K6>2{}iZ0#=Uk=ig*EJV=9Up1rBDwin=<@a9<7-(iJ+W?96q)lsa!w5K%^7rjj?v$TLH|Ur(1YL z;HMgCwGlLSBk5MPd;`6+im`ftd1Rel1g4fBfN%3MC*B_&h&L*4$OcwTxBvUSq`vNYk+6$i{QSf<{2n6zi{K0C0tS*EZ{xZHY9?d z3CQpml&zh#b)Rra`#HKfWH}<+j0V7>d)En=-e7(sfl$(*XWHEW6-VH1pqV#^^wlZF z%h!~o%R#%IA+o%ZgBD@j=9c zD=ua&ZarH#2~0;p2arb68DZ>W&%W(8f#fO%gABqSi^m>pxlzTEBimtC;($??>|zcS zXkCXEQK+W`p z&Ado(+|99^(oz;-Zois@j3WIm{vHpG$$Uh)+3(?%hpn!Uq5@L=AV`WEIywQxD;8zy z5}nJ_Z$CY6O7pCJu8a4qC9bNA7m98*TcV+5x_OYLKVf3^9@0}Ni&|O$K(mOzyH#TU z*c$uEps9A!)zr@v9kWL>q&1c$4dUX89sKp~WN!c){wLSwJ42S>$$cbG0G@OXKmC0P zUl$LX+Au}r5@S=<@qMp7a)W?xvZz@Ql9tu1!RK+-@MGjbhvP5FzJwT#3Ssz@`rkFY zjz(1vi)k=0X8$TxZ>-kCbvpI7G?#qcRyOW9TY$i~RXkJTQu-K{H|&a?bf(_~V1u`q zCD|(eD6SCMcrdI_5Hbg1oF6XrTd~_c*BJIyKwauH)FHHbFUk*xQVjM66!!%r< zX?lIRK(la(zt{W1=KNJI ze1Rxr+#_WnEo+(u_t%Dn0HK#PHbI(Pfx(L*Bp~PO zwweSc@WJ$itYxY@*vPAsydP1WhTfb#N3Ut9pN$M zeiCx{#2@>!%^P&hO?o7%KtfW))g)?2_SVr=dVoqiLy79@rbH5LEilg*L=;SR-`L_> z`>%sj?T-!m9F12-h!b0mr#U%JB2& z3gMx9sQfIyQbzqLignL3RkmW@Gc2Z3k&u5Fk4vaNER2-gaj5F6<2XN_t`%$YRi!2V zVoT?hSnlC;bmP?UdSOf+2{Nr!w%%)Nv zNBI}029>(#iXgwnGQ>%$MBR0>tq%t_4kr-Xa6a|!eG?1N=f*>>IK{dER%ZUfV2|LJ zru}u1k9CEk$hwOT^O2rL>hxHSrXG17o~ya^Nzs8W>E-^EVA0?irVw9ZtcFN^ z!LyJ*s>~jE93^v4;wap|XQ$@ea>BhN!m(hyACHEtF$(4wY))vTNK;-L4Wn3tnMu^$}rh zk4${RBrMbJW&QK*o{!YP_q6KFFQwbp9vWsM#l0&W2N41pFf+AHjhoDfSY`$=8xMD# z$;#6FAP__=EEAFD#$Yu^9rKkwH}`H(Qkon{uxPz#s*gdHO<-jEn zGRT;W0!y?Ls;Z35sutwe=AU>^hz%zkZqPnmlE{Akg87zfWHyW?$6ih6L%qu&zW3DT ziz#Nl%%0Oz4GIBFt(gaKj0=7uVTCCS4+4lWXneK*dO~(PP?-Ixp+hKSy3bjL%^W*g z?rvNV;~=gV$*2?;!)x=v0jO2=VwyOc6t6yxA7Ob7ORB8vc-14tekGS#G`O`6$(nAD z%t>Wd5-x#T)opNEZgD!`Dv#W5^Fag4QtwT|rQA$zkQ1Y9bet$V)BsGr0BZa1uMdWZ z-4mFhz&A#zoOM03a4-$}kTWb&mxd7##DnB)(}#g2B^DmkW-Nnn8^ z8BidEujUwhKrUY~UIIc&F(AWF9$OP_A?v{r9z&(jXqsHsx(b>ReJbW}dtu7jG34I` zLS~eekCEoT3IEdfx0+L@_uxh#TVqO=XN=Q}=Wau((jUU)UMFMsB!s!g_8?1AjaV*Y z?J(GeG9F}|VUo%?{CMkME9u-J67*(v7QmZ%AsU>(mJ3aGzm_QwOBpwR5qIa)t7eJL z{|sJDPimL7qvLaA=SYS`fR%Rw>`tF@`Apwa!0dcxu zL-Q?NFpUXbm>zC1OhtiA%Bk>%bGJ~Cf? zC%r4c^2`Ux@b$)Hkse-bk|3I5f!6b#t~#FLi6>JLtMd`=qj>mR3W~c7)HNuL0nZ#O zSLMQqRN&e{-%n<^vfCci+E}(;L*>+@ib*jIK&9QJ`Rco%RJQ^Zme}0K8HPtqG8L&M z5o~j5e@oG)gm1$?d#+1R6IFY;v#XwvB42d-EXgkEx!nt?=h*_=Peybwu)NGZ)euSF zHX!HDrHQ2E)Jpu)4J}EXs(}SXxd|9@GL1$(W3x3FaFN-8`@5;vb(^=OTMgg?sV{!L z%bWiXlc98&3<=HP1k4F1L+a!3R6aP$4k|qZLk8op8}$WaWVY5h{(5xjvrrSN6p` zrV4dhnID8~S+nRyE2DPcfE{Ftx>$H;@m8TEEn*e)?Jy5l-QMcU&kU<7`r7=Ybk{fx z2V&!cBv++fIFS)F;(f!k_as*&p=OZM7D|0=JrX%j$w?CIs8ZnlTr4=0$gyRVesA{dzAYaHIgF~|y3i}B40tgJTQVOZdo)RK9pOI#=I zXIj@ld4f`xB|;>7H%`numqf)3I%mfITQWvvS9$w~$$Z<)N|r5Vk>~*n)4?-<5Le~% zaJxrVJP(^>QLCx0HU%Ch-M^G>P81b=_J;CHkNKPROhFg!*a)jpA9llgV)d}@rFV!* zqQ&XTNKAigc=LyIA55Pz3jZ99ARLx*?R_MDN|B6C;}h*66+Lb+P3HCzgwDer--SlY zNIouex>++G<{(^J&|BxN!Zax;YT@GWm9BVeYv0L`13mO_a)VwL`gK1zT$M}}^EmRN zIsS&7v*#qc@{yRw=?8iCJT%VCPD(=?-YB$!*kzb3`=E_usd%XcEOkSV$Lt@4KDzc; z+~o9V5hCVCAl;|Je8H2-81H^GtVY^kUBcntm&3;G8BpPu{t+;{z*EgPlKS;}F3sI{yiM3QtL==xuo zXJvXLrWa_)&fw0ckqP4Ov_+r}Qaj$GT3vKwH%x0hqa~hHj#oK}AMOXgOA|L~UiN_T zwSM#9xLIDG|J4KR2a)zYIsjr#NxQkbvu*w}Xfs{e{#i1T;r@lb6hYqoo(ADq{Taq_ zr9!V&OR-b-ekxZO4`P3Nibuli1F|q@)7#bwyHC@xnY3qGL0#3)Ab03Q2T0g80KquS ztlB+fSQ|QS`?p=NL1|fCL^481OeF}l%!oZc1&_Jk8V$x4Mhrwkpo|Zrmkahq{Bh47m5Zxvy34a3$A^{YAs589v)L(}Qse?>(hg67Z!ZI!bjV{sq@n6{U;^6| z8fqn6C0Af#-E-cr`!25G9 z;uG$+=0m zBwNd_!icLy*4*KEMG>^4@$nIk{HqZs7v9aUO~zNKn~ZmT?8yA71@Lv1d}1~5sA=x8 z2$^BFOSk?%_TD_4>h=8}-HFnqlpz^YGEb#sUMeD)Gfzcj3dvCBR)a!@%9Ju>&X^F% z&|oM-SVHD9W=iG|&i%+*Ek1ki&;EVC=Q`Ip=h~k?K9@`OTJQHW+|T{o_iKp3w+>bY zR|3pHq4A;DT8=nYTD-2t~72 z;ZCP6cd;$_U?N9x*Mxeg4Rj;*E4P}oYqzsLa)*+65KT#|*tKC9pQnm9UBd!d>QV)r z)6K~>M?w}A^|HF@J_%A~b?II5xZ!Nn1D|={sM-{3rix{=CS?E$5!aD@sn>-v#JL)? zrn`qfX_4OWW_LUu%03&Mb9fq(G~p$23wHamS#n(Q79X4ZQQ3ak0@gcfh4c5?kIRIz zimMrBus!$k7DSEA_I&XhYK29)Gf%JVx}ryISw8oCQZlLZ#+j@{A$wrbC!kssXc`~n zZ-Hn(mi?YN_&fI-Nf0x(^f`Uf-rsT;wJWRk!AsrmXk2c;`T!Cs5jO5To1>4m{`dhR zscbS15k;WsdQFJ;BR;wg$e{LqXcv{V|5UF(=s4=n!p%GMdPz?o!Sta_fhnvv$fGDK7&NsCu@9sMp8o=FH{2XXYRt|c66`lEAkM>MZ);ntIn#Z{= zR5(BVWHfsAd+u(*q`W}A;w^Vwo7o_-6#YrTs8*5^gmSPHo`_S6qBfaeNOc`pH(Zqa+5kv|d;!%*4Y* z4+4IqjXqNCsL*oy&Dx3Ddl8hz;!Gpm4tZE7pZEf*jEnJb{aBP=9A#eom9{yy6JMr? z5=ivDrw}(UFJfvXiK*@6=RkEOd1dj@W0J|-X}PR2HyQCwX;45oP8tD8_ypXhC2XF7 z2xmO<58m_euiq8et1|GmT*l4RD_+)~9}6m7Y;JHBs$z$We7gpvl$R|wFu)cBIp z@Ms5gvg-oLFt7H32sJ*f$LemZ3>On-PP;tP&gm|M|MjY;2do)34Rk#EMO}^)JFKh> zqATBRx=cXT2x^m}I<-iKdy7`IKpJLWDy zXh}81MMfna_@CR>yz4QR5>kdwPfL5B`>gI(Z7CPts%h$PkV!kDrNG>L2l{*P{ zh;Guln~qJsNvzpkzZpSSjC>?13TPsflNWA6x?R|gZl)@-Z#Rxc{v?Fz0ERO{6qll>|Gfoph zD4|b&1D*&t)mDAbq!J}ZP$KIs(^#ZEgI5s3M)0agN?BW2oB&#V`rM3db)oTxRb1gL zL=Nx&vZ8XjON}KWi&1!k?Cp3!G|rTkdWutCC!8aRmRNG@Y9NlwgzmGZNog#XY1`L+4)`gJC}0=#y0cx4KsvI3i+eA%)v=#GyZU@;U(L3#=VvIOE?vNn3fmY z4VYv0?-z)t9_zdfuifC@e5RoNo%U9xQo`A!B7tR1M0gCLv+n{1hI2Q%?3YR-i8dgd zmG*K`5q)KhqLksQHqchk1?t~T+iXs}fh5R!t0N;j6`IW;NtSbir5(XOkV05Y11AU) z6elTr{RV_4YbyN*zi{ouThT@JZTL9&Gq=xRgXu~=1X3ICJ3R(ge9J=3#$5=%RR|R*y}8$1Lp2S z-o$T%zG@hx1hQ;Qwh%9)0bQ0OLbjQoL9}gL* zbY4S!r}lf8Hs76stVl%TTd66A@E^7r;n&U+I0DSO-`zEEe$!iKP(JdR@Hak7Z+Y#Xz2#}7 zoA>3-O>;nNoGfsjOd8DC#Xxw4X{y^ZW|ayilDo!nX%|2&MtLdR7&uWf;0LwlEt&U> zEgV6+;Og`zk}d8K@CK%vchccM6m8OAj_=T!@0*0qEpGdq&Tlog(@q;dR^(?HmS%{j z4&%Q96SY8AsW7;>i*A)78EDqotVpkyH0#zCT=c}3yT6_%ncUBx8e(goSuto&m_t#H z(}vB`0&TySBN{DeU;#s6P2N$W&5ViKg;c&gqumJOX|EY&*c&&w-|vHSGa;^mBt)eG z{eMV8Ol*cZj<5|6CzhjWQvs#6w(rrRZ1{t7?ebgKUJa=UAUsqOJf*J8$(O_n1V*m{ ziN}b%ZsuJvqB)==7n1W7k6MQd8mkKbIL?{wINSNz-_LHeW*qm;#VUNobdcLKqpfDg z8&0h9E^!hbQ)1|vm;wGV!@vNEO-G||>(9mmZEw5fwr{?@H|R4*Zq%FYvN9KG zrKx1tp0IF4-?_^1RBrpH$(>r2Hykun&TNT#7ae`=s>vTR!FMP)-gVRMo1W-!xtzRE z|H4J|W3qGP!UIK_N6|D5Bqo{)j56LKvBmh0w(Lts6SRMwp<@F;{K-1&s4nB@8=} zrV-^ehZQ81J6TuPKik7Q^jm^zEhR^JZWf2b=Hf~b!ZTKJ!!zc)C7&bw2K`VY4p+LW zx)5C=86nJjQt<#@om-ZC%lkGeYWW$jIo^MUUuvYX@~?931Ebo07Z{eZn$6O%P|2^f zuS{w-USZKwcAF;brbO~z!^p+A+*$1kMeMarJ40yluLrJzJ1y|B$aR?z@;>+hyN>!h=DD<(Qq%I=VE66# zHO)dg(-su?uYScsc1L0ThTc`K)GF)YokgQw5=VDZ&!ex_HhodCCs@7w?^idLRXo5T z^Sq)sC>PhZw=+TF@AX7Ip)}XFOZJ#p8#ga#fcrKyG*G^{VIb}CBT7|bB}JWz78$_>4IL_riq%Y?bP#FASZaye@>=RHz^ILY_U+_0k1sUedSZuk*(SipdtAzL#Y!XprHC{gIY8J-@Prw!%p?O8 z4|wTA(|8mRSf-;fexh8+Sb}L%{VN#ESbL%Aw0*OIy%@l4Lrm55l}gfKug$2Z^`*l) zr+mwo-uIOXsjQuTvsSpwlbG~fjQIQAHZymavfdFB-n}dKQ7J84DSt|SB*E`NSVt$g z1j4qST?CVW;-ba5BGZ20dX|A7M0@(|JvIenxMj~r2nXySHD4Ef>Zcv4xp&8LF7&C` z-fh~?FX)^M7j^i!>p)l+u5gzI%ve&bApXO#y|e;+Rtu61NASN{TDE4cD5{Ns9mVfw zi;5+QnZY2+r*FFZWU|ie7Mm+a^S{dQ@1mL9LVxJkY_zG1i_5|@Q$0OB|HigZmMTno zTiq6QiHZ<@e?LFJP$EpqcclpA$kI$9Nuz_v36t?9OJO%BJCY&+8}xtmTD|2iMKT*D{1mY3QjAd`%`Y)d@3t1r)P6?M+0p z4=ZRCGVWbPTeFGM1?;_zcY4=0Ax7;e7zjuzFoRJ`27u$X%FhE3(I0#^*gRCTrj8&W zSU!Nq?jXO+?3X42ur3T=PRSzv2eNs)J;Bz{d=4BAyx;+aBf!I_81<31rs`zIPX&Gg zo<>p&lIG9vq)tz?p3c7aMgT-Mec)qxx!l4&C^xo1dnB_ATt1rnw{xBv18#!2HDJvW zQ}+~@0tDC};5h92lp|XECCs~?Rq**BCLo}%at;ITKaWva%pLH|J%jPD$`Lk3f_?He z>LTXPCutRMHBN!+<6&S(bZAt|OGorcj5yiWNUztpj^Shw+L;MBhP?}2QVV;G#$orm z#7-kptu1_KpWEX1t&7|G7eWl3&D-07fY%8iy2OT>x^if!^vFf}oaz8=O&8G;$)&}n zav3YM?+5DbuPuEN8t&N4i931qx(=?Wg7c5?V2Hw303+RD!g58Rk>TBoAi+wYYe@#w z9UpoW{ZY_(i~Sk=lEr$$rnb6mt+tma=8}>JB4>bZ=0B>4D8x~=WU}Mf3t^Mphy|?8 znPLl#(=yn~FI2CL_f`8>yM40@Z-1DkLr;#(h>XElEiK|e4NFz2{>w}ECk985Lju=B zi9&?luX^mqw6$Rf;mE?@@*I5WY)}AgcDvj0jXM_HKl|FanotzQ+TDX2p+2R*?XCewI}dsBC>E{4PxuozU3*HYzT*w9GM-q!!l&omlp5aP zVg_Fq=0^Mx>(c1JO=m-xn%+FrzBKic&n$`MPl$hTo~vkcr2FtZnA^M?k$>$+#q@*+ zakq*{jGDd;Pr{1w6G~Rl#iblD-xp#ZKH)O~=r^NI*jL^k)1a}&S3U9U%v;YNV69pG z1HlS^Mug;dvyDP17Kac-?L)&`zB>~6lgwyeLa14>dO-;OuGfnevk_{Oe>%RImfw&8 zaTQpr3%BOY-&j<^tPmo2TkW{bWYh2a5d}&YCNecwr3*+4(sA(#;WiFO$o5TlU_S`%& z1<;l&V5#&Vz0L@%G8?UJY^pPdPo397f}TJe%+#AloP~(Vz1atO@#nge#7*~gVn?f? zf6jy~%*N-`uk5QDt7~Wo&f)f8^Pi{~TS5mofNftf^6JYkgeY7F$AGp-_N+6YgNywk z#N~(oyk~Nb?gP}SvGEA7f|v_EQ6C{({=71%*P;8u!JYB8P9uwAn22dYxZ{9*c)4s? z6GzpNz+lwq7qsmxE`R(p4-TH(&(}7MIp@jRWPZ1IzW*yHRWZd1rOAKkp-M{SF%N!@ zB4tpOQaa}iS2%$*r{i>*k+aY-1qB6%4!QI@Q@L3=Q&e$&?E{$v1X~mXNoicqSJTv0 zS-_Gc=z==2#ts`zV&mE-0DUaQ<{mm-t}pk~+MWUmvQNhVcaklr2Pj^?{O+SZPUHBq zIf-FlVm8@mo@-&SXn`Ad5Lq?5rWAouS6Vp9ek}tBjY8!x+kI8B`vcCgJPs&K8;3w3 z;0~zOK6PBBARHJ5MhSf;L7(L|vOU5vy%CN1@Bgkk#Nm*#+vl8O@LtNy1mEmtG#ctFXVG#DF4hKL{7|O zn?O#Eh?g*LFCE5YFv5{_QsJ} zXAicE_ddvH#!pNqkM=kAR|78H^}Wzw_1)u4O@lp%Xg5$Py*S3dxE<)G6@3(10r3e< z=ebH^b$rmVp6>*9&Bupnoz|m~bZQ$kqy?hv@g7{8VcmrzA^Ml(4+>4d_DmlL%?BL{ z<>G5(n=VBqPHE?CYWl@x*vJvE5dIQ!YZE9^zQ_~OlsixrOJ|B31AZZ(a7TUQ7JK86 zC#T3ZaUfIVON4pUyXfnhTdEEue(b`7o-t96&~hERoJxE<{R3MHbrtiJ1vNrV2i*vg zNMu}C9u^kQ6z@f2e!CG%!X@5c7}zK?67$W03*mZjEb;M@oq|9!k{@yYxx(w- zETmt)*wTu^(($?Ur7L-v+1yKJd?JF$AcbpsJ#*5kq8>70nTRze{2dyvU6`oEt!L|K zMIl+@KOUyDk2mPz39Hj=Rc8AG_?;1^TM$%Mz~}Mk3r8#Rgzc^GZ%&Uls$3UZV#j

TAp%oNdhSJy@WrP0uF+LKEZs9~181;+D$^E&4*UR-C6z_Fje z$=W4f`CQ*vPem746@GY#z;^lliZ5u{6(CzTGff!H$y;`4w^I!Z{$Bshicry#HE`~u*c7eh22$p7}M z^;DBclB}6pekP16CDj1ISdR*UT7P1j#K7RMvYYD2AHsx_fg=zq4v+JW3a%;`9f!*r zlg<#~@6fQ0F6Fr!_wndvC5mRsdx#DtQ8E6003n`v4Dy7)MUf6< zXj0pYw%>aIH$-H@T0b8YG*K}Hm@3C}2Ry~(4s6Tx-GD<-`%y6NI@GvyOIdGj4a}W< zHvr3*fB<^3)w5qU!d)6HH_dQGHk_yK2UA7JAE=ELP%H>R_rCgu=#RBpzJ7!@mrxOm z=lFC6&B`pO3uQs>%oc0#n;14H8}-hr_0PvPcp|30dDstn*|7wyeHQ4{Zlz^F^hmlH(8b-+~w2b{prqhe?y0&-T1$ zkGzA>_A?)a#FWFfB&4RM*6FERz3+r8se8Kz9NHzwqO5Vc!($OJu4_fZBM(_r%a_$T z1+i6;pL)O>zx`qogF-qIxfrLl=bj^sajbKlDWBUEm(f0@$e@Mu-@u8FdubHRsIccM zf=fIWr#<>IG-id}2R=Tz$>Anc7Uy;_7fLJ|F(!mXS;Y^f+@EeKHwnK%Kh*qyjqclV zOZRt0;VMQRt-ZcheW zfi-f}clIb4&8oF4jVNRmiO)4ve|Q}+d2eZin^Ft4X#!u=l z02ogYNky1hS^0uSQ?J|67gONZwF?nV#~pAy{D>`soY!ZX!C>#yPe}0Z0JOBn$gKnD zLgP-BjcLB%L4SDtb)26NcNMq^2OO192nex-!l@b2918TPsEkYF^+qsZh~{cC^P z%WvM`D7TMUd0OEh%5X9+etCnukh_rPM;VvLmdgR>S z%a$qF+mz`pZG%a3mT&p$!##{ddIHrik+TiAe6mbH$7R82eY*R>)TuoCEz?jxV;lt* zdQQvClXwlXhO4W zz|B$+a6?&PA-)BU&P$MVQ~McoXDOncD=Nxqy;SiDaHw5CdOVXb&&bF)+S0Lbs1QEn zauR2D7krin2!F-Z%}7|qTE<>{4;GHQ;G#NUUk>p<(sWpUI^94sMVk_dt|VbYnoT%| z>|U)|Uku0@%gb7gbt#9?VexDpJTDE}BG2c`ALxt?s6sTC>Be>DYAQXC>^{7oQ(uH6 zD`B?1IjH$`4Z`R0p8Oc86ULaZU#tdZjUL?{hI{7pi@rwtBuR$}=YQEU8ckb}SUt|T zJnEjuqnNsI5nTKy7$xe@6LKMp6XZ-4b&a~jJ(@KnzF>x3m+O{r319Ysm41Rx1+w9TA74)|*PZf4Gp|ZurD#fAfD@k>u@z{zqoWRb}r6w^0F_LwY)>Tj)fX? z?Dvx%*$oYW4C;%D5#l0qjZF0YlP6qm8Efj93LyV1v6-ON;IvKyZ*TW)Mt zifZq|oydkFu$up`910a^FG0s9II|;rMS-4lmjYC-GG-OBi6dwtYEs2LJ;H)A!CcU3 z%RCl#m%WPR>~d-;dpwGx3kRh!(SdJ-cA3g4$hxAZ?&Ph^x?U|pm3d~7rh)j^H7X=b z?+%^1%;|W8EG>VmJa=(nZrtF*;jTO4V%6jwxSn6-QSi9?)!6xQn$YwNko z@dLBe>_j2IRyk=!W+DtN#+P?Lsj6WoI^M9u8f=|iE@vC6ZK(Qnub5nJ5q?adZT)@s z;DEb_O#cQ4!q+bSfNh65t#gj;3d6LUG|-KzX^Y8KrOJhxTo>r=Ra^!<@s2J~kn81W zZ%h64=D)gVx0FfoXFcWxv@j~#7Ig`=lBM&?cQ-7)o%69Lh!!8Y{SNpNdM`#cYH%Yu z8Y^XPZe_*$|Ildi)Fg>cwz8g68g*ykpYD6S6ZDTCr>GE)kRo zUcFmx7t3n4)Dw!|-h9yLoM2KTY{*|9c^g{ioJ9QqU;x7dwnQ-|Tv#3y%>Ct84oh)4 zcN`P?`PhZs%W|${nzjsUm-!$3y(+vbxZgyi4QgMtB_Ta<_P$aW4bmm%Y^RjO~T>`|-b7 z`V2EB$kluM6?lp6gV3sCdKaAX_F%~JP^hRZKcn7jyFm}!yaO8UbubjW0g1z~Vtsj8sn z?uj!u@pBdBx4aZZ9dGIpzJv+`QQ(j8DAEUwVI9QEXU4QUb^jPQ%E=6_moY+rMKRF(;J>AfKIQevM)o zx!p@~`~+fN!zXTPmo6u?;eM@X4~U1Og8!~=(tlSsEYANMRyQDoZ3+B<;4mY-{-CMUOjJ~~^GQNP`N0n$aj2`Ox5*&A zlkgy63a961Co{}yqgxZJ4z=*;>go)AmBTsmJz)sTMblJ00dI$%lGC- zuKuhpp*HsGxLF4{odbvYO;^N86%upVu!)KmC=1;NH5aO+LnVatM=0kN)a*>^lQiz0 zkA46i(z|zAy6WGyh9u+H%S8o}$S^R6Jli9*GQT9>i~$tXA96}7URIUN!h_5erOyow znjh8b@u8We<`@a2*ghpbw0$(x=8ng@y7tWmnB&n+QCL!MQAul-BXNYB1bWpXpTUc!N`w;|iBydadrqV@T(kB5FA8R9=I7rXD)w|+7 zVHLk+QRyBX6%eXsBh13m512Zrs0tZ`SZpKODCejW#S`10nQjd7Zs+#aoX5{OR&_gS zGQu>)*GOA;b*at@mw1o*(qUGTZhb&Xnu?SqAJA&?KB!=Qi0&TdT6%i&v`J+rYc>-qCiFs_V-5iOK? zA%-6Sj5>L2MlY<8J!GfUZtttQrah5yK1t+em3nCDk6cbk&s}(#BaSGtT$+@e3YJU!>VtiA2xiu}>)E-AFx2|3mIQF#{#4QC6FL;W{tB~e8t{4YD}hZy6+fgca>{uT;^sD9KT#F!8pVKfDj`e}et$wHb`_(A6|y@sd;iD* z^U`3&Lrr@j2<1gI)U+6sm6@-L$f_pX1u;>{m|dF^=r%uea&677dQSW$u$bw9by!|g z(M+s;NBpM0CzcR^hcS!f1WXf?*7ee{LMeXbg%uJfBu_)`ge-|o#NHYc*PR_ zcNhQj(DUyuUUh){P2fTQ^lza4=i~Knp#C>d{~M@RB#-~5TmN`V{F_m)SUD>)oIlOY z|IMiJ)tUb~aQ|MK{&|Lo7T&)Z^**}+;9XjQRNYYhORy92N+ zGZUbmUj}vlb+Zj`!nIn0BfJ%?6s)rTdz@LykXfKw`h$V^kE7O*eJh;%b{Oy~c0FKl zrU9zgk+-3s6x$Ju8s~`S);$jFifu;VHD)~4{eHeMJ&|1>JS9c}(wI~|rX~iedxM`4 z%sb#Hg;#%F!eud}wd$qpK6c+}5kc4xa5Kkl=%3}Fe?h=<1?Y?qa@Kh<38b&nkFIoj zxt&NcDw0G8$wKiMiPqOt*38Fr9+VYp)h8=F012ga`%r2J{fl76>hzF)D>6&)d@lh0g35TqN{45e~|`YP!r|bzA2&+!bCkL zbq91`>A4VtU`ux(7j5Iz-wzOT3;JL_gI#Dv#5QKR0zJqVa7ua3`FFL}?TGFF`t`PO z(M(kaFfTplrR${Cje8a{8VsZVW@hN+8tysmp243%e3;YS;(L z#n9?P$YR-|oLwga_8D9NxYj7b{sN>^V+-@7%Y8m}s@G2xO9$mFL^eC;%D! z@%Rz(2xD0{@fa0~x6gmOtYsPw&|w8*V5fK^qam;s;qS&FP#u{1NYf?Ah5K0nU~m*nIu21t{`jnPpf&bB4e*bE2xcs~h+Kx2#99jmjnEG2LWGfmsb+2^ z0PGEXL1d14x-)7!_uaf~oj+Ro1Ms8~)lOBGhCBN6=6SDgz{UP?awA=w%P_2P+ujGJ zn*2pTf;v3=HD-LOrG4soYwy78MZKn-32BW_@r{tb-|NsN1X+{8k#EHJ_ML~Y$o~Mb zM|uW<=gHj;)T0uhml(8x4}?^>sq>S9FNo^~8~#Ajnn%qhL6cfVv-KiEbvT?_6C!1K zgBa)`8)ne|wtctz)+zt`G%%VN@tPU$D+7U_E&zh2GJ*WyuU*j6Kg)Sc{blTD#f@Jk zayARe-9O*^VjwBG6HuB}At$lXR6I#MoO0?9O8S7ma(j=z__IqKMb;_m2|l0x{`K&4 z9`y|x7!D&OWW*ce^bgWPFhnRruvTl@lu8wK7nYl6)S}J;L&NFv#?sh7DgfBr1^gFv zeUP~y1zrE$%wpg!u&3&ynvUlIIrSI4faD*WM>dGPyP%_@C-QO7687-`sQ?U9w_%p;^9i%i@GX0o{vQ4{>E zIGq~7KbE14*~8V4`2$N8?6+{!(kBHYm`2O%2&DgY>bXX;rbEkR;LV?EF%M&XPl>Q`C12NTtb9r`3X$#r*8&8HgFV(V+zc3Qk4Hefa#{rR>o&x6$+6=S zLv{(;AZmxe(oQrFvpf!87eZSc!SaJzwhUx%k99(PiAbP} z1_$`^zrV>J1W@;5%3IydO%8`T3GzcjUAm)*C_@jd*ONX zdGvDy0HgTw$EPyM;A*}6E4GMr;xzv?#@`RDzEWD|KrxsZ`QVK&EH4f{i9UoB2dWCY zjsN)oAhFCSx_0kjem|YMW!vP^tY*LdU(V{nH6d=zl-oJ^J-jpV21og_gDOE$t9?9T zy4wJsd^r`s|8_+Ho)88jn~FhXck>9y3{C}u5(Ct+Ghi^ljDYrbiU`wf3@NNr zK@M;b!^cYI2`GcV9aYR3=+AAequxjy173aKFhLtDe;EapPS_Ifge5@5+!%72!BZHJ zkkEG>EwKfVb>BSluo;4QUvJkAXIvS0r!p+1xX8Ke`Sa%k8A9|`;1spfd|hZ3)o!^= zKy+LI3^XmE->VK9f!$`kv&$x2><-U?Qw3fGIa%V_{mB5s|x)Q*@U%ciL@4J?KOy_+enZh*5`K<3O&JyY4KntM%lu@(Xfj*Q#e1oVgmkGoyMP0wcowpBzGsU>` zY;rmp`y}Cv->qSyt@9smg=s@)bUWEb;#Jf6k-{1fYQNTENSe`wVSG)h|tsT6G=jB>0EtW8C09G-`jzlXQdfBTC? zLp*>hmIZ$GOaf%)NqW)C->?WkqY03JivIzRxBvuZCQft_ zeLDZey|RF8{X?;6J|tlMY8{0q*es;eWRLK{Y4gzpncDu=$^Dg4JJN zlMLrzx)25N@x5X#{_Wd?b`Xo=e`p7-{*J$Vu?b|D!0r1#Y{36J<^N9kKQ6T{t-=4F z?Q$#=DZo07;bxfu$S`eCy2{GQIo@naoLl_fi@+}dNEL!});2fq0(!m=LRsM?R|l<{ zPY_Ui+dPtpJH9pFxF z`~DtVZEfvc=2oQ#``M~7nUo=8G=IK+zsj)87k%of28oipdd zUVj$B6F8Ow_eWKLSo!_1CjNHpm+eTxYGLx|?yxW09T@-gMJD)FHY}k!fnhi2as9xG zNrZb$9x#+Y7Hpy-J|M7=UK8nyI?f2xJKo zeiVya^a&vL<%4+VAt+g#iLu{JJji#_(A7X3BoSufGtXCfXMp6N^_p+Q)i;dPa3 z{fO(ydF+70z{k5U?{cqxkfRV==(a}+6aPNSeF=(4#rY2o5a=A=mZ>rI;^=J2% z4Wx49dKi`?pVppHXCd$2dV6S1pvI7Wd}?a8dTPUo+JdXPWeZYokO5^4AC zT<-MDht;7AZO|yH?*&$zUslDN3B<`6@$(HPrVgCOtdV+0@y>*uD5(5i26=p+U0Txa zzhqhYuREVXOCaF=BjUJ>yL!BUSye@9ZXMvc3PHI9XQhB zzyk>9=)pg71-vwINgBy&6Skl#!WD8w1BVB(H;= zW#jYvwygv8$v*RvG0ppz)sF~K)sv@Yc*N>fE9O5A7WshEy(>0@3|Zd%^(7ISEc<@k zn(WT=LmPJNi$$8P!%#3Z2hCLa??14PvWs9%sK>A$bW(-jVveOSN_SJ1oH?rtsf2gg znCBQcF`h0Mu#oJBg7QfalenBQ1M&ycSB0~LBlY4Mg*#mBoI$$MdtWtln-m`%&Pc8r zDHZRxza=WNRjkc%a@r3wF7933vE-EvL!_LZKX!t$R}3mc^pP@9+eoiN8d=e6Q6aGz zsre)vAQntUo0)6ry}3`ut;%Ok$G{c*f{-&UF~#zg=LY+^^-Zry&BI)lJl5XdXBW0% z`Z$=&`4j3+Tz*jTu&VQ7k2st-zRslvs^>vW?mxa{Q!KeULAAD_S@Po+hYdL7mS^7d z>>OG3#g047+~<*vy-b_nzL?|whL$@;C6pWTJ`31{GaJ=mW4zA2NxcJd*a&L`abrU|l2dcjpNbN(2iRZ5_lB2iU zFP8}_SUH=sk-BZF{)=bYUwS~L#l~K+$o6H1?KWk^TC;~GM{}IwazHO|zfM3|h;x7m z5_BjXT~|wS&V(i^MfADrVzGSEVcNr;sPc;457HALe92h_edolvnxk74;pH23e}q3` zw=}pADr|4UL}7PdqwzXP)%aIv7b+oXp{{YB_M@YQ-uFD1HsK~dpSD=REg`={j zz9ov?8OBFjwF^sV^ftSU4{VR6bIeV71GD|?E%$U5{rJ;M9J|ENVkg6oUlTeS??|#L zHU(mGigFlF#V`=lk6vYkTa564Y=spB$(!Il+&*D$1`7 zZA+;8!T(xbY&c6@v^Ug56n98EY>O#lzjT;&<=ZXHWCthmUd?_0A5KGNonc}c*&o=X zjrMacElHy0tCHMLp>S=XSMSIsK7yZuwflm!W1@7JWqQFOUcKi$z91o61!I^WFC)+kC0PX!Xw}&z=6Ip-Wyd&3lSv@|*plaSrj=P72}e7;cNy5}jkFEV-?UXhdSF@zW$3$y`JlpUs z;V)HHf5?#Y_b$v@wAk> zJ;aj-Q8PddCi~p#%iU%JpbvgM|6xVER9@O%k4ep0pI&S_7ec+p-@vhnttwP7<_wLn zu@UI8lnjz*ppI2PsNTt=KAWv8sTisqe{^ky{#sjNjO%vcQhqQHmH@~^Pkg5!2?^!B zCeRfjxP0p;qhRo`9iIQdnUmwJ58Tl_P^+ke;%$S?v>qr*+k>D< zEE2tKga5pw5J^Px9;Kxeat38W94MsLru#u8f1GFn{eh930@qRKPSG^FLsNTp(iC}l zfCi`Bnfifs)45owd}yKTYifuq!37=lzDtVsf8I9iZ4v_*3Xy(jJ!=Tc+E#HOwHfci z;If-t(7$TRwU%`Mf{OY=APO^4VYKk=e$^?v${aPu0?e1)*g|;16%ie z-)4f8sYB|i{E^&>U^NIO^|`ln$+$|k+Se(TOlebcF?6|UerQBpent=zwG7v?{?V`O z5r&itsrb9*535A&DRqFBb4dp3M0h)C2j}*J=C)eC(bzNSkkeTCzi8C&oWBTPK>ZL7 zwr2}9HyYU{#esz)nCHgQ^_suRX zg?n~~=crDDcwbimU8JegMN@(C#FUq=cdARi^Hiu@6G9k<+QJ`|jb_ft0G8`V8ys zTCUbhugPes)_9HOf(|Y9>wC}quH4bsZJqnY(_Q#$neT8$0S~CDYEx2pHKO4EhPS6s z(;qtMS16B}XY+T^tcie;Nz;C?yTee@|JCsu^yM{2l35gQP^A?u%#HWw3I!ds;IcbkI8XdTdT_YXoqw{{xR}B zZ+6buf`X`_Nl>8cqsuVxRKml3Cifeu=OsZ{NsUx5Ixv~8r%Xu7|8xaN?Y#Wpw0(_V zDEn|4_BPT1Joj%8cAGcL&+j?q_E3}+-APhrX&e%=zV z-E?~5Ywg-~dpmVAEadgstttFpolN<$O*$<1g_zN9gzj28#k{{O=!;DmfiQhZoC%wk zYuv+J$K)XWa>r7WM~n9(f9?(9K2Yqv*>;ax?y)t*4f4)? zKegTV&5q#|_^H=;k{>A^6hD3M7ENdAtoD1h4?ce!pWxS2@cMq_#uel2;Ah8Pvi?x_ zlxMZy_9Y%VQPJ9G_GtdGAyfOy-fLS_$5^Cwlv8+im{4QApvFOye6hPMdlN3O@0P}m z?VY7_X6h-LV=&t^FUKE_R%CdWk-t8+p-cNg43F*nkC5tw-d7rrBG*SCJOUN>XH>{2 z*?B`_MsnkQZKrr1r-Gj6q1==huZ80n_7D78RvRAXF65nP%6VP+)=aN5n?o>X&mSly zej}0Q0!#VO8~q+}{`AQ8=H*tSOg>X(tzNTXT3Ekjf= z(XQpx)Y=fqK{@2DVPc$C<|6z?`rJ;QW=gxX&8j7%PT}-m%sv~P751{It!~yvGQI2e z6@Di0FesVhmE03H|M2LQ)L!M}>K9j(p)*!>Q(hld-~F9)%7kiis}>7_x`Z6U zM~L&DV2X7@_amfM+}S&xn<1h3{dUw5!_MAW=J~J3W!{|wSO!0X$s!W-BE8)?1LA@D zq^zAzhOD0{8*e{7t}~Y5b6TDBQJ4a$LT5g?&awB`Nvp6CKU;t1Vy_8NMtQL)*u7s% zTh&D={Iwc#+rx2fT&y#$77^^W_dRaxhbdsM?Re^?aW^`D&|rj%WX-5}y0D>eBV&uP zM&Qm0@`pmVLW~zN=M2ULwkqC4nqfYFs2G~+FAgN9Ta(7J?xie~HK)KGd&<>(IB*Qf zcuIi8W(nu8CXbg!5UUDhqXam*d$Y(?#_dm``I4fYnjjKI(-+9SU*=VJ_=u}%jQLx- zSUR(Bhxk5q%1fr3OvB;(qG3+xi1er=?^=tsRf~?1c1P#My{bR{ILT3w*Q?4vD;-K+ ze4_*o9{$1~#(87q+&&62D*H+kofx{tdqFIe%gAN2>*7({l2waO(57k%zVojb^csYuSc-#> zn)^aA*Ur>((6m*#vDvr-$*JY8aTO4b$Vp0X4ekhJ5^gL@;;3S4W?JJjwr);bZXEj3 zLYg{WL2gLZzqih(F+*1&+h8-{4Hts-k#aNGr3ow+!OM)ZUNAAjeb%k?VCUE^mUJB%k3cb=E2)7^1~HP=^LS2>|@^JEV4}Z%B%f@j`@j?z5AIZEm1vh z!WIc4qZ4BMITal-PJgg(WuFwAsiJkN;q>s|YznpZ7cH$3KOH2~AFef=vF(`?dft=V z_v@6<7VHPKAMX*q>rVc~<%*O^Tuajy;&FZpo7|4wNjobzMnxF8wX?Z;4$HFaCkb2y z8c2MJ?kK4*a~6n;nou~Og!4d$`CuRMyhg1jg^T_Lx>&CuC1dI!O*U&L|A%k7)(z#} zl`4lT`y=Cnp3l04L(9rJY{xy4?=gpT#1>s>dS(yTJDP-I#TMjTl3b^r@>Ml0{vt>l z$3ktLrff@Z>3A^pg0)FX;kIOftc^6?eLcy&-Mg_eJ~VM~#Z5Ro0k9`UlnJ`)b~)V{ zvC3&{u%Y&Hy?HxVL`r|pUO`a8FLkO?9t)B(mI>9SJ1@Ytbvr`UShYN0Zse1zV+b%W zTwuK1dY8#5@8OvN8K;2rZg2Ohn$q37-B*?TtlO=6 zI_OLE;XWj6dMmhRDdR0OF)a*x4$+ym#Rc8pRt_6IJ_%I|UGFxVT znoo<+rr+Msiq`_*W_4Sf>)`ieF7J~s9IJutc&e~aI&AEK)WB^P#qp#w84@S7O9qUF zXJ=YseiApI;GmzR{5m!LeDZF+I&p*rjRaS?^}RKHvXA)J_8LopS6E{!RV?S4&UK>z zpDiS>FMck5Isl@tbO3pC7T1g|ylX!$j!fnDl}_tn*FY0fcHCV6RS0U|Gf>ajmu(E?wh>%?6onNFLI)WL-y+Y`qlBEjr;rjrR&B-ok1$k~9+)K2Es@Kvv$vrmMd0t@rtU>a0E8GbB z!I9%zPSQz38zvR=Z^eM%d1!nRwqgEEZg1mY*sU3Hx_43}CP?&Kbso}X9OZEaRq^WU zLW2Vyb}eI#GaFCLl=C>vJ=Ds7(Hmx|mZG`iOE&qMY;LEv+HYnafnPS`HlJ-wGsuvL zY((;#&2UlBV~V(S#<)J7oLA<3pYqG<7p~cfk6j~>7_T{K>GP!B_dhBrS@NM{UZ(?0 z!~C2K)=Kyvl4+qL9&eBdyNv1;dY5hHiF=?hZ-W4c%apWOQB1{b#a|e&u^U;j8c`by zz$TkP6S8lsCu+gTT-@u&oLIc&8yLECQP5TT_6-k|S6f}Sb9J(Y@dRIiaHNIU`INli z7;}RL>y7Pa9y}}NI*>tf?1r}?KxQx5jqWUyIei}Pc>IQauVchjK90oF@Q<;)#+Z|iIjiK7|U5E$VYYNi9--MeF5OYj2h2Ot%_QdOJ%O(;)$#3 z=~xOVbJ_o)K`eN;?W-py$0L9dl+N*`D~>Uix2LTI{O^x-!B4Oz9|CSLFS^|^Igm=M z}4F`s$j?F$cB|8=khRJaviGcmm%p_}x5F6|iwX@vyM0h3+FPic2#lap~%;*S0q&oW)%BtQL!k+;Y!N(OFcnaG{Q|~AMzKS zUU6uq-`3#qOzuwB3|w;~zbN&{*5S19^&8f0+_Q8UDE9qvJp)oJQm*pt$;0|kk1MHg zG?55(!s*-Sc!(E%f3v9{(low9GUTjpwy8GP>kU;d*mKE^Lm>tV!Ff+|ahNrU!6e67{QK+t|Q-;hL zQ<97ghOWpQ8E=#+u1sYJ@7mpqbNtWw-}~Wx-sk;LpFF2?_OSNeYp=c5Z~c~GzZE$5 z1*3X-?znlEH^Z~6aku`Ee;uF&ooC%oj^5PnX!4xP-cTnm(`0hN-UuSaSYEcu3%`JR zQUlt1kGOSHGZ&Kg)RlN2g><9nEv}!OlhUNQ$`J-pJwoVy+oxsW8U_{|dNppU*^2K294Q&~tU%v00Zw_0F=lzB8 za18AZ`RCgmiX5K`sQd2j>Y2!OmsQD@(dWjW{|@$hBudKYYW8FbY)ft2IOcRD?GdAW zD^wH;7#q7(31=eqB|<)O00>;6eJUCu{sBI1T$-pKH9y-qZ#=jm)zIIvAz6E>f7Ke3 zibHI>3dSOb)uaX=9xZmZRJdt4^%0!<{5ielbfWX4Dw0g`_^4gjsAeb+H>%1!#-pzs z@a;s1XToi`Lgd?vCrbs7(>#eSxpxZOr?pYE&&R?2+4@Ef9`mP0=7O6>IyN-*I9>mu z?5iA$D!Y}=#JG+0M1Pmb11{?%z-EN!2b3Gi@W0(R)6VX)ZLn>~0AGK-AgGyXkMxt# zUr=JN=H{h33!?rbppF7}-R+1kKlt! zLT3P4qfltha^H{N{id13Wl`-j4ovpzQ&E~shQ&P%K*x3^&RDz}oMI?rC?^JzomqvPZmPDB2b!U_QsF4qR_{&Yt#Tj_ljXW=~T6~6Fw z@X>VFfy>(1n>Ko*Q;g=shk-Zs3%p-`hnshg#`P>|DAD!KXlT2>i$G^*7O!SyQ*E45 z66D||vOHxee&oWZ%sBkOkRvH_p2v^GZW7Z>ttlLR%#R%n5V8y* zbjX#iTy_-`usczhP>Ch_PttcEJO?w7{dDEM0_k}N=6r}1y3LsqxbG)~-*z9*M9yCm=rFqJl`lsvIai0}*z%I!0Akalc*+GCHcxpwzW z_js_RefBlL-jN~K)acopU`QEt;LTX zI#koP@3Y-R#M<9ugJ|pIPgaEHbltO7&E}iF<@eB{)2vsMoo$EySirO;sQ1n9vZkwn z#GQD4z-j;19PD77GGp(6gyG0I`WgQx1jOI8HmQ|tGAqxy@ z%OY0|+URb7S8Eu(Ovzsb1dUyC%oyp%4{yZU0SR?=TfOS&w8acX1#kid1z?mR3vtB93a09(sl#~!Y} zwownKj_K@Y#_gZJ_He7WS##~UtOhlU_D0c9v^;aY;go+?Q``NzoH^5M(9~wHO}#IO zPm(h}-{rN#T5{S4Jv=%#uszbDroerS^>DD^M*bttKD)8W{@>1I%e8QJb2^`UxTEKI zTJjd2OqOrLgJR8NO})9&$~tRGV!1wW&A*hLKG0_G|7@GHXpc?ha6}vmw@2@%>%W)l zz*25mnLgQ+5;FYa;k7K53W=PQ>VxEuIHAp}JsqVsE9pg(9t)gVJRk*bWMdn-NWN~v z_s81zEp)Csq+0eX>-_%K+68<3u9&SpPZq>Tlg<}@Hs&)*(7S0Rf8MZ{tTmL3#rUOg z=%IGXB5&(o;3pR~2yI(t3y>LKXI6jbZarc8#4!SZF;}N1THd334x&4bwP}Ap01}#r z5@|!&_-*!paLPr6c?)^pA{5#{MH=RA)haf z4SG8$bddCE7t@5M^_fq1_^ZNX*KO7PyBQ!iE^HIjZ1M2X&HaW#Hc&paI)Ib?*VjCF z2&kl=bzIXl4%c%MZN2;Qw)H)gC6^;l`&RB%oqkCOrI@q3Uck|HLxU-r5HM zrdu*a9;8SF2*>~xyVWl@;!H>suGUdNLcKd%<9dgDP=C2rqqYL1N|QdgY*`1uQdlNW z8t%afi(ZGO?87Cq>mMi$RhzK;tJu^pUfP2cal^@ z3j_8ref}+{P)^Zk8E%dSUr8=fUDz^A91?#QE+7>wm;oj0Cp*rSY)W6MIfUAOPKzLy zhkYLGA^CcPDl{~~>R7nU<@Mt$G2h@!w$50_lh@S2nKiIEZlxn>WnuWs_5<0F7rvvI z2Zu?S%Y1fO(Cl9}#}8Jq+A^y5B|O?+a$o3b*>DI(aPc-+M7WZX|NqN=xnUERv6F5I zvK_FjEAp8qUjc~TzN;s8kssQB+raY0r!qbAKG8^jPWWH$jK4+qbA|tN4^jE#=a&B0 zdgF&q`gw-`t?K-#w0 z!_d4lFarnv=L;!gi$7iV2jMUn*L0ZQd8kM{<|O8&aQp3Z9GFH%hDQ%NBJgC+$fefC zqfkCep#N6#C)vWD$5qjceyN0-m=PHOE_HzzYZ7{x?obVjhYU=V$I+msaDH8bK}=?* zAVgqzP`NyHU|`??m=-v0HB=x}a(b0Qa^m3+>lPYaW{I=hh9}C+T=vEKY0ES+@DI_| zBJPygnd12idBBt9Yjri;(4I!o7w2n>D1FA2yvLRB0DxDB_Qflf)C?@tMp^bip@gU> z9n_H+x|)*iUfFNY#vSLsI+}r)g!l<^v-NW7(bEk{$G64r=349e$Y)7>WRC+}6{LXK z$gXr*Ec{O1f1aS$Rci|-VzAesW&hmF@bE=GNM|IdY+yh8d?ipLP2X;rJ*$FgP1BKrNj%NMx1#XnV-J06bG~BjVWuWZz%{PsRU7l+`u@B^ zRF6w}Xc;Kr@1GMgz_A21;jb)>msE5yZ&ACPP$a3r1)ywAcaC-`_mU=N8=4Bbp3)9P6AHqYtvVl1fU?N!=bkpjW zaDJ;%1YXp2K-ZkONh&ppbT~^wO@S0WouQF>56X(8&xt@=EAL;9>YyV?&G5)pTh5gj zJtnu|3!Qh1AUe18FtN`k6rUn_yM;6bnPhn*5nwSsBaiZPIOZ$nlMNyOQm#)_R|Q|# zgTi$yFf@{UHBC+7J=M|CP}<2+kNB1$by-f}g6tK6d9;d_Mc(*7FGTbSp@WIvM--B9 zRS;D1!qfXkikF^WW0^=#zG9g z=9JrqEB(l~W-G$q7!~xkVGa+3qZ?|91kjRho5>J zLMoeXJU#Qsb0X11Vty6gdXZcaT6TmAu&$$m7=eR9k}0>_W!j#LxM%_bM(p0TQ@DL)2qOk>9? z*xK#bNvQs-2LMA|5y(yX^HhT#<)eNHrvOb02x}3kRAGS&EB?oYMYx5k9&T3D=AztE zj1Gj^B5&(aS=R<5Zopexh_UXeYw!^0lO|+r_y|F(Ts?fAEY1F99>0YiWI&wtuYBV0 zq#I;uV`~|Mni&X+3}Z|NznXfZlGY5BP4gQXTZ7)R#HEFn8uUTU<{ZuJra6fGbBbJ; zjSK&^aIF3s5rK0noPZB6YDK9m1WHGBE!TLnP8ZU35(oH_XDN@o<`|4zV<2Ur^c>0d zLyE};S0oy{3yYh4UG9wSKr&3u{C^!5BZdbUob8iUyJoWMTLz zXlCtM^}k~D5S!FAt&JS{Ko$h=avVnfTiyU^Ok$}?LJP!{8qW2(-g~YH?Y!?h8ncpo zAPaYW%_~@X8EFY3Y5q1zmyKvUR}5mG>ux?VI-sF(|qyJ0ULGj=77CMv<4XABOGU_vjrRU^iSEuX(CJeyLbk7fF--D~12A?8(xrK@W@(&kD z4$S)rhX=>5hqcho!D$BTCGnBWA94sE!qU^z2PIOmIbG2(q|O;>#0)@_dR&L885J5Z za+l)YYjz}u^V7?O*OKY7v2+@5)l(65A07l8#Thl>&<0Gtb-}>$mJJk(bSXi=1}!@K$#m{hOpq%B z5Vb&%X8*B?1#Pjg0DpD#Tp3KKZT@j7noAv%eq&*y(_L7F(2b&w9R;F5dK~*F!o|H2 zES5$&)crupsXQ}W>@5kraR|qI>l_66$|kBMKc|TTy0Od_k}8d01J=JBpkh1=AVuLm zo=t@q*#q4sXZ)-R*}hI>ddoxtptp3YT6#=P5^x`NkX_yQsK~imM%);v68jUvO;o_r zvvt1_NF%uemUZ`u35pC3fRzI4YumcGWO~Z8uW?4JF20?uEe0|9suM*YB=-X7+!V+@ z?ygC5Zp(GTL%Dl(VCrT4A|bVo?kQY#XRoIOlbyXqc`Bl3pfanv*Rn*MzdI*Hp){{M z_gQkTBGQ>a4yl7^-@tp*-Eg2C;LRu%@wc27n^YI*G$GvdB7Dw~d>es<0A4LMw2+gk z8n$;^-`N=fL=W`haQ!co&uSkLwqH}S@v^}6!af-QMm>>H#Tm4=z|OK)G6%u9pjcs= z!7fX^yVYKQI^&_pCLWSZX9rNlLn1I|P9rYo<~cv_Nx%Nb(X)0V(}4d{2c)pwpzXy+ z0P{#fq}3337LWn9<$gdX^h1@y?}`$zTglD6@&1d1Pczqc!5Yk440a@rW204>+`bfX@i(2T%2S z&-IF4{5}~Q^{se*wsfLP!PgNbL0ZfJ6Lq1>hbzomtH;hI0-1@HQb)QN)2a8{Vu zMb)WT7ys}))_`C0IcLv*)STPyHC+#>1GiP**BeG!0VU55@a|?y1{K;{y$1$Myw_TbVu#GN^d@BG;KOkm?hkzn9K+nWzLbOZ{BgQpd;}@W3Zp2aV(0Y4^YCz0egfX;w zd+)u(ARvsDp~mn&6ErJ#zOy=4(#$a}l;^$UV)(pw_K{Lp#k-5ANkue8o zRe>ib8u7me4-fB$*b9L&w@5f1uf~2Lc zDRh#`Y($E`T__F*%(RYOF~G~~5e<0Pl-ax|q@&xhzgXo`NOi zaltctS@G0`1rtEme=UJ6(Q5vE^y~?6&dKUES4!Z=JUYz003|S(Iz)wNjnw{Ddju1Tzxqo<{{gdUX7>h1F_Qn_AcIy)n zFP+m%xT(VdA*3%oUp@c5S~0n2^o^jV_k@9WC@`TlW_E$^b<6z-{li4WP>3#y-JIP8 z@WLP8@TR0fJPV_70_kaVXFPL*^caIg`iozDKJ5?Y10&aphCU;Mveo^34SGcg-Cs|6 zqg;B9&b;kiU9UIhejH(2_Zr@W`p(bZW|X7|qdF2!r)X>t-*}gM8vA1)9f=13|31j7 zcCc-9MrYFyzf%R0=k4ap#EWhrE$c?y50uX1ziVC;MszsI&WMX4vv|%UOK`4WBHd9P zz~m=KBr%c*VQ(3|iw_=_Rv&}Xqo@r3DjI(7eO7A2H$ua|rF-!eR z-X|PJ4JqN$7EdMA`$cH&0-AD*Lxy?uer1c7+MNwn}1wn$WEL8LO*{KrFM>P zwg-pQDnxUTjqsyEfm4vtR=96=cz({&^5oR^%ZCh1+)raM0rrSE;fOf4$9W11pCS32JK$JkKPO4dXY9|m~_7?N#bDw~iT?G+t zvzZgml^0HSUGMj0)KJEbYA?AAD2l(Y04{*uKw|>ArL~}%Y{0M-5nk&BAo+eit|?{g z!S^t-cLTrpnjt!lcs7Sz9%GkU1>2$EjX*c3p7(w9O+Dv@!CKmylCOs9J-|_-0W0dt zikO}c6D8*0ei0l9=!GWs{ML=%fWNBgu3TMMHgdgzqX!da{ErxGa;~PuFYB6uSv_r;yq4yl9-{yK8Edl( z?y-EHCUcAoWKY(M9KBB^qF3XC1Sr8zTu#XJ_mCQqb8C)eU?q?y!DG?&V>T5}Umg$i zv+;D(f*rj$r5}F~S|Co-;PBct0#^+Y#_>umYqI(VOHvw#iZ<%>n*w%H*2lOBVb<%fsyNR92%lx`Z^$d{?YehOHGpwDdrsf`U%^w96Nt*A z;ZrMCtPMRTe^~ebkwzl=h@u)rM!*I)A(glmJki-WQ&ZDvu$Aw09hg(t2JT4Brzg58 ztD;LdanNab4~C4WTvBX=9_}hcCJ_bE$ChzZrF9I=5*Tm~p(F+<$5Hm-ydIT%31X<~ ztJfT3q;jhfG1x?ZJ?pMcNYShRJ~fv59-F=s7bA>8FEEYQ^mS>XcIa~tYh^x8`)%OpkxDR-$xJ`VlWEexem(#t)xE!MgDM;346aXS@$FMqM`{F)IF9NrW9ZV8lcv zkkh`JSDA6g5z!GxAZY6k(b0GybsacOYIq2!l#_a-dK-ti-(9UsE7Z1w~w@#;Y7JIyYy=9l_8H?E6yg{k^;&Azj#bSW{~oF39%DkeY!@ zOP&qZ1>Vt;p7Q@PG@B71MKCx^pbFSGqTWi6RU$gPjTt9b!+xVB0R375)H6x~3zGRT zQCQwmjCG8PTc0)!@DPu4{HawcF>9vb#W5y8YI1}Xk`{6|d(2Js`VC16@Zw^kew;Qa z>hrA*$mwR%6&YDCi%#5Q^q>-DTm@@SH)u&Ef{f(KGs`C|g=81~b8Q zjiCw^oIz2OZyRbuAjE8-xGdFp@wUcY0OR%RL9%*@OHVzNBgOwp6dSwSAjv-zj~>NH zc;@**0kF;do+F1)DYI#tq5sa8B0x`3Dj=#K`=Fe?MwRk$F_eSeCY+tOQdujO+c@7d zv4B>Q)*8Da=*i;+RRvj(du;-BQiK`yo}a1TB{%iE;@O=TQGn#=LQx9^;LeuGMap}fDu!4J5ZufCpe#{;!|BBZJ(bqCAI0%>TG>7|`VM2?6S zieEIMVs010%EnFVtix6`|Fl~`?}XJ?spob6`rha)rX0e)!naQ$>MI k#| Date: Wed, 16 Oct 2024 22:27:17 +0800 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=E4=B8=8A=E6=9E=B6=E5=92=8C?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=20NFT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- members/missop/task3/MissopToken.sol | 15 +++++ members/missop/task3/NftMarket.sol | 83 ++++++++++++++++++++++++++++ members/missop/task3/NftToken.sol | 21 +++++++ members/missop/task3/index.md | 6 ++ 4 files changed, 125 insertions(+) create mode 100644 members/missop/task3/MissopToken.sol create mode 100644 members/missop/task3/NftMarket.sol create mode 100644 members/missop/task3/NftToken.sol create mode 100644 members/missop/task3/index.md diff --git a/members/missop/task3/MissopToken.sol b/members/missop/task3/MissopToken.sol new file mode 100644 index 000000000..4c83df21e --- /dev/null +++ b/members/missop/task3/MissopToken.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MissopToken is ERC20{ + constructor() ERC20("MissopToken","MT") { + // 初始化给合约 mint 这么多 token + _mint(msg.sender, 10000000000*10**6); + } + + function decimals()public view virtual override returns (uint8) { + return 6; + } +} \ No newline at end of file diff --git a/members/missop/task3/NftMarket.sol b/members/missop/task3/NftMarket.sol new file mode 100644 index 000000000..155888f77 --- /dev/null +++ b/members/missop/task3/NftMarket.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; // 防止双花攻击 + +error NftMarket__NotOwnerOf(string message); +error NftMarket__NotApproved(string message); +error NftMarket__NotActive(string message); +error NftMarket__PaymentFailed(string message); + +contract NftMarket is ReentrancyGuard { + struct Listing{ + address seller; + address nftContract; + uint256 tokenId; + uint256 price; + bool isActive; + } + + mapping(address => mapping (uint256 => Listing)) s_listings; + IERC20 public immutable i_paymentToken; + +// 上架 nft 事件 + event NftListed( + address indexed seller, + uint256 indexed tokenId, + address indexed nftContract, + uint256 price + ); + + // nft购买事件 + event NftPurchased( + address indexed buyer, + uint256 indexed tokenId, + address indexed nftContract, + uint256 price + ); + + constructor(address _paymentToken) { + i_paymentToken = IERC20(_paymentToken); + } + + function listNft(address _nftContract,uint256 tokenId,uint256 price) external { + IERC721 nft = IERC721(_nftContract); + if(nft.ownerOf(tokenId) != msg.sender){ + revert NftMarket__NotOwnerOf("not the owner of the NFT"); + } + if(!nft.isApprovedForAll(msg.sender, address(this))){ + revert NftMarket__NotApproved("not approved"); + } + s_listings[_nftContract][tokenId] = Listing( + msg.sender, + _nftContract, + tokenId, + price, + true + ); + + emit NftListed( + msg.sender, + tokenId, + _nftContract, + price + ); + } + + function buyNft(address _nftContract,uint256 _tokenId) external { + Listing storage listing = s_listings[_nftContract][_tokenId]; + if(!listing.isActive){ + revert NftMarket__NotActive("NFT not active"); + } + IERC721 nft = IERC721(_nftContract); + // 将购买人身上的钱转给售卖人 + if(!i_paymentToken.transferFrom(msg.sender, listing.seller, listing.price)){ + revert NftMarket__PaymentFailed("payment failed"); + } + nft.safeTransferFrom(listing.seller, msg.sender, _tokenId); + listing.isActive = false; + emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price); + } +} \ No newline at end of file diff --git a/members/missop/task3/NftToken.sol b/members/missop/task3/NftToken.sol new file mode 100644 index 000000000..843dd0f3f --- /dev/null +++ b/members/missop/task3/NftToken.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import "@openzeppelin/contracts/utils/Counters.sol"; + +contract NftToken is ERC721 { + using Counters for Counters.Counter; + Counters.Counter private _tokenIdCounter; + +// 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量 + constructor() ERC721("NftToken","NT") { + _tokenIdCounter.increment(); + } + + function mint(address to) public { + uint256 tokenId = _tokenIdCounter.current(); + _tokenIdCounter.increment(); + _safeMint(to, tokenId); + } +} \ No newline at end of file diff --git a/members/missop/task3/index.md b/members/missop/task3/index.md new file mode 100644 index 000000000..4cc5f1a01 --- /dev/null +++ b/members/missop/task3/index.md @@ -0,0 +1,6 @@ +# 作业 +由于Sepolia燃气费用太高,部署到了Avalanche Fuji + +上架:0x9a1741e45f8d38e420af23e6b585233fd02fe011ee6524125b3d78a5bfaa8aaa + +购买:0xb03a45c0f0fa911b1017a9b9176aab906746588f37b5dcce166f26761829ba26 \ No newline at end of file From dcd9e7a8075054e4883675d55b23ca9e8f4b455f Mon Sep 17 00:00:00 2001 From: missop Date: Mon, 21 Oct 2024 22:17:21 +0800 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=20NFT=20?= =?UTF-8?q?=E8=B4=AD=E4=B9=B0=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- members/missop/task4/.eslintrc.json | 3 + members/missop/task4/.gitignore | 36 ++ members/missop/task4/README.md | 36 ++ members/missop/task4/jsconfig.json | 7 + members/missop/task4/next.config.mjs | 16 + members/missop/task4/package.json | 25 + members/missop/task4/postcss.config.mjs | 8 + .../task4/src/app/components/Contract.js | 80 +++ .../task4/src/app/components/ListNFTs.js | 38 ++ members/missop/task4/src/app/config.js | 13 + members/missop/task4/src/app/favicon.ico | Bin 0 -> 25931 bytes .../task4/src/app/fonts/GeistMonoVF.woff | Bin 0 -> 67864 bytes .../missop/task4/src/app/fonts/GeistVF.woff | Bin 0 -> 66268 bytes members/missop/task4/src/app/globals.css | 27 + members/missop/task4/src/app/layout.js | 30 + members/missop/task4/src/app/page.js | 18 + members/missop/task4/src/app/provider.js | 21 + .../task4/src/assets/abi/MissopToken.json | 444 +++++++++++++ .../task4/src/assets/abi/NftMarket.json | 404 ++++++++++++ .../missop/task4/src/assets/abi/NftToken.json | 588 ++++++++++++++++++ members/missop/task4/src/hooks/contract.js | 140 +++++ members/missop/task4/tailwind.config.js | 17 + 22 files changed, 1951 insertions(+) create mode 100644 members/missop/task4/.eslintrc.json create mode 100644 members/missop/task4/.gitignore create mode 100644 members/missop/task4/README.md create mode 100644 members/missop/task4/jsconfig.json create mode 100644 members/missop/task4/next.config.mjs create mode 100644 members/missop/task4/package.json create mode 100644 members/missop/task4/postcss.config.mjs create mode 100644 members/missop/task4/src/app/components/Contract.js create mode 100644 members/missop/task4/src/app/components/ListNFTs.js create mode 100644 members/missop/task4/src/app/config.js create mode 100644 members/missop/task4/src/app/favicon.ico create mode 100644 members/missop/task4/src/app/fonts/GeistMonoVF.woff create mode 100644 members/missop/task4/src/app/fonts/GeistVF.woff create mode 100644 members/missop/task4/src/app/globals.css create mode 100644 members/missop/task4/src/app/layout.js create mode 100644 members/missop/task4/src/app/page.js create mode 100644 members/missop/task4/src/app/provider.js create mode 100644 members/missop/task4/src/assets/abi/MissopToken.json create mode 100644 members/missop/task4/src/assets/abi/NftMarket.json create mode 100644 members/missop/task4/src/assets/abi/NftToken.json create mode 100644 members/missop/task4/src/hooks/contract.js create mode 100644 members/missop/task4/tailwind.config.js diff --git a/members/missop/task4/.eslintrc.json b/members/missop/task4/.eslintrc.json new file mode 100644 index 000000000..bffb357a7 --- /dev/null +++ b/members/missop/task4/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/members/missop/task4/.gitignore b/members/missop/task4/.gitignore new file mode 100644 index 000000000..fd3dbb571 --- /dev/null +++ b/members/missop/task4/.gitignore @@ -0,0 +1,36 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/members/missop/task4/README.md b/members/missop/task4/README.md new file mode 100644 index 000000000..0dc9ea2bc --- /dev/null +++ b/members/missop/task4/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/members/missop/task4/jsconfig.json b/members/missop/task4/jsconfig.json new file mode 100644 index 000000000..b8d6842d7 --- /dev/null +++ b/members/missop/task4/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/members/missop/task4/next.config.mjs b/members/missop/task4/next.config.mjs new file mode 100644 index 000000000..9f588a65a --- /dev/null +++ b/members/missop/task4/next.config.mjs @@ -0,0 +1,16 @@ +import dotenv from "dotenv"; +const parsedEnv = dotenv.config().parsed; + +/** @type {import('next').NextConfig} */ +const nextConfig = { + env: parsedEnv, + experimental: { + appDir: true, + }, + webpack: (config) => { + config.externals.push("pino-pretty", "lokijs", "encoding"); + return config; + }, +}; + +export default nextConfig; diff --git a/members/missop/task4/package.json b/members/missop/task4/package.json new file mode 100644 index 000000000..05e7eee58 --- /dev/null +++ b/members/missop/task4/package.json @@ -0,0 +1,25 @@ +{ + "name": "task4", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@rainbow-me/rainbowkit": "^2.2.0", + "next": "14.2.15", + "react": "^18", + "react-dom": "^18", + "wagmi": "^2.12.20" + }, + "devDependencies": { + "dotenv": "^16.4.5", + "eslint": "^8", + "eslint-config-next": "14.2.15", + "postcss": "^8", + "tailwindcss": "^3.4.1" + } +} diff --git a/members/missop/task4/postcss.config.mjs b/members/missop/task4/postcss.config.mjs new file mode 100644 index 000000000..1a69fd2a4 --- /dev/null +++ b/members/missop/task4/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/members/missop/task4/src/app/components/Contract.js b/members/missop/task4/src/app/components/Contract.js new file mode 100644 index 000000000..c004a4b41 --- /dev/null +++ b/members/missop/task4/src/app/components/Contract.js @@ -0,0 +1,80 @@ +import { useWrite } from "@/hooks/contract"; +import React, { useState } from "react"; + +export default function Contract() { + const { mintNFT, setApprovalForAll, listNFT } = useWrite(); + const [tokenId, setTokenId] = useState(""); + const [price, setPrice] = useState(""); + + return ( +

+
+ +
+
+
+ +
+ { + setTokenId(e.target.value); + }} + /> +
+
+
+ +
+ { + setPrice(e.target.value); + }} + /> +
+
+
+ +
+
+
+ ); +} diff --git a/members/missop/task4/src/app/components/ListNFTs.js b/members/missop/task4/src/app/components/ListNFTs.js new file mode 100644 index 000000000..6168e53bd --- /dev/null +++ b/members/missop/task4/src/app/components/ListNFTs.js @@ -0,0 +1,38 @@ +import { useGetListsNFTs, useWrite } from "@/hooks/contract"; +import React from "react"; +import { useAccount } from "wagmi"; + +export default function ListNFTs() { + const { address } = useAccount(); + const listNFTs = useGetListsNFTs() || []; + console.log("listNFTs", listNFTs); + const { approveAmount, buyNFT } = useWrite(); + return ( +
+ {listNFTs.map((nft, index) => ( +
+ {nft.name} +

NFT:#{nft.tokenId.toString()}

+

持有者:{nft.seller}

+

价格:{nft.price.toString()}MT

+ +
+ ))} +
+ ); +} diff --git a/members/missop/task4/src/app/config.js b/members/missop/task4/src/app/config.js new file mode 100644 index 000000000..1c70a0e24 --- /dev/null +++ b/members/missop/task4/src/app/config.js @@ -0,0 +1,13 @@ +import { http } from "wagmi"; +import { hardhat } from "wagmi/chains"; +import { getDefaultConfig } from "@rainbow-me/rainbowkit"; + +export default getDefaultConfig({ + appName: "My RainbowKit App", + projectId: "YOUR_PROJECT_ID", + chains: [hardhat], + ssr: true, // If your dApp uses server side rendering (SSR) + transports: { + [hardhat.id]: http(), + }, +}); diff --git a/members/missop/task4/src/app/favicon.ico b/members/missop/task4/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/members/missop/task4/src/app/fonts/GeistMonoVF.woff b/members/missop/task4/src/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 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
4)|DOKg<>hv+aNnO=o?qd) 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ϣ%UY8`RWp~V-U_7 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 CLkb=M literal 0 HcmV?d00001 diff --git a/members/missop/task4/src/app/fonts/GeistVF.woff b/members/missop/task4/src/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 zcmZsCWl$YW*X1l87)X>$?@vE);t4{YH1mFe0jBE_;zih3)d=3HtKOj};a$8LQ z;{mKizBoEx@QFoo%Q3U|F#Q_99{@n6699-amrKppH2XhZHUQxC)koh9Z`96Da}z^j z06>M|%Z~L6Y&1qSu;yQl0D#8RSN+!)NZ{U~8_aE--M@I|0KoT10055byf;V0+Ro^U zCui_=E#qI~`=w~)LS|#={?)gfz?a>x{{Y1Z*tIpZF#!PdSpa}6(AxtIw;VAx60fHIlil?>9x#H)4lkwAf#?OoR zq}|UH1-_GP?ro-XFe6E6ogAsB_lMb{eMTseU$Q#8C1b*`2YJE2UbHtB7q=F#8c?(} z7MH~UQP;KATrXR0jxH^-9xhh?btgLZV8`yP{4?~5t>#`dU`oKckttiKqS}=0h)-TL zm0*m)Fqi`0;=bZIlJL!*^OrHroA}Fuoxd5CU8V%At$}@aT%_Z<7=JytQ)D?oC4fu; zC9haKy!Hbi0eF1ipxzXiPt=aQ5wop-RG^?s>L>gO@@+lUXG(XGZgCD!0D&Zs4~^e% z(4?{(WBL;9gTH%!vIjaaOL4-?5F%AuAhqP$}Z5*a}4%FHO z__`OOSOe6f$5}vgbHKxcU-p9ue+OOu{ZSHabi?^-WyLLrt+h>i_s0J8MO%1(?6KJ{ z63srC7MKwg5YmV8R^udkjP>c;o0jS%3s1#VZSd_ZMMe}<_%<&|(8tdaVsob9SlD{! zxA!4>pO-DKVwcU1_Qs8{!D!x(rP>~w#&w_8M_z*m4KGu9`d7DfIq*xDA@Pot6Re`h`d%{lBo3am-vR=-J-SO9A>&egV84q&m&9c$A=5 z%sfs3V4GByk@8gn49E{h<(XwIcWcps58AEdX7(zpG>h`7(%)_eh+vz{k!pm%BiGC` z_=5Uzd3aO%4=d~2*uWjw8`-E&TB2z!BU(IgE;XDXw1NdI?B6(MBrV0BsbKgOQ)gVq zTiiW$Yclle$O3+`9mkU9lI}kdXSxZCVc3#pUpLeJh8n71U(M+H_oIWzXjf>?Ub;nl zgr}Vj|2|%YuvXf+F+N$AD`H8>BgpF)5=3ZV&6AF!QO#3~-9`j5fsyJ#B#%vv4OtoE zoN*Lf4;gCHrm9!=;fkWSwnDPm>OzFyN{<}u3vWw{2o9!32OW3*>roJVbmjZQzlG(e zE4}U2iH!Q@$Q{J!?*)q_&o{ma{Zw*#>>xizG(K?ovKtF`xdX~MyHu+y&V2B#8?UA} z3)GS+=ALKVHi<)w-QE08#-CNleh`G&y`sLDidTfmrv{gWy`!r=i}Q2v#-<1h==FuW zo4*3ygV;zyKBgxN{?HQ@hj_U+#I$gm{DHH5VFhB{&2 z43OeSH?8bW8=avoZjrZrTVFiF@fH_w@Xx3vrm3WK)B*ir9HxIFotJ&j?Ql0|_MlDW zFAFtz22CtP@SyIE`u?GZ)=dVaum({0Bk5$QOjPFeR;d)dg^tAMWb#XR zx1N+SC{!SJ|LgCF#-Y>9V0n)&ec+ON<`=rB^tflD@PO&5dd1P!f>fx9N5?Gz0tYaF*sLZO0G1fGI zJBmO(<#@h+D1mjw+HK82Tc@$VtNxi% zE|8*n7FS*<*b%&+mElheV^vn-j|^j#B3O7EpDyIt*oZgUdgrVD+nieQ%oCn z=tvim?Kk=%r6-5a5KYn{cSN(c#);ls)$rs z$>2WG89OeQn+$u%7X^jeuG!?UPZfU>)k2TT`WR;^in+~$27hvw5jonPA>KXZH+n=U z-HdTmV=8Uz@-l4RwROKIHX;)pYhnQ{-gA8{I9_E$1U2#W?a|Z=G1jId8eMbFB2X74 z`tO++;x+F#xG;{RF=LA2>8C&>LFr85=i$Wb6{aFrO{Wxnxot^AOP6_d{#zLQ$rDOh zmx8VSzye=SUQ$IMq75xI4HXEA59Fnh)i7cO!uVPQIAC%WY#)85)HZ%qC7?%_55Ys0-MmZ(mFLWpk4!|Q@tKYGc|M5aQKvdmMnP?P5ZYRPA@UcNk!m! zYM=N4>}|X9#ViD-@-{OA)mQFn9XsaS7Y9(?%-TyN$#35%!F`M`?q#}XOl%HVhbwjt zCD9hq%W@?Vb7iv9#SQ!^zs1Ahj*)z0u^gwJ$gQZK>LPl(dju$D&tWsLLmc6KaS3pr1Z2W;DVO|v_@95?1- zMM>VRwrEw^(?(cgn2z03cSM3w9re}A9@&J-iar~ThaWK;6qbgl9R+_nN+$C===>ifAHw@+mVJro54y_ie`FBKhGpGJfp{7P=$nYHDU85j@aE6xcjU`6`n+UdYu z;k~!=E%i><*SAqRV{@mB5+D#ad!{z`YfsejCwwfQ^S{HX?u$eA4ev+DnZ3iM@r`m+ zLRU?0^iI5+CYyk-JQeAW21GoJm#CuR4}=^0OawIPmLf^Bj+NP;px>mQ@ju91?hU?A z@^6NFDk5sm}DxK#dVoV-L%Npvrr+ooO@;l>4Y7QQ- zdW3cE{K)ywgL|nTIL7??f&XRGbC`}V$#eCsHr>w^yd7NU`;^EDQzm7ei3K5D%lm`+ z_NbNiy=Tm2b-)>1W5&6%wKhpFs?&aw_c-nSe6$OHn}oFM`AT6SSBsV1dD$@{#%ECO zaiNNq2pee!IeZP@I^E+v@_!MPqwA4mCt$2(@-z0LcW4k^>Eo>KuM~B@sNL97E6TFl z1)4A2mU)d_2f0GJOww_Oc7q4(mz@Oz)qi8`E+3Ka*{~&X^P|?>khUM&hA! za-0+zz-fA;NCpK8V8&lEAj~kov2%5g?yoc=(AvRjAGX}w(W#TavcyO)!zy( zBwy-z_~z`5c)^_D?7n6Bk6s#PY%1IH^>8*9DYTP!!0{`s;pmNC!t)DD8_4WWoHDid z?f}^jLEV%i`>#l)r6O{$EICF?lGtwyEIZdkw3-n3GcpRG_G3g24WI%{ z$9%gN{?t7?aUhEagsS=Crvcft)p%O>j4XBnA15^iRW@>yZTAu@VcFtzH z7Pjzcy@{m*?pI;}+Li)cVqSjK+o9$8<#htd>v|Z!spzHUXXhL2&VAWwmO>TOz#2F* zLKBCt%h1UO`bcZm61+W2uiv-$*AWdy4%*JD#Q%mVN~LX?P?L)W5)_vf~Eysd%ifN06o<4DrIb zo`rgBZ)aY-Er1H(R(loTgeRKc`aiNY*ov~%7tdG23sIk0S|&| zI`ym(F~+g~Z@5Ak*#hsXsk%wMma1o}98R11$`-WqDhE~YQA+mXDy(Q>%<^37G)?hj z+kV3owb?Lm^=xvbUF5qgnn3}%i9dP8l?^m`M069e_$gUu1G~Si$r#Db>RW?Xxr1i3 zU}3e66CnC_N(ryScVhF%p7!Zs;o9%K&6EYZ3oRWH+nY=r>ML5RV}UVM5LU3?&R^3c z*yGY}>NGt9GBX1LpI6=voIS=^Xvm|6n<>r?b&=nFv_-Z%Mm7gp! zSI@=w{S$c{z45YBG@x~lPoG6l=DOXaZPZVlw2+33otl)CnYysT!Y~2K-zCtw?30-Z z+j4f4G}f{>C*}kX%RUJeNc7CBpe@lm@?8X1D0HyuJA7fg9{pXg(i_i5pHz&enAz99 zWY3;MKvcgk8C$XtDv6Yv9nuV?irv9MVk&VuUm#O*IQgealiPX?FMl0-hGD?jlbT|; zME&f##=f<={Z30HDUKa?&A?`}^JL%n$By&#!^_LLX#Hw!dL^x^o6ADIYq{oZ_wI$f zBPDV!nu9vX(9U=M4q63-<+v6a=_auzKjbnp>~RgNBkd^lU158+SLy@%Fg|_0De54h z^rK{5>e-9~goCutBe7pS^s-`ZU@;qFoc`@|Uwyz__~mA3V5aaYCZ<4e6g-K3SmT;h z@it4I5vQD*>)Q*Fk+6`Eb4vzkclOo0&Bf~(wh1Wr-GBRg!}h;jXKPr10(}{2!1D1% zZnFF}mr~=Vjw0b47Mu_oQ`l$EqB>V3NVJyRF^Qh4r|cIXJIkCIu|e32zE3D{>g4&%2EEepV0ihrnN0lI*h$OJUUNEJ+f5_s5*kt zmQfjSrXy0*UszZofNBGqi063mn#*;wW}5WUXL;JVcPLTyPpbj}@IfE`+)C3>1iy6( zj@xZ`!%VYN^QX6s+4^nia$?ubBc1sgz=wkk0rC;u!2s(j`^WgqwSUq;DL&UAG&u(% ztx2nnfUn_>ZkfgUW8E9g}L@NcOjYNW~s;MKbcH~h0cpk{_HWNdfijblYz+h2z03P3!{w_^F+Z{6(m;mYyc?e=$R~S7W6r)rmnhc^ zWDY8UgC=qhHXPr6E&p}OFapx)Yqfq0c|%ScJfo!5%;`l<0^eYMGZSctYCudt4D;QS zllZXAwPzujN)eGld?PN9>@xFHYu!q3RYPgwD4^+{ZX+R4pqMO?|LJJ$&|pqT%}z(2 zws%$GBS~6_4OO$4U!NF5sidchXC;p!pWSoPq9I=D?mxL{Zt)>jI<~1LE1+Oz;S?N` zsjnlQu+gxjSKXW_*MzO^o#-wU70)7mu(uLfuB-0YqK5E?-e-<1nICGBYERzbSu?t- z1J9I?E{8Qu_&Px*?|>1;GK>itJ}M{~z2zc|c`DfS=_rwR>wbvoH*rc9Ca=CCq-4Jh z+IxAat$A_beud7*u*t20_~6e9o9BJn_Ho1ME|LyR2HWhz8j>^3+Tpo;1 z#OP$C#H+-wZB1(eXsCdjH8Y>Be8*l^l2z0+y_nU@-|33tBxzRwJX*%MM2dIi{#=IoY<7?7I@41JDTMl z|9r8UIP#bjPm~nR+<#Sib?~q)WS#taf5E>&WYVfkl0n+1X*26v+XO>&f<8pb)x%vS;$rMu{Rcy+BTIL?an0i7iczQl+`d} zYwfz$K@_rR)TcHqJ%uE`{3$4djVoPQ;Hn?ilq^IOYxj-eWN$8weIZ>f`k+fXTv4XV zxXVid5tejj=$k{SJ|9C8d_7#uwA^RYU!2J#ik0bpw9U$J7X!0I3Cu;srmBFnZmXU! zu!~xOmIrL+e;d4Fy_Yn8BTM_b>7-kEqBb{bS3=bJ-^ zArybG{xTk8B}Ff%l0yRj=@m6PP)-nCvyy%R%;|U!{>YrP!}BK`AZ-hu>ElmSHK=&> zEupkk&(|o!b>Z|PcSs`6=3@`isI1|I>wG~8HCk8BNXvslF zb2qb{NmN5#uR-97^5i7Y3#R5QJ74sp0$r%yKu?ed&+ivClsUAJZB~9o<~Q6;L}dp| zgxwnq#X_ME*@s7~+yMyT#C>E|gD=JjzeA}2|Gfez+Cs^Y@3HvO`zi4Y z2oH@RhUH`=t1aWXIifih7aEhgjrV*`ZHH6adZ_+ar&ZyfD2E$B z6i?p|;Ppl5a{2F&Nn$CdcSjfBzTQctXYmW#oGbBx!zpUKne^JrV-1O*A zte39UNS;l(F=?FNaY}cPnV{;IWxW<}kbX@ieFQx@krv%HfvG%4XlKg9O7V3+8>hFt zsZ_-g>;fy72bHS{qLMf>2diP8r87W*IH+%^i_F?^Vcf&!KcIFoE=h>1+K_QCN5_s_ z4q#&aN9h^Ld$%bf!>GnfOUhgzxE|*hE-EA?ojuK5A@-75Y%0`lR@w?JsH>*y%6tpk?I`Tui&N%cfoY1R<> ziTCSG=en`fKl@2rmFUkA)=$oTW&^T_;Wp@KWjYX;@4#NB@x@!36O)_Th#4Bu=8*MK zKC=NwyP~_@yce6Gz$)Y@)bwMU2i2q)9rf>$?y76AlgTZUdG4W6;#_}FOmo!8WcV9? z=tw8waqML#6=2IOVbtwANc83v@=3>m-{G0{Ny)8;7W=g^yEtkE^>yoYbICa)d+sE5R5 ziLK%3zGNws91-!M=Gf<__>gK>e=N=WaVosXzjacH1QSgiHH~f)O#=+XaX|Rsy<^PZ z+N0swA*aXW@XXfN_}RltlFet{@n-5?bzS1KAire&KbctG3g4A!B3yFxfvaUB0=oHU>7e+qgGXcrRVL zaJBKZ_7?3UZ~OFGJ@XP}4U>$LdyBF54(1j_{1m|hWwpUDgwKj})AR%%l7uYevu|w~ zkBOe1zQNCkzkSc_-nZ%ZL1wYmEb(6jIMU>7Yg+K%!3ogU`%s>|sEID}D>#`ArT1Xg zY3DbPR2EFVq|exiDiMyL{;h7zv1OiG^7pKqV>Nm=z2UX6`q@g1l92J6cc+a@kZm*I z1)8d3#;T!<7VjIabqo@eyQoJ)37|fr}Z$3c;pZLeiyn9}` zOV#On7kX{lo-U2XtHNsMgs1tS-$8(nM4yol$L~+TU_|hSo}B(aT+{L@Qqtw>&LoFVZ&5)JcX<|jF-?{%dp72IDUzD0V*CKhi2*j^8=68STUt&br&iVp zT&BuNStFLR+Z&i$V42R4;X^c+lSmq13oJAc!GbaOKI=Lp0;>JnzgjCjp67xP4qg9a zdR?9CTpwbT3D8_T3Xu@c7&a8<3RUEg#=nkbg0w+8cqc?u^a08zbMm@Aj|2z%eC+0^ zql|__mJH(p_&ZY9I9)`pcdL0P#sxFdeI2ZfGdQl2{heylGP}w_1jKaz3a+xS@%id) zUXNpAXIJ~d{kp)a&3uJ>KeBkF0>+^h%Q=^5J_{f0O-z>PK22*&cP1cXs-$D9ble+= z=~ByXN64k!9VyHHrr*1R(d9x1ns%vcOG)`V zQ)GPJ#*rwA?dc^MkkKtXkNRsa6q5~dJ6-YNo3j!4o!ms;ejpQ=^?m|rTJiRsg{K^5 zM7|8=3C>L;f(3o71q@ZNtzz4^=Fuj+G^&VWgU!g5T&)PxJb%5;=Q=oV5ZTVL+>-dx zhhj@57~9XMJMd%ThH!JwXU+%2)FLU@1Uk_VOT~m8v)Dkv{-tP3(1{W3lsxylL+)Ams{`mFkBBHjmQA(dV4hlVkETa_SZqb@%q znl$-FD&x1SE-}P^LFZj6804F6E=n>Fjh=Og^ix@pmsBrc;SD;KvAb}^#tTq|XnPVJ zpT2sEeG7j1wQD4@_IZCbtQ+%9$cJfH+nzm7ZuJ_=8dWlMMAS=kbX_atKBec%d{?j6 zMT6`Wiljm1dZ+vZ>{ozBVSFPAiexw&_`jBDO04g7sG4t^{7&T_s(;7^OJkPNAk7EeNPJB+3 zvnI>9baeSf@IPpZWe^9Ev^W9*!{4{x=I31$Z|j8kg4qYeZnj)K>zaEC-uPo>RSdLE zc5^nm$Is!d8}Ln;f6P3~vKgXj)_-B2uSEdl}Se4P3<09 z^@w?vWg%xH_Jh8+7{G4dT9PLFNw#Cn%B3(2XpP%XOtP_Pkbs9kV z$Q-3kxGQq+N6qKq^axgH)t_hF!-n7lva+Iw5CB1Z-2D814juglNK5g0+ch`iw<~fn zBWiwk;dB}#ap%1RpZax*IFkCNe69y@xvGr^2Afgy<;hRjPZ&4)J9UVSLbPd*Li8;& zj#t5gx0#(>uO7y{KHFrUSnY5iQ0@N6dsnw_XV|c+=cU4sBcs8D_UkF3q_a)o2PEyF zbx!;+GWe_i*JgQHGt(zo)>&;KdH-r4|K=fgzy_@zMbL|azNlnsLrvmF=z&Dr_F>=o zOyF^3ZU?9&s$M>Umkl(GgqVraCNJfNUCn%G@b_nHt!Eto8>uzL_&DQ#UKq=` zEOCp8rf~adZdQ?Loa}6dzb~63LkY2ne7g0#S%1Qt>FW9*{J};0(eM>Uzxxx+Jc=Sw zNbr5M_&QPzoZD-!SVIZ2uWzT1bQFtWLBLeutjw; z$)QUUFgL}$slTMW_j9~~-^lx*3A=|OsaHGxyolndAN+|6ft0Ht44TqVo7R95)TnNp zQPr`<3|W_hYJ{+oFnY|oclbRNqpM?1ZI3)7DWPW?MC-KgzoKB4o$cuW)CsOirDD1w zYu)U^(;c3@$p6$5*I$McZuo=gLiFH--|M}MGVvfh^UWW1Xk z488s>afB{8n19#I#%Qg?lGX-cA!ZQ4>3`_FPJvUKpF0!VF%u(QnO~)ezL2D@n4T!J z^TLk=W9ioU>M>iMaW}C(=-VESzwQY4UB6i(J)vX3hlOv*D;9`p!YA;Jo09ZALCS0x z``9xT+*}tmjgwkb^Ht;=)Ha!3m$Ej3da-!tbc8;59KaUhVqo*5YWio)fbPmVPBcs1 z+E63@FJJHMU>@vmiQydDtYDEDw-;?c`FlUhl)EW~JP2Mw#)x;w4hND9y52uN1_s_U zbd_D{vg>WVjMxf{SyxjYYv!SG;qijw`Avz%TbMSMhM?mvIZsNd^g$c$N zjY3h7e`WP_q^S_Dy4f4fx-AJ5imltL_1J#=C9HNs((E^m&@8SiY?#ONNoMOI@>V{| zzt8Ato5|}rgG6+Vlv&z@Jl89_!mE$lDYbygNM$O9HcfPZ8)J&)hQ5)GD`$Pp07xQF zz?AEtd23`xy<1Ka)JF^Wrs@gF){X)*UPwPU%$$DHY3tQ6>{Qy( zI+f9}N*VO;dNX^!aO=whm+vK|KxofHRE+nIq|`WcH)SPb3^IW+jjZ=GtMEFhD9ZBe*g4qo_y3(B`47t?#J9n|fsREt^6+oZnYE|O>VMg+UqNs?XySy+NRDe)ZhJ21Dg9^xuAx;~ADlE4?&9K+FY zLY4OquJPQc%9&G=agFz$sVapHEv;W~Z~-$7(71afdx?2z$CZQEcPm+W`E#ptJe_EF zNs=>4HZsJh-4Qn(h6^Ly;cS>|l~Oy?Vb**xPSqlKMvd+md;Jbp5$L(AjPu#&qk;SC zAt$%M%wCWtQ^L+WOVlob&+GL-GaUCk#gJ^FLpSQBfr6E<#a#buo+bMG8I6`=zw;r!Zr#``Y6%cj7(T>{_-N(%43famwv!j2H*;aMnE} z3GVb9&|gq~f{@+%UQ0=%)KWoB_Ja5(-oZW5k!XrVeL$#1)yf?DPP>*7gtBIkO=2|+ zk~!gxywqm20328+c`k!6&&}#+`iC12b(fR~H@v`kgQjgjkhYliLxiiTJFyoT;X5wY zcxSuxt=;A-b_ohLABKbb?a(Jhv(SoLXjJ*6#VgC^Io-IMR~6zl(u$kjz>u4tzd>T> z`OWiT@O8#+O-b3Dj>Cs(NV8K4hT@nw0v)>J!1}~dmAfC&V&Zcm*7+tb&a0Z2n8`=t z%UU0!STkH%} z$Gl|&T*vRGX=^F|=5m3yDO-g-DW8gQsZGYyk=GWZYos0>I=7MG=mlij%mv9*cE`-i zOfyQu?`5;Xqoa6A?@IAVZTZ+GKMps-AN9#tA#vufqKlEtZ$svUYH7;UrL&7ymjs2h z|KJgsm=GK=mx9x=_IzQv$QXlsJgVYsJOU@iW2Aue47K{Mnr(% zls~)ux`ll{bGrQkeB|0MiR_WX)dU3Fd+OF-Ge_2T_8?>Be~_-;ZvT)7Zx!wtQpoYp#(5_i;Y-fOez&Vj(Be{*bW0QNL}yF}Evr-^v_z zz`DK8xp-uCA?9=`PCl{K9OF*$Cm#5y5;OM?SL#}a#eLWpBhNG~@!M4?Z$4jfC!=gm zwl??6gY&C;;dY!;dQ0gQq^Oe0;%f}`irfoFJIxYe)A6OkkC#f3**Mwr55;81L&Q#h z4uWd~D;nFML_bM6Oc{`GjE-N8*A4VR6tbVinQavNGX(AZ9ne1yAqUQbT+waTR?Mf- z(1^OPqjl>UaH%1+UOZPb@dmn)9aTIjh$&r~avj7?&MSZ7ScL*zE({Z&cFZKv6Rs=B*a|GANc994A_xCl+Q`(OY-EcW-Fv$LZe zgIZN8U4pg4tAIGcvk0PLjwhoB7aq8huIOyN z`E5b`yf>PB|DN`}Lu}QTO#It#`Hguqc>QFXWJDlzEvMW0boIu_)MOBy(+b7MyFJ?xJ&+m}|daP2c&rshQpR z)GHe(QM5MdovXb$_%7Y(vrNMUtr4Yjn!qiQA=ixG3GH;1o_+P|hR5akMmE-M*Ms|i z1zcxF_VRVeWruX?W?FoDYr)}h6sI*;r_srH#qEkqTOKig7dN0^n|V^>(b-Xe>rT4A zPq`G!qtB#EBi#=wtL+upix1#Ta)5CyiF1vB6@sz*`dEY%4RsHD^&B9-h4mg`dY8x7 z_qZ?9dG$;j%KN(2{QcDTEikCJ_Yp)=duVdShqLMXqUZcR+3_cbp=_-2mp(`Io)J~S zFAl*AZH*t-rHT3z-tb6K2+XM0&3jcV?|oi06Z^?-6K&(f?2Z{PdVr08yrcFtJ=|C( z=PdRx-g375e6xI@43*Vhqn4SE;3Yl~Psq70Wa5WZ^LtC`1H@ip$VdGCBQf)3_^>k4 zr8Me`cr1T*IO|7V`=tNF%G35Z>{6%pImj2~0Q;yab~CH1QLk2})BHu3Nua~R0DD-H z>A@MT%`-#?+5~~3RlX7mc6-3{YnmIpgXfG=rKza{J>QoaRBXcUsfJY*4uWc4>uX>f z;YN5AT$9%>?^qn-sI$j#<{O|-pa1DOuQJgXN#A`IctZ)`h%a1qXvX{lQzj*xYo&<$ zIb$i9ixGfSF3|K1a&;?++Es`CP>1Sx_`Wq^a^Se*?(=izf-dxS^D=3}sYHF&%Wb0k za~X?P_o-`s4p?eSoIb(zv`qwQMo`-^0!B>BB+T+wm3*IbheA#Hfnr))SZBHSAZ z4eS_C>y$B@v{{G>!U8*7kWc{peLy0kp=;NT3SR=uIp1x3KEH90sVP5~g!6&rn@eo8 z)nZ&OldlPLX+U5!^1U@L)6d%grvfNvT7d~YvxXx0yJV+JW z>V$;VyO-ZZvijEI@THu7SJuJ(+inZ3f0%=5tYhab7?M?1VO-R7eYBwUm2FEiVl{W` zZsI228CZIWoMRr6?Gcg7e9e7Bm3{3${S-VrdSRM!kyYZW<<7V>3@JJj6#^W}Q#Oyi zN%4)!(CAN#GA-bbNg-<&troPLENSK6__zm49n`e(>h+4tVQV~{ntLxMDPP2`Nz9UJ zH_j{E7~py=u6`1GlT;;)+-1FmlHe*=2^YZYYFIU}s3x(QEt;e_dp5GsE}GS;Yjfwh z7WJAw0GcYg)F&#+_2+-yZTA@Mp9OM>drJzdj~zNDCUWcYDbb~6$2~;H&5@&3F5uyu zlpzWm>RN&8xG0O4^Ei0%)0XknL?Gpx5$Fvbj zrjP@9?#yj#Xi7eUK;y80gEP;1%|p0ir#CX9vKy}2+TlYwuq!QV4cjgh&3SdJ;^KdA zrd5@meTVihq&d?MrBRe1Lvi)Yf8#DlpkWs*b>Dg(qi}a)aFM=VoUPy8)Vd+T${eM{ zn89PbY{>3iDWyJGZ~XnG9eM0MKSccm4XG;XWQ%qRs+l(S3R&(59I)|IoeUosjNqhM zul>F@wJs_|#T-%vEua08J4^~3u%sFcdd&PM?upyceQ%p7e}XY*D5+1vJLo>+gy`M# zOXV{DQ0gX?5jtyb$ECyt!sTCR6s&`L{8?GvqU`*yxEA@yX5<-_Th;O~_UK4KL-(=U zgY*m8?FK(arYzh(_X*T2IqCB>qWd2pI>l;Cdf9nyNZ6I0^fkMVV=UN4-YDjfAN*9y zuGA&CPxFNRUGl;+pIsOao{pxAW5)x0aySe1>=7zh9G#0S{5Z@B+>?cFp0qknz^GCS z6Bl=f@_agDx+q83L8Vgy6^e|c04=289z#@%)S~3u$sGQ@#O=fR_;%re z{piCv?e+oLQf;nbp!Ya-t1~tpDHqL@F!dX6y%tVVF(E6JmelcdSdJpCHb}2;}aa zkk@zgTc?BFnc!0xqF%uxtrDf|_@ll}db$DzXKtS0nY$x)?oyw_<^k($+OZp!^JV3t zqH5tCLsBDTLEhi8`b=bhnJ60o|M94@fr80rc=m=vRMl{963-HZnm{mC(<||dNX8Lw^k|t^_-o{YXWA-TsoICH6tPD%?-ZfK2mpkDK zHKi;bEQ?_1qCcToxpUrTS(0QyRXrj`DSAkSu&^t51+cny?fdvNZgWPtp5Y=K{br>y z$ueJ`_-D~ANmmIx-c6(N{tjp;N!Vgxu`cM@hv^ve=8GF?zR zK=wg!M(GxY7zq#JgTlCd*rj^aIc%A`z4T~MeoS~-L$7tAqO@8?D`jRg6LZnH{+iH5 zsqdFfY~M#4AN`&5w;;*w=>1y3etqDPDNNQQ&;*UP9xbpL-8+bRstIN`Gjz0UZ(J#` zb5V!yFAQ$C^iF*Ib-~qE{BI>0DIP2a8KgkXn8~2JW=rs(roFg(d+xQ5{G~gRYcLP2 zvpxnoOKx#=3VU~tZyiKjK8;euXsnS*G_BjL2ozE;;ozoD*-Id}SCnyDq>g6J?ac@q zYtQz3*CPn8_C^exl^@oW>{DwX=u~i8@NFfLedDg<$f-MYd#yOQ$?3lZ7x=P}MZ_iG zlJ7>8Xab@bK@qRtYOg5(K;I+!z-N9NsOl+j{(mxiPTW1=EDeEB&S*32c{p8cAq2 zL-QEor6gyn{fpi$?UZdOh8;}^EcDPo46s&;TWsLb**!d-^UK>_-1y-}Jcu(7B{I8x za%>O##Iwe=R|0O=hR*i_5)Ix4L6vT%0M7~P=zec>+bfO`jH5M3@8f!a{m`j4dquPR zH_iLI2iDDHSElfWyDqG48tP>a=%I z?|0#@f`xRF@)L76(_pQ%Z>Qxv6_p$PDKAYWr_i7m@tEFPv_LU_!9@=I=3%z%KRi(a zvdOJ~bDuJ>*^y(lGt6XAHu=?Xk)O;_{6Y>hK9su*UW{^45yDx#At2tg!huQ5gq!;z z=bqLpDqHH1c5Z~|skW)Z2r0{M99}}a3r3G4=*rc`o1JiVEy*8&!Ih^?7cr;?Jipx4 z{0FUX?VG?B)}wPC&QD1c#++01q;9HUv?#Tm-7)jMX=Wt!dmbh zpWusIE@O`jmu8<(HkOy4|CEQLZIkXWYm;jei4t+)W!kBf@ML|H#M>~a`_~=ee(Nt7 z5Lhu5(x`IZgL}P!kOziuX$zKO#1s-a1Cbh;&9=*)O|~Ff4w8+~ZmwOZ^Dz1y@ATWP zV$dx^85>bx^Tde_2v(gX@_Mn3cl{)0J=G5XYOBxqw>_xj1%gLdZBTu_JvfW+f%)lQ zT6o_EhwP?1r+_(RoXlrqNHAfIAkVipcMEJPD13cfBt*f=UozVzQ9$;r(#tyc5g&fB zR6ilW?pNAe=MIEn_5bBVvx}U`Bzego8U0XWPM`I+oCWeI9UB}|Nrep<_p#0X>{z5% zD8~JGTyqiSu5rgWKXX!=-}6uS-5Z-b|AZK}v-F%&S(6 zEPe;|5fF5G|7eKpC2P5Hu@ zxXbm|NgqQx`l7Vy%KtK|P9APXPkOJ%QcpOaCG4i4Xeuyhb$w?AR-fN-UTc)L+T(FQ9VOHyPqPrC? z)grB4n=O;n**2AA=1=Yq=_l0n9+A}L**0X4Vs)YqRQZM)FQPynYW>(j->PDH{cQA7 z;z+-c0;7&W{q09lboEzA?YUd#mE41DMVt~D8t3GsmyBw{%2Er%A${%Hx`|B`HB}X_ zb4WWqF+IsX-IZd>y^L-)bxC!Neb{|%Sk{5uGyj{FKk1Y63yBbEX9|}MiAnBb500$5 zx7VE7F)#S1oo?g71etXDHPL#-%0NfmLs!}NCqH}lU+8C*GAJsH^lDL>Wtj!_RD`?< zaHfiI*blCmi>&wQD4JTq$*Z2GuQTg{;sK5M-B^^eh|UR8=khTgXo>kx50V8|r;inV z!)B0AhurOYjrd+-SGDpEThfjoK7#SYCsMWY= z>P7YkL5+9PBB1LBe=C7)A={TPH?y=;=u%4D>q4$|kgI_0(cn)AM?EKQC1+_ zKtX`)Z&cci!uc8Au;pf$*HS*@=7AL4=I*WYUQyXMoirTQcf1}d?K&q&=6^RNvgi~4 z9t^(us$1rfxe|!T=JH|w3pv*Jp|}^Re$@y;eC*>{b4_#10U`K_`~zK|CXzznaLMSQ zM88*atx|VQ(@>+G8n~djt&3|BZ!4f%4m(OHQjz<96m0ixKXfpY-=2VC!R5^CnxF*( zwKtBn{gb*N-NpN|qeQR=g8@KpQXDmac0nBla4)}2?r)G1c2LXIoX%&_!h&k6Zlxe7%cZ#Cp>b_Z#CMUt7GEg2T2-l1VO(=3oEh!?bzm z&>D)f3*B74eq%kzJ2tBGupu3k;ayq}f_rR?wA!Uivbkqe^h;{{pyZTmMSYNUz2Mam zlPq15NX;Kirpnns63I#}cUF-qq?ssZ6s^~quu%x3Ygls-sb{0Yz-X6y!kiPgQxj;a?=n<*Vp3XayHTD@# z4+Kx|fC>H$%O_?rHA%z&Yz09}1$an>(m!E8bJm-s_=QF?#~{aET=lUZEd(p8bHhpj zbu({YXPZHzKrr?rBoC4T4@#lLdWUL;K;Ark!9`|;78CR+3c{Aad~tXIOpgeA&ZUi+ zmR2VTFF0z@#$LX1+tqA2=K&wrCwY7rOs`~@J&hC>7;KjywBz(^PV7X=KY0fLj!^;d zNU((50g-@?a%j-(qJH@$o6S?V#vV$Rt~eGx3rs4iQ#%^CdhWq<*{n)R76NFhMkzy2 zgK@sU(m#7#K)|0Wm<;q)zB8p{0s5w&D_Wo)z@`@%cpZh~--IGAE`9K=mSUS+>^$Xu zeqW8$3>z9&6tWFNnqJ{Fn?-b}uvg_^%?#7R$a4K>2Gf1aBgbo%X^QLwIP$>pKBkCB zLO%UxlLbl3sjL+HZNntR;+Q;`GOG0Z>jg zmlY&Wc7YiVVHw`nZ>%*#%7Fo)p?~SI=nfO28*T;G_pQZ!sD4_62;v~;%j#8D z*q=JSpA|d$&6QQqBQe9VjC3 zh9o2m;i>M00DtxAVHEMw4=N1Ew(RWiY8FZsEiB`*$`=+<)dQB(=hiOOK44XwAuHy6 zamDmm^V<^NVe~SilUnwr*1p}T=C(|B@1tT~SQ3}{otzI=k~-!pS9H;5pCu~&`THa+ zXa0_`E<-ZbP}YXe~ecQe!#dJ*3NoDRAb<jpsxKx1@jJVeo=*MjpnVj( zEE$NdEEJSe@?tM9E^x};X)+Cdi)Cl_Gr!OJ`%D@q_N}2!8|BRZV}VzIPC8Y)kO!em z{P`^`La-O-bi^C`km6*B?ZZ!WFi%7gX|RYiV}ZrEO-+!B^(3vWxzlZorFZ+20AI16 zsk3?L%H~0FvcJGb8APAmE^m4~a-zvw>U_+;8Ur`Vij3nQ8f~P81WH49EkQaLNWm1t zM7o0H)%p{oIs0dG`uoluD3^0?Iwf0T$HO77n?1>O`-8||n5atn!MnX@D_5(>O2uAz%5r!#A7&QQqQWT37#AdY44R=aACIL%i*Vn zD1kB+ac@8e(U6LP3w*FU27y+5TGSbT6Xg9MdctdOHFnfeh0^6c%2ARj7G}QA9~p!D zIC~01GSW-?fL3JqX^ZaW0#x-9tbHN>hA|#DYRNY)Wv`;MB7<9ZtgUO&xL38?#n?eZ zq9(T;=Yh;D+iyktMfRK~xWASX%nuWkI)~qU38o5S$uN14?kQm(Dnq;Q^F8fg*cg>TA4oJQ%ZRlia zmQib%rxv0jS0I2m9;|A*qlIusT~9EdAgoJq@~=lMuzq?k24_6H&Z7^>VHNKb(zxxh0=$Op<-76-3k7Eq5H35 zhiuHU{rGE*qK5bYJtPvH6!(UZpeL90y+hvpwUK~&!I+-uL&=tfRXk!4fy7<>mg0tM z5gF2*zxlCKh1W~S3>`rYk&WRC+a;pEAN9SXOy{ff`2gWH#@>(9XYxcmc_BIEiJg!E zP6c}dE~s#gXT3(@VPW28<@VkUawKroZ!OpS$FM`CI1r;~oRo$Ph;w5?P;}beNgZMjCx#g4!?? z!&LY_^-$vBc0N2cSQCj6NAI6f>7F|H2m*!)h5|37#U=ZoIu=U-3d-WF%34!MX#A=^ z%z5PI$)x4R;g^Y+YDSs6oPji3g+>0T4J#P_qWe_nY`>vwl9pHQlJRVc zPR1Iy(h^veY%P|fu4G=7Z5WjeSRsYh=RsxWXQwHi@)BLmi+_`^mUI( zU$+l*K4j(~_z?KfLxfLCT@_ytJ?ZMMYwP*yK_XV#d1PFJtFw6I1t>;5UZK!F%l^{B zoxcsbS~yjiQVGh|!N?pHqirr2u0JA1#vzF>YU>%X3OYaK9$z?qB)*g}h(%|(fe9YD z^$pD7c%k>HaPB?O#14wkq{Zp9zD+XCE6<@^w`@k1H=u5Dtc00Q~_-C_jie3UGaF zF7FBlP>@V|{o%B^XZAV+>uOr0)LlGr`=^`Ix6(8T`ycn%zK@%6cAl<1P3K*ujBRi8 z!N)~r8u-{Ah=u5rVTP>-G0~EN*`uRe8YKQ5eSA+7LpC-NM zR!QT<-p-KjZ(F@#BAk=EU80_U`f)b$R91 zh&lcuyf`*4ETc&Jpjx7JH<2{6}dyAD#bMhmt zPI(>Lz@=zngFxv1B>?~l6D4YRAPv{OE>!)`J2ZV~?_1<}%&vLDdbr%N0S-39S+h`~ zf(cRcP^+)rJ!-yW2ejKSi^F63JjdeYhH`?Z+b?c=;Xd+)FWpscIf$x9#ZzwLPxnvy z_CkH|4d36FMx5ObxicOgwbyScPr0L*n;yk+upRv37iF~9@2s15ywam9M@lgmuIfe! zs3Pk`TjHIXez0JR4AVjXc@(8l4M`^$FojP1_1G2fs5i0YmUVaf$sgd8zbAXYaBIJ4 zaPR>700;nj0HD7!AOJi7@L$BVUm!F9U;t2eK$t$@-h6HVfLYCogCVy$$YXoA5Y3@xh)+T_)!ZjoX`QTufJRt&hP{XVFZGdlq$*Rk~GED^ZXW-&Wi7HPzgu`!Dy4PQ3K<( zywFs-+cCOHb!UPhD7lO9((Y{*j!=gcgpO^J>OS7vRtGo$`9d2+9Y7 zHHKGd*OE#6pc}7nLfksM}n%-ekpXs9W2`}q5{ zEbEwW#6gl%E-O^p!L*8bGwJHe8J9zh-kzGZL391=oYs!L)pafLQvMO*Fcl5~V z8P%27S-LGoH!k&H^)dA|?d#{)$hY+~F5J~{>%X@JKrQY*M_fE_)pG$f?6K5069Y9Na~@+#nS z0P-$QE0Apf_%5b9FmC|9JasY(ps+%?<6pynNabOge{IbXu)<9LaVpT3DPEL9U^*=3?(8-QjidsBtc1Z6$#8Uo~1tuf;mQO z%is~(#lMW=AL2{?V^&xv=Sc<}$2v;M)TJqLRb(@dV3DdQd73}Am}nGQN9HMxb=G-# zr1r$_3ghMHEB;|n#2O4|ki^)E_8lfS%5?A_E;uWb<)9I%n4@(D(h+KzHG0J964jf9 ze~iP-T$|K1rE`k)822_FY67YVR2jiCk*SB%(5vKgHRNiFxrA~>_sa2^lDJ@Y0At6_ zrkZABE1uY5v}J3_tQ z3k2`W+69lAQDn;SpoXUE9k0czguLi|uSK+m(&}BVHRGn08((njr+{}S&5c6eFLo!{ z_IKL_eg*0Fx7!7O1^xE-L#Pu`Owj$;kDMWlry#A2&?Jn^AXJIyCWvGTnH3_{ucL5D zzVl-xtWy9vmu)W7NW_Vx6Y-4-0#ENeBoDx!wAO5+I`eAtbCnZg&l>bQ+t6kI<$TtO zH?c-Iag&77e3CQ?)tG~03O7lQ1!rbdYJrP|UV9o|QR$h?d$z9$g*qx)L#Q=3*C=g6 z=_S`pFZ3C3NmUi0<4JEoR%~S^pFEpipu1D z)$y|YMV-#VwdIa8CC9F{^FrIy*3q@dOHJDF#2)HHIJmBqU9sD`*M-@AG2c=TE(*jt zm{QO{-$;CL%s{NcjlFRz4>uMsOphpLfuaHiOWd+3dSTeyiTX&+!QS1byO%d>0?{8N zB@oaCH}>eW!#ZxUy0e%`^UCxa&#X-|k4!r_%w;oQ z(xIgY1P0$%akLD@E+c##$YY1f*wNGWH8&%@9QbmFDqb5!Be5>|&Z2kgepR|Vppm|@ zzP>&)Yp$Y&HsXxkLrOr#8z?XWw_+Mn;B2Je&&{XWp0c4X@L@d@eSk0^w-NMzrobJr zDh0UGS^^=oLT;wP#%fzf`go1iEbo780mSluHlfSw#md;xacA>VDUr_4jYU??O$GNU z^)Z1@Bv454(0gvCz|5HcHhoaZkCGFY1 zBL15WE8sgG9YuNgTVz&AlXQ&$II(fOm!2Y@tRSy=SLju8KjS`UK^)l`*NLo`tT8U% zU|D=1d9z;~n!*8&P5k8HnBb=2O*>FS5o#7C*@QZHb1Xy4BTr5M!liKVCvG=)arM=M z8U?^LX6X+BpA@<{yENYyo1IdlpJ-HpU4>n7RAkW)D(PuIug-iAL%F0`e)}P@ zF0wZj%WDcn6LE{eS8WHGoHR{ha49V_Bot#VlvD1LA{&u_l0-J!Q1QQN4_X1QXS#rr zg2+X9qy3Z)`|n|rtIoca2a%&xz(1V-JiIFc;tJdGwsYL94|b4K3eI^fjJ9XD*}nI+ z=EDv#tBFKY`)FH(xHhSlmhj3iZcjN~xq`?5`GE5<0N!e8{_K7V#(e z=I56iKKyZna&ofkn~JG-0Jc)UrJq*`6mV;IXx#^DHUv7@-V++5sMAstmb*iJda>x6 z(C@R>%bg@3ZO#uREUef2(gtUO6vur(Ou8S4uezfBpby(j=$gTa$6MA$e!!#QE9*|I z#&MsDa|pJ1U$n^}uj>$5h_I%mcmQaId6-j$6N69KAM!-Bh#v?OD&g*FT}Iqg+Az;r;Y+l zV48VoQ)MbOdayno99glE@g2}(W^E2NfqvknaGOAIXTFKq+NH z!Z7V_J?breAgSDl(|F|iVp$zj9@(5~C0b3rYN#PUsy33YgKLS5K^8B{MhH=`Wb%j> z7Gf|--&xy(c;HwXfr)Y*l00V|0KTIcl9chy_il%DC0WlCzm@n9 zcWe)LLL!maQh};T2yI3B@`dG&c&yxQ@vS)l?o5i}2ZF_lLpR1bFVTWou5F(4Z!AW= z?2>bnsezZ4QD~%dW%9E0E-T9CaW=Wkn7b^i-m%Kfx5(*3pV-DtBSS7X%wX)-0X!LF zw9O}}cZ$ASB&ZjmTIIH|&{h|oQs>9D^FE6k*loa-@^tWo3F5ewm&uGbg3nK%GaKn0 zbZ`bd-}1{t;fm8#QUPZRhIZQ@OaD82^48c*!Qi(G@x!&GkiMG?E~rHx7LXbRC(8K1 z;GS^%5w>%3AgucVn9PN)`Tu$>_f9Y5PYBcAPmbSswj@6yO7A2%KtcxS@PB&F0Lmb{ zw|Bg^Z*d5vueWy>_AllEMl=QoW_+(8Sji7uw4C3-tAW5YFAO*aiZ2tx%xg`5e7|=< zf=obw0jGGZMEDs-yrRB7AVA3){4dh5JD~9la4kLq0@&@;QH9Np_5F3+`v3KYHq5qYD-Y#wFh@AZ(B%ghdn7P!NxVO&ElwQJDr& z@A@T;j+)N3KB|P4IWA&@qbUx?2j{827+bW-S0;k)G4=^rfZ|a(60qMC07&LgXyy>R z7?7Rn5UA>qy&Mom>`~cnA?R*teHFCU3a?0>4L*{-f|499n>8BJeiK-})+cRM*Fe!o-Dq1WG4@-tk0yb(LOUO^sTAb~&`N$WG>&uuf99z;YaIO1;F6$h0 zxGN0{4J%HoPMc0+PD@(7Y{XfUspMLb))p(W@7Le;+G*kG^$LKRqFTa^2_lE+Ln5FG zH1d8L+|7!i=QHXnBx9$HuKC;OvU1^Z%=YoHZSfn;YE<0kIoKI9_DzW63 z!1EoK;v6^Q9Pi^CDSsq~s>e%yQB2MKZ)pI+rQesDqqFffFfoyRk-OgyI=HA|oCX^0 z-7rAT5NyMCaUnWFZTgQ58VHbzK;=N;LEQxGjqFA2Wos$Yfy!LbazE|MRbofLih7k4`WE3lp!O7+LU5KeMq#~fmqCeo6J6Q*)nzcOo2v?1pc0S z<_^m4mLcyJcBdiBxqj3PpM*53-aM+MeR*_Ulk37-r!r0TLa}OY0INEpUA5($bE{;+ zxq93s*JggsQ~1QIk#;`lyaup*zJXIriCgr`x*=8pyGdC~h7^u0l-N+B2<^#2$VqcP zvhUFh0N7&O`Is?kjoLW&+87YLAqSWv99hHA#XURBJ-O5)y3{=s-6M|8Bg+j!oHRsP zw=^6|l7fkRMMqi7$;w)$D#L}P<$CY|M1flxNKP^B#G+S<`OxJ24k*SWg|t&tYrB-? zW{Dow^nqAF**n4k1;tS*d6fK>X7(6h7jq&s3}leG+9{0 zAw$TQbYXlM3Vo2_vCnB0o|rl| zTvIBJz6|@Orc-#+F1^(d!*W1UB{rE;`_r-X#RTSZm^t2GGQEY684MY)iz-&Fs=o)v z60|CzXI++58biO5u04{$j=XV% z`L28Dc9<8(TXrv+AV?yaGNzWl2~SbqbvsX0)AiD4rsw@MEc}9Tyxf2FuB~x0$A6|Ji!A(QdhsqoN$Q!l7WfjMHoz>v1~X^8`!V z+_`Kl#dJk;)7+(EDhCdp^K0=a&9+B~c~GdpY_DVFPv62V`=DT=x%l&^pMbrz{(mm# ztR5UeAlffVJU>VhBtq}7HBde%fahmUb8LG_YG}aU;Dp@x+Vr55n4F}B!ltUO;*5~C zvbv6zu(;Biw7jgSilXGsz{>3U$j0b`#B$C25A+{!Y)2^cUp+28O`?PRbgXUxwH+Rp=!&`}1O+oK2-)1yFUimoxl z)uYrVxKWyG)ROLsu%Mwath0K)DXvj4On#XXH?;J_83dE3v=HKq1XoD4=9Hb$Q;KZ1 zdd3+E(Wg`i0y9pQ$VAb(B=x2wC{ygrdMe4e`q+e1?}1c@f7p6X#CVETr`!X4CnO#? z5mx{pw5L#-p_whDsms9uAr5hiy=4^Lg{KGWab_9L?oC{5rtOpmn1g}Ft#wSt_JjK< zWE(83ApUq*_&cPsc%h0sV)&iQv|H&xfNvj&deJjt*`~N@#N4^ZJ+*7%#rCUV+`?0oFxes z#VA7IOHey}rEGLe)G29uQu_9Dq{ti3MQpM5XKgIwJ6DqWgPhAPM^M#~I&xNFMufp? z6<5fE{{-*~w2^7v+~*f&WDg1^+1Q=SGourJOtFSw&g#q;kPED@!yV8%m_?BIx3xf` z&L*0h*_KXs5FfZ_uKyR1TkH4cg;Qg91~G{H+5no!cZ2>ZM=%GYempSRTHTmw>Z(Z) zgu?e-Z#_*jQp1!hFS6MX92`e;5^~37^9TZD;%DOu?+32^>>ouqF2QvLS&oD39c}jG zR%GLB=g7*1>3FAQjuQ`|+(78im|DwZ!Zhu=;TVPk>-rI1l5V9E!~PcZo4YZHuXJmXS&w)mN?gKZXn$81IO$5?I zL0YHu3f15lgTDAqh3)|+QEt*MwuGYYODLO!S5(XAbF-T|$$`#|#}2qL=0`jQ6X_3R zAowK&5IKN8Ukh~{tJ43(AXSHykRy~sBvlk}NXnP~sh}4tpw*lksRs>{ub{wZHkmJ# z=!D7Yv_G9LmG1Zp2!+OAu$XQJODL60rL&lA2Z~6gR;f3cZiUKdHD9eZne7A!iN)p& z8cTD;5G$HZ>$Ex_t;cA&UGum<9bu{@j~C5UplVwGqW=MxsQ<$R?`1?v^3^Z9(0SPkzN7z`Gp_255- z15)WsMw{VEjt4Yq&3fyha+Zt#zNO7bHO~he4yWVgU>Va1t#-TP)o>Np3m&)U{pC;v z+YPVx`~B5OP58g`*5IP##^}myzrfu;I==_?{L?Sn<||FHO|fPhzK!Oo9e2@ZN~|L+ zw`mDEg$s-2+EkZHGhpnsLDS~iC8pe`?31ot5ju}GD&42dm99M*JC6;n?Wf!qpIssR zw^cIUr;HgHh9%|&%)K~F)B7|((+r!~w&M)DfDkkd>xkl14cm|uRSlb%rezJgpcvLQ z>!_;cx=2)OBd)H=;*_mMdKuCQYct+o-4K@Jx@HsC^}KciKn00#7#~D!Kq1CH%nQeU zSPK{w3WLpHIoS%C6w5vi(+~`S{6~_FCz@fJ8*O1P{XmxeEO}v?eF6_HK?JPr@HLQI z(dUdR_C5ur#QO?+=RKBLRAbkR?{!Yjmox_|^&tm;a8=?@$EpB_N%H)d!#cY-q>Jz0 zP|NkQcR2)Y1Yr~aeiZHP{p;B<@7XXQ^xemf?2f%@7?!JY!5lCdO^{&WLE<9gLzLvk zv)N*?JU}7Q=nQ(3;cQST)k=^340N9RaqJuK+cET=&)bQ-BUmG^1+DGpShubdANl7;aGW9Y+k#XhM{sM}`67t6(K$ARdRLi;RJ zl{V~Rips5R)N==_zUo2WyL;BE61q4i-#Txz#z9FbT?y)}PW3ViwxL>~ z0mjKQuF?u(-UY`YFNuwkz8l)vIRl4b#UzbhNyC zuX12_u~fVy7mo``N5y9k(}9OWW*@i_Ghhqa5$W>YvVIv4Gfk*`Bd&ZWSKsFklsi>J zCyf?&By_Jw4t;lN71}E0(^hv!?UFZ3j~9hX-ZG@Lrh8F#=I@8tSMUg)zRnR&ZM5T+ z?tI>3>#m+OylvH11G)DM`qEhicQD|Bg4A5>3rByJ+cfd42nUAhYcday?&T4W6}Omk z_io_(N(0F`QLv)2;I1D-W0Qx~*xn1SVbJ3TkM7X=$J7!AMcAoldZL@ue+cKcBCbWx zjb0Vu^>SPJ7B|uJF7Bmte5+30MQ5J0zO=`lxqNsqG~lDGdqUgtEvrTmP>U829?}&t=p^X zFgqi%udmGVI=RN{^ka_`7E<0sz9Z8bxvz<6UlP>po)Y{mJPLN<tNU_Zh? zq?&Gsil57+9up#eYjyDNgr{cOeJkQX=rXJQmQ83Xgtm z7Bmmc^!eT_A6}~;H|+b!LaiUje#XbhgT+ty9N&J@_ujK+(H1CEDFsRI>#gz><~4dm zg|c7EvB-K_c!Z8ZdN?#>pB5>DM2C-2|6jRu?Qk3vLhz7LgFp9;2xaL1OFF8DbEEx| z;tI~SCEiu^yw1v2p}--9wDX=qMqOY(j9eC^l5Q1A%ZesX{xFQ| zA%Y$hESfd9d(R#v>25wqJk0-0{|u0}$!vYOyXhQWJXXHd{RQlT*kI;IPR<`Vf49XX@pRgZ9ja2h$IK#oz?;;sHmt?@I~6p^`Yov zcwPtma5^yBKVf#i<57d^}DW{}Sy?13A znS6<4f|>W@1v$}!5Dl*71A76{>bnW}rbINgQYz~l?4H_xv(v*|{mfpKUh~0j zm4?yiP+_cWbjrI~lyFY;k07(k$XP$=ymaYQSo^8h?i*k-%ta!fo{G$?l0XvG_i&%W?PSYWux(ykS_}%|KMp@W z<)&~0#-;knw0<3r3(?4 z*Yk~A<-_*ij5(y=8~wFrlVDn7#5uEM7rMVtLaA5r15}AHk^OrfBAKiM6fgh)-lOCD z&H7^W@_XikL;v2u=;OD87$vSjj6^0~oNGP?#zHsCwg`}XbtGWr6y<`bC6wNJSQZHB z=4Hd`3AY}};pb=k*8^dg-aDA80aWB68r=a=f`9=k_yPFoE)Z%ot#3cMHK z)(#DTfk>>EZ?JNg4@n$~F(@#f`yaGsP_90EIuu$^%q~e%(%D3`sVU<`M%ARjG3-N> z$|{aEN%NnLfUB8Uqmz28)vZg3XRx$Hs)4D4W&4g+a^CV(@-rTY5i^t2oI4>gJ_0q4&m$)+_V~s+!Qg% zQj~vGk}}1yi+vn{+S<7_eanl~?kS5?GRF;$0v+W%3O^NDnqt=#u4-ac%qpmsw9cWQ zvPdmrQ~9MzkLHdoE1GiFJ+7Eg@?nvCA8Vnk!9RKx?7_6bT6!ODX}w|n2*FAC&*ZHZ zkzvJ@<~$qGb41zZoE}l5R)_B#yf)F}hMDdhJ5lk6(eHpi@qYeGyYBvp6q^qL9MHL{CrS=~6qy`BE()|<22ZF%{4Gy3BA zw)~0t;Q}IRBBCPf2_zOc&X?u_L`?9Xeh`D$TESJKY=mkE z_`yj+1g%J&A(ef|yM$y_q@vJyn6u1BVbw!^JZinfn=!lJ+;V=js_ehDCChWin1ykx zuEw@?imS|LA@rwXPp+;sUg^97zBxW@iD=hh*@J?+-d6)tHmgjTDY#>Pr>vAM$0|Zq zl8UOO5lzdS#$2tuD;QV2td;{;ijL5(SzRkWheWRWh2FDEYA3w5-leT(Te+9~wCRbX zyWA@VyVjPKnZ2}oGte_&I&=I|1U2$p1pPi6yp&OK}iH$00JPf z0%G+6FyM~^n)Kn>VXK2ic2Qp;z8T9hq@`s`0F<&VMxu>n>qRs&a7TDg5}j;XgEk?r zA@jm#M$!&Y@gAn$Y(E9RE91q;DU{J`=>^k?ve9gzYla#PdF!%A!@Guf6m`oQm6f0* zg)K>*QeCCci_z-|X5v@I!H*{HmEN$WAs>1b^ZoB@cZ4!0mq}E3MIpZ z6c!<4grR2zoR!8(8Wlq+p_6&W7yR+r(b>^2@jfxfu{6=AQLk~kvA(g(@DPbKiv)_K zjD?LAm?ato8+{w~9)&BFtu-%GBA3q27u>(ydtS$1zh6UMeP~)#6_^^I*D-9mTs6E3 zTNYPNKOU_@t({p)FtB5&hSijqz_lnUk(ZS&qH-3e4b|#dI=XoJc=hw#?m4m-dNYo+ z9eDR9TLDaK{5S_O4#G-;X{yyU$wQ{L1_${LX&zIm{6?1D5|nv6%C$XS$XKow;*n z(UxYN`Fdu4A8hjMW{$3h-dJfep2Y;uf&{9YQ&LusL$z1aHV?J8+dAdZ$lY`?M!2W7 zyu5dHz1-M%tz1nU6ci8wK`A0BN)SNC>uy`Ii*Fhq(iQ^0-Q_J*J54W58$VagZftIZ zw#c~+l+KC)!s7ru_7&}(77DUu$asfDA{CU^=`OHiD*b_>=9SCdK z3Hl*~xQ~U4E3J35m(RDf1R3t|YFYWa1kmNFfD*z6TVHs~w#S#Cwe4}tW}L(0_ipA> zABRQexw{|-`rF|QA3FZo)4v~EpXtJl*W=#U`>=16{rmY{W7wLt^ixRa8^?Dv3SVEj zmdZ()7ju9rMREf+D2d8hLt|}sS2?)i?DRA})6v>hlkH}wr>EoOuq^4-t6}-9+v}w| z?EI=2?N&&BXQLvF#!%!py=HAnA$4>WN;Gw3O@P4eIGFep=lyv%f)*9@Sc6P{3go|T z4+WkU31XHjohehcJK0s!^ZmZQ{D)${JDYjx4~+hivK%w=~%&b8TAF;M2z=)q(3=yLeG2(*J0eI_(4NfT{dzIl1YLgNjOL3s2|i+==U-#6lmGNjjorL zk%2|V#fl6Rdu8Qghd0fR?h^u2%rgZ7 zj5=DoP8Oq}1`RdqnH#5VzFm~rnAiqk3BkvTTEgXGMeG9wAzqmBw zJgy81tn5Pn;jsF^a4>-`igxs&hWZ76i5Ckw2-f`D6TV!zkPlL|T6=ly!bu>&a^Wl) zXt`n`8ECp}0cLTxULhRmS17E^t!dk3?Avt+Swxm#D@$GMZ@IagKST3*q{b}C)KX8+ z$A>R_xCmRN1;*QfJuV^s0JmaAvFLMXJa9$RAc0;k|K~vT7(1dw9(oA!4}Rl{F7I z6YVv3c{PWtPBnXf2~V{~1BvG1B?{X8i41yLMZ_#n{$KZZ=-t8jF6i{hNAbkurZ_coZ z3ELc%166D@o*>ab8c`!uRNA!OOOE=9#U2uTv8IINGi)wSyR9fJ_`l2S9RrEDU-u=l zD{E!RXELNL&^ChjDN~PGjJhvAI91rv9STm&BxYu?U;&WBNEzQqReUtl@bEUp9b1y> zl94HhXsL#h{mP2bWYpwC`@s~@m)!Laqs>G2B4#N!|1yDE}j~>b77}PNzdYxbT zL$j``C>9lenC{YmIdL_kG;>5+yjtLz^;6bxb7J2ZPCYF>_Swnm{W@h zffoE%GIRfdL)ifUb1|dbSuqiK(a&lnmBn1GHcRGj{=$M#yzH0ha`PBuQcz|D2JE{Tx99@?!K>3C( z?COjCP(C3hzhfd77@G-vDAz+7LmA^xJzJ~4qMe|4&C+^Tv|iGC6Q|mQy%c$e8YIvN zcu_1^_f`hSNH9d!icp9mmn0e*^fN0`%c)nPNFkNb)zXYM|6v+Z9b!T+o|u?0Gc!98 zRIrEk@g@~I;%+TE#!=?nuq*haJ;`9|sOUWt#(c)xRt-^kqDWp26?I6lR)ucV>`QH| z0B%{eRW6rnBB_MZKxKq={pa90*hUib5Gn_Gy8|)`t*lg{7gPma{k=yb*TJ5YhS){O zubtoR)>HJ2rN|c}mqL$ez+G=w&A+>*QrudOcs9GM&lg8iZp}(|dJC^C7dQBBpU9F= zWn&gvYm`r8;@OWB;+Qf@nNYU&^A;yWmFKr%1)^u*60yke3C`xdruu=S0Dn zHEWizn&MMs0c;=xKDU6<%uH?D_=wSmDOQa06=>#dHK zruB3@d<+Z>Iqa4^?}sTiIa{{hLgaTjG6CDF71wz)nZGk?3ECp_iTSsI#_6`np zeSFbI79N&)XY%x`TRu;eZ9#nq<8DwD-ax6TOs(Y8%v$+2TcS!T9U^hkk0YL*AkJuG zr$7~j(A-?@IsAJx*DH3NG!8 z(4AC&8}}|-wPQU`nwQbxa5@Gyl-T;Z zdfEPoLM&GiX{bEiGG#nV@o%WF)=c$-^G&B8(xKjl6=cX4UwX?X{ z9onZt#eH+P-izWybK*&Yp>YVSM8l(C8`@f%QO)>_vS)U z>NaUdNR}?W;t`Z&)m&W&&n`T>^*KV4C7KSm8{3__!m6sK?*4y@Wyz8>SS2>|{b)H`!gYk1?#iFvvqUh;x8F-j8o6*bcc4`PaZ(5y~Y+R^4 z4;wh238#OaeJ(6I1v_m_2?{)0KsdFl2-!u$H9H#1NJwTrxq@_k8{5dvA?;it0ys1K|vv>J($ zgxstXc?4laMUTr^nEnEytd24@ntmm{JHa20d+HAy1SIsM?)w+}8_ea1a^nrrdyOdh z@-bfhK(&?9fbTy)AJsrR08>JaUsmDeCN9c>YZOG&l#%0bj@;A2Fdb3~s4G}tOfHt3 zEwYR=-i4sTxDe18Rty{;>#Xw>Z+wm?xu!i#==6YIGDMP&K4lO*;vp*>Uh$0CMg;tB zFvSR-k%Rw(K5W>;c1dD0rZ_PwqBy=cdOyS#92bMsR;(-(2g!?t&g6>{QY*pGvfsU* zm}y1!yyh#dNA%0Z6=4d_w3=rwH;QL2$QnK~Hy3Gx3D7S`{6ybE>jAqK!vI;)Ir4M0Chl$znD&n4H0ILVjmM`m11Lrm5HqAtm$cHac=sF#grkL#qq#5GK(--$SUSm z;ufi_V*lo6^NGWSd}8e0XY2VyXfEUu<6?@okV|aIx?HQdM2Q^Aw z8NwLCBx83sG(Xo*cnsF(+6iO9PDp4~8PS}QIhR!XA7nUsT?d=szp0Vp>kaS{H1r%PO)+z+m z$YdZ|Yb|3Fo{}x;!nht;+5IozH{eJ$fZ&#&_YU3?W|!_p70WAYj*A|#BoX@ zucy%j)&)wSfj;$E1|VWpNYnlg=nloy4F0Q zWzW*TgY+LD?TV&x0kBl0%q)vMxpkX?Xk=k>GLcP1BUufeuSY`uQJi>JM5)I`pi?L` zd_JF_nusZ?+V^I%GKJ#BM#a*jsRKX@f+ihX2rdSrMqC-yOy0pV(1H1I)0ig-brn`K zpN_dk$3P~BRLZVSqN1f|p2cuvG0B-4>Vf7s8IP1s#zG+@COqm4T3V1TqTOCl zsn+cEVW8j`0N9@33k4i^_wKz(pGS-WTpk~VegVvT#*vJBLokOifUUzp-E=u1e_b== z2Q!YaUJ1*SLqiVRg)3LC__z|Kjn$qGW{#dOU=5L$<{ zq+aue^(qKWK1*L-o3lQaM)}Y}rKZAco}R`qOb!Vp{!+vjr%+T=i{hM-B&nU6zUiP2 z)CroQ$z|Z{R%I0s=PeY8;9u<89iBN+fA1G9O`+eXk)J`Xa8FLU;V1TeR#1p1ov?BL zxA?DK_5b8Cyd-ETDiVR8W*p~$g4Y3{nawQ3%w_UeaM3$6V~*#s$N6|w;1c@O`G(DDMO_<2mKjKVn^Ef_Z&wWk!TfY#I+_D@Tf$kTQMT)5!c1W zTC1*Xb^BO0?>%|p!i9I=?%u3hUc7i=f8CO9bLZ7}7vPwf)7x0Z5I?D~gT!Wm#y@AV zw74vw=!uH;C*;q0!u%8Ks9S$x_Bl@|)}Kf|=LzNd6XxeUkywAC{2NdF20rnd0MPLh zW?)NeYwNCd>jE!F>m%3e^g50V>CKCe!^^3 z@;onN3>QxJo;!E0_jJ!IM^7Bv+p@tNR~jzf~L);W8$JD78omzy2uvf zh;LsF-I5lFP^~mI6Us_cp3sJ3%9H&fQoD4?1Sz@cS^7&ze_5pME*Jcav)~h~t4jZ8 znu*;f&!0c}GtS0ApaA=#Tlg*jIsRo4NCE+mKiTMR8`YcBZ?fl?@0 z$0MX}Qoe|4H>4GWK9Qo*Ju6U#P=hp$5Ndjs@<>%81zJFSqmNl>B>Z|&=@cn#DXv?w zN=M-TBBc&NH~gPsd6L{7c~iPjwg#z9q{=X@$5c2TuDTWke2^O+9v=6l1S*xgA!9e$ zY;|>YN8oRW|JYwY%3>XguCA^_T}PD4BlS0mT2hmi+SghtqSd9e@ZJv2>(=S70xbb? zeuIJlcLc}^)MjJ91{e482OnNbZWh<{+k(LSfl_G@D5pgt;~OMdjkhIosf1Yxd-i=s zO`PMzgNjG)v9U!M!zdyi6j=8JN}^xG`g~sWp5FZ6;>89yfvon3z@B{>Wgw9o9wRI3 zL}}|T!uCmJI9S5Wg>svbZANC`R$NieWHREW_Aa^IS#Sxm=)9>43OzLVdXBo5#>PgE z9zA;M;?bi<*e}R*s$>p|dwLdYy#xSF+{nnp$e1fIGch_b<`20h@iH2XOm=1V0p{No zigYr(8n3}DO4}2OB<+lEVk%&#(|B4Uk1J6TR6^X&8Sz6kf1}CQa|)F~&#}XuFYfPr zv15;T!Ym#r)5bRZgbI_Y*nVtPC2bLmN~O_KrbG20$A5UKP)*3E@1vUd`mtM(yT`;& z6Yl=?cg@;Xb>YZ^@%v9a?loN)E$G6P;L^8PJ@!O*!{X~X(|z#3(IZ3;CUs3~dJtW5 z_f#4i)1gY5xQ8v=ohaESa;%QLRVKB1s|d{$Q!(^5yli*=yW zQVhj1_=8^k$7pj*4r61CM5tLbpRRs>C}6>0V}1xsMoN5!JV-uKj4_W+VgrUAuQbRp z)WC?i>$njeKwb>TX*gJou{egnP#XKXNQ`=1(zn=<))6`@O_hY2rD-{#ercK@w7fux z-8>@Fx_kFvC5t8~yAlr0O;1nH1;c>noDiPD(~Oxg+!OweYA67f_28_Y*>uSEG-=TO z%0-k?JBkVAw3a$R@AbNx=1^Sg`3u!r{$e$8P~1O?^sjQQekJ z$lbq>3o7KA!aU6M+@kN%@CeR}9Mdt}N@xO`n+(Tc4!719pHJCYIS&a`0Os9?4q|jX zzZ!0C;vntBF8<#TYbE^v3b?I7vnv8VYWv^xvZUvI0enAdd~a9AO3K7i8FVcI^`&mp4qH7sxm9Up{FUM z;*1{c=k)Y4Pm&AM=x07zO=d9%5A8PNaaIC&xt*T+{0qBg$e9Li)B1`a(qo7K$t{Ww z7gf0*&()S!qS5805FUH`UMuq_%C248(p8@0Sqd^awH9*>C`mYInY zx%X(=J32ZwGq$Qk9^q`xxR>l4CWJRBd9)g@zj5j6)weERzIy56s;W34Xp~BiJAOKE)|Wwd9|xS83+U-w1rFH*3-1V`r$96sp?%Pam&4SwEe(oOe?-@gOftvR&nK) zi55*kC8G=Bg=mUHVKC9?JSIgJGxD;U`i9yvE!SUivJoJ;xswuJ2Vn*&W*}^v6f57L z&N9Mm1@;cI_mJ)4^07$Bi&@@>ckhl)qaE?i2k}a3(Vpni;>Va$G%XSTqx<*oa~!w@ zDwDCR^EpVz@mh(e8P0A&=}s;zC&hdj?mu4)thj9I6yMtAi`N{!@SA_}7k}|9mo9zq zhxq%KUps?WcLTohy7l)ZoV*hmZG)i^>PTB~YVLyE+{W_@j%9k>zB1amikO z>eQ*O27P84`%qqPm4~M8{_p?&zyHq=zu8ID3C6&Sx{?lDRe!)>vTM);%J;aBq9!JnBWCZ&Q`2%D_QLxGszN(P0SX9kkZ0 z?zec+|H8>QSjS>OeCABpA5Eo#&>sHT2|xh` z*W}i)_6-taWO6=?5wU9#c~}Nah38$$;uojZ^xXMv{f5Y8=-z_swT8Xnlgmi3RL0^A-b84 z+>9)-gKf|;EHL>WGrisLUFy}->lE}76os1g|dZn!BMBH6^A`UV;Q(0+{6&-|c&q^JHLn5D% zsijy#?Zyc$ zU!%pI1)+^dOLQDXSnV?<3+Lj5RX)p(BRhetK_(X+UKypfh$m_WQ&|}W3$(>tMlCLi z+0{969GFUiTyCdk1|4+A!3K;N9t6-liU-^vMhp$%C7jdcXebz1Jxg=rOP%xTB|J=9 zQr905Cv){cP?gPbD(z|xQ8Z0VHj8IzTQpqOg(fe|RhC9W9L$mUyh}=6IYP^%X$7G& zX=>iE<~l-Wq^WYlb`ykJ)@ZR`KDpojvPlvXH{K9|Une5_)_Oz;BIjmt`8g0pLxU`0tLSg|$(UtwwL zCFq79NO&+L$9e?*V1sN(6pnA;bD?jzfj8iX-5XfN)bniS5|QQU4K!U84sEc5BG4t3 z`JNPoK;GoKRr*HS6#P$-UO@V{OQ{b&5$RQ=|F)FghJPv2-$gq3l)i=ZZKQ3S0x#NZ zmMskrDfrBi=Mi2{FjL`+rv6`N{{h%mk?oJ;bGy1^NtR_x?k#TV)r61)0tqY-Ah48O z>Qc7w-tu~XzETXk|JQqO-}cHbKiI+smR^>GkhsN8;@)l9mMrVaRxkh0NOCuMW$Y_m z&D^PX%9(RM=Zsn{aY;fgad?LTfdtZEMwYdyNN6!^uC1+=1lDC>nYl5r>8Q#wVI@)4 z3o`tltEv+vovpkUZd+YVO{KliXfzp&S|g_7(rwtQRyfFB zSynMD$5Ux=NH$A|ETk=Ya3qyV5rL#+O`e#JB$A8>&BSaA?xXzwGC~UDs0b8TP<&5- z>hS_`fI^Q3=qk;o(u|8`(f|YW_|j%bu`FqCPmf!prsxVmU{HLuMN`xuR_)wbw7*5g zimXOSsI42VQG5zY13mKWM)WX%!W2L3@hPi{WtvckDtO8wcAj&gc-p19I35zfo1&_4 z`}ezxFl|{XvI=HnQ$V9mQRJ|6=#WIJ5DNmV{5-wjg7Jbp1=}F1<#z6zdt-^N(h}96 zL~G|po})G5!fkx41%rTVK0S7G3)D?Et*)`G#?#Hq{lY*PTtq~RP$vww@q?BTng-KM zgcnbby_o(s5<*F`&+7?;YxVglK5!wm$W1yBLns-e`Eu0*%QyZ}9v@cMIcJTzOxH^LT##=ZVMj>`O0w`z7*a znFpNqUbG4{f5lTU;BoTgsg0E37;T+Ww9bFc9>xtUZImLk7NM$Jf^Tubci#=Z3v4C# zS~&a~zQuRBw}Q7|jQ$nhcJjB_%46hD$)7TnFCHV)KusEy9|Up3@u)6uXWgvIsi*Lp|sJrCZJ zBDa)))3G>)PJZ2=Wb#VO%4TQh!VJj=Y`IjY)(EXCE|TO#E=|%e?=dma==0AVDUqfi z8SzNA!a|#B7Dj%e1v~D2U}knv>ufj-!OQUzx1G2R?r?*X97Yx@M}0jtN^_*%sab^a z4uioUE(~6xs(rl!Gf|fg<6cmyBhdu4Wz$O5>rEFFys1`Sxzac~N=G5N%}p-6to`uA zrfEo`#&_%h&E5i?X*YDIUnVPD>3xV%>9Gh zhFSBE2(~l-pY+fYB{0Gd;hsHB9)b6UaTLI_bj_fe^c!tMOa~c`9~`t;Ixl_R(a)37 zOdlVLxVioNN#fOn^&Yf#0e0k$|pQJtdhVmBgV^jWbyd%<413SdM^2SnQ`b}-mt>4NGyk<`|k1^I98U${pVW=!>}v=EX&h> z&N?4qn8>^j<^{%mQL`C}n5ypn7A~3KIa$N;i6pt`&)c8pcU7w*8C}?d>V1Gb?yD{! zLv%5O%4|kceS5*w$&*uPi55PUBpmBP;v|`ZHu6DeBVWKkxd7S8!BeMRS#2pX(^5-l zsiWkt<+Ceu;|}=SV++0+&n$(jV$vU(oeu%@{K+RVazSRD>9m`HN{Qs_$2R4vFZPPP z6Ply5b4yVS?&qIB*<_ssC-RnCI!U?AX&px1#f0W$Y1?j$=tGUQudJnI)mUqDPSsX0 z%D=a`Kt3WDUF=1W398fQ_m4fLP<7o?F7^~TC9hi_sEv{=Zh?cXh(TW0V;LNkNybpb zFN_7B;(r0Cqh)&x1&C9K!KK3sSdPWAy7xlMG2hGNOD>*8#?T4VHY_L7)bLx#o}4;M z^CvVd8{TSu*%}R(YkFGtN!Cv;x+Rg8iu!gRr{za~-lPNG*0!Pq&hz+@U9GW-wn$iw zru?B;+O5J0on5Nk1z4h&mB6X49-mbMCslYJntF{D&U}?yHH!he*U7GEBke_Q)XJ%2 z{CnRU|AHJ}lh1CMBdI$EJ+r^G*L^|GzlL~Uobv&~;6l#)M<0Rx6jFScvwccPrNR$2 zRL<2QDi70O?%67H$5=EvcE=qWYc+(e)mBY!?;Ur<`yfT>ixUT;ojXUi&U>T96MvS% z)-R97n+b!9kWxCkwoOg7jgAUT0zEsyK&KKv?ATY^1yI*+9VH63EL|y`hKpW(wP^qT zC}#zIWaXk%Z*umt*Is)Kn&uir-n(~p_6B9#Fn{e?o~KR{1{WcfIja`_si9$eLE1l& zF=jF0PuuK6gOmP`J{lS#BanzuvkGoA01YM7Dnrif+sNEpROTF$lMZ*KHXaNHY;8uR&~%jcU9*5vcl5>(?#Isg}=`TJ4e8jVJjxk;yU(!HT{agM!k zaWs(7gTB=#0;8W@VAxn-7UcTyI3z%;B zE-KGHvA=-H0En4_{ZBlr1jT~#j46)tf?eCT?II0G2ONtUlxKf_)@a1_rKQ+%Iw%}U zw-q05_hvqvF1w$8m+q&xT(?%@?8{NqPOiV7d-wdsw)V^Kz542_=ndB{fA-0=6lBF815^G@t2V9{?dl6O-E*mZ_f%d&9p z+|pzq;bJuTvUI)eop;_j-`)EP$>@}0UU{&L6xuWMT1Ilo<=_DH13q@X?O)qI`Mmv; zbKigc+-H5TUGUzI{^hU!>R*2Js!YjU#%*8->~zouuc1adNKqluT80(iq7L_P9GgFO z8meVAHQVnz^X!W+K6~cQJ*HG@&r`?9Uy#3G?tDTPs{0uxod!oWjmB1=IzZ;motv|r zA{+J{3^Uk%`Q4Zh1p{$%@bk~{`@-w5zkXqmw4-xjt5GELCaqe-xmDv(Su9b7sn+87 z_?~?Sp7iz2BoYZ-8CVzNJMR7Z*S~)64!R@Gsw?uoV8kDFtBUd3yJp!Ht;ORx+;m0o zUA&#k7eD^sCm4Hg{_OJQUQBUUKK}Rv`i|(!!vrU@ct>ZsR5Xr_8wPQdQl@nl(M@+h z6;o&Mst)hpw{I8TRb5qC+0sWJeKZgkW#9cfui99RA3PuGP#%ufJ za=UwVFLZEa&ZBe7*0b%1tQ#7#TEAe@GZ@Bp>`)SVuy*wc<--qm>=^&(-~R32J{l*S z%&66_EhpSe-uL9Ja8&Em`YTtjbPW_5q{XS|TyNK>oI%^&t>r%akSiG&DB%VMsD7Im z^1+4DvLxkK!sSacn;svhMpBxZ=#|+Sa@UsZPaP+2@-O6nmHbM~HR`i%qgk4{xf#S78yOz*gz7E% zwnB%qw5+1C%Ij|a&#e7ycNRG+7)Hy6d{gt$g5p@Ay?W=N=9~9#HUqS6qY)du-Qg_S z)`S&n_pVvb-1OA7tDv0P+8w$6QI^wCH$j_yN1dJv27Qa6G_=}7=%F9&FL&`68pj`P zHHkleI3+Ya@Wd0(eC5kuLEAoy@Zah4yLjaF&iOSGpWR4J*Y?+c-FAb$;NQuAN4|E9 zbdfIMYyX8kA@I7}w*5_R_msmvT=>&Jy|8Xa@)z=-k!>0BfZ4WjXTqE&l$b;+f3kua zr;@3BTE0yd>OPcP*IKB{4?OWiV3U=)V>C7QT0?ak=I(wvcYkYn?kcJcAXU^DHb>Uw`^S=4!vO4_gzNwMcU5%*gH1e;??zJlU zKcHnlyGA>IPi~fQcKq$%c6hGog2RE;$nk=7DPx7#yl8kJlEQ9GOurXV&UN*lUV?H#4!A{4z4kMio z^x>_SF2H%dVBso&d0q@;jN_GIoNjvRDO-b3HE^R9Yjv*{%kI^h>Anu7--=&za=FIO zS;Kg}HhE5-+Qb_WXkB&#(0iDXnNB+1S>P*{d34XEkQ8eh75-XndY|OjAosiqGR| zYN{z~s6TYLx}>nEr12I^`^R>a>3zs;PF+N|eovp?T}o~Oi$quGFp2`u`PMvxA*J{i zXO~1tQmNroJj=+&n;I>AXaMCJ4D*&o2z;`&yCt_nwORVhg;&~@aY%MFX_rn5rkO9HDQs-?`ADV5wD-h`6AwTA^rQINljl(eFjSdG9$~_` z32PsDM2p=i)g&}YT7!yBFkHfwcd({V1Ct>K51P{pV~|su&1-le<}yN50&>qGXW7Qa zl2(Dw^a8%Z@{q?0e28kJbXO#!S^1H5mA}1_pXg~9JY};jSlXGLL^uM}d*@*RSQFjA z78VR}i2-3e)UBD~7t2Uvi7amSlo;=yF!ADfT7YbvLx^)YYr$YDC98USjmD18FMZxm zxrnj~EoAEJHIhD=!&q0&su~+f5#!QnIYf963U-jWeR3_TM`;a9i+0yCS8rWkeRtCOM9E<%#p_ zo+!=joK$tAKV`?h|NXI7kEWmJ{;<3I5AiL&%Kmh;j{GtBj-z+|YWlzl@_+Gn02uce z8DyS$<~SL|-5>GkU%hJ-0}fRd1d7DSd;_yA2=sEVS`>Sjzy;)O7cTY;dBJp_>xG-c zjc>H){Lct8KY9g5<}Q5t>1X)r8UjDOrI2Td2RN(ggub+-*yo)KaRnGv1tf)eluKhe z=3Z%lCGVS>?Ws}F*qHtxHb0p8VYJnJvQ4Dt@ zg>0khSR`o!98G__b%R~2@vQv2W(!*Z*)VZ6EHAf4>pTD8Q@wEcvY3^Z~6UKuJjCg z1@c~&e>m;t8XM#M%XuDj_0P{&RQ%{i^}BY}R(Oa;7NMJV;2_QJ^Upc{WwPE*kMNT~ zBWZ|wL)P|j8FR$4 z>8vx84|xu=8VJTVrZYj)xn=XpIY<5PhyRwAxCXkl!)zlm;FX*18EIla*KAJtI!)os z=Czm2$_Gmkw#;eF*&{1g5>%5>S;*)ijQbW?I#nzTQk!`Tnw}m_#sqXSNzLW)97liz z&|aJ-g`hqQ$@ImGuc#^+EI&-;@uzMhXUU&s{?3}8I(`$z$4$513FWLiZ?%8(n|6%k zR@o7YCIx+-$z+0%C>f2#b{7f(n1Blig}ZmlOftD?civ8G^x|@jw&&4kziFbTor3#D4^Up`fy|UF*W>IC- z&^4Ov`@pchX?K%GvqpYyS;upv-A4F0Dw7MO+r@T+02UsaJmdKlNhXhr`$&i!Ngk02 z;-a@$~)u@+;T4qvU_Hd)Fq<+MAk=lHb!DNoF&_r@SH) zGm>>YN?O-(HblDJ7#Osghj}K6O6JPdn3Id;qfA3tCxj@@Xb8XQ0!(qC(L~av>X}RE zD=I1=y3EH5sMw2jX>Wzc4{Wht_s~P&bJAHIvJEYla;bLOxp{2n0Tf!{f!;)AE8}3O zY?%{e%vs=MS0Z^JfH?iqorurt#VyAV#%zW z5vX61Nn&}#9xBVOspdSwavRE&C$x7PtV2FHp}Jb|4fz&iW2j<%v5L_Y9traC4$uY8 znwlD?rsLY1Z@zhL@yL-yVwV}MR@QDa1x8^`4=9hY}4kITblS-k;^ndestc>0OS z*38Wg+w%idg(Z--+J|SogJZHu(iKxx7K$WaiV;l1<;%($2k$#GF{8_AWoTz6&YV5~ zrbA&NMT*#$6*S1=;>3zchia=;C3A}1uH?#j^GbQhN=Y*15(She!d+||4=@DD1_c;=aBPHe-rRZJ&i zyoS<(^YgMgRt8zHC#EkebCVU$)_usU7F*Wx=6w$iWx%=qO8Uqxo4V~Ok~NGHO5~{)oo8fWhJX_D-`ad>b4;;j_?b9`?Mjd zl#Ak-_4;Ic5akoZ6DNkjS^W6Qu&h3M^ytk8_s-4jwYWIFK9O)|Y2@4tL*X2fkj1vE zAzjKJY#VGBMqGS;V^7aTxv>4n5w#7Y)uwL02A z`q^lVIyj`Z5MOm{kKE_Ngh4*XLJ)q43Fr7*jd?V(`ebSXUNCfO6`p`$L@OQ@#nsLL+!9TQ**YuHac`y4>*kI`N53)dB-j;gkIt>NfVT&V7oKm5Z_Zn(?( zyIYBiEa1=eU)pZX%K`&JY|Aaz%Fcz-V0n>`K8mc{NqhoMU(qr09r7KfXycB8d4PcY zSV?6{gNpD(l3cw-GHyq8Xi2@y6z3B{r&y^^(kbgf#qaO5)SNI zpOmV!baZqzxmB)UJ#DACH{O_Ahu1$RyVnBtiS-z95trV&4!BQA6b)@HvI^f{;R!ZV zp5W;BzBl?sbnxr4dkaF?srj{E(|i#z{G`k<%oh>FTgf4J-qF) zbwq!-wT$GMn2jr0i*am&R_yv^40!0R7BOp8)fURJ)~#2qjk^CUdna1H^|of|scz$+ za`Z$u($K0BpMIL`eL*BI$ZjyzTi4q>XLi?{(Zq@1{LC;=@}K?S-~0OJ=OfgHKCI$T zbyF$E`20MBDM7k;@%?s%8b*>BhA8dtqaT_scTY!&AtSmlkmz*x<<`1@h91~Og+Qe{ zsEnef;-;Has^}mH&Vi(D=jkV&c;enY)ztwAB&1U(ns+qqEaY91P`I;cNArnOvgy>_ z%{DUiDLuz)irAX(UPeFMl(RosvXImpVXRjbTj03R{74@-iGu_E0|N_O|L0sru9AkN zD^ZBK%Y|l^`S>hWS{Hh?c28q$iV< zU*%EqH|#Hq=;&@)ljhXggyDzpK$_;#LBsIw+mC`~C+P{cb%W;EQr4_-H}u2$rOr-C z=;#p06=4;wB}tNr#tuz=-ro|pg8(YZqyzVJ#Yu}A0 zzMDC@L0^r2R;|ySd!dd}Ntnh~z7t%UUFBe*BMOy-We@^Qu&KXniL90K(~YP0T8Q^^ zbgR$3#Ikq!1S>mXa1o-zCMZSH>2yzz7MY4QH6ggzD>^ZeNJ&K)=-NW zw3Q~EW;w#C*eRei%advUKwl4DhLV5a$>$=AoTZ%Z5pO>6rLX?RZyY(2B!^^UK~t^M zVP+IcbhSYX)1^s+wa%-N(rQy_KnrFdlVcFKEJPLt4 zUZ=v)^XbYgmNEvw38tj^!7uyf)g{fa#rLKA?>_^>11ApDk>f}@ufF~!D)6S z_l8I4Nqy)0hx{&0d@&k|gp?G9MXnB3!r;oRy-ZdHqjG4#iCz(?r4=7+b*GI&*_Jh(Eaz{dFK9y z?mP44haPy~fjjqCk-LzNlwYtNwXQSJ!xDQZCuQBab7qr71xFeKpWb*Dh?d&A;KP2; zY-O1kp6%?o-s@Rf3I+m!P+G{x(SLdIz#!Fq3vwg|L_s)}NW09Opr(hO@mH_T#^4eu zhLQD`rc!2bw<_|)&;UIPM1>Kobvl~vxNTuUEW){?XU^Pm_~>mAY#iB9!QySD3hGWi z_Sj=z+F49)M$)=`v({w}j19Fx&3(>l<)9e65KhDrvi^u8HU#9-Wo&91j~sDtI9;fy z5}KmZ)6t2EA`*}}!-4(#Wp?**38xEP{z)|IaNI;CpjMfSUp{wEX5SuPo&z95$AuTR zUqmz5%gU_y;?t=lMG1Na2Pg3rN~EmlzWS6Ot>8%+aG#f&!~J}U_E;^5Zz3>~1SK!t zrRCLt$xDntK$Xh{mpm~wkiY7f2VFX?D@KzQ>(YL|`#>>|#*r)*6Iyzs*5eNIg5#ry7l?z!jg*+;&C3{#0DsO(gPAw28S zvOHm8sWitVVV=I=&I1k(ATiEy;LbY>l9L@^V{}X=3kq^A_Eo~*!nia$9HUcl(cail zS(%r$4Jf8!0l28BDa9O8BECcYZIZA zwkmsI=F<4JYwjkSlz#N#V~rN?oM$=`3rA4Xl(uje)T?(kT7r1*3&x6l)b{872WrV} zNL*c0w;#Pi+uP-VmOY<{#F2Pxd`dR%sxhP%y0Q9QnNMh|cI|Snw~9+7YD}CkXUPQE z$D4WmyAcX%BeYc*n+@}96~<@7rnd^yWy9vT3e#u9rnU;>ZjhfU8>ZYK-o$@5O(`3e zB>9`eoY}C*`Y>TNP1lV>Hp#HF>G25rqBcq2IK?k$5$#rC+=iOnD8<`y`@w2mU!U&3 zu+rlk)ba5zSnjJsjsuqe!jiA1Vsmn%Wk1WAD$DZ1HR_Cfl%b#Mx4F=)cW&;(@O$D# zLf8M8i-t4Va1MJ#i5D}}z%KzGEgm2lTELa5E1yFrkUaNUHg8q(zT#gD|La@$Yv6C% z!e0x2?H2y|@Q-fcPxBSG@YloNu!X<*3(Bd3e|YP3Xn8hr3AwVskly_YH^P*r+&QX9 zmD^+S|G@xvCBMw46gw%EU)~TJV#dh?Lh}?0DcTs?!p$?pk5Ii)A+}9%eT5yftxMUtWj@Dq)H{<*yPWA{A|AzdJsM9)V9=??<`TL@0A_?1Y$QU(?=nfBC21Kq z#<4}>Xi&z+V4XrsCa>t-j81SB3Oa+S00&kTm<-f3Detr!I72>|qIMJ@2kkwZMavq& z)%ALeHXCTSC1SA$+-vB?GD2L!QY0Mi@24#wlvhZS#J(a5Bx8U`5J?(`QLxhZz5cQ`?)CW=W5fvjqu~`vFz1vU=o3!b{Bqc4ktk8 zsr=#5ATfeW)e}J=2HfaqVcaC`Vk6<0i(y#23fK>}D70-898_;G8KyL5luOqtqzNde zq>ODvE2HM*Z4QT7%TfA9ElFw)xRch6QgF zR6r`Wh(a#_rR-8M1SBxeLG$U0D06mpab$Lc{kUIc36ez%IkiYsgR_0nKy)xYrV8g1 zeVB~s$;yr?Yt1RikddL8C<8qxF1j!>oJ@v7BiFCY!1gvs&-p+Ios}9v)C5uAC1OB- z(6~7;wdPzr!xHR5h)OPX*o|rq=vz*0$SX*Z(o%b|-EK8o(G&C3YEl52oR=gcDrXSW z)S68^E^B9J%{qxXQOF@5?$2?h89{KFRT{#QbV;Fx#C&5D6CvztU3!M-=sV#%yHmw-E9OEo4l^K)ut6lz-l5WN7!Qh|>7B_f$nbCX1t zmfS>gv4T$Jsud0S7~NKr4WG2q45KnwQRjSv3ipyBANN)R9qKA-N1voQj&-S6jt+UA zQt~#7LBxO*4H!A;h~h(2_>@RGy=vq8bOw*Xuw&CH!CdMn(g+~W5kC=kVQdRp`Z`jJ zsK+7%9crGW7SXBrQmYH|0!g_r{LgAf7YTh%lX-0hKFO6jEP8fPSxk!@<0_C0dJ`Qp zTD3q&z1B)gof$uB6*O`&9GRt9E1Hx?k}QjthLl!b+R7~20zBO+=fP42AJw*PC&&(7QkPM{3E$~@Jy@Fo1kwAn6QS9iLkiqzp`HqfQX{lS#D9VWw z`($zeUbo)LClVXbT6Avj!Z5eGxrGHfTEWj=e>MjvG2nF)>)GrB`{ni4GGi2S3h%?vuAJ zqPPl5%avC<9J1sntSGOpzV+7D4fdmZI@^&ZMSjOZ_@=40a0#{uyIgA_n*bzl=h?hl zPu`70k@T#85vkH-`TpUdX=>1NvVXXry!&phE_dYS#7Z`aeZMG*ixbz*f5tK4*@@As z*!XpHTx`2^iDhwtyg)w-vD!RaC8*;9E{(CGWC%x1w}Unj*uRqC}!dGaNBNaFiG9y=KV^tE<%EJj=D-;OO~L_d1Ph zqE5Wq&0YJO*M`X7%fF{y$TKR=BR7?Re*C@cb0s<1lEDHq6$!!OdS4)nO@00(-+LR|?h={R6_VlmhpE4)lyd}F~(dNPhH@AED$cTI6 z88jX3v@Kr|7N7eXHBs@(`f$Nw9vdTL2%npI?5pJDa(F)4x&+}^$`}qUDsbFT`(PJ0 zHE=l~>m`r~Qb7%D9o7_p*3~9VWji20*U0pg75Gb7P}k$83ENMxg=O(q76 zL=Q0nK%VOfs%5DJCGxuH0Nni?!Ejura1Z2ULk>`gxxv`c)e~CeIBs!fh@QkTgJ}HB zymu06>%NJ}$q|<-Fhya${ZoNfM>M2>s{)&R_uYNhsh9;blLgYylaPf1XTWQ&j!woz7w_V|C_R>GGWLg zw0-LNlqB#x7nr_s;d6{`uXn5)qx(Wv_m#FbqM#Vcbf(tRbd;;pF;38FoK)?MO$)rs z3M=7SV{xI?Xt9vh_GuUypPL@MdbKC+IQaOJN-(Z3*>(V<{lwk(!3^Js7NmjJQ4f!L zddRwQ-_H69D;FL@At%xdCJ$RG8VDE|ySJVLAU3qSW%Mx8yC$A$ zdDR%<#@RswVI?KX!id2aJTZhP@)VA(?*AV@(ZcM^Jki3uNmhH`;f%IIM_VW45?#Zy z+zi?~>n^o*{P<^W5PrHqgS$+|(#3&`EAF#TeXUNc9|DmyMw>%fVm0QXa-9YoxNx|_ zt|3;rXsGXc@8A&JSW#(JRaIGGStY(oOQwg0+-q^z1f-7VC!;^{U>0Chk?*J!#e4UY zcY6W%W5n2ZvSl@`oECYV>wNRgPC8>S5!G20>t~<&>Q|q^!)_)f=34*09L-uAV^we> zMldJRJ2n=%etq;h+|b0t5WeV-2zEp!mZVv=$yVf;_IQ;j)v;!GHtA$tGR`m*?y=O} z#j@^Nm3I(sdJ&R^X?o{X6*(LSZim}dQL&4DA8b)5A)ziE{%>kovHv>GZLuz zx88jFLO2{_W2`9czvajga9r1y7lK?4E*Yi=R%CvRkM>@H>$%?7cfE(+^^T6Cyjr%a zdx>QQkc{!9%<7tUy7E|#M5*mhN0H5>X48b0mu07}!Fl6xFa4eZ*_6NQDBS+KhK9QR z^ln!^mnrX&Be(3AL>8qBhcCSS=36MQ1ZibJ<#djXE}<@b80Fmx>&m~{{p#y2%yvvw zV|Rb)?t5F9*H6pqsF~#_2e|KZuQOfSflXy!Wbb88zwRPyQzQ~c5%e7NH@+(=gZF&x zoJzlg zEA~z1uW*4Dc4sr;VtI{34X<3Ij~_sE~fL@P5Ei_B_332GIk zq9SO7(AEU|vI`bxq&L=B_j_HhcL0iE>BpR{f#juqV{m3cw{`4HY}>YHV%xTDCllM|#CGz; zwr$(CZ{B*p@5lXp`*d}k({<3hx_Y1L-M!YL%(Vv@Z?Qk8e~3bOdUkV_m9;CtCPXCT zSn}A~1YGLeXo|=~JZ}|%X%jnV`P~QwZh?#JcYk|5GpoU15Uslh3!+hoLO_V!R#Ebr zINvM~CbBXTR^^;?6AN+E*3}_y%<^0Z+vw5bUF3CF*UShQbHOIb_y0V1rg z+3{+2l|FoaCxfkIS-9TRsu@Pmc|Dy!JRnR+gsND&3D*x0)+yg_V#mih-5=hh)^d!Y z?x>6+)3TMLaR~DI&VEKKQpujM&V@BKJxNKChwnnadRl)z1T=o%tJD0DGQYWKj0`zf zSVUQC4~+kg%oFb2@O{tt^n@SX84=$K-=`vX;YEpW_dFO;=^LSgz-E(BZQcb+c92fV zQRtlP@Oi&9t_)EqDi!)u|6XxC8|&K{m6VEfShqs8p!H!_do3&M7A z2yD02R=ubKha0P0gtOQvS*5W4DlF~O?}<$mm0}Gc(V;-s@cH706!Kw5O_d2Zs04S1 zn8pfV*R&GR5t7jnDauwU^T5BekyX;xSSPeAVCcwqeXrJO&%(UX-C-O$4#X!PQvdCH zbWh3+Ol?Ud<6IAhuj}Fx&VET91&+Rl%~&2`<+>UNWU!))ZQIc~tWr>w$RGr!-L)2 z%XYOgt8CXyVA)mH>Tx|~BRc{5YQht<1zBKZcE!8o{8Ct^8{5Hl=ymrmuFT7`U+M|eDUNq|JpH>sUXVb1aXciU0K+e@BrM$Cz4m#fu2G&|LH3qUkx#+U(>4@j@3rbZ!(E2ny2fDlV@{$EA<~BZ`k2&}lQQV)<>6~70 zrOn%kKdZ<%b=TfV8-|OBe92-a{bw zuu7jk5H_4Ar@j2AXAiuU!V}YOzBAEse)_tM)6|$Vp zOAwbQF!fS0Rp$$5*{k;0meX09&JsY8aq=a~4yH$GE=y}K^t^>|GYhcqcMW0&zkb!= zmMa@^o#3Sf7WNRNwebh&0ozR8LK1ko^Xpr#_#OAh^12?0>s(F(9r4~RitXU@D=_#Y z{U8YOyna|Kf%gXD&mj{mbQ^)0m7<&|`XU&9D^msIo3x>V&IzDDc#1IwRmXaKAgQx9 z{?P|wuj$P{HnFk5KORo8RPcF*!v+)c3`Hk-WP^x;d2@6iRONdXzME zBM{sI=}2LC7yyp1X2!6oCxl^iszYyF(~*kC1S=fLvBaZxbrCv7XV#2C1gc~T(n;Xz z+5ICws2KxrpPE8ayVEg*?&!+Yd>; z%7(UQE}{YHn(}9RKwj9GI2=*m3VLa|yA+&Qb3fM^Lp_>FZvr!*2(8pmpPiKLm$g|fElhq+JDd)@N3zpl0(Gnk1o zca7tey(WnlX&lY7bF#fJzDw#Vx6{{|HTy{qCX^w% z_c7csci8eV4iO)d;G0h{<#EV0#bjYfJqFzh>#uc`L)~9MF8l-pNQ2OFHM|bvl}m)g ztVhGBuCCf~V`kXw@0F$)7Jp7vv|d0-$}D;khVlt_2{D9_ae3m4nCQoyYKDkM#Ya9a z1(Qqmhd^tx3|~0c)iX!V5Zw(QAMa_=QrL7B7Rmde8vBivh5HlMjnyej>#?t0q6vQo zkgfphGS&fhTY`2E%|9oj#6IeEQb(mhXNv$JSS+8#xFO zed`W+v%+a$<>krcWhhg2*Vb0dFE=3%V8#aULpJ#Lo`%h3c^1HDw%ge`1yCN%Mng$0 zrr~5l#-&%;D2X*f^k9(**%UHu#6ttB>ZgACEIe#9vyvjQl~uW91Y%xoVR`XTXW#gc z$YRcnz^VL{Z&RrdCj{xi;%{4u#3FRV`1F=PLl`(5h%%%$jD_`d*JF(J`KOX)F8M^zt$pw5!TXe_&Dx zsL^d2-o%86aSlz@4FF}Tr{~D;Q>SuK|jx_`&FFWdue87v#7C>u~L@` zUT)e`?YiE&U|^$oB%rb@AfAsebuN}McBkDac z=*%xM5u+5SX-b<_Z>YQTn>o1`eqCF#Od90`ym#c;I6dp@hH8U8pOhD`o!^ zeWrKQ!@HO6ot#jzfv1romiiN6okbRabli~v7YEf|8J;9*l}8OOtHOPf`TQyr?_Tec zTU0neOb?zkjNe)?h5n-lG^KVxhK`QD=YiI4*SQ}PA1)#^C=<*7cJdh-ah4H_$K%>E zCCWvr3Sqi0h49yERUhpGR7Z!eU`v0)BshG(tV_=CZ9Z2wGd4UWA;K|qvgi0HpC{Gj zDJ?6K26o+YQkoK!6PD@qas3GNMm9f#DhDLF%g9to8VP1opKJ?%!Gd|R*d+YUr~b{e zO93c%_y|J<{K<_U`w14cNrUVqbc@G~i7`@g3JI9fUpT-LkeU2-j@rDGhuBZAU*eX8 zR$(H6nnyx8V5k9ey=v0loHjmtQ!K3ivUjY>Cov%>E8TN|&&rWN{DkBR(H8zm==<(t zAZ4>SaAJsQvLq+>4>6Lu`cA*RE`#n;S66P|JMx@GErtM}_%PK?hrkv2KZP>|kYN zMOfa-uH$&OsB~)89oIXEC3efNJ3qGIq9MZZ`xAlh^=04fnp!0mVcY3hmx7#&58KYS zoMV1QlJ=519MbgDAw)xyxMK_AU$knbY=7mWOk9OE3wGfWnigpblta)|HY^nh=<+`m z4;%f1Y_}xB1=zqAEFv2XGRo9}u#663X^MJF?rJKCZr~CLo<38jmcUu=KT+IGaI|X9 z`Aj^?Bx0zB#Ymx{I>=DxdA3lB#>sSS4$!;qN;J$G+Cj=U9}m{Zi9U{|*v*|fJI&6I zvfuANj$dSa9@dBj)Wiq zVa})!t^B3rsxrja7dD%DN>N>ryjv{w_RLU0K>@fwiH9;l2%JPF(P;58rjVHrn1hXZ zn2{u>HQp*rIy4BtBKgqxo(Lw<9tp-ji7sDS9}dJ-lxO#Y5%vA@PSAGcp!RR4gyG*M z#ui)L+Hcmw*@d;V3*=uRk>h=ocDgTk-hMuiQjUpXs;c;jSIi+h8k~qziBD;_I_6yY zkoQZ{N}C@eTgCKEaacIkWCf@S75U$DH7}K;tM9wM2gAlgu~nH=^ShL1=vEvxb&*vV z>hH~3Wk=I}Ftw;sMiVm(hkH|kQK4 zCX+g zHIt17W+01jqIK}_8ro@oAVIQ;)8(-s)|TJr?dAzN+EnP%5gCyaO~ClyBTnFZ+BScg zXKtmVgA`OR?6bSI_7swWtCWxs1Zd~Ro16_mPK~?`Ivtpc$Yz@#y6yS%d2>9AOFO6( z>o;e*eHsyx2DZ^_dGM?yPRr{Ib3S=zxLS&>CH9%~QtaENv5)jG{pPMN^CVK^GEe8c z2(w{xX<=9hBPML8#;sMZ1!ok)YJu)BEAyQj{8Xvxt|9yA(|Bs&IGE1*p}dnbGXm!` zd~elj?b$Y}sa5OwdtOM>Gs#aj6_QiYm{#(*n3x8f#MzTvANgbN8x0CBm$M7*_MUOq zOwRZ~n!AXs;j6lK;gUV&woLder$%pT3Y9msz8&HNd1~ZH+P9B+wRSEl7`~lTjqLyd z(z5qz**6JVv^xgKNq43h^Z*)zz`MTz-bOiCA>Goo_Ar^Ux@iu5Nf0XMoKPd)ome9! zycH?|aJWy}!)CwtsqgQhN05He(NapL4eI{G1!QadV-SK({KU)k&ZoRb`P(yRDNmdp z6P%RHsQm4Zcsm&lQo1KoLWL^3keMa#S!XDN2F7%OH%xpjRic5LFnNb91>GoMo<@1J zwXtimYRif#kA9R=!NJYUeyOL_N-XB!kO!YU-moexPp}p2(GtA6%1PV8eca*HyC_Ic zNB_2rUMC(EY9?0qG?9l(nLnltLRRilBwxit<-hM5Zd?)xifR&|!8k%w&#c|(=KG}K z?0NwMIe^F~Uaj&&sKg{KQ6?z48!ub)=j0Q&sH!E)s5IK4ZwK@h@q$I8uk4a7*wPlA zW`OqC+Sb;U*iWY?_-gMfyyXMb;% zqft0L9jNlfdUUge}RIgR4JD0wg^N@h(qC!?mxkV`nC3cQcp+i!n88O6qL zCut3MU3Wg`cqM_SLNP%cU=}aAaQk3SvDeo2B#YF<5e_cxI*GecCQ)4KG#MBQegd_P^D&tA0<6fbpSxb2z2j$?+3 zxl7`e0^lB*lQ?X)*Ufj)A=l~k&R`w6{;>;j*`EG>9^MaWyClVzX^qz511*TKIj-JR zZz9=0VR2aldy`I5b11{)!(~d5gwPJHsf%*yFc1z1kE zN^;8RdKb2fRW%$OmvK58w-fEPI_`c46C4j)-+pxv zf2k5|c{9Bjtg;@P#d}IwQ$EO8QAO>>DQ;fgeJ>Bs;mx*ZY+~0u|GDSX1y}DE-kka8?gO70L$=s<#5OR$?|z6#lQ<+pd#0O zmo(4$(V1+>O9$w(guern8|41!Ml%L&~9hV_5ChmxjIwW{W;$KG2ZRNgZxGRit-j}=O+3D zU#;gUV+8o(SnJfcX}1C+7je18RIgGW{O$u0=v9JaJR5X!8Wbjz(r~WsouP)2HkHVm zOR>3@wMR{(sVPDANkfM^Hl-;wpuhOF6w3TVS$Z&K4v6m=k`Ep-*{n3M+2}iDmPi-O z6K|9*uWU@D9Me!B#BJ9sMMoD@^dPfU<)=r4ShD;`q-Lp)Bl`u(b}X@fZ%enQtfI0O zOPLx+Au0=_{k^r2y?BN8+D5mI{{eaJ3nYtN1w=TOKY~<(qIkPFfq-ABLJk(yIsKF% zGw0FOUeI5eaYN$f0>V?29c^m1AlHDPPuzmqvYIo=@AK-Ybsammc%{N)yQrMm-LvLU z)XyCec)grdsC8ui$M};rLQr+QaM9RC*94|`SJq)kDSd9Ua5RbjzV5WMvaSOD0$~hvNY1J70Yye!*w>O!2zT}a0ysLPSnV;< z6!c<92ECUSC+7tWZFTho+M;#0YrArmbFR9U-WJjM<#5;8$FCDH_qvJJ^X2Jy-EBQ=Ja=PU8m5fYTO$&n=9ZiJdGHza$40<~8AcPls{DyZjb$T$? zz-teug&EOyM(?TV^f(M zE91n#z~Oj?1N;o2$c39O+O|u=_Dc5n+yv~PTAK7R(fT1wj^2)FquE z7?Pe&Re5PP0;IAWL`8n&xveoNhc&46-%RIe^SGyGsO zCQKu2>5sKMVCePa{iKl?0Mnbh6xNuibG3LsevY{Ap8Sp}I8h-a^rNo+vHb;49{YN9 zB<$2c>uSL|$+&i48aX&WTu0afU3t0fb&Xd-z%N7R@truK*Jj-AEP?(U6B{_+wcL4y zD~QHoZ+p5Qn>v!otS4njL#+vJvR#vC=Pfkk5%O_<@aVQ>vB~JWhziRgajY_trJ^;} z7TBucwmvjd!FrXH*_l36H4&_tGS1wSC8S`kq4~0<%gpMWvR(4=#?iG)yd8v4?zC=W zwrpvT_b^cueC`0Nh&GR* z?bWmjy)K48?diIt2p!Z*&*wNBE&Z%`Dk~VHY^{?!-#KnuAi3uRBbNhw1rjhAmo{M`tfnU_>lN$iPZ<`6PRQk^5 zxaGdsq|jv4r5>+6|K;Wv76fZC$bfhzOF%>t`! zo0sQp>px*k2o?j3#F@R2xBac7f#~2r?YhI!+XCQZh_z#BjxBt6j!#5SP{!dH`SnI8Bs$Eb(yrC~yX} z2rYSEEx8#3(U5YIt7c(y>m`(jk^;VTAuIw(TN2m?#ku5b0?dQ2{Zd&l!yx&OWm`FlCIymY-g6DM6N>3Ra;?`&w%z+>*!en-Yn~9H z^Pb}fOmnW@Jqd1iH~@)OtW^&*8{y*{0+058jAlkQ3TBK@pPbGd9$(s41%&qXjxc%e z8~aL!mmNW%hqJqJT}X@yW+$mA5NK?7bWcz1&T|#@x`yZk*j(KEmHO&Cf#$AlZHV03 zwU$Y8xvtKBuhFq6H;MWj{DWw=vB5EA4EH$SI1$%lI2NTjaW-v`Jx)O`A)s@*uvFe) z{B!b1j;wn0m_tTj1{|WIg|oAn{)mS}qP4P9E6%Ken^S >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/members/missop/task4/src/app/globals.css b/members/missop/task4/src/app/globals.css new file mode 100644 index 000000000..13d40b892 --- /dev/null +++ b/members/missop/task4/src/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} diff --git a/members/missop/task4/src/app/layout.js b/members/missop/task4/src/app/layout.js new file mode 100644 index 000000000..8c8f38a8d --- /dev/null +++ b/members/missop/task4/src/app/layout.js @@ -0,0 +1,30 @@ +import Provider from "./provider"; + +import localFont from "next/font/local"; +import "./globals.css"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/members/missop/task4/src/app/page.js b/members/missop/task4/src/app/page.js new file mode 100644 index 000000000..6dc562619 --- /dev/null +++ b/members/missop/task4/src/app/page.js @@ -0,0 +1,18 @@ +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { useAccount } from "wagmi"; +import Contract from "./components/Contract"; +import ListNFTs from "./components/ListNFTs"; + +export default function Home() { + const account = useAccount(); + + return ( +
+ + {account.address && } + +
+ ); +} diff --git a/members/missop/task4/src/app/provider.js b/members/missop/task4/src/app/provider.js new file mode 100644 index 000000000..6f2ac1af2 --- /dev/null +++ b/members/missop/task4/src/app/provider.js @@ -0,0 +1,21 @@ +"use client"; + +import { WagmiProvider } from "wagmi"; +import { RainbowKitProvider } from "@rainbow-me/rainbowkit"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +import config from "./config"; + +import "@rainbow-me/rainbowkit/styles.css"; + +const queryClient = new QueryClient(); + +export default function Provider({ children }) { + return ( + + + {children} + + + ); +} diff --git a/members/missop/task4/src/assets/abi/MissopToken.json b/members/missop/task4/src/assets/abi/MissopToken.json new file mode 100644 index 000000000..a778701c3 --- /dev/null +++ b/members/missop/task4/src/assets/abi/MissopToken.json @@ -0,0 +1,444 @@ +{ + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "transactionIndex": 0, + "gasUsed": "1169429", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xdfc8460659659d33f0c703e4f2db066906e3f63690349a04084baf14fe8b2e67", + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1, + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc10000", + "logIndex": 0, + "blockHash": "0xdfc8460659659d33f0c703e4f2db066906e3f63690349a04084baf14fe8b2e67" + } + ], + "blockNumber": 1, + "cumulativeGasUsed": "1169429", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "2af2f9ba1a66ee6f5c17052112925613", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MissopToken.sol\":\"MissopToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(address from, address to, uint256 amount) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(address owner, address spender, uint256 amount) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n}\\n\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/MissopToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract MissopToken is ERC20{\\n constructor() ERC20(\\\"MissopToken\\\",\\\"MT\\\") {\\n // \\u521d\\u59cb\\u5316\\u7ed9\\u5408\\u7ea6 mint \\u8fd9\\u4e48\\u591a token\\n _mint(msg.sender, 10000000000*10**6);\\n }\\n\\n function decimals()public view virtual override returns (uint8) {\\n return 6;\\n }\\n}\",\"keccak256\":\"0x4784f8877f71ac0d29af4a74a438953c39a7c9cf04759fe10fd5126b6a03b19b\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4d6973736f70546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d5400000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004b4565b508060049081620000a19190620004b4565b505050620000bd33662386f26fc10000620000c360201b60201c565b620006b6565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000135576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012c90620005fc565b60405180910390fd5b62000149600083836200023060201b60201c565b80600260008282546200015d91906200064d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000210919062000699565b60405180910390a36200022c600083836200023560201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bc57607f821691505b602082108103620002d257620002d162000274565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fd565b620003488683620002fd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003956200038f620003898462000360565b6200036a565b62000360565b9050919050565b6000819050919050565b620003b18362000374565b620003c9620003c0826200039c565b8484546200030a565b825550505050565b600090565b620003e0620003d1565b620003ed818484620003a6565b505050565b5b81811015620004155762000409600082620003d6565b600181019050620003f3565b5050565b601f82111562000464576200042e81620002d8565b6200043984620002ed565b8101602085101562000449578190505b620004616200045885620002ed565b830182620003f2565b50505b505050565b600082821c905092915050565b6000620004896000198460080262000469565b1980831691505092915050565b6000620004a4838362000476565b9150826002028217905092915050565b620004bf826200023a565b67ffffffffffffffff811115620004db57620004da62000245565b5b620004e78254620002a3565b620004f482828562000419565b600060209050601f8311600181146200052c576000841562000517578287015190505b62000523858262000496565b86555062000593565b601f1984166200053c86620002d8565b60005b8281101562000566578489015182556001820191506020850194506020810190506200053f565b8683101562000586578489015162000582601f89168262000476565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005e4601f836200059b565b9150620005f182620005ac565b602082019050919050565b600060208201905081810360008301526200061781620005d5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200065a8262000360565b9150620006678362000360565b92508282019050808211156200068257620006816200061e565b5b92915050565b620006938162000360565b82525050565b6000602082019050620006b0600083018462000688565b92915050565b61122f80620006c66000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", + "devdoc": { + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 80, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 86, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 88, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 90, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 92, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/members/missop/task4/src/assets/abi/NftMarket.json b/members/missop/task4/src/assets/abi/NftMarket.json new file mode 100644 index 000000000..3eac6f38f --- /dev/null +++ b/members/missop/task4/src/assets/abi/NftMarket.json @@ -0,0 +1,404 @@ +{ + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_paymentToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotApproved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotOwnerOf", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__PaymentFailed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NftListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NftPurchased", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "buyNft", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getListsArray", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "internalType": "struct NftMarket.Listing[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "i_paymentToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "listNft", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "s_listings", + "outputs": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x8bfa8df4685d4e67df9f76d2641ac3b7702cf5fefdc4453b8fe170b6fb8c60db", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "transactionIndex": 0, + "gasUsed": "1008966", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6ab2dcd9837c34da22c9cc40e120061b3743bc3c40a5d2b189932be722208ca4", + "transactionHash": "0x8bfa8df4685d4e67df9f76d2641ac3b7702cf5fefdc4453b8fe170b6fb8c60db", + "logs": [], + "blockNumber": 2, + "cumulativeGasUsed": "1008966", + "status": 1, + "byzantium": true + }, + "args": ["0x5FbDB2315678afecb367f032d93F642f64180aa3"], + "numDeployments": 1, + "solcInputHash": "783b419ba32410806b37ad78d6b4c00c", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n Listing[] private s_listsArray;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_listsArray.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing storage listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n function getListsArray() public view returns (Listing[] memory) {\\n return s_listsArray;\\n }\\n}\\n\",\"keccak256\":\"0x8ac6ae6e9565d05129346bc69d9e129349d5e1cf5ccc3f1404cbd2e57896e317\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001215380380620012158339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b6080516110dc62000139600039600081816102ea0152610a1501526110dc6000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80630f7a7a8d1461005c5780634ddf4f8f1461007a578063a0b5a2ee14610096578063c922b17c146100ca578063cd2ae956146100e6575b600080fd5b610064610104565b6040516100719190610bc3565b60405180910390f35b610094600480360381019061008f9190610c42565b61023e565b005b6100b060048036038101906100ab9190610c42565b61050f565b6040516100c1959493929190610caf565b60405180910390f35b6100e460048036038101906100df9190610d02565b61059f565b005b6100ee610a13565b6040516100fb9190610db4565b60405180910390f35b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561023557838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610128565b50505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090508060040160009054906101000a900460ff166102e3576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016102da90610e2c565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd338460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600301546040518463ffffffff1660e01b815260040161036d93929190610e4c565b6020604051808303816000875af115801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610eaf565b6103ef576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016103e690610f28565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633866040518463ffffffff1660e01b815260040161045093929190610e4c565b600060405180830381600087803b15801561046a57600080fd5b505af115801561047e573d6000803e3d6000fd5b5050505060008260040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85600301546040516105019190610f48565b60405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016105f49190610f48565b602060405180830381865afa158015610611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106359190610f78565b73ffffffffffffffffffffffffffffffffffffffff161461068b576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161068290610ff1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016106c6929190611011565b602060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190610eaf565b610746576040517fb85efa4500000000000000000000000000000000000000000000000000000000815260040161073d90611086565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908315150217905550905050600281908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc2686604051610a049190610f48565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a8e82610a63565b9050919050565b610a9e81610a83565b82525050565b6000819050919050565b610ab781610aa4565b82525050565b60008115159050919050565b610ad281610abd565b82525050565b60a082016000820151610aee6000850182610a95565b506020820151610b016020850182610a95565b506040820151610b146040850182610aae565b506060820151610b276060850182610aae565b506080820151610b3a6080850182610ac9565b50505050565b6000610b4c8383610ad8565b60a08301905092915050565b6000602082019050919050565b6000610b7082610a37565b610b7a8185610a42565b9350610b8583610a53565b8060005b83811015610bb6578151610b9d8882610b40565b9750610ba883610b58565b925050600181019050610b89565b5085935050505092915050565b60006020820190508181036000830152610bdd8184610b65565b905092915050565b600080fd5b610bf381610a83565b8114610bfe57600080fd5b50565b600081359050610c1081610bea565b92915050565b610c1f81610aa4565b8114610c2a57600080fd5b50565b600081359050610c3c81610c16565b92915050565b60008060408385031215610c5957610c58610be5565b5b6000610c6785828601610c01565b9250506020610c7885828601610c2d565b9150509250929050565b610c8b81610a83565b82525050565b610c9a81610aa4565b82525050565b610ca981610abd565b82525050565b600060a082019050610cc46000830188610c82565b610cd16020830187610c82565b610cde6040830186610c91565b610ceb6060830185610c91565b610cf86080830184610ca0565b9695505050505050565b600080600060608486031215610d1b57610d1a610be5565b5b6000610d2986828701610c01565b9350506020610d3a86828701610c2d565b9250506040610d4b86828701610c2d565b9150509250925092565b6000819050919050565b6000610d7a610d75610d7084610a63565b610d55565b610a63565b9050919050565b6000610d8c82610d5f565b9050919050565b6000610d9e82610d81565b9050919050565b610dae81610d93565b82525050565b6000602082019050610dc96000830184610da5565b92915050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000610e16600e83610dcf565b9150610e2182610de0565b602082019050919050565b60006020820190508181036000830152610e4581610e09565b9050919050565b6000606082019050610e616000830186610c82565b610e6e6020830185610c82565b610e7b6040830184610c91565b949350505050565b610e8c81610abd565b8114610e9757600080fd5b50565b600081519050610ea981610e83565b92915050565b600060208284031215610ec557610ec4610be5565b5b6000610ed384828501610e9a565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000610f12600e83610dcf565b9150610f1d82610edc565b602082019050919050565b60006020820190508181036000830152610f4181610f05565b9050919050565b6000602082019050610f5d6000830184610c91565b92915050565b600081519050610f7281610bea565b92915050565b600060208284031215610f8e57610f8d610be5565b5b6000610f9c84828501610f63565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000610fdb601883610dcf565b9150610fe682610fa5565b602082019050919050565b6000602082019050818103600083015261100a81610fce565b9050919050565b60006040820190506110266000830185610c82565b6110336020830184610c82565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611070600c83610dcf565b915061107b8261103a565b602082019050919050565b6000602082019050818103600083015261109f81611063565b905091905056fea26469706673582212200870aee182d7a210517e3b0c3ebdfbddc204b177e3f779245f3d0db5b7ec622564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80630f7a7a8d1461005c5780634ddf4f8f1461007a578063a0b5a2ee14610096578063c922b17c146100ca578063cd2ae956146100e6575b600080fd5b610064610104565b6040516100719190610bc3565b60405180910390f35b610094600480360381019061008f9190610c42565b61023e565b005b6100b060048036038101906100ab9190610c42565b61050f565b6040516100c1959493929190610caf565b60405180910390f35b6100e460048036038101906100df9190610d02565b61059f565b005b6100ee610a13565b6040516100fb9190610db4565b60405180910390f35b60606002805480602002602001604051908101604052809291908181526020016000905b8282101561023557838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610128565b50505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002090508060040160009054906101000a900460ff166102e3576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016102da90610e2c565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd338460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600301546040518463ffffffff1660e01b815260040161036d93929190610e4c565b6020604051808303816000875af115801561038c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b09190610eaf565b6103ef576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016103e690610f28565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633866040518463ffffffff1660e01b815260040161045093929190610e4c565b600060405180830381600087803b15801561046a57600080fd5b505af115801561047e573d6000803e3d6000fd5b5050505060008260040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85600301546040516105019190610f48565b60405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016105f49190610f48565b602060405180830381865afa158015610611573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106359190610f78565b73ffffffffffffffffffffffffffffffffffffffff161461068b576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161068290610ff1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b81526004016106c6929190611011565b602060405180830381865afa1580156106e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107079190610eaf565b610746576040517fb85efa4500000000000000000000000000000000000000000000000000000000815260040161073d90611086565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908315150217905550905050600281908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc2686604051610a049190610f48565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a8e82610a63565b9050919050565b610a9e81610a83565b82525050565b6000819050919050565b610ab781610aa4565b82525050565b60008115159050919050565b610ad281610abd565b82525050565b60a082016000820151610aee6000850182610a95565b506020820151610b016020850182610a95565b506040820151610b146040850182610aae565b506060820151610b276060850182610aae565b506080820151610b3a6080850182610ac9565b50505050565b6000610b4c8383610ad8565b60a08301905092915050565b6000602082019050919050565b6000610b7082610a37565b610b7a8185610a42565b9350610b8583610a53565b8060005b83811015610bb6578151610b9d8882610b40565b9750610ba883610b58565b925050600181019050610b89565b5085935050505092915050565b60006020820190508181036000830152610bdd8184610b65565b905092915050565b600080fd5b610bf381610a83565b8114610bfe57600080fd5b50565b600081359050610c1081610bea565b92915050565b610c1f81610aa4565b8114610c2a57600080fd5b50565b600081359050610c3c81610c16565b92915050565b60008060408385031215610c5957610c58610be5565b5b6000610c6785828601610c01565b9250506020610c7885828601610c2d565b9150509250929050565b610c8b81610a83565b82525050565b610c9a81610aa4565b82525050565b610ca981610abd565b82525050565b600060a082019050610cc46000830188610c82565b610cd16020830187610c82565b610cde6040830186610c91565b610ceb6060830185610c91565b610cf86080830184610ca0565b9695505050505050565b600080600060608486031215610d1b57610d1a610be5565b5b6000610d2986828701610c01565b9350506020610d3a86828701610c2d565b9250506040610d4b86828701610c2d565b9150509250925092565b6000819050919050565b6000610d7a610d75610d7084610a63565b610d55565b610a63565b9050919050565b6000610d8c82610d5f565b9050919050565b6000610d9e82610d81565b9050919050565b610dae81610d93565b82525050565b6000602082019050610dc96000830184610da5565b92915050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000610e16600e83610dcf565b9150610e2182610de0565b602082019050919050565b60006020820190508181036000830152610e4581610e09565b9050919050565b6000606082019050610e616000830186610c82565b610e6e6020830185610c82565b610e7b6040830184610c91565b949350505050565b610e8c81610abd565b8114610e9757600080fd5b50565b600081519050610ea981610e83565b92915050565b600060208284031215610ec557610ec4610be5565b5b6000610ed384828501610e9a565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000610f12600e83610dcf565b9150610f1d82610edc565b602082019050919050565b60006020820190508181036000830152610f4181610f05565b9050919050565b6000602082019050610f5d6000830184610c91565b92915050565b600081519050610f7281610bea565b92915050565b600060208284031215610f8e57610f8d610be5565b5b6000610f9c84828501610f63565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000610fdb601883610dcf565b9150610fe682610fa5565b602082019050919050565b6000602082019050818103600083015261100a81610fce565b9050919050565b60006040820190506110266000830185610c82565b6110336020830184610c82565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611070600c83610dcf565b915061107b8261103a565b602082019050919050565b6000602082019050818103600083015261109f81611063565b905091905056fea26469706673582212200870aee182d7a210517e3b0c3ebdfbddc204b177e3f779245f3d0db5b7ec622564736f6c63430008140033", + "devdoc": { + "kind": "dev", + "methods": {}, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 10, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "_status", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 2941, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "s_listings", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)2934_storage))" + }, + { + "astId": 2945, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "s_listsArray", + "offset": 0, + "slot": "2", + "type": "t_array(t_struct(Listing)2934_storage)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Listing)2934_storage)dyn_storage": { + "base": "t_struct(Listing)2934_storage", + "encoding": "dynamic_array", + "label": "struct NftMarket.Listing[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)2934_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(uint256 => struct NftMarket.Listing))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_struct(Listing)2934_storage)" + }, + "t_mapping(t_uint256,t_struct(Listing)2934_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct NftMarket.Listing)", + "numberOfBytes": "32", + "value": "t_struct(Listing)2934_storage" + }, + "t_struct(Listing)2934_storage": { + "encoding": "inplace", + "label": "struct NftMarket.Listing", + "members": [ + { + "astId": 2925, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "seller", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 2927, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "nftContract", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 2929, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "tokenId", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 2931, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "price", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 2933, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "isActive", + "offset": 0, + "slot": "4", + "type": "t_bool" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} diff --git a/members/missop/task4/src/assets/abi/NftToken.json b/members/missop/task4/src/assets/abi/NftToken.json new file mode 100644 index 000000000..1b1dc1da6 --- /dev/null +++ b/members/missop/task4/src/assets/abi/NftToken.json @@ -0,0 +1,588 @@ +{ + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenIdOwners", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x1896a3e1c07a67da44b90330492ccb2f397a2794e176d1752abd5c638d401236", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "transactionIndex": 0, + "gasUsed": "2228632", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x427a69fce91f3d5b0a69b264c5b8f41739c298945a094a31a3b0563267243874", + "transactionHash": "0x1896a3e1c07a67da44b90330492ccb2f397a2794e176d1752abd5c638d401236", + "logs": [], + "blockNumber": 5, + "cumulativeGasUsed": "2228632", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 2, + "solcInputHash": "394ffbba7c866b67453d99ab3d3f3589", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenIdOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftToken.sol\":\"NftToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\\n * that `ownerOf(tokenId)` is `a`.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\\n _balances[account] += amount;\\n }\\n}\\n\",\"keccak256\":\"0x2c309e7df9e05e6ce15bedfe74f3c61b467fc37e0fae9eab496acf5ea0bbd7ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"contracts/NftToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract NftToken is ERC721 {\\n using Counters for Counters.Counter;\\n Counters.Counter private _tokenIdCounter;\\n mapping(uint256 => address) public tokenIdOwners;\\n\\n // \\u6bcf mint \\u4e00\\u4e2a nft \\u90fd\\u9700\\u8981\\u628a count+1 \\u8868\\u793a nft \\u603b\\u6570\\u91cf\\n constructor() ERC721(\\\"NftToken\\\", \\\"NT\\\") {\\n _tokenIdCounter.increment();\\n }\\n\\n function mint(address to) public {\\n uint256 tokenId = _tokenIdCounter.current();\\n _tokenIdCounter.increment();\\n _safeMint(to, tokenId);\\n tokenIdOwners[tokenId] = to;\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return \\\"https://avatars.githubusercontent.com/u/24432763?v=4\\\";\\n }\\n}\\n\",\"keccak256\":\"0xb994397f985abc8f1ee248d32692656ed8a4140faaeccd837841219565dbd185\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6674546f6b656e0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e5400000000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200034c565b508060019081620000a191906200034c565b505050620000b66006620000bc60201b60201c565b62000433565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200015457607f821691505b6020821081036200016a57620001696200010c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000195565b620001e0868362000195565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200022d620002276200022184620001f8565b62000202565b620001f8565b9050919050565b6000819050919050565b62000249836200020c565b62000261620002588262000234565b848454620001a2565b825550505050565b600090565b6200027862000269565b620002858184846200023e565b505050565b5b81811015620002ad57620002a16000826200026e565b6001810190506200028b565b5050565b601f821115620002fc57620002c68162000170565b620002d18462000185565b81016020851015620002e1578190505b620002f9620002f08562000185565b8301826200028a565b50505b505050565b600082821c905092915050565b6000620003216000198460080262000301565b1980831691505092915050565b60006200033c83836200030e565b9150826002028217905092915050565b6200035782620000d2565b67ffffffffffffffff811115620003735762000372620000dd565b5b6200037f82546200013b565b6200038c828285620002b1565b600060209050601f831160018114620003c45760008415620003af578287015190505b620003bb85826200032e565b8655506200042b565b601f198416620003d48662000170565b60005b82811015620003fe57848901518255600182019150602085019450602081019050620003d7565b868310156200041e57848901516200041a601f8916826200030e565b8355505b6001600288020188555050505b505050505050565b61260c80620004436000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610296578063b88d4fde146102b2578063c87b56dd146102ce578063e985e9c5146102fe576100f5565b80636352211e146101fc5780636a6278421461022c57806370a082311461024857806395d89b4114610278576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806342842e0e146101b05780634884254a146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f91906118d4565b61032e565b604051610121919061191c565b60405180910390f35b610132610410565b60405161013f91906119c7565b60405180910390f35b610162600480360381019061015d9190611a1f565b6104a2565b60405161016f9190611a8d565b60405180910390f35b610192600480360381019061018d9190611ad4565b6104e8565b005b6101ae60048036038101906101a99190611b14565b6105ff565b005b6101ca60048036038101906101c59190611b14565b61065f565b005b6101e660048036038101906101e19190611a1f565b61067f565b6040516101f39190611a8d565b60405180910390f35b61021660048036038101906102119190611a1f565b6106b2565b6040516102239190611a8d565b60405180910390f35b61024660048036038101906102419190611b67565b610738565b005b610262600480360381019061025d9190611b67565b6107b0565b60405161026f9190611ba3565b60405180910390f35b610280610867565b60405161028d91906119c7565b60405180910390f35b6102b060048036038101906102ab9190611bea565b6108f9565b005b6102cc60048036038101906102c79190611d5f565b61090f565b005b6102e860048036038101906102e39190611a1f565b610971565b6040516102f591906119c7565b60405180910390f35b61031860048036038101906103139190611de2565b6109d9565b604051610325919061191c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610409575061040882610a6d565b5b9050919050565b60606000805461041f90611e51565b80601f016020809104026020016040519081016040528092919081815260200182805461044b90611e51565b80156104985780601f1061046d57610100808354040283529160200191610498565b820191906000526020600020905b81548152906001019060200180831161047b57829003601f168201915b5050505050905090565b60006104ad82610ad7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104f3826106b2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055a90611ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610582610b22565b73ffffffffffffffffffffffffffffffffffffffff1614806105b157506105b0816105ab610b22565b6109d9565b5b6105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e790611f86565b60405180910390fd5b6105fa8383610b2a565b505050565b61061061060a610b22565b82610be3565b61064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690612018565b60405180910390fd5b61065a838383610c78565b505050565b61067a8383836040518060200160405280600081525061090f565b505050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806106be83610f71565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072690612084565b60405180910390fd5b80915050919050565b60006107446006610fae565b90506107506006610fbc565b61075a8282610fd2565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790612116565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461087690611e51565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611e51565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b61090b610904610b22565b8383610ff0565b5050565b61092061091a610b22565b83610be3565b61095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690612018565b60405180910390fd5b61096b8484848461115c565b50505050565b606061097c82610ad7565b60006109866111b8565b905060008151116109a657604051806020016040528060008152506109d1565b806109b0846111d8565b6040516020016109c1929190612172565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ae0816112a6565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612084565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b9d836106b2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bef836106b2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c315750610c3081856109d9565b5b80610c6f57508373ffffffffffffffffffffffffffffffffffffffff16610c57846104a2565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c98826106b2565b73ffffffffffffffffffffffffffffffffffffffff1614610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590612208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061229a565b60405180910390fd5b610d6a83838360016112e7565b8273ffffffffffffffffffffffffffffffffffffffff16610d8a826106b2565b73ffffffffffffffffffffffffffffffffffffffff1614610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790612208565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6c83838360016112ed565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b610fec8282604051806020016040528060008152506112f3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612306565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161114f919061191c565b60405180910390a3505050565b611167848484610c78565b6111738484848461134e565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990612398565b60405180910390fd5b50505050565b60606040518060600160405280603481526020016125a360349139905090565b6060600060016111e7846114d5565b01905060008167ffffffffffffffff81111561120657611205611c34565b5b6040519080825280601f01601f1916602001820160405280156112385781602001600182028036833780820191505090505b509050600082602001820190505b60011561129b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161128f5761128e6123b8565b5b04945060008503611246575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166112c883610f71565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112fd8383611628565b61130a600084848461134e565b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612398565b60405180910390fd5b505050565b600061136f8473ffffffffffffffffffffffffffffffffffffffff16611845565b156114c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611398610b22565b8786866040518563ffffffff1660e01b81526004016113ba949392919061243c565b6020604051808303816000875af19250505080156113f657506040513d601f19601f820116820180604052508101906113f3919061249d565b60015b611478573d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b506000815103611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790612398565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506114cd565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611533577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611529576115286123b8565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611570576d04ee2d6d415b85acef81000000008381611566576115656123b8565b5b0492506020810190505b662386f26fc10000831061159f57662386f26fc100008381611595576115946123b8565b5b0492506010810190505b6305f5e10083106115c8576305f5e10083816115be576115bd6123b8565b5b0492506008810190505b61271083106115ed5761271083816115e3576115e26123b8565b5b0492506004810190505b606483106116105760648381611606576116056123b8565b5b0492506002810190505b600a831061161f576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612516565b60405180910390fd5b6116a0816112a6565b156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790612582565b60405180910390fd5b6116ee6000838360016112e7565b6116f7816112a6565b15611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90612582565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118416000838360016112ed565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b18161187c565b81146118bc57600080fd5b50565b6000813590506118ce816118a8565b92915050565b6000602082840312156118ea576118e9611872565b5b60006118f8848285016118bf565b91505092915050565b60008115159050919050565b61191681611901565b82525050565b6000602082019050611931600083018461190d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611971578082015181840152602081019050611956565b60008484015250505050565b6000601f19601f8301169050919050565b600061199982611937565b6119a38185611942565b93506119b3818560208601611953565b6119bc8161197d565b840191505092915050565b600060208201905081810360008301526119e1818461198e565b905092915050565b6000819050919050565b6119fc816119e9565b8114611a0757600080fd5b50565b600081359050611a19816119f3565b92915050565b600060208284031215611a3557611a34611872565b5b6000611a4384828501611a0a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a7782611a4c565b9050919050565b611a8781611a6c565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b611ab181611a6c565b8114611abc57600080fd5b50565b600081359050611ace81611aa8565b92915050565b60008060408385031215611aeb57611aea611872565b5b6000611af985828601611abf565b9250506020611b0a85828601611a0a565b9150509250929050565b600080600060608486031215611b2d57611b2c611872565b5b6000611b3b86828701611abf565b9350506020611b4c86828701611abf565b9250506040611b5d86828701611a0a565b9150509250925092565b600060208284031215611b7d57611b7c611872565b5b6000611b8b84828501611abf565b91505092915050565b611b9d816119e9565b82525050565b6000602082019050611bb86000830184611b94565b92915050565b611bc781611901565b8114611bd257600080fd5b50565b600081359050611be481611bbe565b92915050565b60008060408385031215611c0157611c00611872565b5b6000611c0f85828601611abf565b9250506020611c2085828601611bd5565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c6c8261197d565b810181811067ffffffffffffffff82111715611c8b57611c8a611c34565b5b80604052505050565b6000611c9e611868565b9050611caa8282611c63565b919050565b600067ffffffffffffffff821115611cca57611cc9611c34565b5b611cd38261197d565b9050602081019050919050565b82818337600083830152505050565b6000611d02611cfd84611caf565b611c94565b905082815260208101848484011115611d1e57611d1d611c2f565b5b611d29848285611ce0565b509392505050565b600082601f830112611d4657611d45611c2a565b5b8135611d56848260208601611cef565b91505092915050565b60008060008060808587031215611d7957611d78611872565b5b6000611d8787828801611abf565b9450506020611d9887828801611abf565b9350506040611da987828801611a0a565b925050606085013567ffffffffffffffff811115611dca57611dc9611877565b5b611dd687828801611d31565b91505092959194509250565b60008060408385031215611df957611df8611872565b5b6000611e0785828601611abf565b9250506020611e1885828601611abf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e6957607f821691505b602082108103611e7c57611e7b611e22565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ede602183611942565b9150611ee982611e82565b604082019050919050565b60006020820190508181036000830152611f0d81611ed1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611f70603d83611942565b9150611f7b82611f14565b604082019050919050565b60006020820190508181036000830152611f9f81611f63565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612002602d83611942565b915061200d82611fa6565b604082019050919050565b6000602082019050818103600083015261203181611ff5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061206e601883611942565b915061207982612038565b602082019050919050565b6000602082019050818103600083015261209d81612061565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612100602983611942565b915061210b826120a4565b604082019050919050565b6000602082019050818103600083015261212f816120f3565b9050919050565b600081905092915050565b600061214c82611937565b6121568185612136565b9350612166818560208601611953565b80840191505092915050565b600061217e8285612141565b915061218a8284612141565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006121f2602583611942565b91506121fd82612196565b604082019050919050565b60006020820190508181036000830152612221816121e5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612284602483611942565b915061228f82612228565b604082019050919050565b600060208201905081810360008301526122b381612277565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006122f0601983611942565b91506122fb826122ba565b602082019050919050565b6000602082019050818103600083015261231f816122e3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612382603283611942565b915061238d82612326565b604082019050919050565b600060208201905081810360008301526123b181612375565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061240e826123e7565b61241881856123f2565b9350612428818560208601611953565b6124318161197d565b840191505092915050565b60006080820190506124516000830187611a7e565b61245e6020830186611a7e565b61246b6040830185611b94565b818103606083015261247d8184612403565b905095945050505050565b600081519050612497816118a8565b92915050565b6000602082840312156124b3576124b2611872565b5b60006124c184828501612488565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612500602083611942565b915061250b826124ca565b602082019050919050565b6000602082019050818103600083015261252f816124f3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061256c601c83611942565b915061257782612536565b602082019050919050565b6000602082019050818103600083015261259b8161255f565b905091905056fe68747470733a2f2f617661746172732e67697468756275736572636f6e74656e742e636f6d2f752f32343433323736333f763d34a2646970667358221220c594240e229d9d23d8336945d1ba135b5daea5c4ba84f27b702aaa745193cc7564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80636352211e11610097578063a22cb46511610066578063a22cb46514610296578063b88d4fde146102b2578063c87b56dd146102ce578063e985e9c5146102fe576100f5565b80636352211e146101fc5780636a6278421461022c57806370a082311461024857806395d89b4114610278576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806342842e0e146101b05780634884254a146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f91906118d4565b61032e565b604051610121919061191c565b60405180910390f35b610132610410565b60405161013f91906119c7565b60405180910390f35b610162600480360381019061015d9190611a1f565b6104a2565b60405161016f9190611a8d565b60405180910390f35b610192600480360381019061018d9190611ad4565b6104e8565b005b6101ae60048036038101906101a99190611b14565b6105ff565b005b6101ca60048036038101906101c59190611b14565b61065f565b005b6101e660048036038101906101e19190611a1f565b61067f565b6040516101f39190611a8d565b60405180910390f35b61021660048036038101906102119190611a1f565b6106b2565b6040516102239190611a8d565b60405180910390f35b61024660048036038101906102419190611b67565b610738565b005b610262600480360381019061025d9190611b67565b6107b0565b60405161026f9190611ba3565b60405180910390f35b610280610867565b60405161028d91906119c7565b60405180910390f35b6102b060048036038101906102ab9190611bea565b6108f9565b005b6102cc60048036038101906102c79190611d5f565b61090f565b005b6102e860048036038101906102e39190611a1f565b610971565b6040516102f591906119c7565b60405180910390f35b61031860048036038101906103139190611de2565b6109d9565b604051610325919061191c565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610409575061040882610a6d565b5b9050919050565b60606000805461041f90611e51565b80601f016020809104026020016040519081016040528092919081815260200182805461044b90611e51565b80156104985780601f1061046d57610100808354040283529160200191610498565b820191906000526020600020905b81548152906001019060200180831161047b57829003601f168201915b5050505050905090565b60006104ad82610ad7565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104f3826106b2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055a90611ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610582610b22565b73ffffffffffffffffffffffffffffffffffffffff1614806105b157506105b0816105ab610b22565b6109d9565b5b6105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e790611f86565b60405180910390fd5b6105fa8383610b2a565b505050565b61061061060a610b22565b82610be3565b61064f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064690612018565b60405180910390fd5b61065a838383610c78565b505050565b61067a8383836040518060200160405280600081525061090f565b505050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806106be83610f71565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361072f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072690612084565b60405180910390fd5b80915050919050565b60006107446006610fae565b90506107506006610fbc565b61075a8282610fd2565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081790612116565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461087690611e51565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611e51565b80156108ef5780601f106108c4576101008083540402835291602001916108ef565b820191906000526020600020905b8154815290600101906020018083116108d257829003601f168201915b5050505050905090565b61090b610904610b22565b8383610ff0565b5050565b61092061091a610b22565b83610be3565b61095f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095690612018565b60405180910390fd5b61096b8484848461115c565b50505050565b606061097c82610ad7565b60006109866111b8565b905060008151116109a657604051806020016040528060008152506109d1565b806109b0846111d8565b6040516020016109c1929190612172565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610ae0816112a6565b610b1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1690612084565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610b9d836106b2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610bef836106b2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610c315750610c3081856109d9565b5b80610c6f57508373ffffffffffffffffffffffffffffffffffffffff16610c57846104a2565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610c98826106b2565b73ffffffffffffffffffffffffffffffffffffffff1614610cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce590612208565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d549061229a565b60405180910390fd5b610d6a83838360016112e7565b8273ffffffffffffffffffffffffffffffffffffffff16610d8a826106b2565b73ffffffffffffffffffffffffffffffffffffffff1614610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790612208565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f6c83838360016112ed565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b610fec8282604051806020016040528060008152506112f3565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612306565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161114f919061191c565b60405180910390a3505050565b611167848484610c78565b6111738484848461134e565b6111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990612398565b60405180910390fd5b50505050565b60606040518060600160405280603481526020016125a360349139905090565b6060600060016111e7846114d5565b01905060008167ffffffffffffffff81111561120657611205611c34565b5b6040519080825280601f01601f1916602001820160405280156112385781602001600182028036833780820191505090505b509050600082602001820190505b60011561129b578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161128f5761128e6123b8565b5b04945060008503611246575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166112c883610f71565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b6112fd8383611628565b61130a600084848461134e565b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090612398565b60405180910390fd5b505050565b600061136f8473ffffffffffffffffffffffffffffffffffffffff16611845565b156114c8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611398610b22565b8786866040518563ffffffff1660e01b81526004016113ba949392919061243c565b6020604051808303816000875af19250505080156113f657506040513d601f19601f820116820180604052508101906113f3919061249d565b60015b611478573d8060008114611426576040519150601f19603f3d011682016040523d82523d6000602084013e61142b565b606091505b506000815103611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790612398565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506114cd565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611533577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611529576115286123b8565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611570576d04ee2d6d415b85acef81000000008381611566576115656123b8565b5b0492506020810190505b662386f26fc10000831061159f57662386f26fc100008381611595576115946123b8565b5b0492506010810190505b6305f5e10083106115c8576305f5e10083816115be576115bd6123b8565b5b0492506008810190505b61271083106115ed5761271083816115e3576115e26123b8565b5b0492506004810190505b606483106116105760648381611606576116056123b8565b5b0492506002810190505b600a831061161f576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611697576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168e90612516565b60405180910390fd5b6116a0816112a6565b156116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790612582565b60405180910390fd5b6116ee6000838360016112e7565b6116f7816112a6565b15611737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172e90612582565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118416000838360016112ed565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118b18161187c565b81146118bc57600080fd5b50565b6000813590506118ce816118a8565b92915050565b6000602082840312156118ea576118e9611872565b5b60006118f8848285016118bf565b91505092915050565b60008115159050919050565b61191681611901565b82525050565b6000602082019050611931600083018461190d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611971578082015181840152602081019050611956565b60008484015250505050565b6000601f19601f8301169050919050565b600061199982611937565b6119a38185611942565b93506119b3818560208601611953565b6119bc8161197d565b840191505092915050565b600060208201905081810360008301526119e1818461198e565b905092915050565b6000819050919050565b6119fc816119e9565b8114611a0757600080fd5b50565b600081359050611a19816119f3565b92915050565b600060208284031215611a3557611a34611872565b5b6000611a4384828501611a0a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a7782611a4c565b9050919050565b611a8781611a6c565b82525050565b6000602082019050611aa26000830184611a7e565b92915050565b611ab181611a6c565b8114611abc57600080fd5b50565b600081359050611ace81611aa8565b92915050565b60008060408385031215611aeb57611aea611872565b5b6000611af985828601611abf565b9250506020611b0a85828601611a0a565b9150509250929050565b600080600060608486031215611b2d57611b2c611872565b5b6000611b3b86828701611abf565b9350506020611b4c86828701611abf565b9250506040611b5d86828701611a0a565b9150509250925092565b600060208284031215611b7d57611b7c611872565b5b6000611b8b84828501611abf565b91505092915050565b611b9d816119e9565b82525050565b6000602082019050611bb86000830184611b94565b92915050565b611bc781611901565b8114611bd257600080fd5b50565b600081359050611be481611bbe565b92915050565b60008060408385031215611c0157611c00611872565b5b6000611c0f85828601611abf565b9250506020611c2085828601611bd5565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c6c8261197d565b810181811067ffffffffffffffff82111715611c8b57611c8a611c34565b5b80604052505050565b6000611c9e611868565b9050611caa8282611c63565b919050565b600067ffffffffffffffff821115611cca57611cc9611c34565b5b611cd38261197d565b9050602081019050919050565b82818337600083830152505050565b6000611d02611cfd84611caf565b611c94565b905082815260208101848484011115611d1e57611d1d611c2f565b5b611d29848285611ce0565b509392505050565b600082601f830112611d4657611d45611c2a565b5b8135611d56848260208601611cef565b91505092915050565b60008060008060808587031215611d7957611d78611872565b5b6000611d8787828801611abf565b9450506020611d9887828801611abf565b9350506040611da987828801611a0a565b925050606085013567ffffffffffffffff811115611dca57611dc9611877565b5b611dd687828801611d31565b91505092959194509250565b60008060408385031215611df957611df8611872565b5b6000611e0785828601611abf565b9250506020611e1885828601611abf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611e6957607f821691505b602082108103611e7c57611e7b611e22565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611ede602183611942565b9150611ee982611e82565b604082019050919050565b60006020820190508181036000830152611f0d81611ed1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611f70603d83611942565b9150611f7b82611f14565b604082019050919050565b60006020820190508181036000830152611f9f81611f63565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000612002602d83611942565b915061200d82611fa6565b604082019050919050565b6000602082019050818103600083015261203181611ff5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061206e601883611942565b915061207982612038565b602082019050919050565b6000602082019050818103600083015261209d81612061565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612100602983611942565b915061210b826120a4565b604082019050919050565b6000602082019050818103600083015261212f816120f3565b9050919050565b600081905092915050565b600061214c82611937565b6121568185612136565b9350612166818560208601611953565b80840191505092915050565b600061217e8285612141565b915061218a8284612141565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006121f2602583611942565b91506121fd82612196565b604082019050919050565b60006020820190508181036000830152612221816121e5565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612284602483611942565b915061228f82612228565b604082019050919050565b600060208201905081810360008301526122b381612277565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006122f0601983611942565b91506122fb826122ba565b602082019050919050565b6000602082019050818103600083015261231f816122e3565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000612382603283611942565b915061238d82612326565b604082019050919050565b600060208201905081810360008301526123b181612375565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061240e826123e7565b61241881856123f2565b9350612428818560208601611953565b6124318161197d565b840191505092915050565b60006080820190506124516000830187611a7e565b61245e6020830186611a7e565b61246b6040830185611b94565b818103606083015261247d8184612403565b905095945050505050565b600081519050612497816118a8565b92915050565b6000602082840312156124b3576124b2611872565b5b60006124c184828501612488565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612500602083611942565b915061250b826124ca565b602082019050919050565b6000602082019050818103600083015261252f816124f3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061256c601c83611942565b915061257782612536565b602082019050919050565b6000602082019050818103600083015261259b8161255f565b905091905056fe68747470733a2f2f617661746172732e67697468756275736572636f6e74656e742e636f6d2f752f32343433323736333f763d34a2646970667358221220c594240e229d9d23d8336945d1ba135b5daea5c4ba84f27b702aaa745193cc7564736f6c63430008140033", + "devdoc": { + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when `owner` enables `approved` to manage the `tokenId` token." + }, + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `tokenId` token is transferred from `from` to `to`." + } + }, + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "details": "See {IERC721Metadata-tokenURI}." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 168, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 170, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_symbol", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 174, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_owners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 178, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_balances", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 182, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_tokenApprovals", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 188, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_operatorApprovals", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 3133, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_tokenIdCounter", + "offset": 0, + "slot": "6", + "type": "t_struct(Counter)1596_storage" + }, + { + "astId": 3137, + "contract": "contracts/NftToken.sol:NftToken", + "label": "tokenIdOwners", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint256,t_address)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Counter)1596_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "members": [ + { + "astId": 1595, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/members/missop/task4/src/hooks/contract.js b/members/missop/task4/src/hooks/contract.js new file mode 100644 index 000000000..d63666dee --- /dev/null +++ b/members/missop/task4/src/hooks/contract.js @@ -0,0 +1,140 @@ +import { useAccount, useReadContract, useWriteContract } from "wagmi"; + +import MissopToken from "@/assets/abi/MissopToken.json"; +import NftToken from "@/assets/abi/NftToken.json"; +import NftMarket from "@/assets/abi/NftMarket.json"; + +const NftAbi = NftToken.abi; +const NftMarketAbi = NftMarket.abi; +const NftTokenContractAddress = process.env.NftTokenContractAddress; +const NftMarketContractAddress = process.env.NftMarketContractAddress; +const MissopTokenAddress = process.env.MissopTokenContractAddress; + +const NFTContractParams = { + abi: NftAbi, + address: NftTokenContractAddress, +}; +const NFTMarketParams = { + abi: NftMarketAbi, + address: NftMarketContractAddress, +}; +const MissopTokenParams = { + abi: MissopToken.abi, + address: MissopTokenAddress, +}; +console.log(MissopTokenParams, NFTMarketParams, NFTContractParams); + +/** + * 写入操作所有方法 + * @returns + */ +export function useWrite() { + const account = useAccount(); + const { writeContractAsync } = useWriteContract(); + + /** + * 上架 NFT + * @param {*} tokenId + * @param {*} price + * @returns + */ + async function listNFT(tokenId, price) { + try { + return await writeContractAsync({ + functionName: "listNft", + args: [NftTokenContractAddress, tokenId, price], + ...NFTMarketParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 铸造 NFT + * @returns + */ + async function mintNFT() { + try { + return await writeContractAsync({ + functionName: "mint", + args: [account.address], + ...NFTContractParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 调用setApprovalForAll,参数为NFTMarket 合约地址和 true + * @returns + */ + async function setApprovalForAll() { + try { + return await writeContractAsync({ + functionName: "setApprovalForAll", + args: [NftMarketContractAddress, true], + ...NFTContractParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 授权NFTMarket 合约使用 MT 代币额度,因此参数为NFTMarket 合约地址 + * @param {*} params + */ + async function approveAmount(amount) { + try { + return await writeContractAsync({ + functionName: "approve", + args: [NftMarketContractAddress, amount], + ...MissopTokenParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 购买 NFT + * @param {*} _tokenId + * @returns + */ + async function buyNFT(_tokenId) { + try { + return await writeContractAsync({ + functionName: "buyNft", + args: [NftTokenContractAddress, _tokenId], + ...NFTMarketParams, + }); + } catch (error) { + console.log("error", error); + } + } + + return { + listNFT, + buyNFT, + mintNFT, + approveAmount, + setApprovalForAll, + }; +} + +/** + * 获取所有上架的 NFT + * @returns + */ +export function useGetListsNFTs() { + const { data, error } = useReadContract({ + ...NFTMarketParams, + functionName: "getListsArray", + }); + + console.log("error", error); + + return data; +} diff --git a/members/missop/task4/tailwind.config.js b/members/missop/task4/tailwind.config.js new file mode 100644 index 000000000..abf6a0fb7 --- /dev/null +++ b/members/missop/task4/tailwind.config.js @@ -0,0 +1,17 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + }, + }, + plugins: [], +}; From f8b3255051d186a79620d67311e2f64653d6a1bc Mon Sep 17 00:00:00 2001 From: missop Date: Tue, 22 Oct 2024 22:37:00 +0800 Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=E4=B8=8A=E4=BC=A0=E6=88=AA?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- members/missop/task4/preview.png | Bin 0 -> 234808 bytes .../task4/src/app/components/Contract.js | 8 ++++---- .../task4/src/app/components/ListNFTs.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 members/missop/task4/preview.png diff --git a/members/missop/task4/preview.png b/members/missop/task4/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..38fc93f5e3f555f66fb06b1e4f94a40ae3953e95 GIT binary patch literal 234808 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%0D%&NPVgk(qPtlCVt`R5 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 铸造NFT +
+ +
+ { + setCid(e.target.value); + }} + /> +
+
+ + + + + diff --git a/members/missop/task5/contracts/coverage/contracts/NftMarket.sol.html b/members/missop/task5/contracts/coverage/contracts/NftMarket.sol.html new file mode 100644 index 000000000..9a6b43702 --- /dev/null +++ b/members/missop/task5/contracts/coverage/contracts/NftMarket.sol.html @@ -0,0 +1,533 @@ + + + + Code coverage report for contracts/NftMarket.sol + + + + + + + +
+
+

+ all files / contracts/ NftMarket.sol +

+
+
+ 0% + Statements + 0/24 +
+
+ 0% + Branches + 0/16 +
+
+ 20% + Functions + 1/5 +
+
+ 2.7% + Lines + 1/37 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+ 
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
+import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; // 防止双花攻击
+import "hardhat/console.sol";
+ 
+error NftMarket__NotOwnerOf(string message);
+error NftMarket__NotApproved(string message);
+error NftMarket__NotActive(string message);
+error NftMarket__PaymentFailed(string message);
+error NftMarket__NotExist(string message);
+error NftMarket__IsListed(string message);
+ 
+contract NftMarket is ReentrancyGuard {
+    struct Listing {
+        address seller;
+        address nftContract;
+        uint256 tokenId;
+        uint256 price;
+        uint256 listTime;
+        string cid;
+        bool isActive;
+    }
+ 
+    mapping(address => mapping(uint256 => Listing)) public s_listings;
+    uint256[] private s_tokenIds;
+    // Listing[] private s_listArr;
+    IERC20 public immutable i_paymentToken;
+ 
+    // 上架 nft 事件
+    event NftListed(
+        address indexed seller,
+        uint256 indexed tokenId,
+        address indexed nftContract,
+        uint256 price
+    );
+ 
+    // nft购买事件
+    event NftPurchased(
+        address indexed buyer,
+        uint256 indexed tokenId,
+        address indexed nftContract,
+        uint256 price
+    );
+ 
+    event NftUnlisted(
+        address indexed seller,
+        uint256 indexed tokenId,
+        address indexed nftContract
+    );
+ 
+    constructor(address _paymentToken) {
+        i_paymentToken = IERC20(_paymentToken);
+    }
+ 
+    function listNft(
+        address _nftContract,
+        uint256 tokenId,
+        uint256 price,
+        string memory cid
+    ) external {
+        IERC721 nft = IERC721(_nftContract);
+        if (nft.ownerOf(tokenId) != msg.sender) {
+            revert NftMarket__NotOwnerOf("not the owner of the NFT");
+        }
+        if (!nft.isApprovedForAll(msg.sender, address(this))) {
+            revert NftMarket__NotApproved("not approved");
+        }
+        if (s_listings[_nftContract][tokenId].isActive) {
+            revert NftMarket__IsListed("NFT already listed");
+        }
+        uint256 listTime = block.timestamp;
+        Listing memory item = Listing(
+            msg.sender,
+            _nftContract,
+            tokenId,
+            price,
+            listTime,
+            cid,
+            true
+        );
+        s_listings[_nftContract][tokenId] = item;
+        s_tokenIds.push(tokenId);
+        // s_listArr.push(item);
+ 
+        emit NftListed(msg.sender, tokenId, _nftContract, price);
+    }
+ 
+    function unlistNft(address _nftContract, uint256 _tokenId) external {
+        Listing memory item = s_listings[_nftContract][_tokenId];
+        if (!item.isActive) {
+            revert NftMarket__NotActive("not active");
+        }
+        IERC721 nft = IERC721(_nftContract);
+        if (nft.ownerOf(_tokenId) != msg.sender) {
+            revert NftMarket__NotOwnerOf("not the owner of the NFT");
+        }
+        if (!nft.isApprovedForAll(msg.sender, address(this))) {
+            revert NftMarket__NotApproved("not approved");
+        }
+        item.isActive = false;
+        emit NftUnlisted(msg.sender, _tokenId, _nftContract);
+    }
+ 
+    function buyNft(address _nftContract, uint256 _tokenId) external {
+        Listing memory listing = s_listings[_nftContract][_tokenId];
+        if (!listing.isActive) {
+            revert NftMarket__NotActive("NFT not active");
+        }
+        IERC721 nft = IERC721(_nftContract);
+        // 将购买人身上的钱转给售卖人
+        if (
+            !i_paymentToken.transferFrom(
+                msg.sender,
+                listing.seller,
+                listing.price
+            )
+        ) {
+            revert NftMarket__PaymentFailed("payment failed");
+        }
+        nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);
+        listing.isActive = false;
+        emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);
+    }
+ 
+    /**
+     *
+     * @dev 从 s_listings 中获取上架的 NFT
+     */
+    function getListsArray(
+        address _nftContract
+    ) public view returns (Listing[] memory) {
+        Listing[] memory listings = new Listing[](s_tokenIds.length);
+        for (uint256 i = 0; i < s_tokenIds.length; i++) {
+            Listing memory item = s_listings[_nftContract][s_tokenIds[i]];
+            listings[i] = item;
+        }
+        return listings;
+    }
+ 
+    /**
+     * @dev 从数组中获取,对比两者差异
+     */
+    // function getList(
+    //     address _nftContract
+    // ) external view returns (Listing[] memory) {
+    //     for (uint256 i = 0; i < s_listArr.length; i++) {
+    //         Listing memory item = s_listArr[i];
+    //         Listing memory listingItem = s_listings[_nftContract][item.tokenId];
+    //         item.isActive = listingItem.isActive;
+    //     }
+    //     return s_listArr;
+    // }
+}
+ 
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/contracts/NftToken.sol.html b/members/missop/task5/contracts/coverage/contracts/NftToken.sol.html new file mode 100644 index 000000000..827091069 --- /dev/null +++ b/members/missop/task5/contracts/coverage/contracts/NftToken.sol.html @@ -0,0 +1,128 @@ + + + + Code coverage report for contracts/NftToken.sol + + + + + + + +
+
+

+ all files / contracts/ NftToken.sol +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 4/4 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  + + + +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+ 
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+import "@openzeppelin/contracts/utils/Counters.sol";
+ 
+contract NftToken is ERC721 {
+    using Counters for Counters.Counter;
+    Counters.Counter private _tokenIdCounter;
+ 
+    // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量
+    constructor() ERC721("NftToken", "NT") {
+        _tokenIdCounter.increment();
+    }
+ 
+    function mint(address to) public {
+        uint256 tokenId = _tokenIdCounter.current();
+        _tokenIdCounter.increment();
+        _safeMint(to, tokenId);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/contracts/index.html b/members/missop/task5/contracts/coverage/contracts/index.html new file mode 100644 index 000000000..00aea35e1 --- /dev/null +++ b/members/missop/task5/contracts/coverage/contracts/index.html @@ -0,0 +1,119 @@ + + + + Code coverage report for contracts/ + + + + + + + +
+
+

+ all files contracts/ +

+
+
+ 20% + Statements + 6/30 +
+
+ 0% + Branches + 0/16 +
+
+ 55.56% + Functions + 5/9 +
+
+ 16.28% + Lines + 7/43 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MissopToken.sol
100%2/2100%0/0100%2/2100%2/2
NftMarket.sol
0%0/240%0/1620%1/52.7%1/37
NftToken.sol
100%4/4100%0/0100%2/2100%4/4
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/coverage-final.json b/members/missop/task5/contracts/coverage/coverage-final.json new file mode 100644 index 000000000..c99a7c356 --- /dev/null +++ b/members/missop/task5/contracts/coverage/coverage-final.json @@ -0,0 +1,4 @@ +{ +"contracts/MissopToken.sol":{"l":{"9":6,"13":1},"path":"/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/MissopToken.sol","s":{"1":6,"2":1},"b":{},"f":{"1":6,"2":1},"fnMap":{"1":{"name":"constructor","line":7,"loc":{"start":{"line":7,"column":4},"end":{"line":10,"column":4}}},"2":{"name":"decimals","line":12,"loc":{"start":{"line":12,"column":4},"end":{"line":14,"column":4}}}},"statementMap":{"1":{"start":{"line":9,"column":8},"end":{"line":9,"column":43}},"2":{"start":{"line":13,"column":8},"end":{"line":13,"column":17}}},"branchMap":{}}, +"contracts/NftMarket.sol":{"l":{"55":3,"64":0,"65":0,"66":0,"68":0,"69":0,"71":0,"72":0,"74":0,"75":0,"84":0,"85":0,"88":0,"92":0,"93":0,"94":0,"96":0,"97":0,"98":0,"100":0,"101":0,"103":0,"104":0,"108":0,"109":0,"110":0,"112":0,"114":0,"121":0,"123":0,"124":0,"125":0,"135":0,"136":0,"137":0,"138":0,"140":0},"path":"/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/NftMarket.sol","s":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"b":{"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]},"f":{"1":3,"2":0,"3":0,"4":0,"5":0},"fnMap":{"1":{"name":"constructor","line":54,"loc":{"start":{"line":54,"column":4},"end":{"line":56,"column":4}}},"2":{"name":"listNft","line":58,"loc":{"start":{"line":58,"column":4},"end":{"line":89,"column":4}}},"3":{"name":"unlistNft","line":91,"loc":{"start":{"line":91,"column":4},"end":{"line":105,"column":4}}},"4":{"name":"buyNft","line":107,"loc":{"start":{"line":107,"column":4},"end":{"line":126,"column":4}}},"5":{"name":"getListsArray","line":132,"loc":{"start":{"line":132,"column":4},"end":{"line":141,"column":4}}}},"statementMap":{"1":{"start":{"line":64,"column":8},"end":{"line":64,"column":43}},"2":{"start":{"line":65,"column":8},"end":{"line":65,"column":1745}},"3":{"start":{"line":68,"column":8},"end":{"line":68,"column":1875}},"4":{"start":{"line":71,"column":8},"end":{"line":71,"column":2008}},"5":{"start":{"line":74,"column":8},"end":{"line":74,"column":42}},"6":{"start":{"line":75,"column":8},"end":{"line":75,"column":2183}},"7":{"start":{"line":85,"column":8},"end":{"line":85,"column":31}},"8":{"start":{"line":88,"column":8},"end":{"line":88,"column":64}},"9":{"start":{"line":92,"column":8},"end":{"line":92,"column":64}},"10":{"start":{"line":93,"column":8},"end":{"line":93,"column":2709}},"11":{"start":{"line":96,"column":8},"end":{"line":96,"column":43}},"12":{"start":{"line":97,"column":8},"end":{"line":97,"column":2849}},"13":{"start":{"line":100,"column":8},"end":{"line":100,"column":2980}},"14":{"start":{"line":104,"column":8},"end":{"line":104,"column":60}},"15":{"start":{"line":108,"column":8},"end":{"line":108,"column":67}},"16":{"start":{"line":109,"column":8},"end":{"line":109,"column":3353}},"17":{"start":{"line":112,"column":8},"end":{"line":112,"column":43}},"18":{"start":{"line":114,"column":8},"end":{"line":114,"column":3525}},"19":{"start":{"line":123,"column":8},"end":{"line":123,"column":65}},"20":{"start":{"line":125,"column":8},"end":{"line":125,"column":76}},"21":{"start":{"line":135,"column":8},"end":{"line":135,"column":68}},"22":{"start":{"line":136,"column":8},"end":{"line":136,"column":4189}},"23":{"start":{"line":137,"column":12},"end":{"line":137,"column":73}},"24":{"start":{"line":140,"column":8},"end":{"line":140,"column":23}}},"branchMap":{"1":{"line":65,"type":"if","locations":[{"start":{"line":65,"column":8},"end":{"line":65,"column":8}},{"start":{"line":65,"column":8},"end":{"line":65,"column":8}}]},"2":{"line":68,"type":"if","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":8}},{"start":{"line":68,"column":8},"end":{"line":68,"column":8}}]},"3":{"line":71,"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":8}},{"start":{"line":71,"column":8},"end":{"line":71,"column":8}}]},"4":{"line":93,"type":"if","locations":[{"start":{"line":93,"column":8},"end":{"line":93,"column":8}},{"start":{"line":93,"column":8},"end":{"line":93,"column":8}}]},"5":{"line":97,"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":97,"column":8}},{"start":{"line":97,"column":8},"end":{"line":97,"column":8}}]},"6":{"line":100,"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":8}},{"start":{"line":100,"column":8},"end":{"line":100,"column":8}}]},"7":{"line":109,"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":109,"column":8}},{"start":{"line":109,"column":8},"end":{"line":109,"column":8}}]},"8":{"line":114,"type":"if","locations":[{"start":{"line":114,"column":8},"end":{"line":114,"column":8}},{"start":{"line":114,"column":8},"end":{"line":114,"column":8}}]}}}, +"contracts/NftToken.sol":{"l":{"13":3,"17":1,"18":1,"19":1},"path":"/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/NftToken.sol","s":{"1":3,"2":1,"3":1,"4":1},"b":{},"f":{"1":3,"2":1},"fnMap":{"1":{"name":"constructor","line":12,"loc":{"start":{"line":12,"column":4},"end":{"line":14,"column":4}}},"2":{"name":"mint","line":16,"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":4}}}},"statementMap":{"1":{"start":{"line":13,"column":8},"end":{"line":13,"column":34}},"2":{"start":{"line":17,"column":8},"end":{"line":17,"column":51}},"3":{"start":{"line":18,"column":8},"end":{"line":18,"column":34}},"4":{"start":{"line":19,"column":8},"end":{"line":19,"column":29}}},"branchMap":{}}} diff --git a/members/missop/task5/contracts/coverage/index.html b/members/missop/task5/contracts/coverage/index.html new file mode 100644 index 000000000..b60902532 --- /dev/null +++ b/members/missop/task5/contracts/coverage/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ / +

+
+
+ 20% + Statements + 6/30 +
+
+ 0% + Branches + 0/16 +
+
+ 55.56% + Functions + 5/9 +
+
+ 16.28% + Lines + 7/43 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contracts/
20%6/300%0/1655.56%5/916.28%7/43
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/base.css b/members/missop/task5/contracts/coverage/lcov-report/base.css new file mode 100644 index 000000000..29737bcb0 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/base.css @@ -0,0 +1,213 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.medium .chart { border:1px solid #f9cd0b; } +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } +/* light gray */ +span.cline-neutral { background: #eaeaea; } + +.cbranch-no { background: yellow !important; color: #111; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/members/missop/task5/contracts/coverage/lcov-report/contracts/MissopToken.sol.html b/members/missop/task5/contracts/coverage/lcov-report/contracts/MissopToken.sol.html new file mode 100644 index 000000000..2c6324d52 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/contracts/MissopToken.sol.html @@ -0,0 +1,107 @@ + + + + Code coverage report for contracts/MissopToken.sol + + + + + + + +
+
+

+ all files / contracts/ MissopToken.sol +

+
+
+ 100% + Statements + 2/2 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 2/2 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15  +  +  +  +  +  +  +  + +  +  +  + +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+ 
+import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
+ 
+contract MissopToken is ERC20{
+    constructor() ERC20("MissopToken","MT") {
+        // 初始化给合约 mint 这么多 token
+        _mint(msg.sender, 10000000000*10**6);
+    }
+ 
+    function decimals()public  view  virtual  override  returns (uint8) {
+        return  6;
+    }
+}
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/contracts/NftMarket.sol.html b/members/missop/task5/contracts/coverage/lcov-report/contracts/NftMarket.sol.html new file mode 100644 index 000000000..9a6b43702 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/contracts/NftMarket.sol.html @@ -0,0 +1,533 @@ + + + + Code coverage report for contracts/NftMarket.sol + + + + + + + +
+
+

+ all files / contracts/ NftMarket.sol +

+
+
+ 0% + Statements + 0/24 +
+
+ 0% + Branches + 0/16 +
+
+ 20% + Functions + 1/5 +
+
+ 2.7% + Lines + 1/37 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+ 
+import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
+import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
+import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; // 防止双花攻击
+import "hardhat/console.sol";
+ 
+error NftMarket__NotOwnerOf(string message);
+error NftMarket__NotApproved(string message);
+error NftMarket__NotActive(string message);
+error NftMarket__PaymentFailed(string message);
+error NftMarket__NotExist(string message);
+error NftMarket__IsListed(string message);
+ 
+contract NftMarket is ReentrancyGuard {
+    struct Listing {
+        address seller;
+        address nftContract;
+        uint256 tokenId;
+        uint256 price;
+        uint256 listTime;
+        string cid;
+        bool isActive;
+    }
+ 
+    mapping(address => mapping(uint256 => Listing)) public s_listings;
+    uint256[] private s_tokenIds;
+    // Listing[] private s_listArr;
+    IERC20 public immutable i_paymentToken;
+ 
+    // 上架 nft 事件
+    event NftListed(
+        address indexed seller,
+        uint256 indexed tokenId,
+        address indexed nftContract,
+        uint256 price
+    );
+ 
+    // nft购买事件
+    event NftPurchased(
+        address indexed buyer,
+        uint256 indexed tokenId,
+        address indexed nftContract,
+        uint256 price
+    );
+ 
+    event NftUnlisted(
+        address indexed seller,
+        uint256 indexed tokenId,
+        address indexed nftContract
+    );
+ 
+    constructor(address _paymentToken) {
+        i_paymentToken = IERC20(_paymentToken);
+    }
+ 
+    function listNft(
+        address _nftContract,
+        uint256 tokenId,
+        uint256 price,
+        string memory cid
+    ) external {
+        IERC721 nft = IERC721(_nftContract);
+        if (nft.ownerOf(tokenId) != msg.sender) {
+            revert NftMarket__NotOwnerOf("not the owner of the NFT");
+        }
+        if (!nft.isApprovedForAll(msg.sender, address(this))) {
+            revert NftMarket__NotApproved("not approved");
+        }
+        if (s_listings[_nftContract][tokenId].isActive) {
+            revert NftMarket__IsListed("NFT already listed");
+        }
+        uint256 listTime = block.timestamp;
+        Listing memory item = Listing(
+            msg.sender,
+            _nftContract,
+            tokenId,
+            price,
+            listTime,
+            cid,
+            true
+        );
+        s_listings[_nftContract][tokenId] = item;
+        s_tokenIds.push(tokenId);
+        // s_listArr.push(item);
+ 
+        emit NftListed(msg.sender, tokenId, _nftContract, price);
+    }
+ 
+    function unlistNft(address _nftContract, uint256 _tokenId) external {
+        Listing memory item = s_listings[_nftContract][_tokenId];
+        if (!item.isActive) {
+            revert NftMarket__NotActive("not active");
+        }
+        IERC721 nft = IERC721(_nftContract);
+        if (nft.ownerOf(_tokenId) != msg.sender) {
+            revert NftMarket__NotOwnerOf("not the owner of the NFT");
+        }
+        if (!nft.isApprovedForAll(msg.sender, address(this))) {
+            revert NftMarket__NotApproved("not approved");
+        }
+        item.isActive = false;
+        emit NftUnlisted(msg.sender, _tokenId, _nftContract);
+    }
+ 
+    function buyNft(address _nftContract, uint256 _tokenId) external {
+        Listing memory listing = s_listings[_nftContract][_tokenId];
+        if (!listing.isActive) {
+            revert NftMarket__NotActive("NFT not active");
+        }
+        IERC721 nft = IERC721(_nftContract);
+        // 将购买人身上的钱转给售卖人
+        if (
+            !i_paymentToken.transferFrom(
+                msg.sender,
+                listing.seller,
+                listing.price
+            )
+        ) {
+            revert NftMarket__PaymentFailed("payment failed");
+        }
+        nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);
+        listing.isActive = false;
+        emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);
+    }
+ 
+    /**
+     *
+     * @dev 从 s_listings 中获取上架的 NFT
+     */
+    function getListsArray(
+        address _nftContract
+    ) public view returns (Listing[] memory) {
+        Listing[] memory listings = new Listing[](s_tokenIds.length);
+        for (uint256 i = 0; i < s_tokenIds.length; i++) {
+            Listing memory item = s_listings[_nftContract][s_tokenIds[i]];
+            listings[i] = item;
+        }
+        return listings;
+    }
+ 
+    /**
+     * @dev 从数组中获取,对比两者差异
+     */
+    // function getList(
+    //     address _nftContract
+    // ) external view returns (Listing[] memory) {
+    //     for (uint256 i = 0; i < s_listArr.length; i++) {
+    //         Listing memory item = s_listArr[i];
+    //         Listing memory listingItem = s_listings[_nftContract][item.tokenId];
+    //         item.isActive = listingItem.isActive;
+    //     }
+    //     return s_listArr;
+    // }
+}
+ 
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/contracts/NftToken.sol.html b/members/missop/task5/contracts/coverage/lcov-report/contracts/NftToken.sol.html new file mode 100644 index 000000000..827091069 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/contracts/NftToken.sol.html @@ -0,0 +1,128 @@ + + + + Code coverage report for contracts/NftToken.sol + + + + + + + +
+
+

+ all files / contracts/ NftToken.sol +

+
+
+ 100% + Statements + 4/4 +
+
+ 100% + Branches + 0/0 +
+
+ 100% + Functions + 2/2 +
+
+ 100% + Lines + 4/4 +
+
+
+
+

+
+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  + +  +  +  + + + +  +  + 
// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.20;
+ 
+import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
+import "@openzeppelin/contracts/utils/Counters.sol";
+ 
+contract NftToken is ERC721 {
+    using Counters for Counters.Counter;
+    Counters.Counter private _tokenIdCounter;
+ 
+    // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量
+    constructor() ERC721("NftToken", "NT") {
+        _tokenIdCounter.increment();
+    }
+ 
+    function mint(address to) public {
+        uint256 tokenId = _tokenIdCounter.current();
+        _tokenIdCounter.increment();
+        _safeMint(to, tokenId);
+    }
+}
+ 
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/contracts/index.html b/members/missop/task5/contracts/coverage/lcov-report/contracts/index.html new file mode 100644 index 000000000..00aea35e1 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/contracts/index.html @@ -0,0 +1,119 @@ + + + + Code coverage report for contracts/ + + + + + + + +
+
+

+ all files contracts/ +

+
+
+ 20% + Statements + 6/30 +
+
+ 0% + Branches + 0/16 +
+
+ 55.56% + Functions + 5/9 +
+
+ 16.28% + Lines + 7/43 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MissopToken.sol
100%2/2100%0/0100%2/2100%2/2
NftMarket.sol
0%0/240%0/1620%1/52.7%1/37
NftToken.sol
100%4/4100%0/0100%2/2100%4/4
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/index.html b/members/missop/task5/contracts/coverage/lcov-report/index.html new file mode 100644 index 000000000..b60902532 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/index.html @@ -0,0 +1,93 @@ + + + + Code coverage report for All files + + + + + + + +
+
+

+ / +

+
+
+ 20% + Statements + 6/30 +
+
+ 0% + Branches + 0/16 +
+
+ 55.56% + Functions + 5/9 +
+
+ 16.28% + Lines + 7/43 +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
contracts/
20%6/300%0/1655.56%5/916.28%7/43
+
+
+ + + + + + + diff --git a/members/missop/task5/contracts/coverage/lcov-report/prettify.css b/members/missop/task5/contracts/coverage/lcov-report/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/members/missop/task5/contracts/coverage/lcov-report/prettify.js b/members/missop/task5/contracts/coverage/lcov-report/prettify.js new file mode 100644 index 000000000..ef51e0386 --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov-report/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/members/missop/task5/contracts/coverage/lcov-report/sort-arrow-sprite.png b/members/missop/task5/contracts/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/members/missop/task5/contracts/coverage/lcov.info b/members/missop/task5/contracts/coverage/lcov.info new file mode 100644 index 000000000..8ed7aff6f --- /dev/null +++ b/members/missop/task5/contracts/coverage/lcov.info @@ -0,0 +1,104 @@ +TN: +SF:/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/MissopToken.sol +FN:7,constructor +FN:12,decimals +FNF:2 +FNH:2 +FNDA:6,constructor +FNDA:1,decimals +DA:9,6 +DA:13,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/NftMarket.sol +FN:54,constructor +FN:58,listNft +FN:91,unlistNft +FN:107,buyNft +FN:132,getListsArray +FNF:5 +FNH:1 +FNDA:3,constructor +FNDA:0,listNft +FNDA:0,unlistNft +FNDA:0,buyNft +FNDA:0,getListsArray +DA:55,3 +DA:64,0 +DA:65,0 +DA:66,0 +DA:68,0 +DA:69,0 +DA:71,0 +DA:72,0 +DA:74,0 +DA:75,0 +DA:84,0 +DA:85,0 +DA:88,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:100,0 +DA:101,0 +DA:103,0 +DA:104,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:112,0 +DA:114,0 +DA:121,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:140,0 +LF:37 +LH:1 +BRDA:65,1,0,0 +BRDA:65,1,1,0 +BRDA:68,2,0,0 +BRDA:68,2,1,0 +BRDA:71,3,0,0 +BRDA:71,3,1,0 +BRDA:93,4,0,0 +BRDA:93,4,1,0 +BRDA:97,5,0,0 +BRDA:97,5,1,0 +BRDA:100,6,0,0 +BRDA:100,6,1,0 +BRDA:109,7,0,0 +BRDA:109,7,1,0 +BRDA:114,8,0,0 +BRDA:114,8,1,0 +BRF:16 +BRH:0 +end_of_record +TN: +SF:/Users/zhuxiansheng/Documents/demo/Web3-Frontend-Bootcamp/members/missop/task5/contracts/contracts/NftToken.sol +FN:12,constructor +FN:16,mint +FNF:2 +FNH:2 +FNDA:3,constructor +FNDA:1,mint +DA:13,3 +DA:17,1 +DA:18,1 +DA:19,1 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record diff --git a/members/missop/task5/contracts/coverage/prettify.css b/members/missop/task5/contracts/coverage/prettify.css new file mode 100644 index 000000000..b317a7cda --- /dev/null +++ b/members/missop/task5/contracts/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/members/missop/task5/contracts/coverage/prettify.js b/members/missop/task5/contracts/coverage/prettify.js new file mode 100644 index 000000000..ef51e0386 --- /dev/null +++ b/members/missop/task5/contracts/coverage/prettify.js @@ -0,0 +1 @@ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/members/missop/task5/contracts/coverage/sort-arrow-sprite.png b/members/missop/task5/contracts/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..03f704a609c6fd0dbfdac63466a7d7c958b5cbf3 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function (a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function (a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function () { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i =0 ; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function () { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(cols); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/members/missop/task5/contracts/deploy/deploy-missopToken.js b/members/missop/task5/contracts/deploy/deploy-missopToken.js new file mode 100644 index 000000000..dad3ae00c --- /dev/null +++ b/members/missop/task5/contracts/deploy/deploy-missopToken.js @@ -0,0 +1,11 @@ +module.exports = async ({ getNamedAccounts, deployments }) => { + const { deploy } = deployments; + const { deployer } = await getNamedAccounts(); + await deploy("MissopToken", { + from: deployer, + log: true, + waitConfirmations: 1, + }); +}; + +module.exports.tags = ["MissopToken"]; diff --git a/members/missop/task5/contracts/deployments/localhost/MissopToken.json b/members/missop/task5/contracts/deployments/localhost/MissopToken.json index e39e7311a..582a365ec 100644 --- a/members/missop/task5/contracts/deployments/localhost/MissopToken.json +++ b/members/missop/task5/contracts/deployments/localhost/MissopToken.json @@ -285,7 +285,7 @@ "transactionIndex": 0, "gasUsed": "1169429", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xd7d507a2e71f657817f41429b14cb817c0eaf261e6781f120ca9fa1b4c6b7853", + "blockHash": "0x5ae2d6bd21646622356687b8ddc9bf1cafbe34257e578b0f4550ea36738aed3d", "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", "logs": [ { @@ -300,7 +300,7 @@ ], "data": "0x000000000000000000000000000000000000000000000000002386f26fc10000", "logIndex": 0, - "blockHash": "0xd7d507a2e71f657817f41429b14cb817c0eaf261e6781f120ca9fa1b4c6b7853" + "blockHash": "0x5ae2d6bd21646622356687b8ddc9bf1cafbe34257e578b0f4550ea36738aed3d" } ], "blockNumber": 1, diff --git a/members/missop/task5/contracts/deployments/localhost/NftMarket.json b/members/missop/task5/contracts/deployments/localhost/NftMarket.json index 41ee66941..da48ee0db 100644 --- a/members/missop/task5/contracts/deployments/localhost/NftMarket.json +++ b/members/missop/task5/contracts/deployments/localhost/NftMarket.json @@ -180,7 +180,7 @@ "type": "address" } ], - "name": "getList", + "name": "getListsArray", "outputs": [ { "components": [ @@ -204,51 +204,15 @@ "name": "price", "type": "uint256" }, - { - "internalType": "bool", - "name": "isActive", - "type": "bool" - } - ], - "internalType": "struct NftMarket.Listing[]", - "name": "", - "type": "tuple[]" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "_nftContract", - "type": "address" - } - ], - "name": "getListsArray", - "outputs": [ - { - "components": [ - { - "internalType": "address", - "name": "seller", - "type": "address" - }, - { - "internalType": "address", - "name": "nftContract", - "type": "address" - }, { "internalType": "uint256", - "name": "tokenId", + "name": "listTime", "type": "uint256" }, { - "internalType": "uint256", - "name": "price", - "type": "uint256" + "internalType": "string", + "name": "cid", + "type": "string" }, { "internalType": "bool", @@ -293,6 +257,11 @@ "internalType": "uint256", "name": "price", "type": "uint256" + }, + { + "internalType": "string", + "name": "cid", + "type": "string" } ], "name": "listNft", @@ -335,6 +304,16 @@ "name": "price", "type": "uint256" }, + { + "internalType": "uint256", + "name": "listTime", + "type": "uint256" + }, + { + "internalType": "string", + "name": "cid", + "type": "string" + }, { "internalType": "bool", "name": "isActive", @@ -363,19 +342,19 @@ "type": "function" } ], - "transactionHash": "0x423d3b4d91455af71b8350d2b267979c33d0603d0b8e0efaf02c0131e731363d", + "transactionHash": "0x0cfa0c34cc329d8afdd8a75349d72995fd42d14c83922d9c32290e1a456035f1", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "transactionIndex": 0, - "gasUsed": "1680549", + "gasUsed": "1845344", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x72d09177fa1021c8d53c4fd9e0179852fb0dc24f4759491dfb61579e5a843d73", - "transactionHash": "0x423d3b4d91455af71b8350d2b267979c33d0603d0b8e0efaf02c0131e731363d", + "blockHash": "0x6b356a62a6312b3520248f6dbb247286a1e003b14c7d9fd315fd8257344fb6ec", + "transactionHash": "0x0cfa0c34cc329d8afdd8a75349d72995fd42d14c83922d9c32290e1a456035f1", "logs": [], "blockNumber": 2, - "cumulativeGasUsed": "1680549", + "cumulativeGasUsed": "1845344", "status": 1, "byzantium": true }, @@ -383,16 +362,13 @@ "0x5FbDB2315678afecb367f032d93F642f64180aa3" ], "numDeployments": 1, - "solcInputHash": "f3ccb1b89e4cf68339a84fd309cc4f67", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__IsListed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"}],\"name\":\"NftUnlisted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getList\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"unlistNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getList(address)\":{\"details\":\"\\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\"},\"getListsArray(address)\":{\"details\":\"\\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\nerror NftMarket__NotExist(string message);\\nerror NftMarket__IsListed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n uint256[] private s_tokenIds;\\n Listing[] private s_listArr;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n event NftUnlisted(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n if (s_listings[_nftContract][tokenId].isActive) {\\n revert NftMarket__IsListed(\\\"NFT already listed\\\");\\n }\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_tokenIds.push(tokenId);\\n s_listArr.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function unlistNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory item = s_listings[_nftContract][_tokenId];\\n if (!item.isActive) {\\n revert NftMarket__NotActive(\\\"not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(_tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n item.isActive = false;\\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n /**\\n *\\n * @dev \\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\\n */\\n function getListsArray(\\n address _nftContract\\n ) public view returns (Listing[] memory) {\\n Listing[] memory listings = new Listing[](s_tokenIds.length);\\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\\n listings[i] = item;\\n }\\n return listings;\\n }\\n\\n /**\\n * @dev \\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\\n */\\n function getList(\\n address _nftContract\\n ) external view returns (Listing[] memory) {\\n for (uint256 i = 0; i < s_listArr.length; i++) {\\n Listing memory item = s_listArr[i];\\n Listing memory listingItem = s_listings[_nftContract][item.tokenId];\\n item.isActive = listingItem.isActive;\\n }\\n return s_listArr;\\n }\\n}\\n\",\"keccak256\":\"0x29f291dfb0bb1cfa7dcae49f53a9683b5d68102a121018d3c356eff8758ac872\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n}\\n\",\"keccak256\":\"0xf2560b5386574153057104d19a9e68a32ee912cf23c0c8df1fe9a0607f42d543\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001e4838038062001e488339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b608051611d0f620001396000396000818161051101526110510152611d0f6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0b5a2ee1161005b578063a0b5a2ee146100ea578063c922b17c1461011e578063cd2ae9561461013a578063ef00e37a146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906114f3565b610188565b6040516100a9919061167a565b60405180910390f35b6100cc60048036038101906100c791906116c8565b61038c565b005b6100e860048036038101906100e391906116c8565b6106ea565b005b61010460048036038101906100ff91906116c8565b610a81565b604051610115959493929190611735565b60405180910390f35b61013860048036038101906101339190611788565b610b11565b005b61014261104f565b60405161014f919061183a565b60405180910390f35b610172600480360381019061016d91906114f3565b611073565b60405161017f919061167a565b60405180910390f35b6060600060028054905067ffffffffffffffff8111156101ab576101aa611855565b5b6040519080825280602002602001820160405280156101e457816020015b6101d1611433565b8152602001906001900390816101c95790505b50905060005b600280549050811015610382576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061024e5761024d611884565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061036357610362611884565b5b602002602001018190525050808061037a906118e2565b9150506101ea565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015161050a576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161050190611987565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b8152600401610574939291906119a7565b6020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611a0a565b6105f6576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105ed90611a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b8152600401610637939291906119a7565b600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106dc9190611aa3565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610868576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161085f90611b0a565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108bd9190611aa3565b602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610954576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161094b90611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161098f929190611bd8565b602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190611a0a565b610a0f576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610a0690611c4d565b60405180910390fd5b60008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610b669190611aa3565b602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610bf490611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610c38929190611bd8565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190611a0a565b610cb8576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610caf90611c4d565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610d59576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610d5090611cb9565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516110409190611aa3565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b6003805490508110156112f85760006003828154811061109b5761109a611884565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151826080019015159081151581525050505080806112f0906118e2565b915050611078565b506003805480602002602001604051908101604052809291908181526020016000905b8282101561142857838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250508152602001906001019061131b565b505050509050919050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114c082611495565b9050919050565b6114d0816114b5565b81146114db57600080fd5b50565b6000813590506114ed816114c7565b92915050565b60006020828403121561150957611508611490565b5b6000611517848285016114de565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611555816114b5565b82525050565b6000819050919050565b61156e8161155b565b82525050565b60008115159050919050565b61158981611574565b82525050565b60a0820160008201516115a5600085018261154c565b5060208201516115b8602085018261154c565b5060408201516115cb6040850182611565565b5060608201516115de6060850182611565565b5060808201516115f16080850182611580565b50505050565b6000611603838361158f565b60a08301905092915050565b6000602082019050919050565b600061162782611520565b611631818561152b565b935061163c8361153c565b8060005b8381101561166d57815161165488826115f7565b975061165f8361160f565b925050600181019050611640565b5085935050505092915050565b60006020820190508181036000830152611694818461161c565b905092915050565b6116a58161155b565b81146116b057600080fd5b50565b6000813590506116c28161169c565b92915050565b600080604083850312156116df576116de611490565b5b60006116ed858286016114de565b92505060206116fe858286016116b3565b9150509250929050565b611711816114b5565b82525050565b6117208161155b565b82525050565b61172f81611574565b82525050565b600060a08201905061174a6000830188611708565b6117576020830187611708565b6117646040830186611717565b6117716060830185611717565b61177e6080830184611726565b9695505050505050565b6000806000606084860312156117a1576117a0611490565b5b60006117af868287016114de565b93505060206117c0868287016116b3565b92505060406117d1868287016116b3565b9150509250925092565b6000819050919050565b60006118006117fb6117f684611495565b6117db565b611495565b9050919050565b6000611812826117e5565b9050919050565b600061182482611807565b9050919050565b61183481611819565b82525050565b600060208201905061184f600083018461182b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118ed8261155b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361191f5761191e6118b3565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611971600e8361192a565b915061197c8261193b565b602082019050919050565b600060208201905081810360008301526119a081611964565b9050919050565b60006060820190506119bc6000830186611708565b6119c96020830185611708565b6119d66040830184611717565b949350505050565b6119e781611574565b81146119f257600080fd5b50565b600081519050611a04816119de565b92915050565b600060208284031215611a2057611a1f611490565b5b6000611a2e848285016119f5565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611a6d600e8361192a565b9150611a7882611a37565b602082019050919050565b60006020820190508181036000830152611a9c81611a60565b9050919050565b6000602082019050611ab86000830184611717565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611af4600a8361192a565b9150611aff82611abe565b602082019050919050565b60006020820190508181036000830152611b2381611ae7565b9050919050565b600081519050611b39816114c7565b92915050565b600060208284031215611b5557611b54611490565b5b6000611b6384828501611b2a565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611ba260188361192a565b9150611bad82611b6c565b602082019050919050565b60006020820190508181036000830152611bd181611b95565b9050919050565b6000604082019050611bed6000830185611708565b611bfa6020830184611708565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611c37600c8361192a565b9150611c4282611c01565b602082019050919050565b60006020820190508181036000830152611c6681611c2a565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611ca360128361192a565b9150611cae82611c6d565b602082019050919050565b60006020820190508181036000830152611cd281611c96565b905091905056fea26469706673582212203284377f1419a0c20c3ed0274fd0fcdae3e823ce9346edcde948ad45eeb8683764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0b5a2ee1161005b578063a0b5a2ee146100ea578063c922b17c1461011e578063cd2ae9561461013a578063ef00e37a146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906114f3565b610188565b6040516100a9919061167a565b60405180910390f35b6100cc60048036038101906100c791906116c8565b61038c565b005b6100e860048036038101906100e391906116c8565b6106ea565b005b61010460048036038101906100ff91906116c8565b610a81565b604051610115959493929190611735565b60405180910390f35b61013860048036038101906101339190611788565b610b11565b005b61014261104f565b60405161014f919061183a565b60405180910390f35b610172600480360381019061016d91906114f3565b611073565b60405161017f919061167a565b60405180910390f35b6060600060028054905067ffffffffffffffff8111156101ab576101aa611855565b5b6040519080825280602002602001820160405280156101e457816020015b6101d1611433565b8152602001906001900390816101c95790505b50905060005b600280549050811015610382576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061024e5761024d611884565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061036357610362611884565b5b602002602001018190525050808061037a906118e2565b9150506101ea565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015161050a576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161050190611987565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b8152600401610574939291906119a7565b6020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611a0a565b6105f6576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105ed90611a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b8152600401610637939291906119a7565b600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106dc9190611aa3565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610868576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161085f90611b0a565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108bd9190611aa3565b602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610954576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161094b90611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161098f929190611bd8565b602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190611a0a565b610a0f576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610a0690611c4d565b60405180910390fd5b60008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610b669190611aa3565b602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610bf490611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610c38929190611bd8565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190611a0a565b610cb8576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610caf90611c4d565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610d59576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610d5090611cb9565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516110409190611aa3565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b6003805490508110156112f85760006003828154811061109b5761109a611884565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151826080019015159081151581525050505080806112f0906118e2565b915050611078565b506003805480602002602001604051908101604052809291908181526020016000905b8282101561142857838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250508152602001906001019061131b565b505050509050919050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114c082611495565b9050919050565b6114d0816114b5565b81146114db57600080fd5b50565b6000813590506114ed816114c7565b92915050565b60006020828403121561150957611508611490565b5b6000611517848285016114de565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611555816114b5565b82525050565b6000819050919050565b61156e8161155b565b82525050565b60008115159050919050565b61158981611574565b82525050565b60a0820160008201516115a5600085018261154c565b5060208201516115b8602085018261154c565b5060408201516115cb6040850182611565565b5060608201516115de6060850182611565565b5060808201516115f16080850182611580565b50505050565b6000611603838361158f565b60a08301905092915050565b6000602082019050919050565b600061162782611520565b611631818561152b565b935061163c8361153c565b8060005b8381101561166d57815161165488826115f7565b975061165f8361160f565b925050600181019050611640565b5085935050505092915050565b60006020820190508181036000830152611694818461161c565b905092915050565b6116a58161155b565b81146116b057600080fd5b50565b6000813590506116c28161169c565b92915050565b600080604083850312156116df576116de611490565b5b60006116ed858286016114de565b92505060206116fe858286016116b3565b9150509250929050565b611711816114b5565b82525050565b6117208161155b565b82525050565b61172f81611574565b82525050565b600060a08201905061174a6000830188611708565b6117576020830187611708565b6117646040830186611717565b6117716060830185611717565b61177e6080830184611726565b9695505050505050565b6000806000606084860312156117a1576117a0611490565b5b60006117af868287016114de565b93505060206117c0868287016116b3565b92505060406117d1868287016116b3565b9150509250925092565b6000819050919050565b60006118006117fb6117f684611495565b6117db565b611495565b9050919050565b6000611812826117e5565b9050919050565b600061182482611807565b9050919050565b61183481611819565b82525050565b600060208201905061184f600083018461182b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118ed8261155b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361191f5761191e6118b3565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611971600e8361192a565b915061197c8261193b565b602082019050919050565b600060208201905081810360008301526119a081611964565b9050919050565b60006060820190506119bc6000830186611708565b6119c96020830185611708565b6119d66040830184611717565b949350505050565b6119e781611574565b81146119f257600080fd5b50565b600081519050611a04816119de565b92915050565b600060208284031215611a2057611a1f611490565b5b6000611a2e848285016119f5565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611a6d600e8361192a565b9150611a7882611a37565b602082019050919050565b60006020820190508181036000830152611a9c81611a60565b9050919050565b6000602082019050611ab86000830184611717565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611af4600a8361192a565b9150611aff82611abe565b602082019050919050565b60006020820190508181036000830152611b2381611ae7565b9050919050565b600081519050611b39816114c7565b92915050565b600060208284031215611b5557611b54611490565b5b6000611b6384828501611b2a565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611ba260188361192a565b9150611bad82611b6c565b602082019050919050565b60006020820190508181036000830152611bd181611b95565b9050919050565b6000604082019050611bed6000830185611708565b611bfa6020830184611708565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611c37600c8361192a565b9150611c4282611c01565b602082019050919050565b60006020820190508181036000830152611c6681611c2a565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611ca360128361192a565b9150611cae82611c6d565b602082019050919050565b60006020820190508181036000830152611cd281611c96565b905091905056fea26469706673582212203284377f1419a0c20c3ed0274fd0fcdae3e823ce9346edcde948ad45eeb8683764736f6c63430008140033", + "solcInputHash": "4ab649e2e835b6ae1cbf37c773bdacba", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__IsListed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"}],\"name\":\"NftUnlisted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"listTime\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"cid\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"cid\",\"type\":\"string\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"listTime\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"cid\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"unlistNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getListsArray(address)\":{\"details\":\"\\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\nerror NftMarket__NotExist(string message);\\nerror NftMarket__IsListed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n uint256 listTime;\\n string cid;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n uint256[] private s_tokenIds;\\n // Listing[] private s_listArr;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n event NftUnlisted(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price,\\n string memory cid\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n if (s_listings[_nftContract][tokenId].isActive) {\\n revert NftMarket__IsListed(\\\"NFT already listed\\\");\\n }\\n uint256 listTime = block.timestamp;\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n listTime,\\n cid,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_tokenIds.push(tokenId);\\n // s_listArr.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function unlistNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory item = s_listings[_nftContract][_tokenId];\\n if (!item.isActive) {\\n revert NftMarket__NotActive(\\\"not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(_tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n item.isActive = false;\\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n /**\\n *\\n * @dev \\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\\n */\\n function getListsArray(\\n address _nftContract\\n ) public view returns (Listing[] memory) {\\n Listing[] memory listings = new Listing[](s_tokenIds.length);\\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\\n listings[i] = item;\\n }\\n return listings;\\n }\\n\\n /**\\n * @dev \\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\\n */\\n // function getList(\\n // address _nftContract\\n // ) external view returns (Listing[] memory) {\\n // for (uint256 i = 0; i < s_listArr.length; i++) {\\n // Listing memory item = s_listArr[i];\\n // Listing memory listingItem = s_listings[_nftContract][item.tokenId];\\n // item.isActive = listingItem.isActive;\\n // }\\n // return s_listArr;\\n // }\\n}\\n\",\"keccak256\":\"0xaa0f7386e057b41c5695f34c1fb4ec663120cbac1d5d7afd690956edae4d58e0\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n}\\n\",\"keccak256\":\"0xf2560b5386574153057104d19a9e68a32ee912cf23c0c8df1fe9a0607f42d543\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162002144380380620021448339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b60805161200b620001396000396000818161060001526111b3015261200b6000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80632ad26116146100675780634ddf4f8f1461009757806354e6448e146100b3578063578ed67f146100cf578063a0b5a2ee146100eb578063cd2ae95614610121575b600080fd5b610081600480360381019061007c91906112b2565b61013f565b60405161008e9190611510565b60405180910390f35b6100b160048036038101906100ac919061155e565b6103df565b005b6100cd60048036038101906100c8919061155e565b6107d9565b005b6100e960048036038101906100e491906116d3565b610c0c565b005b6101056004803603810190610100919061155e565b61108d565b60405161011897969594939291906117cd565b60405180910390f35b6101296111b1565b60405161013691906118a2565b60405180910390f35b6060600060028054905067ffffffffffffffff811115610162576101616115a8565b5b60405190808252806020026020018201604052801561019b57816020015b6101886111d5565b8152602001906001900390816101805790505b50905060005b6002805490508110156103d5576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060028481548110610205576102046118bd565b5b906000526020600020015481526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546103039061191b565b80601f016020809104026020016040519081016040528092919081815260200182805461032f9061191b565b801561037c5780601f106103515761010080835404028352916020019161037c565b820191906000526020600020905b81548152906001019060200180831161035f57829003601f168201915b505050505081526020016006820160009054906101000a900460ff1615151515815250509050808383815181106103b6576103b56118bd565b5b60200260200101819052505080806103cd9061197b565b9150506101a1565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546105169061191b565b80601f01602080910402602001604051908101604052809291908181526020018280546105429061191b565b801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b505050505081526020016006820160009054906101000a900460ff16151515158152505090508060c001516105f9576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016105f090611a0f565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b815260040161066393929190611a2f565b6020604051808303816000875af1158015610682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a69190611a92565b6106e5576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016106dc90611b0b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b815260040161072693929190611a2f565b600060405180830381600087803b15801561074057600080fd5b505af1158015610754573d6000803e3d6000fd5b5050505060008260c00190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516107cb9190611b2b565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546109109061191b565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061191b565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b505050505081526020016006820160009054906101000a900460ff16151515158152505090508060c001516109f3576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016109ea90611b92565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610a489190611b2b565b602060405180830381865afa158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a899190611bc7565b73ffffffffffffffffffffffffffffffffffffffff1614610adf576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610ad690611c40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610b1a929190611c60565b602060405180830381865afa158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b9190611a92565b610b9a576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610b9190611cd5565b60405180910390fd5b60008260c00190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60008490503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610c619190611b2b565b602060405180830381865afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190611bc7565b73ffffffffffffffffffffffffffffffffffffffff1614610cf8576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610cef90611c40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610d33929190611c60565b602060405180830381865afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190611a92565b610db3576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610daa90611cd5565b60405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060060160009054906101000a900460ff1615610e54576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610e4b90611d41565b60405180910390fd5b600042905060006040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186815260200183815260200185815260200160011515815250905080600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005019081610fd19190611f03565b5060c08201518160060160006101000a81548160ff02191690831515021790555090505060028690806001815401808255809150506001900390600052602060002001600090919091909150558673ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc268860405161107c9190611b2b565b60405180910390a450505050505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600301549080600401549080600501805461111b9061191b565b80601f01602080910402602001604051908101604052809291908181526020018280546111479061191b565b80156111945780601f1061116957610100808354040283529160200191611194565b820191906000526020600020905b81548152906001019060200180831161117757829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061127f82611254565b9050919050565b61128f81611274565b811461129a57600080fd5b50565b6000813590506112ac81611286565b92915050565b6000602082840312156112c8576112c761124a565b5b60006112d68482850161129d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131481611274565b82525050565b6000819050919050565b61132d8161131a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561136d578082015181840152602081019050611352565b60008484015250505050565b6000601f19601f8301169050919050565b600061139582611333565b61139f818561133e565b93506113af81856020860161134f565b6113b881611379565b840191505092915050565b60008115159050919050565b6113d8816113c3565b82525050565b600060e0830160008301516113f6600086018261130b565b506020830151611409602086018261130b565b50604083015161141c6040860182611324565b50606083015161142f6060860182611324565b5060808301516114426080860182611324565b5060a083015184820360a086015261145a828261138a565b91505060c083015161146f60c08601826113cf565b508091505092915050565b600061148683836113de565b905092915050565b6000602082019050919050565b60006114a6826112df565b6114b081856112ea565b9350836020820285016114c2856112fb565b8060005b858110156114fe57848403895281516114df858261147a565b94506114ea8361148e565b925060208a019950506001810190506114c6565b50829750879550505050505092915050565b6000602082019050818103600083015261152a818461149b565b905092915050565b61153b8161131a565b811461154657600080fd5b50565b60008135905061155881611532565b92915050565b600080604083850312156115755761157461124a565b5b60006115838582860161129d565b925050602061159485828601611549565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115e082611379565b810181811067ffffffffffffffff821117156115ff576115fe6115a8565b5b80604052505050565b6000611612611240565b905061161e82826115d7565b919050565b600067ffffffffffffffff82111561163e5761163d6115a8565b5b61164782611379565b9050602081019050919050565b82818337600083830152505050565b600061167661167184611623565b611608565b905082815260208101848484011115611692576116916115a3565b5b61169d848285611654565b509392505050565b600082601f8301126116ba576116b961159e565b5b81356116ca848260208601611663565b91505092915050565b600080600080608085870312156116ed576116ec61124a565b5b60006116fb8782880161129d565b945050602061170c87828801611549565b935050604061171d87828801611549565b925050606085013567ffffffffffffffff81111561173e5761173d61124f565b5b61174a878288016116a5565b91505092959194509250565b61175f81611274565b82525050565b61176e8161131a565b82525050565b600082825260208201905092915050565b600061179082611333565b61179a8185611774565b93506117aa81856020860161134f565b6117b381611379565b840191505092915050565b6117c7816113c3565b82525050565b600060e0820190506117e2600083018a611756565b6117ef6020830189611756565b6117fc6040830188611765565b6118096060830187611765565b6118166080830186611765565b81810360a08301526118288185611785565b905061183760c08301846117be565b98975050505050505050565b6000819050919050565b600061186861186361185e84611254565b611843565b611254565b9050919050565b600061187a8261184d565b9050919050565b600061188c8261186f565b9050919050565b61189c81611881565b82525050565b60006020820190506118b76000830184611893565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061193357607f821691505b602082108103611946576119456118ec565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119868261131a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036119b8576119b761194c565b5b600182019050919050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b60006119f9600e83611774565b9150611a04826119c3565b602082019050919050565b60006020820190508181036000830152611a28816119ec565b9050919050565b6000606082019050611a446000830186611756565b611a516020830185611756565b611a5e6040830184611765565b949350505050565b611a6f816113c3565b8114611a7a57600080fd5b50565b600081519050611a8c81611a66565b92915050565b600060208284031215611aa857611aa761124a565b5b6000611ab684828501611a7d565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611af5600e83611774565b9150611b0082611abf565b602082019050919050565b60006020820190508181036000830152611b2481611ae8565b9050919050565b6000602082019050611b406000830184611765565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611b7c600a83611774565b9150611b8782611b46565b602082019050919050565b60006020820190508181036000830152611bab81611b6f565b9050919050565b600081519050611bc181611286565b92915050565b600060208284031215611bdd57611bdc61124a565b5b6000611beb84828501611bb2565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611c2a601883611774565b9150611c3582611bf4565b602082019050919050565b60006020820190508181036000830152611c5981611c1d565b9050919050565b6000604082019050611c756000830185611756565b611c826020830184611756565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611cbf600c83611774565b9150611cca82611c89565b602082019050919050565b60006020820190508181036000830152611cee81611cb2565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611d2b601283611774565b9150611d3682611cf5565b602082019050919050565b60006020820190508181036000830152611d5a81611d1e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611dc37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611d86565b611dcd8683611d86565b95508019841693508086168417925050509392505050565b6000611e00611dfb611df68461131a565b611843565b61131a565b9050919050565b6000819050919050565b611e1a83611de5565b611e2e611e2682611e07565b848454611d93565b825550505050565b600090565b611e43611e36565b611e4e818484611e11565b505050565b5b81811015611e7257611e67600082611e3b565b600181019050611e54565b5050565b601f821115611eb757611e8881611d61565b611e9184611d76565b81016020851015611ea0578190505b611eb4611eac85611d76565b830182611e53565b50505b505050565b600082821c905092915050565b6000611eda60001984600802611ebc565b1980831691505092915050565b6000611ef38383611ec9565b9150826002028217905092915050565b611f0c82611333565b67ffffffffffffffff811115611f2557611f246115a8565b5b611f2f825461191b565b611f3a828285611e76565b600060209050601f831160018114611f6d5760008415611f5b578287015190505b611f658582611ee7565b865550611fcd565b601f198416611f7b86611d61565b60005b82811015611fa357848901518255600182019150602085019450602081019050611f7e565b86831015611fc05784890151611fbc601f891682611ec9565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220f1fca9517fb685b7730655652fdb50647cfd56fa7fa055c17da29ae00532e05564736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c80632ad26116146100675780634ddf4f8f1461009757806354e6448e146100b3578063578ed67f146100cf578063a0b5a2ee146100eb578063cd2ae95614610121575b600080fd5b610081600480360381019061007c91906112b2565b61013f565b60405161008e9190611510565b60405180910390f35b6100b160048036038101906100ac919061155e565b6103df565b005b6100cd60048036038101906100c8919061155e565b6107d9565b005b6100e960048036038101906100e491906116d3565b610c0c565b005b6101056004803603810190610100919061155e565b61108d565b60405161011897969594939291906117cd565b60405180910390f35b6101296111b1565b60405161013691906118a2565b60405180910390f35b6060600060028054905067ffffffffffffffff811115610162576101616115a8565b5b60405190808252806020026020018201604052801561019b57816020015b6101886111d5565b8152602001906001900390816101805790505b50905060005b6002805490508110156103d5576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060028481548110610205576102046118bd565b5b906000526020600020015481526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546103039061191b565b80601f016020809104026020016040519081016040528092919081815260200182805461032f9061191b565b801561037c5780601f106103515761010080835404028352916020019161037c565b820191906000526020600020905b81548152906001019060200180831161035f57829003601f168201915b505050505081526020016006820160009054906101000a900460ff1615151515815250509050808383815181106103b6576103b56118bd565b5b60200260200101819052505080806103cd9061197b565b9150506101a1565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546105169061191b565b80601f01602080910402602001604051908101604052809291908181526020018280546105429061191b565b801561058f5780601f106105645761010080835404028352916020019161058f565b820191906000526020600020905b81548152906001019060200180831161057257829003601f168201915b505050505081526020016006820160009054906101000a900460ff16151515158152505090508060c001516105f9576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016105f090611a0f565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b815260040161066393929190611a2f565b6020604051808303816000875af1158015610682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a69190611a92565b6106e5576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016106dc90611b0b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b815260040161072693929190611a2f565b600060405180830381600087803b15801561074057600080fd5b505af1158015610754573d6000803e3d6000fd5b5050505060008260c00190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516107cb9190611b2b565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060e00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820154815260200160038201548152602001600482015481526020016005820180546109109061191b565b80601f016020809104026020016040519081016040528092919081815260200182805461093c9061191b565b80156109895780601f1061095e57610100808354040283529160200191610989565b820191906000526020600020905b81548152906001019060200180831161096c57829003601f168201915b505050505081526020016006820160009054906101000a900460ff16151515158152505090508060c001516109f3576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016109ea90611b92565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610a489190611b2b565b602060405180830381865afa158015610a65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a899190611bc7565b73ffffffffffffffffffffffffffffffffffffffff1614610adf576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610ad690611c40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610b1a929190611c60565b602060405180830381865afa158015610b37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5b9190611a92565b610b9a576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610b9190611cd5565b60405180910390fd5b60008260c00190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60008490503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e866040518263ffffffff1660e01b8152600401610c619190611b2b565b602060405180830381865afa158015610c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190611bc7565b73ffffffffffffffffffffffffffffffffffffffff1614610cf8576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610cef90611c40565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610d33929190611c60565b602060405180830381865afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190611a92565b610db3576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610daa90611cd5565b60405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060060160009054906101000a900460ff1615610e54576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610e4b90611d41565b60405180910390fd5b600042905060006040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815260200186815260200183815260200185815260200160011515815250905080600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005019081610fd19190611f03565b5060c08201518160060160006101000a81548160ff02191690831515021790555090505060028690806001815401808255809150506001900390600052602060002001600090919091909150558673ffffffffffffffffffffffffffffffffffffffff16863373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc268860405161107c9190611b2b565b60405180910390a450505050505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600301549080600401549080600501805461111b9061191b565b80601f01602080910402602001604051908101604052809291908181526020018280546111479061191b565b80156111945780601f1061116957610100808354040283529160200191611194565b820191906000526020600020905b81548152906001019060200180831161117757829003601f168201915b5050505050908060060160009054906101000a900460ff16905087565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060e00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001606081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061127f82611254565b9050919050565b61128f81611274565b811461129a57600080fd5b50565b6000813590506112ac81611286565b92915050565b6000602082840312156112c8576112c761124a565b5b60006112d68482850161129d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131481611274565b82525050565b6000819050919050565b61132d8161131a565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561136d578082015181840152602081019050611352565b60008484015250505050565b6000601f19601f8301169050919050565b600061139582611333565b61139f818561133e565b93506113af81856020860161134f565b6113b881611379565b840191505092915050565b60008115159050919050565b6113d8816113c3565b82525050565b600060e0830160008301516113f6600086018261130b565b506020830151611409602086018261130b565b50604083015161141c6040860182611324565b50606083015161142f6060860182611324565b5060808301516114426080860182611324565b5060a083015184820360a086015261145a828261138a565b91505060c083015161146f60c08601826113cf565b508091505092915050565b600061148683836113de565b905092915050565b6000602082019050919050565b60006114a6826112df565b6114b081856112ea565b9350836020820285016114c2856112fb565b8060005b858110156114fe57848403895281516114df858261147a565b94506114ea8361148e565b925060208a019950506001810190506114c6565b50829750879550505050505092915050565b6000602082019050818103600083015261152a818461149b565b905092915050565b61153b8161131a565b811461154657600080fd5b50565b60008135905061155881611532565b92915050565b600080604083850312156115755761157461124a565b5b60006115838582860161129d565b925050602061159485828601611549565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115e082611379565b810181811067ffffffffffffffff821117156115ff576115fe6115a8565b5b80604052505050565b6000611612611240565b905061161e82826115d7565b919050565b600067ffffffffffffffff82111561163e5761163d6115a8565b5b61164782611379565b9050602081019050919050565b82818337600083830152505050565b600061167661167184611623565b611608565b905082815260208101848484011115611692576116916115a3565b5b61169d848285611654565b509392505050565b600082601f8301126116ba576116b961159e565b5b81356116ca848260208601611663565b91505092915050565b600080600080608085870312156116ed576116ec61124a565b5b60006116fb8782880161129d565b945050602061170c87828801611549565b935050604061171d87828801611549565b925050606085013567ffffffffffffffff81111561173e5761173d61124f565b5b61174a878288016116a5565b91505092959194509250565b61175f81611274565b82525050565b61176e8161131a565b82525050565b600082825260208201905092915050565b600061179082611333565b61179a8185611774565b93506117aa81856020860161134f565b6117b381611379565b840191505092915050565b6117c7816113c3565b82525050565b600060e0820190506117e2600083018a611756565b6117ef6020830189611756565b6117fc6040830188611765565b6118096060830187611765565b6118166080830186611765565b81810360a08301526118288185611785565b905061183760c08301846117be565b98975050505050505050565b6000819050919050565b600061186861186361185e84611254565b611843565b611254565b9050919050565b600061187a8261184d565b9050919050565b600061188c8261186f565b9050919050565b61189c81611881565b82525050565b60006020820190506118b76000830184611893565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061193357607f821691505b602082108103611946576119456118ec565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119868261131a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036119b8576119b761194c565b5b600182019050919050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b60006119f9600e83611774565b9150611a04826119c3565b602082019050919050565b60006020820190508181036000830152611a28816119ec565b9050919050565b6000606082019050611a446000830186611756565b611a516020830185611756565b611a5e6040830184611765565b949350505050565b611a6f816113c3565b8114611a7a57600080fd5b50565b600081519050611a8c81611a66565b92915050565b600060208284031215611aa857611aa761124a565b5b6000611ab684828501611a7d565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611af5600e83611774565b9150611b0082611abf565b602082019050919050565b60006020820190508181036000830152611b2481611ae8565b9050919050565b6000602082019050611b406000830184611765565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611b7c600a83611774565b9150611b8782611b46565b602082019050919050565b60006020820190508181036000830152611bab81611b6f565b9050919050565b600081519050611bc181611286565b92915050565b600060208284031215611bdd57611bdc61124a565b5b6000611beb84828501611bb2565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611c2a601883611774565b9150611c3582611bf4565b602082019050919050565b60006020820190508181036000830152611c5981611c1d565b9050919050565b6000604082019050611c756000830185611756565b611c826020830184611756565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611cbf600c83611774565b9150611cca82611c89565b602082019050919050565b60006020820190508181036000830152611cee81611cb2565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611d2b601283611774565b9150611d3682611cf5565b602082019050919050565b60006020820190508181036000830152611d5a81611d1e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611dc37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611d86565b611dcd8683611d86565b95508019841693508086168417925050509392505050565b6000611e00611dfb611df68461131a565b611843565b61131a565b9050919050565b6000819050919050565b611e1a83611de5565b611e2e611e2682611e07565b848454611d93565b825550505050565b600090565b611e43611e36565b611e4e818484611e11565b505050565b5b81811015611e7257611e67600082611e3b565b600181019050611e54565b5050565b601f821115611eb757611e8881611d61565b611e9184611d76565b81016020851015611ea0578190505b611eb4611eac85611d76565b830182611e53565b50505b505050565b600082821c905092915050565b6000611eda60001984600802611ebc565b1980831691505092915050565b6000611ef38383611ec9565b9150826002028217905092915050565b611f0c82611333565b67ffffffffffffffff811115611f2557611f246115a8565b5b611f2f825461191b565b611f3a828285611e76565b600060209050601f831160018114611f6d5760008415611f5b578287015190505b611f658582611ee7565b865550611fcd565b601f198416611f7b86611d61565b60005b82811015611fa357848901518255600182019150602085019450602081019050611f7e565b86831015611fc05784890151611fbc601f891682611ec9565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220f1fca9517fb685b7730655652fdb50647cfd56fa7fa055c17da29ae00532e05564736f6c63430008140033", "devdoc": { "kind": "dev", "methods": { - "getList(address)": { - "details": "从数组中获取,对比两者差异" - }, "getListsArray(address)": { "details": "从 s_listings 中获取上架的 NFT" } @@ -415,28 +391,20 @@ "type": "t_uint256" }, { - "astId": 3595, + "astId": 2954, "contract": "contracts/NftMarket.sol:NftMarket", "label": "s_listings", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)3588_storage))" + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)2947_storage))" }, { - "astId": 3598, + "astId": 2957, "contract": "contracts/NftMarket.sol:NftMarket", "label": "s_tokenIds", "offset": 0, "slot": "2", "type": "t_array(t_uint256)dyn_storage" - }, - { - "astId": 3602, - "contract": "contracts/NftMarket.sol:NftMarket", - "label": "s_listArr", - "offset": 0, - "slot": "3", - "type": "t_array(t_struct(Listing)3588_storage)dyn_storage" } ], "types": { @@ -445,12 +413,6 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Listing)3588_storage)dyn_storage": { - "base": "t_struct(Listing)3588_storage", - "encoding": "dynamic_array", - "label": "struct NftMarket.Listing[]", - "numberOfBytes": "32" - }, "t_array(t_uint256)dyn_storage": { "base": "t_uint256", "encoding": "dynamic_array", @@ -462,26 +424,31 @@ "label": "bool", "numberOfBytes": "1" }, - "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)3588_storage))": { + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)2947_storage))": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => mapping(uint256 => struct NftMarket.Listing))", "numberOfBytes": "32", - "value": "t_mapping(t_uint256,t_struct(Listing)3588_storage)" + "value": "t_mapping(t_uint256,t_struct(Listing)2947_storage)" }, - "t_mapping(t_uint256,t_struct(Listing)3588_storage)": { + "t_mapping(t_uint256,t_struct(Listing)2947_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct NftMarket.Listing)", "numberOfBytes": "32", - "value": "t_struct(Listing)3588_storage" + "value": "t_struct(Listing)2947_storage" }, - "t_struct(Listing)3588_storage": { + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Listing)2947_storage": { "encoding": "inplace", "label": "struct NftMarket.Listing", "members": [ { - "astId": 3579, + "astId": 2934, "contract": "contracts/NftMarket.sol:NftMarket", "label": "seller", "offset": 0, @@ -489,7 +456,7 @@ "type": "t_address" }, { - "astId": 3581, + "astId": 2936, "contract": "contracts/NftMarket.sol:NftMarket", "label": "nftContract", "offset": 0, @@ -497,7 +464,7 @@ "type": "t_address" }, { - "astId": 3583, + "astId": 2938, "contract": "contracts/NftMarket.sol:NftMarket", "label": "tokenId", "offset": 0, @@ -505,7 +472,7 @@ "type": "t_uint256" }, { - "astId": 3585, + "astId": 2940, "contract": "contracts/NftMarket.sol:NftMarket", "label": "price", "offset": 0, @@ -513,15 +480,31 @@ "type": "t_uint256" }, { - "astId": 3587, + "astId": 2942, "contract": "contracts/NftMarket.sol:NftMarket", - "label": "isActive", + "label": "listTime", "offset": 0, "slot": "4", + "type": "t_uint256" + }, + { + "astId": 2944, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "cid", + "offset": 0, + "slot": "5", + "type": "t_string_storage" + }, + { + "astId": 2946, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "isActive", + "offset": 0, + "slot": "6", "type": "t_bool" } ], - "numberOfBytes": "160" + "numberOfBytes": "224" }, "t_uint256": { "encoding": "inplace", diff --git a/members/missop/task5/contracts/deployments/localhost/NftToken.json b/members/missop/task5/contracts/deployments/localhost/NftToken.json index 091cad543..08094331f 100644 --- a/members/missop/task5/contracts/deployments/localhost/NftToken.json +++ b/members/missop/task5/contracts/deployments/localhost/NftToken.json @@ -167,11 +167,6 @@ "internalType": "address", "name": "to", "type": "address" - }, - { - "internalType": "string", - "name": "_baseUri", - "type": "string" } ], "name": "mint", @@ -355,28 +350,28 @@ "type": "function" } ], - "transactionHash": "0x4e8bbf51dd46e56a9dab30e658b41fadeef3041f6f80ada1febb74cf478fbb7a", + "transactionHash": "0x3439d3b46580392b496bca9a3d0bf2421854b15e118cb04bab2377ef28b22549", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", "transactionIndex": 0, - "gasUsed": "2396710", + "gasUsed": "2174007", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xac3fb420ad8e4bc79f21ad696872de2ac40cc89bac981b19ebfd0b1b3e52c97d", - "transactionHash": "0x4e8bbf51dd46e56a9dab30e658b41fadeef3041f6f80ada1febb74cf478fbb7a", + "blockHash": "0xcdff02554cd5d158e1d038f3196a82ee723671f446c6b5872c0f8563e0b1263d", + "transactionHash": "0x3439d3b46580392b496bca9a3d0bf2421854b15e118cb04bab2377ef28b22549", "logs": [], "blockNumber": 3, - "cumulativeGasUsed": "2396710", + "cumulativeGasUsed": "2174007", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "f3ccb1b89e4cf68339a84fd309cc4f67", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_baseUri\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftToken.sol\":\"NftToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\\n * that `ownerOf(tokenId)` is `a`.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\\n _balances[account] += amount;\\n }\\n}\\n\",\"keccak256\":\"0x2c309e7df9e05e6ce15bedfe74f3c61b467fc37e0fae9eab496acf5ea0bbd7ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"contracts/NftToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract NftToken is ERC721 {\\n using Counters for Counters.Counter;\\n Counters.Counter private _tokenIdCounter;\\n string private baseUri;\\n\\n // \\u6bcf mint \\u4e00\\u4e2a nft \\u90fd\\u9700\\u8981\\u628a count+1 \\u8868\\u793a nft \\u603b\\u6570\\u91cf\\n constructor() ERC721(\\\"NftToken\\\", \\\"NT\\\") {\\n _tokenIdCounter.increment();\\n }\\n\\n function mint(address to, string memory _baseUri) public {\\n baseUri = _baseUri;\\n uint256 tokenId = _tokenIdCounter.current();\\n _tokenIdCounter.increment();\\n _safeMint(to, tokenId);\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return baseUri;\\n }\\n}\\n\",\"keccak256\":\"0xe5bd71f34753632d2a366d45f753674a2fb002dbd700e8d50ea4273f92f3d47f\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6674546f6b656e0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e5400000000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200034c565b508060019081620000a191906200034c565b505050620000b66006620000bc60201b60201c565b62000433565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200015457607f821691505b6020821081036200016a57620001696200010c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000195565b620001e0868362000195565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200022d620002276200022184620001f8565b62000202565b620001f8565b9050919050565b6000819050919050565b62000249836200020c565b62000261620002588262000234565b848454620001a2565b825550505050565b600090565b6200027862000269565b620002858184846200023e565b505050565b5b81811015620002ad57620002a16000826200026e565b6001810190506200028b565b5050565b601f821115620002fc57620002c68162000170565b620002d18462000185565b81016020851015620002e1578190505b620002f9620002f08562000185565b8301826200028a565b50505b505050565b600082821c905092915050565b6000620003216000198460080262000301565b1980831691505092915050565b60006200033c83836200030e565b9150826002028217905092915050565b6200035782620000d2565b67ffffffffffffffff811115620003735762000372620000dd565b5b6200037f82546200013b565b6200038c828285620002b1565b600060209050601f831160018114620003c45760008415620003af578287015190505b620003bb85826200032e565b8655506200042b565b601f198416620003d48662000170565b60005b82811015620003fe57848901518255600182019150602085019450602081019050620003d7565b868310156200041e57848901516200041a601f8916826200030e565b8355505b6001600288020188555050505b505050505050565b61291680620004436000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", + "solcInputHash": "4ab649e2e835b6ae1cbf37c773bdacba", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftToken.sol\":\"NftToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\\n * that `ownerOf(tokenId)` is `a`.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\\n _balances[account] += amount;\\n }\\n}\\n\",\"keccak256\":\"0x2c309e7df9e05e6ce15bedfe74f3c61b467fc37e0fae9eab496acf5ea0bbd7ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"contracts/NftToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract NftToken is ERC721 {\\n using Counters for Counters.Counter;\\n Counters.Counter private _tokenIdCounter;\\n\\n // \\u6bcf mint \\u4e00\\u4e2a nft \\u90fd\\u9700\\u8981\\u628a count+1 \\u8868\\u793a nft \\u603b\\u6570\\u91cf\\n constructor() ERC721(\\\"NftToken\\\", \\\"NT\\\") {\\n _tokenIdCounter.increment();\\n }\\n\\n function mint(address to) public {\\n uint256 tokenId = _tokenIdCounter.current();\\n _tokenIdCounter.increment();\\n _safeMint(to, tokenId);\\n }\\n}\\n\",\"keccak256\":\"0x320d222a5aa16f9ccf0ec1351914c2330710d8b884222c9f48e358ab56c0689b\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6674546f6b656e0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e5400000000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200034c565b508060019081620000a191906200034c565b505050620000b66006620000bc60201b60201c565b62000433565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200015457607f821691505b6020821081036200016a57620001696200010c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000195565b620001e0868362000195565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200022d620002276200022184620001f8565b62000202565b620001f8565b9050919050565b6000819050919050565b62000249836200020c565b62000261620002588262000234565b848454620001a2565b825550505050565b600090565b6200027862000269565b620002858184846200023e565b505050565b5b81811015620002ad57620002a16000826200026e565b6001810190506200028b565b5050565b601f821115620002fc57620002c68162000170565b620002d18462000185565b81016020851015620002e1578190505b620002f9620002f08562000185565b8301826200028a565b50505b505050565b600082821c905092915050565b6000620003216000198460080262000301565b1980831691505092915050565b60006200033c83836200030e565b9150826002028217905092915050565b6200035782620000d2565b67ffffffffffffffff811115620003735762000372620000dd565b5b6200037f82546200013b565b6200038c828285620002b1565b600060209050601f831160018114620003c45760008415620003af578287015190505b620003bb85826200032e565b8655506200042b565b601f198416620003d48662000170565b60005b82811015620003fe57848901518255600182019150602085019450602081019050620003d7565b868310156200041e57848901516200041a601f8916826200030e565b8355505b6001600288020188555050505b505050505050565b61250f80620004436000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636a6278421161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636a627842146101f157806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b6101096004803603810190610104919061180b565b6102f3565b6040516101169190611853565b60405180910390f35b6101276103d5565b60405161013491906118fe565b60405180910390f35b61015760048036038101906101529190611956565b610467565b60405161016491906119c4565b60405180910390f35b61018760048036038101906101829190611a0b565b6104ad565b005b6101a3600480360381019061019e9190611a4b565b6105c4565b005b6101bf60048036038101906101ba9190611a4b565b610624565b005b6101db60048036038101906101d69190611956565b610644565b6040516101e891906119c4565b60405180910390f35b61020b60048036038101906102069190611a9e565b6106ca565b005b61022760048036038101906102229190611a9e565b6106f0565b6040516102349190611ada565b60405180910390f35b6102456107a7565b60405161025291906118fe565b60405180910390f35b61027560048036038101906102709190611b21565b610839565b005b610291600480360381019061028c9190611c96565b61084f565b005b6102ad60048036038101906102a89190611956565b6108b1565b6040516102ba91906118fe565b60405180910390f35b6102dd60048036038101906102d89190611d19565b610919565b6040516102ea9190611853565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109ad565b5b9050919050565b6060600080546103e490611d88565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611d88565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a17565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611e2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a62565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a62565b610919565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90611ebd565b60405180910390fd5b6105bf8383610a6a565b505050565b6105d56105cf610a62565b82610b23565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90611f4f565b60405180910390fd5b61061f838383610bb8565b505050565b61063f8383836040518060200160405280600081525061084f565b505050565b60008061065083610eb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890611fbb565b60405180910390fd5b80915050919050565b60006106d66006610eee565b90506106e26006610efc565b6106ec8282610f12565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107579061204d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107b690611d88565b80601f01602080910402602001604051908101604052809291908181526020018280546107e290611d88565b801561082f5780601f106108045761010080835404028352916020019161082f565b820191906000526020600020905b81548152906001019060200180831161081257829003601f168201915b5050505050905090565b61084b610844610a62565b8383610f30565b5050565b61086061085a610a62565b83610b23565b61089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690611f4f565b60405180910390fd5b6108ab8484848461109c565b50505050565b60606108bc82610a17565b60006108c66110f8565b905060008151116108e65760405180602001604052806000815250610911565b806108f08461110f565b6040516020016109019291906120a9565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a20816111dd565b610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690611fbb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610add83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b2f83610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b715750610b708185610919565b5b80610baf57508373ffffffffffffffffffffffffffffffffffffffff16610b9784610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bd882610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c259061213f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c94906121d1565b60405180910390fd5b610caa838383600161121e565b8273ffffffffffffffffffffffffffffffffffffffff16610cca82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d179061213f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610eac8383836001611224565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b610f2c82826040518060200160405280600081525061122a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061223d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161108f9190611853565b60405180910390a3505050565b6110a7848484610bb8565b6110b384848484611285565b6110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e9906122cf565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111e8461140c565b01905060008167ffffffffffffffff81111561113d5761113c611b6b565b5b6040519080825280601f01601f19166020018201604052801561116f5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111d2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c6576111c56122ef565b5b0494506000850361117d575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111ff83610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b611234838361155f565b6112416000848484611285565b611280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611277906122cf565b60405180910390fd5b505050565b60006112a68473ffffffffffffffffffffffffffffffffffffffff1661177c565b156113ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112cf610a62565b8786866040518563ffffffff1660e01b81526004016112f19493929190612373565b6020604051808303816000875af192505050801561132d57506040513d601f19601f8201168201806040525081019061132a91906123d4565b60015b6113af573d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b5060008151036113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906122cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611404565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061146a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114605761145f6122ef565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a7576d04ee2d6d415b85acef8100000000838161149d5761149c6122ef565b5b0492506020810190505b662386f26fc1000083106114d657662386f26fc1000083816114cc576114cb6122ef565b5b0492506010810190505b6305f5e10083106114ff576305f5e10083816114f5576114f46122ef565b5b0492506008810190505b612710831061152457612710838161151a576115196122ef565b5b0492506004810190505b60648310611547576064838161153d5761153c6122ef565b5b0492506002810190505b600a8310611556576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061244d565b60405180910390fd5b6115d7816111dd565b15611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e906124b9565b60405180910390fd5b61162560008383600161121e565b61162e816111dd565b1561166e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611665906124b9565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611778600083836001611224565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e8816117b3565b81146117f357600080fd5b50565b600081359050611805816117df565b92915050565b600060208284031215611821576118206117a9565b5b600061182f848285016117f6565b91505092915050565b60008115159050919050565b61184d81611838565b82525050565b60006020820190506118686000830184611844565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a857808201518184015260208101905061188d565b60008484015250505050565b6000601f19601f8301169050919050565b60006118d08261186e565b6118da8185611879565b93506118ea81856020860161188a565b6118f3816118b4565b840191505092915050565b6000602082019050818103600083015261191881846118c5565b905092915050565b6000819050919050565b61193381611920565b811461193e57600080fd5b50565b6000813590506119508161192a565b92915050565b60006020828403121561196c5761196b6117a9565b5b600061197a84828501611941565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119ae82611983565b9050919050565b6119be816119a3565b82525050565b60006020820190506119d960008301846119b5565b92915050565b6119e8816119a3565b81146119f357600080fd5b50565b600081359050611a05816119df565b92915050565b60008060408385031215611a2257611a216117a9565b5b6000611a30858286016119f6565b9250506020611a4185828601611941565b9150509250929050565b600080600060608486031215611a6457611a636117a9565b5b6000611a72868287016119f6565b9350506020611a83868287016119f6565b9250506040611a9486828701611941565b9150509250925092565b600060208284031215611ab457611ab36117a9565b5b6000611ac2848285016119f6565b91505092915050565b611ad481611920565b82525050565b6000602082019050611aef6000830184611acb565b92915050565b611afe81611838565b8114611b0957600080fd5b50565b600081359050611b1b81611af5565b92915050565b60008060408385031215611b3857611b376117a9565b5b6000611b46858286016119f6565b9250506020611b5785828601611b0c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ba3826118b4565b810181811067ffffffffffffffff82111715611bc257611bc1611b6b565b5b80604052505050565b6000611bd561179f565b9050611be18282611b9a565b919050565b600067ffffffffffffffff821115611c0157611c00611b6b565b5b611c0a826118b4565b9050602081019050919050565b82818337600083830152505050565b6000611c39611c3484611be6565b611bcb565b905082815260208101848484011115611c5557611c54611b66565b5b611c60848285611c17565b509392505050565b600082601f830112611c7d57611c7c611b61565b5b8135611c8d848260208601611c26565b91505092915050565b60008060008060808587031215611cb057611caf6117a9565b5b6000611cbe878288016119f6565b9450506020611ccf878288016119f6565b9350506040611ce087828801611941565b925050606085013567ffffffffffffffff811115611d0157611d006117ae565b5b611d0d87828801611c68565b91505092959194509250565b60008060408385031215611d3057611d2f6117a9565b5b6000611d3e858286016119f6565b9250506020611d4f858286016119f6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611da057607f821691505b602082108103611db357611db2611d59565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e15602183611879565b9150611e2082611db9565b604082019050919050565b60006020820190508181036000830152611e4481611e08565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ea7603d83611879565b9150611eb282611e4b565b604082019050919050565b60006020820190508181036000830152611ed681611e9a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f39602d83611879565b9150611f4482611edd565b604082019050919050565b60006020820190508181036000830152611f6881611f2c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611fa5601883611879565b9150611fb082611f6f565b602082019050919050565b60006020820190508181036000830152611fd481611f98565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612037602983611879565b915061204282611fdb565b604082019050919050565b600060208201905081810360008301526120668161202a565b9050919050565b600081905092915050565b60006120838261186e565b61208d818561206d565b935061209d81856020860161188a565b80840191505092915050565b60006120b58285612078565b91506120c18284612078565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612129602583611879565b9150612134826120cd565b604082019050919050565b600060208201905081810360008301526121588161211c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006121bb602483611879565b91506121c68261215f565b604082019050919050565b600060208201905081810360008301526121ea816121ae565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612227601983611879565b9150612232826121f1565b602082019050919050565b600060208201905081810360008301526122568161221a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006122b9603283611879565b91506122c48261225d565b604082019050919050565b600060208201905081810360008301526122e8816122ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123458261231e565b61234f8185612329565b935061235f81856020860161188a565b612368816118b4565b840191505092915050565b600060808201905061238860008301876119b5565b61239560208301866119b5565b6123a26040830185611acb565b81810360608301526123b4818461233a565b905095945050505050565b6000815190506123ce816117df565b92915050565b6000602082840312156123ea576123e96117a9565b5b60006123f8848285016123bf565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612437602083611879565b915061244282612401565b602082019050919050565b600060208201905081810360008301526124668161242a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124a3601c83611879565b91506124ae8261246d565b602082019050919050565b600060208201905081810360008301526124d281612496565b905091905056fea2646970667358221220c71a8531ab48b3d9d62a286d4ad54153af2182a3af7a7ab0a1a0e687ce572ba764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80636a6278421161008c578063a22cb46511610066578063a22cb4651461025b578063b88d4fde14610277578063c87b56dd14610293578063e985e9c5146102c3576100ea565b80636a627842146101f157806370a082311461020d57806395d89b411461023d576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b6101096004803603810190610104919061180b565b6102f3565b6040516101169190611853565b60405180910390f35b6101276103d5565b60405161013491906118fe565b60405180910390f35b61015760048036038101906101529190611956565b610467565b60405161016491906119c4565b60405180910390f35b61018760048036038101906101829190611a0b565b6104ad565b005b6101a3600480360381019061019e9190611a4b565b6105c4565b005b6101bf60048036038101906101ba9190611a4b565b610624565b005b6101db60048036038101906101d69190611956565b610644565b6040516101e891906119c4565b60405180910390f35b61020b60048036038101906102069190611a9e565b6106ca565b005b61022760048036038101906102229190611a9e565b6106f0565b6040516102349190611ada565b60405180910390f35b6102456107a7565b60405161025291906118fe565b60405180910390f35b61027560048036038101906102709190611b21565b610839565b005b610291600480360381019061028c9190611c96565b61084f565b005b6102ad60048036038101906102a89190611956565b6108b1565b6040516102ba91906118fe565b60405180910390f35b6102dd60048036038101906102d89190611d19565b610919565b6040516102ea9190611853565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109ad565b5b9050919050565b6060600080546103e490611d88565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611d88565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a17565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611e2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a62565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a62565b610919565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90611ebd565b60405180910390fd5b6105bf8383610a6a565b505050565b6105d56105cf610a62565b82610b23565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b90611f4f565b60405180910390fd5b61061f838383610bb8565b505050565b61063f8383836040518060200160405280600081525061084f565b505050565b60008061065083610eb1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890611fbb565b60405180910390fd5b80915050919050565b60006106d66006610eee565b90506106e26006610efc565b6106ec8282610f12565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107579061204d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546107b690611d88565b80601f01602080910402602001604051908101604052809291908181526020018280546107e290611d88565b801561082f5780601f106108045761010080835404028352916020019161082f565b820191906000526020600020905b81548152906001019060200180831161081257829003601f168201915b5050505050905090565b61084b610844610a62565b8383610f30565b5050565b61086061085a610a62565b83610b23565b61089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690611f4f565b60405180910390fd5b6108ab8484848461109c565b50505050565b60606108bc82610a17565b60006108c66110f8565b905060008151116108e65760405180602001604052806000815250610911565b806108f08461110f565b6040516020016109019291906120a9565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a20816111dd565b610a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5690611fbb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610add83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b2f83610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b715750610b708185610919565b5b80610baf57508373ffffffffffffffffffffffffffffffffffffffff16610b9784610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610bd882610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c259061213f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c94906121d1565b60405180910390fd5b610caa838383600161121e565b8273ffffffffffffffffffffffffffffffffffffffff16610cca82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d179061213f565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610eac8383836001611224565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b610f2c82826040518060200160405280600081525061122a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f959061223d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161108f9190611853565b60405180910390a3505050565b6110a7848484610bb8565b6110b384848484611285565b6110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e9906122cf565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b60606000600161111e8461140c565b01905060008167ffffffffffffffff81111561113d5761113c611b6b565b5b6040519080825280601f01601f19166020018201604052801561116f5781602001600182028036833780820191505090505b509050600082602001820190505b6001156111d2578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111c6576111c56122ef565b5b0494506000850361117d575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166111ff83610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b611234838361155f565b6112416000848484611285565b611280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611277906122cf565b60405180910390fd5b505050565b60006112a68473ffffffffffffffffffffffffffffffffffffffff1661177c565b156113ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026112cf610a62565b8786866040518563ffffffff1660e01b81526004016112f19493929190612373565b6020604051808303816000875af192505050801561132d57506040513d601f19601f8201168201806040525081019061132a91906123d4565b60015b6113af573d806000811461135d576040519150601f19603f3d011682016040523d82523d6000602084013e611362565b606091505b5060008151036113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e906122cf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611404565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061146a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816114605761145f6122ef565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114a7576d04ee2d6d415b85acef8100000000838161149d5761149c6122ef565b5b0492506020810190505b662386f26fc1000083106114d657662386f26fc1000083816114cc576114cb6122ef565b5b0492506010810190505b6305f5e10083106114ff576305f5e10083816114f5576114f46122ef565b5b0492506008810190505b612710831061152457612710838161151a576115196122ef565b5b0492506004810190505b60648310611547576064838161153d5761153c6122ef565b5b0492506002810190505b600a8310611556576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c59061244d565b60405180910390fd5b6115d7816111dd565b15611617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160e906124b9565b60405180910390fd5b61162560008383600161121e565b61162e816111dd565b1561166e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611665906124b9565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611778600083836001611224565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117e8816117b3565b81146117f357600080fd5b50565b600081359050611805816117df565b92915050565b600060208284031215611821576118206117a9565b5b600061182f848285016117f6565b91505092915050565b60008115159050919050565b61184d81611838565b82525050565b60006020820190506118686000830184611844565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156118a857808201518184015260208101905061188d565b60008484015250505050565b6000601f19601f8301169050919050565b60006118d08261186e565b6118da8185611879565b93506118ea81856020860161188a565b6118f3816118b4565b840191505092915050565b6000602082019050818103600083015261191881846118c5565b905092915050565b6000819050919050565b61193381611920565b811461193e57600080fd5b50565b6000813590506119508161192a565b92915050565b60006020828403121561196c5761196b6117a9565b5b600061197a84828501611941565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006119ae82611983565b9050919050565b6119be816119a3565b82525050565b60006020820190506119d960008301846119b5565b92915050565b6119e8816119a3565b81146119f357600080fd5b50565b600081359050611a05816119df565b92915050565b60008060408385031215611a2257611a216117a9565b5b6000611a30858286016119f6565b9250506020611a4185828601611941565b9150509250929050565b600080600060608486031215611a6457611a636117a9565b5b6000611a72868287016119f6565b9350506020611a83868287016119f6565b9250506040611a9486828701611941565b9150509250925092565b600060208284031215611ab457611ab36117a9565b5b6000611ac2848285016119f6565b91505092915050565b611ad481611920565b82525050565b6000602082019050611aef6000830184611acb565b92915050565b611afe81611838565b8114611b0957600080fd5b50565b600081359050611b1b81611af5565b92915050565b60008060408385031215611b3857611b376117a9565b5b6000611b46858286016119f6565b9250506020611b5785828601611b0c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611ba3826118b4565b810181811067ffffffffffffffff82111715611bc257611bc1611b6b565b5b80604052505050565b6000611bd561179f565b9050611be18282611b9a565b919050565b600067ffffffffffffffff821115611c0157611c00611b6b565b5b611c0a826118b4565b9050602081019050919050565b82818337600083830152505050565b6000611c39611c3484611be6565b611bcb565b905082815260208101848484011115611c5557611c54611b66565b5b611c60848285611c17565b509392505050565b600082601f830112611c7d57611c7c611b61565b5b8135611c8d848260208601611c26565b91505092915050565b60008060008060808587031215611cb057611caf6117a9565b5b6000611cbe878288016119f6565b9450506020611ccf878288016119f6565b9350506040611ce087828801611941565b925050606085013567ffffffffffffffff811115611d0157611d006117ae565b5b611d0d87828801611c68565b91505092959194509250565b60008060408385031215611d3057611d2f6117a9565b5b6000611d3e858286016119f6565b9250506020611d4f858286016119f6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611da057607f821691505b602082108103611db357611db2611d59565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611e15602183611879565b9150611e2082611db9565b604082019050919050565b60006020820190508181036000830152611e4481611e08565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000611ea7603d83611879565b9150611eb282611e4b565b604082019050919050565b60006020820190508181036000830152611ed681611e9a565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000611f39602d83611879565b9150611f4482611edd565b604082019050919050565b60006020820190508181036000830152611f6881611f2c565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000611fa5601883611879565b9150611fb082611f6f565b602082019050919050565b60006020820190508181036000830152611fd481611f98565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000612037602983611879565b915061204282611fdb565b604082019050919050565b600060208201905081810360008301526120668161202a565b9050919050565b600081905092915050565b60006120838261186e565b61208d818561206d565b935061209d81856020860161188a565b80840191505092915050565b60006120b58285612078565b91506120c18284612078565b91508190509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612129602583611879565b9150612134826120cd565b604082019050919050565b600060208201905081810360008301526121588161211c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006121bb602483611879565b91506121c68261215f565b604082019050919050565b600060208201905081810360008301526121ea816121ae565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612227601983611879565b9150612232826121f1565b602082019050919050565b600060208201905081810360008301526122568161221a565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006122b9603283611879565b91506122c48261225d565b604082019050919050565b600060208201905081810360008301526122e8816122ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006123458261231e565b61234f8185612329565b935061235f81856020860161188a565b612368816118b4565b840191505092915050565b600060808201905061238860008301876119b5565b61239560208301866119b5565b6123a26040830185611acb565b81810360608301526123b4818461233a565b905095945050505050565b6000815190506123ce816117df565b92915050565b6000602082840312156123ea576123e96117a9565b5b60006123f8848285016123bf565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000612437602083611879565b915061244282612401565b602082019050919050565b600060208201905081810360008301526124668161242a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006124a3601c83611879565b91506124ae8261246d565b602082019050919050565b600060208201905081810360008301526124d281612496565b905091905056fea2646970667358221220c71a8531ab48b3d9d62a286d4ad54153af2182a3af7a7ab0a1a0e687ce572ba764736f6c63430008140033", "devdoc": { "events": { "Approval(address,address,uint256)": { @@ -441,7 +436,7 @@ "storageLayout": { "storage": [ { - "astId": 780, + "astId": 168, "contract": "contracts/NftToken.sol:NftToken", "label": "_name", "offset": 0, @@ -449,7 +444,7 @@ "type": "t_string_storage" }, { - "astId": 782, + "astId": 170, "contract": "contracts/NftToken.sol:NftToken", "label": "_symbol", "offset": 0, @@ -457,7 +452,7 @@ "type": "t_string_storage" }, { - "astId": 786, + "astId": 174, "contract": "contracts/NftToken.sol:NftToken", "label": "_owners", "offset": 0, @@ -465,7 +460,7 @@ "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 790, + "astId": 178, "contract": "contracts/NftToken.sol:NftToken", "label": "_balances", "offset": 0, @@ -473,7 +468,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 794, + "astId": 182, "contract": "contracts/NftToken.sol:NftToken", "label": "_tokenApprovals", "offset": 0, @@ -481,7 +476,7 @@ "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 800, + "astId": 188, "contract": "contracts/NftToken.sol:NftToken", "label": "_operatorApprovals", "offset": 0, @@ -489,20 +484,12 @@ "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" }, { - "astId": 4012, + "astId": 3320, "contract": "contracts/NftToken.sol:NftToken", "label": "_tokenIdCounter", "offset": 0, "slot": "6", - "type": "t_struct(Counter)2208_storage" - }, - { - "astId": 4014, - "contract": "contracts/NftToken.sol:NftToken", - "label": "baseUri", - "offset": 0, - "slot": "7", - "type": "t_string_storage" + "type": "t_struct(Counter)1596_storage" } ], "types": { @@ -549,12 +536,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Counter)2208_storage": { + "t_struct(Counter)1596_storage": { "encoding": "inplace", "label": "struct Counters.Counter", "members": [ { - "astId": 2207, + "astId": 1595, "contract": "contracts/NftToken.sol:NftToken", "label": "_value", "offset": 0, diff --git a/members/missop/task5/contracts/deployments/localhost/solcInputs/4ab649e2e835b6ae1cbf37c773bdacba.json b/members/missop/task5/contracts/deployments/localhost/solcInputs/4ab649e2e835b6ae1cbf37c773bdacba.json new file mode 100644 index 000000000..238f9b783 --- /dev/null +++ b/members/missop/task5/contracts/deployments/localhost/solcInputs/4ab649e2e835b6ae1cbf37c773bdacba.json @@ -0,0 +1,84 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/security/ReentrancyGuard.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n * that `ownerOf(tokenId)` is `a`.\n */\n // solhint-disable-next-line func-name-mixedcase\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\n _balances[account] += amount;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "contracts/NftMarket.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\"; // 防止双花攻击\nimport \"hardhat/console.sol\";\n\nerror NftMarket__NotOwnerOf(string message);\nerror NftMarket__NotApproved(string message);\nerror NftMarket__NotActive(string message);\nerror NftMarket__PaymentFailed(string message);\nerror NftMarket__NotExist(string message);\nerror NftMarket__IsListed(string message);\n\ncontract NftMarket is ReentrancyGuard {\n struct Listing {\n address seller;\n address nftContract;\n uint256 tokenId;\n uint256 price;\n uint256 listTime;\n string cid;\n bool isActive;\n }\n\n mapping(address => mapping(uint256 => Listing)) public s_listings;\n uint256[] private s_tokenIds;\n // Listing[] private s_listArr;\n IERC20 public immutable i_paymentToken;\n\n // 上架 nft 事件\n event NftListed(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n // nft购买事件\n event NftPurchased(\n address indexed buyer,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n event NftUnlisted(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract\n );\n\n constructor(address _paymentToken) {\n i_paymentToken = IERC20(_paymentToken);\n }\n\n function listNft(\n address _nftContract,\n uint256 tokenId,\n uint256 price,\n string memory cid\n ) external {\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n if (s_listings[_nftContract][tokenId].isActive) {\n revert NftMarket__IsListed(\"NFT already listed\");\n }\n uint256 listTime = block.timestamp;\n Listing memory item = Listing(\n msg.sender,\n _nftContract,\n tokenId,\n price,\n listTime,\n cid,\n true\n );\n s_listings[_nftContract][tokenId] = item;\n s_tokenIds.push(tokenId);\n // s_listArr.push(item);\n\n emit NftListed(msg.sender, tokenId, _nftContract, price);\n }\n\n function unlistNft(address _nftContract, uint256 _tokenId) external {\n Listing memory item = s_listings[_nftContract][_tokenId];\n if (!item.isActive) {\n revert NftMarket__NotActive(\"not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(_tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n item.isActive = false;\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\n }\n\n function buyNft(address _nftContract, uint256 _tokenId) external {\n Listing memory listing = s_listings[_nftContract][_tokenId];\n if (!listing.isActive) {\n revert NftMarket__NotActive(\"NFT not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n // 将购买人身上的钱转给售卖人\n if (\n !i_paymentToken.transferFrom(\n msg.sender,\n listing.seller,\n listing.price\n )\n ) {\n revert NftMarket__PaymentFailed(\"payment failed\");\n }\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\n listing.isActive = false;\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\n }\n\n /**\n *\n * @dev 从 s_listings 中获取上架的 NFT\n */\n function getListsArray(\n address _nftContract\n ) public view returns (Listing[] memory) {\n Listing[] memory listings = new Listing[](s_tokenIds.length);\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\n listings[i] = item;\n }\n return listings;\n }\n\n /**\n * @dev 从数组中获取,对比两者差异\n */\n // function getList(\n // address _nftContract\n // ) external view returns (Listing[] memory) {\n // for (uint256 i = 0; i < s_listArr.length; i++) {\n // Listing memory item = s_listArr[i];\n // Listing memory listingItem = s_listings[_nftContract][item.tokenId];\n // item.isActive = listingItem.isActive;\n // }\n // return s_listArr;\n // }\n}\n" + }, + "contracts/NftToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract NftToken is ERC721 {\n using Counters for Counters.Counter;\n Counters.Counter private _tokenIdCounter;\n\n // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量\n constructor() ERC721(\"NftToken\", \"NT\") {\n _tokenIdCounter.increment();\n }\n\n function mint(address to) public {\n uint256 tokenId = _tokenIdCounter.current();\n _tokenIdCounter.increment();\n _safeMint(to, tokenId);\n }\n}\n" + }, + "hardhat/console.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS =\n 0x000000000000000000636F6e736F6c652e6c6f67;\n\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\n address consoleAddress = CONSOLE_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n pop(\n staticcall(\n gas(),\n consoleAddress,\n add(payload, 32),\n mload(payload),\n 0,\n 0\n )\n )\n }\n }\n\n function _castToPure(\n function(bytes memory) internal view fnIn\n ) internal pure returns (function(bytes memory) pure fnOut) {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castToPure(_sendLogPayloadImplementation)(payload);\n }\n\n function log() internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n }\n\n function logUint(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function logString(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function log(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n }\n\n function log(uint256 p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n }\n\n function log(uint256 p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n }\n\n function log(uint256 p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n }\n\n function log(string memory p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n}\n" + } + }, + "settings": { + "evmVersion": "paris", + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/members/missop/task5/contracts/hardhat.config.js b/members/missop/task5/contracts/hardhat.config.js index 40b5b562d..aa8f64c01 100644 --- a/members/missop/task5/contracts/hardhat.config.js +++ b/members/missop/task5/contracts/hardhat.config.js @@ -1,5 +1,8 @@ require("dotenv").config(); require("hardhat-deploy"); +require("solidity-coverage"); +require("@nomiclabs/hardhat-ethers"); + /** * @type {import('hardhat/config').HardhatUserConfig} */ @@ -9,12 +12,12 @@ const config = { networks: { localhost: { chainId: 31337, - gas: 300000, + gas: 30_000_000, gasPrice: 8000000000, }, hardhat: { chainId: 31337, - gas: 300000, + gas: 30_000_000, gasPrice: 8000000000, }, }, diff --git a/members/missop/task5/contracts/helper-hardhat-config.js b/members/missop/task5/contracts/helper-hardhat-config.js new file mode 100644 index 000000000..e30c4a12a --- /dev/null +++ b/members/missop/task5/contracts/helper-hardhat-config.js @@ -0,0 +1,5 @@ +const developmentChains = ["hardhat", "localhost"]; + +module.exports = { + developmentChains, +}; diff --git a/members/missop/task5/contracts/package.json b/members/missop/task5/contracts/package.json index 6cc000c5f..29c28bfc3 100644 --- a/members/missop/task5/contracts/package.json +++ b/members/missop/task5/contracts/package.json @@ -6,14 +6,22 @@ "scripts": { "compile": "hardhat compile", "hardhat-node": "hardhat node", - "deploy": "hardhat deploy" + "deploy": "hardhat deploy", + "test": "hardhat test", + "test-staging": "hardhat test --network sepolia", + "coverage": "hardhat coverage" }, "dependencies": { "@openzeppelin/contracts": "4" }, "devDependencies": { + "@nomiclabs/hardhat-ethers": "^2.2.3", + "chai": "4", "dotenv": "^16.4.5", - "hardhat": "^2.22.13", - "hardhat-deploy": "^0.14.0" + "ethereum-waffle": "*", + "ethers": "^5.0.0", + "hardhat": "^2.22.15", + "hardhat-deploy": "^0.14.0", + "solidity-coverage": "^0.8.13" } } diff --git a/members/missop/task5/contracts/test/unit/MissopToken.test.js b/members/missop/task5/contracts/test/unit/MissopToken.test.js new file mode 100644 index 000000000..dc267319d --- /dev/null +++ b/members/missop/task5/contracts/test/unit/MissopToken.test.js @@ -0,0 +1,35 @@ +const { network, ethers, deployments } = require("hardhat"); +const { assert } = require("chai"); +const { developmentChains } = require("../../helper-hardhat-config"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("MissopToken Unit Tests", () => { + let missopToken; + + beforeEach(async () => { + const res = await deployments.fixture(["MissopToken"]); + missopToken = await ethers.getContractAt("MissopToken", res.MissopToken.address); + }); + + describe("constructor", () => { + it("sets the name and symbol of the token", async () => { + const name = await missopToken.name(); + const symbol = await missopToken.symbol(); + assert.equal(name, "MissopToken"); + assert.equal(symbol, "MT"); + }); + + it("sets the total supply of the token", async () => { + const totalSupply = await missopToken.totalSupply(); + assert.equal(totalSupply.toString(), "10000000000000000"); + }); + }); + + describe("decimals", () => { + it("returns the correct number of decimals", async () => { + const decimals = await missopToken.decimals(); + assert.equal(decimals, 6); + }); + }); + }); diff --git a/members/missop/task5/contracts/test/unit/NftMarket.test.js b/members/missop/task5/contracts/test/unit/NftMarket.test.js new file mode 100644 index 000000000..82ee860e1 --- /dev/null +++ b/members/missop/task5/contracts/test/unit/NftMarket.test.js @@ -0,0 +1,35 @@ +const { deployments, getNamedAccounts, ethers } = require("hardhat"); +const { developmentChains } = require("../../helper-hardhat-config"); +const { assert } = require("chai"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("NftMarket Unit Tests", function () { + let nftMarket, deployer; + + beforeEach(async () => { + const res = await deployments.fixture(["NftMarket"]); + nftMarket = await ethers.getContractAt("NftMarket", res.NftMarket.address); + deployer = (await getNamedAccounts()).deployer; + }); + + describe("constructor", () => { + it("set paymentToken", () => {}); + }); + + describe("listNft", () => { + it("list nft", () => {}); + }); + + describe("unlistNft", () => { + it("unlist nft", () => {}); + }); + + describe("buyNft", () => { + it("buy nft", () => {}); + }); + + describe("getListsArray", () => { + it("get lists array", () => {}); + }); + }); diff --git a/members/missop/task5/contracts/test/unit/NftToken.test.js b/members/missop/task5/contracts/test/unit/NftToken.test.js new file mode 100644 index 000000000..5352a1b16 --- /dev/null +++ b/members/missop/task5/contracts/test/unit/NftToken.test.js @@ -0,0 +1,32 @@ +const { deployments, getNamedAccounts, ethers } = require("hardhat"); +const { developmentChains } = require("../../helper-hardhat-config"); +const { assert } = require("chai"); + +!developmentChains.includes(network.name) + ? describe.skip + : describe("NftToken Unit Tests", function () { + let nftToken, deployer; + + beforeEach(async () => { + const res = await deployments.fixture(["NftToken"]); + nftToken = await ethers.getContractAt("NftToken", res.NftToken.address); + deployer = (await getNamedAccounts()).deployer; + }); + + describe("constructor", function () { + it("sets the name and symbol of the token", async () => { + const name = await nftToken.name(); + const symbol = await nftToken.symbol(); + assert.equal(name, "NftToken"); + assert.equal(symbol, "NT"); + }); + }); + + describe("mintNft", function () { + it("mints a new NFT and assigns it to the caller", async () => { + await nftToken.mint(deployer); + const balances = await nftToken.balanceOf(deployer); + assert.equal(balances, 1); + }); + }); + }); diff --git a/members/missop/task5/web/package.json b/members/missop/task5/web/package.json index da8850a8d..e7ae299db 100644 --- a/members/missop/task5/web/package.json +++ b/members/missop/task5/web/package.json @@ -11,6 +11,7 @@ "dependencies": { "@rainbow-me/rainbowkit": "^2.2.0", "@wagmi/core": "^2.14.1", + "date-fns": "^4.1.0", "next": "14.2.15", "react": "^18", "react-dom": "^18", diff --git a/members/missop/task5/web/src/app/components/ListNFTs.js b/members/missop/task5/web/src/app/components/ListNFTs.js index a01c3025a..4c1546b27 100644 --- a/members/missop/task5/web/src/app/components/ListNFTs.js +++ b/members/missop/task5/web/src/app/components/ListNFTs.js @@ -1,16 +1,18 @@ -import { useGetListsNFTs, useNftList, useWrite } from "@/hooks/contract"; +import { useGetListsNFTs, useListings, useWrite } from "@/hooks/contract"; import { waitForTransactionReceipt } from "@wagmi/core"; import React from "react"; import { useAccount } from "wagmi"; import config from "../wagmi"; import Image from "next/image"; +import { fromUnixTime, formatDate } from "date-fns"; + export default function ListNFTs() { const { address } = useAccount(); const listNFTs = useGetListsNFTs() || []; console.log("listNFTs", listNFTs); - const lists = useNftList() || []; - console.log("lists", lists); + const data = useListings(listNFTs?.[0]?.tokenId?.toString?.()); + console.log("data", data); const { approveAmount, buyNFT, unlistNFT, setApprovalForAll } = useWrite(); return (
@@ -20,18 +22,21 @@ export default function ListNFTs() {
{nft.name}

NFT:#{nft.tokenId.toString()}

+

+ cid:{nft.cid} +

持有者:{nft.seller}

价格:{nft.price.toString()}MT

-

上架时间:{nft.listTime?.toString?.()}

+

+ 上架时间:{nft.listTime ? formatDate(fromUnixTime(nft.listTime.toString()), "yyyy-MM-dd HH:mm:ss") : ""} +

{nft.seller === address ? (
-
-
+ ); +} diff --git a/members/missop/task5/web/src/app/components/Operations.js b/members/missop/task5/web/src/app/components/Operations.js new file mode 100644 index 000000000..4e4129687 --- /dev/null +++ b/members/missop/task5/web/src/app/components/Operations.js @@ -0,0 +1,97 @@ +import { useWatchEvent, useWrite } from "@/hooks/contract"; +import React, { useState } from "react"; + +export default function Operations() { + const { mintNFT, setApprovalForAll, listNFT } = useWrite(); + const [tokenId, setTokenId] = useState(""); + const [price, setPrice] = useState(""); + const [baseUri, setBaseUri] = useState(""); + useWatchEvent({ + key: "NFTMarketParams", + eventName: "NftListed", + onSuccess: (data) => { + console.log("NFTListed", data); + }, + onError: (error) => { + console.log("NFTListed", error); + }, + }); + + return ( +
+
+
+ + { + setBaseUri(e.target.value); + }} + /> +
+ +
+
+ +
+ { + setTokenId(e.target.value); + }} + /> +
+
+
+ +
+ { + setPrice(e.target.value); + }} + /> +
+
+
+ +
+
+ ); +} diff --git a/members/missop/task5/web/src/app/config.js b/members/missop/task5/web/src/app/config.js new file mode 100644 index 000000000..1c70a0e24 --- /dev/null +++ b/members/missop/task5/web/src/app/config.js @@ -0,0 +1,13 @@ +import { http } from "wagmi"; +import { hardhat } from "wagmi/chains"; +import { getDefaultConfig } from "@rainbow-me/rainbowkit"; + +export default getDefaultConfig({ + appName: "My RainbowKit App", + projectId: "YOUR_PROJECT_ID", + chains: [hardhat], + ssr: true, // If your dApp uses server side rendering (SSR) + transports: { + [hardhat.id]: http(), + }, +}); diff --git a/members/missop/task5/web/src/app/favicon.ico b/members/missop/task5/web/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/members/missop/task5/web/src/app/fonts/GeistMonoVF.woff b/members/missop/task5/web/src/app/fonts/GeistMonoVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..f2ae185cbfd16946a534d819e9eb03924abbcc49 GIT binary patch literal 67864 zcmZsCV{|6X^LDby#!fc2?QCp28{4*X$D569+qP}vj&0lKKhN*HAKy9W>N!=Xdb(?> zQB^(TCNCxi0tx~G0t$@@g8bk8lJvX$|6bxEqGBK*H_sp-KYBnwz$0Q}BT2;-%I=)X2ub{=04r2*}TK5D+LXt~5{t z)Bof^+#0@Rw7=mKi|m$bX6?Bh~_rVfN!~Z5D+lYZ~eMdYd=)1 z?To(VG`{%|MBi{mhZ2~!F#vq`Pec9x)g^>91o^TxurUDvvGDqSS9st3-kw(m@3Xga z`qtIzyIr_nARq+I@sH7;0MG(2NPTSa#jh!1f4cEF5Xll)bpZ(>cyI|Q1wleT1wA5Y zq9^hv^x;~(?2G$>(CTL2)#Ou-rP=XDW$spn8<%0TH%F=^X^(F62Vd@bY`Wi$j$33w zf!U^8o_B|x>{pW$eFZG}b7#|uFueKt$`e9j!wHNBGQX67&nfgl(Ae`3qE-E+yBSfA zEnJSA6p%}|+P9ZIYR{w}nfaKIlV@b3YYzcH!?WNXRvg|J( z((lq^WAE%Q7;oE?zDk~Nvg1Dr_0)KH8m&HF%^&8bI!=#YAGqIx$Yf2lH9S*;=c=b6 zUHi?R*$?Q;>HU4-#?hGJ&dj2jq>d3;_NN_TeipMG!(E+ou)RL-kMQv(W$b9+k# z*%bh8;4)9Je-Giu+XwdbyoaSGei^KG*(1D)5+h{Kfg<`v)nU>dj}RiD_+VvZgb7>9 z-Qb^cdc0k1VSIW!onbm2*_uY*_+r1qe${8^DzXxMnX@F#u>I3_n0j_0ih#p?wd+gPI5niQVbIIsk zkxy%JZZqLeb?p_DXdh1*9Z(O`Nm%TZ(zL`RA!dd+$VNO>qwecEt;dy5w%UK1@1exK zD~__{?4}pb@sGL5CjI=xAR7Jym_*l%fS~I(m>6873y~E7k;IfdA_0)|1$o9?h92Js zt4eu6$WMaSodkz#g|LB%Iw?^B?6x^A=arKjpBhhH6ZCbk2{;io5x)B3eh9R{KEOQX z9|&Q1T3-YGeF+9$doOBzU`TntM~LF~ON3aEZ|p9Y7+wF9qBi`6(hl}&)@-uZ`4zJl z>R`Cps(&x90dBZ~SLeCp?oa*PgM%P!bZaG*OS96bkBT*gF)q0a zxEd&4ZXnQHBuCrYm@m@ffPQTObP*2j+P z_?=gLxmGc32nceW5l5oy=+SB$=N%F^{g}lKR9(TljKIPHw)zVyZ?3ODUL^k;0CuW% z!;ErXcl6|m8OB+{5iYNEq}!Y@o<%r_^{5a($V)INcxkIcMA}Gd8LUShZK5U!u)=PR z6ZALS*{0F1Oxl?y$xE;JA+eyc6mW}LqFTZ3ZvVl#h*UFfj`$%JE0l8D!JRBYUlH!L zJ!uZs@&)nqNg9x8t`fZ?k4Ihgdv(Ogzr)|%{JQ|-g@#=7rCIq(Oo={zr!i7F_F!6; zqpKdMO={?6)e1SETQW+U?L?WPzQx9x#RrVu%xa5u$bDgLQrF-K4Iwd}9a=yS3(f1J z=&B1p=UwPU_#kfxrJ(YnDYZkc%{pp&sn{<~MdR_9^8y%u``RUJaJtY*yi=~R9ryu@ z9kzsKGwMLhZ1egl=e5m~k^Ft9pSfxI5B!$g1WaeqpO`4?C-3aj(gSm%1+@BdqpyAV z@X|;G-&|(jA;zG>T=$%}2gC%)gu@pTPQ)SpSw*2DuSrX((%PM=kQ&E@b=Ygy)l&#k zn6Q419734+(;{THjU2Uy9No0H4_jV1#6O)c>u@tbG6oWD;-8yHLnM^;;b@dWvle!?{40o`dO)$$EZ zM^@JN7b3@-+?UUO*P#gtLsy$!7gZcziDwAj59PsCAJm>m6r+l^X1z|%wu-jJhnQ&_ znPJwq9_*qBLoo*W`sPdYk10kPgf$aH@4qU~%&pFl2rZ0AHR*E-AvBR{F9QCehDa@z z95xXU{QZg|=zb2Pq36>@3je4inO+>S(`ht?)Z#zrHM(i>qE+>iU#!8v4QnWDruR08 zihT~ec3TRJh#llhgk(NqF04=VE8}61FWwvTi_}KWRnkIGbxQ)CAyBfBoVsTvRsR!v zeeHuptQ&5sDmg3vV_f9UtqYjdrR(_D^waATK``ZJjfZD5Kduvl1+l2-u6Qf=6Ombx z7Sq ztJ92oU^LD6n$?=8G?#FGx#fF$d!2WBTf$UGVa}#`S@X&5dFIq%K!1Ikjs!+ybc~8&;<*f2$gyb>j{=&y@=kHsC%Xl#WTojY!)xQxm z+xUe-8Of9gTp&DDOh{Yy9#6leUk5m&-h{G7M@bsLtAJZq1|X(5;ulY z-D2nY-`lAFFZza${swOYsV>&wyw;MiiXw9Ze4so}{Flt`IeJQ5b1l1!d)yG4v?WEO zO3yg9oy--%g}hya8*T);IAWhS&T>>KL9Je(WS#9P#!$_f6!1`7cfKj*+i>@*tP8Mjj|un5Z`YGD>MiCU!adPX zx#5sU8_)@)5fHgRLdp7k;l9Mr_8H3SOvpCBbBRGBQ`Wih*Xpj<)C6}E4SH?GeM1wt)HAM~N<~ejyt^Wpq0tmp z6X&e+wbKjOt@{1ng^s>(semrGFCQLXu|@O1tvtmYwuZ`$BSe{a-011Sk2a~(>MVE0 zpIQ7LpuG+o?lOHuw%e_kJ6yAoXCpu*QQeY%8SNh6?$89*3`>%=;EOJb+gtz&Kp|yv zfPV+nw`uTKbxE3vpT)v3C@L}V3(f*@_3N$Flc(8e<6F?hmPF|Dt%$W})5dMX(nql2 zOMy&yEWPokJ^l?odvVv&l(un4B`x0UHu6T8LraPoL*NltIUElZ5m!YVjcyZe{0Gtx zK{scl85IYuMO$EBG$tHHu0zc0wi&8rW3`d{VJC$oYNJ?m2MBStoGQ!4xQLHS_tBeI z4=tL^Lv>Bj^g79fzfCc?aTHu%Uvn6&+a@&*N~Rba)gbaLl?WBo%1^Pjx=t&|S^9nh zu(^m2A5XEp+ZN2L2#w^7IpLW%BW#F@6{50p0liwKYe!&NWu2F@oIV-5r<}*;+3|bP ze>zfTOAXqW760vNex|NG!Xz~@Wcd5UhOk&n5clNgylEGuS)lF7K$c{a+Hl#rx-2Ic zD(HhN(=Sa(v|zonLt6q9;>ZBVh6n__yB8Pn7WCY*KX8V+u(@n9e zOTe7&?}Fvh8wHRCgku@eEVodSv4NBH%wJEO4wEp#-}%%$wR$2D5JR|@$vRkRb7}iIhxv; zshP$6ckt<2KCd5K9#gwy%I*Ey>Fe20M_29Y=)g1AcBH#@^pXEtP30j`IbaZgR2{t^ z`r?E$A9Zdf@wct0$aRwJ=i9-^yxU77e+%zOG9j-MXBP)nekEiIFHfS>Ba|3w;D?|dL35fhFX>Fi zQcepJaiZvXu&=IsDUMoZIo?5N1`h|7?WDfbJmXcY~w_lg&|t|BlK!`YFCDcu*n(Sa{%c z4$vg-+drB`)#x8&q6x0pG5p+BKvfIu#O32<*&LF;z8q?zL`41|Yicx^Yq4jz6>WcO z4=~f8fF;F-A=fL28*f$mLyZ)0X>6z$biG4VuDpiV4z zY~_evrt9XZfAzEyT`LtOtA^qKGM{Tq8NMHGIOL>T;4vaiE@lH-C<@aOeh_^m?<&&h zdXSPA^^n-i>Uj{Z%Lb+6v5B_zD^V_GWE1OBNlHndI9YW5kD^Kk@cZ&Ia z6oRdBan^1xma-m6+`d|wRJR`V~A;L2zw&Yu_yoTtgzTrhi-xxFYK659imn;^%TR%3!4mYTU`we=`K-=!r$)M^U|fng0gd4 zY&D|@id)hQ6lZ6$q#}%snpqqb>@aUApp7;*W>0UoVkg(l}MYC6COXI29 zGc~J-gZ4vC{yy!bjlkXM?rF2de*R#dL=(PI9-L-quUxck&u`DmTQjI#p*2mPjNqc? z$X9XK{UtI;@pJUK?cwIxV;%;lTG0!%y5 zJpWhb11vK@d2I=!;)F5vM`ML)^6b)LCj<7zlFm7!F$_T_`hyDZ>MEBe@A%a+9RG#y z_*KevIxJ(rEBNzd_KBWC<+$;IWH5}W4eTN}TM#4*`n;PelIth54aC}8|KHL1Kd9hY zdg6C1@KJ_+m6OHmY-}EB_QYaDnd8)^Y#fTGC1QB3E&Rq&s{PIUL5DzjJG<4E+;x=! zz3?hDSALlK#YF2II?cmMlq^D)riLWp(`LjFJNTY&BkIxb04C*yZ)Vjb*8{OJ&U(p# z3cxi}BFmgL+V%Ew9*g|D_V>-jj>E&_kXF}@LX&k)UuVIb+!>`~SGXZrZd9yBFoeR5 zNrxA*){}5*BIRJ3GSAb5CW!RX5}9`W*v3|J4v;znteT1Jn6BmRxF0|>v+o2A%ix3E z_}aH+5hk}2B`>5kW}hg%W`rkIVN-e8*j3!A(mQ&IFKdo(2cn%(!rGGG-la2y4dz)d z;cU;$Z5l<(tUS+pPC9~e+Sl_5OnGT=${=;{P%TayUQ^o1bm#Qel@0Ea2wDFsgpR8p z%{42-o*aWIGVFESm@;QGB)am8yb0`j>EazkuEVoKMd!r}nWzO!rg#7+BuCQ?4|TZ^ z`|;e56wJl>(SLl!DEUo1dvlUaqZZ{;%CQg!oaJ?FFxAmVK6uv$_;SHB!^)t!xv-f_$Bs$C)MjJg|HA#qe9b`BSwl8 z2McXH6Uvn|ClJyKV8|OT-V{LIG1v~h>gQprzhfK(DrmFQ4M!VgO!ZS8o6D1p%RSmV z+Xf5C09vC7w0t%eXb8L=U(~wlP)tZ3TaN#j4{NWJFL7# zMeiEPfaIS?IHAdP9aH+sm5udxfk^i!o76N(KewVyMk&0@OpX6rwAKG}3?0IvE?(cPM;r3Az!_xLiYFY&)}Sl<19#fU0x zj-uZ}`Ey9BnVxqbj#D{R24|$jM(dNl2KH#FvbDSz*@x<{sy48Gz=(yRiYW`ofYMu+ zzdPsn^PhpxWX2v}!sahrD*o$$3k;XDHq|HQU^rDKHq%xw$IafF=^BmtY8T@#Z%YDW zAdx@ahu2vaLq%D&-me?D(}&)mEb|5m{{oc6#p!vRnXxnizHWv)adXiBb>q0*jdBJ~Zv<2B}4vZ{P z>E)ayXwPyT&!MqX{ao=#mpGCX5|61&)PEQKmppcZigqM*Xe+;DOlb?AQ8hZ8S0~w3)(nNAK)Iuc7rg zfIT}yB^fVpt`B3Pkl;fBY6u~2&%W5O{d;oadPW=tcE^D^C>VI_JPYukh@TfhQoWZeCJ5B$7I19W@q_TM0($TkNK3wl)QIl3|@|1RCuW$X^KSG)YgdJf$ zD&q2EfNK5$`W1XPc!pW_jn16RK(}y~T4kUY!;u`93tAJiu%lz7ol{&ur{Q zrA4yCFcU|gV0|>p_`D&ByZc`)DL+`Qqx8bmSv%J+qdQd*Y<;Klb{>?OW@XKPzqewj ztIkvI-K;Hlf@9cCVRdISFG4&ME?xbBnin*J=9sxZ+*CAN{PGnwwyeqzbU^u}JEz&U zujyQvjy%LMauULwp0$59k|Lxd4Icntq<^uQ3!iJ0*EJT#GqBhF5^zk{hkBT< zKNwtg4Y`s4lJ-1VzUy%1!)~>kypou8iu}HY$;B}2qhX>w`(0ya>5ndBmNHvwz@<@d z)_T3Arr!pCuZ?)(&jZ=LnXHsU&B)ifpJd12LpQF3x4*zCIMUlbov*YMkDIX`ZQ}#B zDEm7;2>6H|!x9eQMZTTQ#83yK07tV{aiGreb{XKo=?{!()DRH+$I-(B{q;fyyO2n) z-rGbBGoMjZLapRim!$3W&f}tbELYcO^N@9^$@oA{Fw|v>Jo^sP%|m`>OsVrmyd1`r z*_-ScUuU|lzR~%OHT$uyWNQuw)pj`yF@eLl^+;zNjqf~|6huSAAIGYnALff2fZP5> zz7ARH{>mIa^RkT@w4ZV!CXF(cDn9w9CcPN-d;=6xcKKM>?vd2tUshA!XM9hA9JplyPAlKHA3W}2f4;=EdS9$VRk zJd#7BDuS+qpm{NTo#0B*Oj{$Z2l2)5j>joob07T0UCp(y#jl_ioRJq7;CrcFZ;7+D ziT+n)gme?&`MZ8Q3URYd1 zUXO6*c;TeIhsi*l(c2?lau-s#yIh8Vm$bBPLkB24pwd6-v8=f_57U7s_X=;?ZMPX$=V+KD?D%h69Plxj z6s25MR;B`_3y$P%?|Wl%v9)a+)Xt1ovYG0-8ZEx;{wk%oGLr8D(F1mGIiIYKO7qIT zkyAXybQE{@&#($=@kZpE5&n7R;k?&LuC|WbUG$$?mLATHDk-iOwVbXY!1z4~OSn zL9Iql5xuH}kpF|{#T-2i$=3HA7g2YTKZSXE!U$;^53~)*>eS`jehs0aZ z?~}w>o$4HP*axMt=ZuDj#B+$8z;s<~`^+`;?9euOJhNPximpeOXZLVk`?)op?#1LI zsEJ(3NA-`GoL{a>z!{Z>a*D$!ZnSUCRhF+h1{YrQx-{HFin8WzZefO{l z8cNaM;e7wxPv4B1qdM6*FoUE$-f@ij7)Qn+%qi1X#m$C)|q*>heV z_F1E1;>jFo_X_SxU4z7K=dzD=a^~oL!C9SEV-!KD$#mnz60qM-#pJFWBjB{A91?@LxNGc9%0{4?@cU#Y7z;WB&(t+Ux8ij z{ywC~@RW4y=k@~>Rr8pTmb$u=7qLo2Vpes~6>g_ENtTY7^pVeIg!wVc`DUmbY|`3M z-R+tCPAunS>R|zng`6f_20?)pLm}bSq%ja@pW1*wXr=T!IW0oYP6_8+GG^?eKvEc| z0FC0qr5|LsL5JWpacSeAuHLx1qO#F6G*`!D4x6a;L#0WM=HD&Vnsp=Ye)1&&^=NgK z$R=p#49`^kf{*a{V%70)-|osKU4qK8u*Ee`n^}AVgiVqOGq`)`$~)h-UbZ_TpWn5) z4AU%KuIEO^Hr5rLcT?KcOFj<^6-E5p*F`RXe_*jNQ-<*{pcs{>ypy$kvv5&h_=hdL<+0wfo7i8Zr zN2QPM2zwaYFfOrCFU7(G*GymiiuOMUH#o1w-P5{_<`RmBx9=5gvCW1?z*U9M+@ATPF1Psy-Tq}n0&H9|(XuzmZW30{I#a|z_}fb*J@}$Os9qoBgJ+y# zL#8>}`N|}X{(N$J8f*=>O{m7)%z$pbzMS2$yb0xce}L`230Nn-UPkBNZy?Asat0>M==4pw7^P*~|GtzfgB9oEz zSk=B0wEed=|Ip)4I}(ZDBYlprm6N!l&1a{)JCR@4>nZ9els~Gu+`<5ezJ3A;{B3`Ck6-7#p ziFkA{?4$2BcHuw~sGfB+sGG>sgP(eW)M^H@39}u3uf^6HSPdw&q^1jxpusc>E1p9-Su?Z)!3+F+@GwHP~|a`e`o(nklU0c z$M)W3BB{3Wn$(JgntlTNAP(iL>=b;wqp`!xMfLpa7@%+oG3L2vFv0Yd{WYP^a(Nq8 z;2jw%*$3xNJbL7%aTo}j30ZXHpm9k0sVi_dl8xNyUxDA006-~CjL%1|Og^BvD;u`5 z8eUsPX>1Jry+fY`?0PYEo<6g2_UycjSnM=1^3)pT)`AiKgWBpcxjSg3%AirFd5eP* zjvhK=PEj=}3VEoUv38N5?p1FxcdB>$Mz7(sJzqFUM>lEr#N`oGvZQdU_A z`K|dEXc~4j2p{1d#j?jW&BI$yC00u2CH5F#XOFeDJdb_wrIAZDw(D<$uoFNSLNQjK zmiC)`+pCCs75<1NJK7S?oxlh4Tt%Ivo^LVH@gw3D
4)|DOKg<>hv+aNnO=o?qd) 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ϣ%UY8`RWp~V-U_7 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 CLkb=M literal 0 HcmV?d00001 diff --git a/members/missop/task5/web/src/app/fonts/GeistVF.woff b/members/missop/task5/web/src/app/fonts/GeistVF.woff new file mode 100644 index 0000000000000000000000000000000000000000..1b62daacff96dad6584e71cd962051b82957c313 GIT binary patch literal 66268 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 >-Aun5A4Gp>4U0IQJ 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 G)cz05(PHWV literal 0 HcmV?d00001 diff --git a/members/missop/task5/web/src/app/globals.css b/members/missop/task5/web/src/app/globals.css new file mode 100644 index 000000000..e443fdd4d --- /dev/null +++ b/members/missop/task5/web/src/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +/* @media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} */ + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} diff --git a/members/missop/task5/web/src/app/layout.js b/members/missop/task5/web/src/app/layout.js new file mode 100644 index 000000000..8c8f38a8d --- /dev/null +++ b/members/missop/task5/web/src/app/layout.js @@ -0,0 +1,30 @@ +import Provider from "./provider"; + +import localFont from "next/font/local"; +import "./globals.css"; + +const geistSans = localFont({ + src: "./fonts/GeistVF.woff", + variable: "--font-geist-sans", + weight: "100 900", +}); +const geistMono = localFont({ + src: "./fonts/GeistMonoVF.woff", + variable: "--font-geist-mono", + weight: "100 900", +}); + +export const metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ children }) { + return ( + + + {children} + + + ); +} diff --git a/members/missop/task5/web/src/app/page.js b/members/missop/task5/web/src/app/page.js new file mode 100644 index 000000000..e1fde6f24 --- /dev/null +++ b/members/missop/task5/web/src/app/page.js @@ -0,0 +1,23 @@ +"use client"; + +import { ConnectButton } from "@rainbow-me/rainbowkit"; +import { useAccount } from "wagmi"; +import Operations from "./components/Operations"; +import ListNFTs from "./components/ListNFTs"; + +export default function Home() { + const account = useAccount(); + + return ( +
+
+ Missop NFT 市场 + +
+
+ + {account.address && } +
+
+ ); +} diff --git a/members/missop/task5/web/src/app/provider.js b/members/missop/task5/web/src/app/provider.js new file mode 100644 index 000000000..6f2ac1af2 --- /dev/null +++ b/members/missop/task5/web/src/app/provider.js @@ -0,0 +1,21 @@ +"use client"; + +import { WagmiProvider } from "wagmi"; +import { RainbowKitProvider } from "@rainbow-me/rainbowkit"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; + +import config from "./config"; + +import "@rainbow-me/rainbowkit/styles.css"; + +const queryClient = new QueryClient(); + +export default function Provider({ children }) { + return ( + + + {children} + + + ); +} diff --git a/members/missop/task5/web/src/assets/abi/MissopToken.json b/members/missop/task5/web/src/assets/abi/MissopToken.json new file mode 100644 index 000000000..aecf702de --- /dev/null +++ b/members/missop/task5/web/src/assets/abi/MissopToken.json @@ -0,0 +1,444 @@ +{ + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "transactionIndex": 0, + "gasUsed": "1169429", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x9ec4f29e21ee84a18bb8adee18a483337388ce6d6b91995a044c28464572d768", + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 1, + "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", + "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ], + "data": "0x000000000000000000000000000000000000000000000000002386f26fc10000", + "logIndex": 0, + "blockHash": "0x9ec4f29e21ee84a18bb8adee18a483337388ce6d6b91995a044c28464572d768" + } + ], + "blockNumber": 1, + "cumulativeGasUsed": "1169429", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "2af2f9ba1a66ee6f5c17052112925613", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MissopToken.sol\":\"MissopToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(address from, address to, uint256 amount) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(address owner, address spender, uint256 amount) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n}\\n\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/MissopToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract MissopToken is ERC20{\\n constructor() ERC20(\\\"MissopToken\\\",\\\"MT\\\") {\\n // \\u521d\\u59cb\\u5316\\u7ed9\\u5408\\u7ea6 mint \\u8fd9\\u4e48\\u591a token\\n _mint(msg.sender, 10000000000*10**6);\\n }\\n\\n function decimals()public view virtual override returns (uint8) {\\n return 6;\\n }\\n}\",\"keccak256\":\"0x4784f8877f71ac0d29af4a74a438953c39a7c9cf04759fe10fd5126b6a03b19b\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4d6973736f70546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d5400000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004b4565b508060049081620000a19190620004b4565b505050620000bd33662386f26fc10000620000c360201b60201c565b620006b6565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000135576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012c90620005fc565b60405180910390fd5b62000149600083836200023060201b60201c565b80600260008282546200015d91906200064d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000210919062000699565b60405180910390a36200022c600083836200023560201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bc57607f821691505b602082108103620002d257620002d162000274565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fd565b620003488683620002fd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003956200038f620003898462000360565b6200036a565b62000360565b9050919050565b6000819050919050565b620003b18362000374565b620003c9620003c0826200039c565b8484546200030a565b825550505050565b600090565b620003e0620003d1565b620003ed818484620003a6565b505050565b5b81811015620004155762000409600082620003d6565b600181019050620003f3565b5050565b601f82111562000464576200042e81620002d8565b6200043984620002ed565b8101602085101562000449578190505b620004616200045885620002ed565b830182620003f2565b50505b505050565b600082821c905092915050565b6000620004896000198460080262000469565b1980831691505092915050565b6000620004a4838362000476565b9150826002028217905092915050565b620004bf826200023a565b67ffffffffffffffff811115620004db57620004da62000245565b5b620004e78254620002a3565b620004f482828562000419565b600060209050601f8311600181146200052c576000841562000517578287015190505b62000523858262000496565b86555062000593565b601f1984166200053c86620002d8565b60005b8281101562000566578489015182556001820191506020850194506020810190506200053f565b8683101562000586578489015162000582601f89168262000476565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005e4601f836200059b565b9150620005f182620005ac565b602082019050919050565b600060208201905081810360008301526200061781620005d5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200065a8262000360565b9150620006678362000360565b92508282019050808211156200068257620006816200061e565b5b92915050565b620006938162000360565b82525050565b6000602082019050620006b0600083018462000688565b92915050565b61122f80620006c66000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", + "devdoc": { + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero." + } + }, + "kind": "dev", + "methods": { + "allowance(address,address)": { + "details": "See {IERC20-allowance}." + }, + "approve(address,uint256)": { + "details": "See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address." + }, + "balanceOf(address)": { + "details": "See {IERC20-balanceOf}." + }, + "decimals()": { + "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}." + }, + "decreaseAllowance(address,uint256)": { + "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`." + }, + "increaseAllowance(address,uint256)": { + "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address." + }, + "name()": { + "details": "Returns the name of the token." + }, + "symbol()": { + "details": "Returns the symbol of the token, usually a shorter version of the name." + }, + "totalSupply()": { + "details": "See {IERC20-totalSupply}." + }, + "transfer(address,uint256)": { + "details": "See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 80, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 86, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 88, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 90, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 92, + "contract": "contracts/MissopToken.sol:MissopToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/members/missop/task5/web/src/assets/abi/NftMarket.json b/members/missop/task5/web/src/assets/abi/NftMarket.json new file mode 100644 index 000000000..32e7c9d2c --- /dev/null +++ b/members/missop/task5/web/src/assets/abi/NftMarket.json @@ -0,0 +1,527 @@ +{ + "address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_paymentToken", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__IsListed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotApproved", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__NotOwnerOf", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "name": "NftMarket__PaymentFailed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NftListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "NftPurchased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "nftContract", + "type": "address" + } + ], + "name": "NftUnlisted", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "buyNft", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getList", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "internalType": "struct NftMarket.Listing[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + } + ], + "name": "getListsArray", + "outputs": [ + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "internalType": "struct NftMarket.Listing[]", + "name": "", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "i_paymentToken", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "listNft", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "s_listings", + "outputs": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address", + "name": "nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "unlistNft", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x5cffe0fc9c93215980181bea0df52f512e14cacb8bf6be527c608790ca8eea7a", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "transactionIndex": 0, + "gasUsed": "1556837", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x81d4d397f380c18c290b01a7eda5f1d60080fecaaa87bb2aa8286027d2b0ea73", + "transactionHash": "0x5cffe0fc9c93215980181bea0df52f512e14cacb8bf6be527c608790ca8eea7a", + "logs": [], + "blockNumber": 2, + "cumulativeGasUsed": "1556837", + "status": 1, + "byzantium": true + }, + "args": [ + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ], + "numDeployments": 1, + "solcInputHash": "6baaea9d3ae99489cad522d95836e096", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__IsListed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"}],\"name\":\"NftUnlisted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getList\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"unlistNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getList()\":{\"details\":\"\\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\"},\"getListsArray(address)\":{\"details\":\"\\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\nerror NftMarket__NotExist(string message);\\nerror NftMarket__IsListed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n uint256[] private s_tokenIds;\\n Listing[] private s_listArr;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n event NftUnlisted(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n if (s_listings[_nftContract][tokenId].isActive) {\\n revert NftMarket__IsListed(\\\"NFT already listed\\\");\\n }\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_tokenIds.push(tokenId);\\n s_listArr.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function unlistNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory item = s_listings[_nftContract][_tokenId];\\n if (!item.isActive) {\\n revert NftMarket__NotActive(\\\"not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(_tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n s_listings[_nftContract][_tokenId].isActive = false;\\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n /**\\n *\\n * @dev \\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\\n */\\n function getListsArray(\\n address _nftContract\\n ) public view returns (Listing[] memory) {\\n Listing[] memory listings = new Listing[](s_tokenIds.length);\\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\\n listings[i] = item;\\n }\\n return listings;\\n }\\n\\n /**\\n * @dev \\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\\n */\\n function getList() external view returns (Listing[] memory) {\\n return s_listArr;\\n }\\n}\\n\",\"keccak256\":\"0x71bf7b1d6f08aece5bc1796b971a39b2dafe69891cf85bb46a9d7e45a57dd6f6\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n}\\n\",\"keccak256\":\"0xf2560b5386574153057104d19a9e68a32ee912cf23c0c8df1fe9a0607f42d543\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001c0b38038062001c0b8339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b608051611ad262000139600039600081816104ff01526111d40152611ad26000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063942b765a1161005b578063942b765a146100ea578063a0b5a2ee14610108578063c922b17c1461013c578063cd2ae956146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906112b6565b610176565b6040516100a9919061143d565b60405180910390f35b6100cc60048036038101906100c7919061148b565b61037a565b005b6100e860048036038101906100e3919061148b565b6106d8565b005b6100f2610aca565b6040516100ff919061143d565b60405180910390f35b610122600480360381019061011d919061148b565b610c04565b6040516101339594939291906114f8565b60405180910390f35b6101566004803603810190610151919061154b565b610c94565b005b6101606111d2565b60405161016d91906115fd565b60405180910390f35b6060600060028054905067ffffffffffffffff81111561019957610198611618565b5b6040519080825280602002602001820160405280156101d257816020015b6101bf6111f6565b8152602001906001900390816101b75790505b50905060005b600280549050811015610370576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061023c5761023b611647565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061035157610350611647565b5b6020026020010181905250508080610368906116a5565b9150506101d8565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905080608001516104f8576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016104ef9061174a565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b81526004016105629392919061176a565b6020604051808303816000875af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906117cd565b6105e4576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105db90611846565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b81526004016106259392919061176a565b600060405180830381600087803b15801561063f57600080fd5b505af1158015610653573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106ca9190611866565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610856576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161084d906118cd565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108ab9190611866565b602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610942576040517f1901c6590000000000000000000000000000000000000000000000000000000081526004016109399061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161097d92919061199b565b602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117cd565b6109fd576040517fb85efa450000000000000000000000000000000000000000000000000000000081526004016109f490611a10565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60606003805480602002602001604051908101604052809291908181526020016000905b82821015610bfb57838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610aee565b50505050905090565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce99190611866565b602060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610d779061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610dbb92919061199b565b602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc91906117cd565b610e3b576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610e3290611a10565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610edc576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610ed390611a7c565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516111c39190611866565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061128382611258565b9050919050565b61129381611278565b811461129e57600080fd5b50565b6000813590506112b08161128a565b92915050565b6000602082840312156112cc576112cb611253565b5b60006112da848285016112a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131881611278565b82525050565b6000819050919050565b6113318161131e565b82525050565b60008115159050919050565b61134c81611337565b82525050565b60a082016000820151611368600085018261130f565b50602082015161137b602085018261130f565b50604082015161138e6040850182611328565b5060608201516113a16060850182611328565b5060808201516113b46080850182611343565b50505050565b60006113c68383611352565b60a08301905092915050565b6000602082019050919050565b60006113ea826112e3565b6113f481856112ee565b93506113ff836112ff565b8060005b8381101561143057815161141788826113ba565b9750611422836113d2565b925050600181019050611403565b5085935050505092915050565b6000602082019050818103600083015261145781846113df565b905092915050565b6114688161131e565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b600080604083850312156114a2576114a1611253565b5b60006114b0858286016112a1565b92505060206114c185828601611476565b9150509250929050565b6114d481611278565b82525050565b6114e38161131e565b82525050565b6114f281611337565b82525050565b600060a08201905061150d60008301886114cb565b61151a60208301876114cb565b61152760408301866114da565b61153460608301856114da565b61154160808301846114e9565b9695505050505050565b60008060006060848603121561156457611563611253565b5b6000611572868287016112a1565b935050602061158386828701611476565b925050604061159486828701611476565b9150509250925092565b6000819050919050565b60006115c36115be6115b984611258565b61159e565b611258565b9050919050565b60006115d5826115a8565b9050919050565b60006115e7826115ca565b9050919050565b6115f7816115dc565b82525050565b600060208201905061161260008301846115ee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b08261131e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e2576116e1611676565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611734600e836116ed565b915061173f826116fe565b602082019050919050565b6000602082019050818103600083015261176381611727565b9050919050565b600060608201905061177f60008301866114cb565b61178c60208301856114cb565b61179960408301846114da565b949350505050565b6117aa81611337565b81146117b557600080fd5b50565b6000815190506117c7816117a1565b92915050565b6000602082840312156117e3576117e2611253565b5b60006117f1848285016117b8565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611830600e836116ed565b915061183b826117fa565b602082019050919050565b6000602082019050818103600083015261185f81611823565b9050919050565b600060208201905061187b60008301846114da565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b60006118b7600a836116ed565b91506118c282611881565b602082019050919050565b600060208201905081810360008301526118e6816118aa565b9050919050565b6000815190506118fc8161128a565b92915050565b60006020828403121561191857611917611253565b5b6000611926848285016118ed565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b60006119656018836116ed565b91506119708261192f565b602082019050919050565b6000602082019050818103600083015261199481611958565b9050919050565b60006040820190506119b060008301856114cb565b6119bd60208301846114cb565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b60006119fa600c836116ed565b9150611a05826119c4565b602082019050919050565b60006020820190508181036000830152611a29816119ed565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611a666012836116ed565b9150611a7182611a30565b602082019050919050565b60006020820190508181036000830152611a9581611a59565b905091905056fea2646970667358221220c24d37e86dc378b7e8045a61d61aec786f11eb258fd51991c9cd9959d93dceb764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063942b765a1161005b578063942b765a146100ea578063a0b5a2ee14610108578063c922b17c1461013c578063cd2ae956146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906112b6565b610176565b6040516100a9919061143d565b60405180910390f35b6100cc60048036038101906100c7919061148b565b61037a565b005b6100e860048036038101906100e3919061148b565b6106d8565b005b6100f2610aca565b6040516100ff919061143d565b60405180910390f35b610122600480360381019061011d919061148b565b610c04565b6040516101339594939291906114f8565b60405180910390f35b6101566004803603810190610151919061154b565b610c94565b005b6101606111d2565b60405161016d91906115fd565b60405180910390f35b6060600060028054905067ffffffffffffffff81111561019957610198611618565b5b6040519080825280602002602001820160405280156101d257816020015b6101bf6111f6565b8152602001906001900390816101b75790505b50905060005b600280549050811015610370576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061023c5761023b611647565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061035157610350611647565b5b6020026020010181905250508080610368906116a5565b9150506101d8565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905080608001516104f8576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016104ef9061174a565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b81526004016105629392919061176a565b6020604051808303816000875af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906117cd565b6105e4576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105db90611846565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b81526004016106259392919061176a565b600060405180830381600087803b15801561063f57600080fd5b505af1158015610653573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106ca9190611866565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610856576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161084d906118cd565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108ab9190611866565b602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610942576040517f1901c6590000000000000000000000000000000000000000000000000000000081526004016109399061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161097d92919061199b565b602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117cd565b6109fd576040517fb85efa450000000000000000000000000000000000000000000000000000000081526004016109f490611a10565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60606003805480602002602001604051908101604052809291908181526020016000905b82821015610bfb57838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610aee565b50505050905090565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce99190611866565b602060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610d779061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610dbb92919061199b565b602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc91906117cd565b610e3b576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610e3290611a10565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610edc576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610ed390611a7c565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516111c39190611866565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061128382611258565b9050919050565b61129381611278565b811461129e57600080fd5b50565b6000813590506112b08161128a565b92915050565b6000602082840312156112cc576112cb611253565b5b60006112da848285016112a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131881611278565b82525050565b6000819050919050565b6113318161131e565b82525050565b60008115159050919050565b61134c81611337565b82525050565b60a082016000820151611368600085018261130f565b50602082015161137b602085018261130f565b50604082015161138e6040850182611328565b5060608201516113a16060850182611328565b5060808201516113b46080850182611343565b50505050565b60006113c68383611352565b60a08301905092915050565b6000602082019050919050565b60006113ea826112e3565b6113f481856112ee565b93506113ff836112ff565b8060005b8381101561143057815161141788826113ba565b9750611422836113d2565b925050600181019050611403565b5085935050505092915050565b6000602082019050818103600083015261145781846113df565b905092915050565b6114688161131e565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b600080604083850312156114a2576114a1611253565b5b60006114b0858286016112a1565b92505060206114c185828601611476565b9150509250929050565b6114d481611278565b82525050565b6114e38161131e565b82525050565b6114f281611337565b82525050565b600060a08201905061150d60008301886114cb565b61151a60208301876114cb565b61152760408301866114da565b61153460608301856114da565b61154160808301846114e9565b9695505050505050565b60008060006060848603121561156457611563611253565b5b6000611572868287016112a1565b935050602061158386828701611476565b925050604061159486828701611476565b9150509250925092565b6000819050919050565b60006115c36115be6115b984611258565b61159e565b611258565b9050919050565b60006115d5826115a8565b9050919050565b60006115e7826115ca565b9050919050565b6115f7816115dc565b82525050565b600060208201905061161260008301846115ee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b08261131e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e2576116e1611676565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611734600e836116ed565b915061173f826116fe565b602082019050919050565b6000602082019050818103600083015261176381611727565b9050919050565b600060608201905061177f60008301866114cb565b61178c60208301856114cb565b61179960408301846114da565b949350505050565b6117aa81611337565b81146117b557600080fd5b50565b6000815190506117c7816117a1565b92915050565b6000602082840312156117e3576117e2611253565b5b60006117f1848285016117b8565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611830600e836116ed565b915061183b826117fa565b602082019050919050565b6000602082019050818103600083015261185f81611823565b9050919050565b600060208201905061187b60008301846114da565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b60006118b7600a836116ed565b91506118c282611881565b602082019050919050565b600060208201905081810360008301526118e6816118aa565b9050919050565b6000815190506118fc8161128a565b92915050565b60006020828403121561191857611917611253565b5b6000611926848285016118ed565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b60006119656018836116ed565b91506119708261192f565b602082019050919050565b6000602082019050818103600083015261199481611958565b9050919050565b60006040820190506119b060008301856114cb565b6119bd60208301846114cb565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b60006119fa600c836116ed565b9150611a05826119c4565b602082019050919050565b60006020820190508181036000830152611a29816119ed565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611a666012836116ed565b9150611a7182611a30565b602082019050919050565b60006020820190508181036000830152611a9581611a59565b905091905056fea2646970667358221220c24d37e86dc378b7e8045a61d61aec786f11eb258fd51991c9cd9959d93dceb764736f6c63430008140033", + "devdoc": { + "kind": "dev", + "methods": { + "getList()": { + "details": "从数组中获取,对比两者差异" + }, + "getListsArray(address)": { + "details": "从 s_listings 中获取上架的 NFT" + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 10, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "_status", + "offset": 0, + "slot": "0", + "type": "t_uint256" + }, + { + "astId": 320, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "s_listings", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)313_storage))" + }, + { + "astId": 323, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "s_tokenIds", + "offset": 0, + "slot": "2", + "type": "t_array(t_uint256)dyn_storage" + }, + { + "astId": 327, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "s_listArr", + "offset": 0, + "slot": "3", + "type": "t_array(t_struct(Listing)313_storage)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Listing)313_storage)dyn_storage": { + "base": "t_struct(Listing)313_storage", + "encoding": "dynamic_array", + "label": "struct NftMarket.Listing[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)313_storage))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(uint256 => struct NftMarket.Listing))", + "numberOfBytes": "32", + "value": "t_mapping(t_uint256,t_struct(Listing)313_storage)" + }, + "t_mapping(t_uint256,t_struct(Listing)313_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct NftMarket.Listing)", + "numberOfBytes": "32", + "value": "t_struct(Listing)313_storage" + }, + "t_struct(Listing)313_storage": { + "encoding": "inplace", + "label": "struct NftMarket.Listing", + "members": [ + { + "astId": 304, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "seller", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 306, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "nftContract", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 308, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "tokenId", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 310, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "price", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 312, + "contract": "contracts/NftMarket.sol:NftMarket", + "label": "isActive", + "offset": 0, + "slot": "4", + "type": "t_bool" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/members/missop/task5/web/src/assets/abi/NftToken.json b/members/missop/task5/web/src/assets/abi/NftToken.json new file mode 100644 index 000000000..f281c6dc4 --- /dev/null +++ b/members/missop/task5/web/src/assets/abi/NftToken.json @@ -0,0 +1,574 @@ +{ + "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "string", + "name": "_baseUri", + "type": "string" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x4e8bbf51dd46e56a9dab30e658b41fadeef3041f6f80ada1febb74cf478fbb7a", + "receipt": { + "to": null, + "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "contractAddress": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "transactionIndex": 0, + "gasUsed": "2396710", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x5f237a55e74ec91e08f4f8a0878770264023eac2a3fe9f4af8dd8404d113613a", + "transactionHash": "0x4e8bbf51dd46e56a9dab30e658b41fadeef3041f6f80ada1febb74cf478fbb7a", + "logs": [], + "blockNumber": 3, + "cumulativeGasUsed": "2396710", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "c6aaaff768b13d48c1e916369f33894e", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_baseUri\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftToken.sol\":\"NftToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\\n * that `ownerOf(tokenId)` is `a`.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\\n _balances[account] += amount;\\n }\\n}\\n\",\"keccak256\":\"0x2c309e7df9e05e6ce15bedfe74f3c61b467fc37e0fae9eab496acf5ea0bbd7ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"contracts/NftToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract NftToken is ERC721 {\\n using Counters for Counters.Counter;\\n Counters.Counter private _tokenIdCounter;\\n string private baseUri;\\n\\n // \\u6bcf mint \\u4e00\\u4e2a nft \\u90fd\\u9700\\u8981\\u628a count+1 \\u8868\\u793a nft \\u603b\\u6570\\u91cf\\n constructor() ERC721(\\\"NftToken\\\", \\\"NT\\\") {\\n _tokenIdCounter.increment();\\n }\\n\\n function mint(address to, string memory _baseUri) public {\\n baseUri = _baseUri;\\n uint256 tokenId = _tokenIdCounter.current();\\n _tokenIdCounter.increment();\\n _safeMint(to, tokenId);\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return baseUri;\\n }\\n}\\n\",\"keccak256\":\"0xe5bd71f34753632d2a366d45f753674a2fb002dbd700e8d50ea4273f92f3d47f\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6674546f6b656e0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e5400000000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200034c565b508060019081620000a191906200034c565b505050620000b66006620000bc60201b60201c565b62000433565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200015457607f821691505b6020821081036200016a57620001696200010c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000195565b620001e0868362000195565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200022d620002276200022184620001f8565b62000202565b620001f8565b9050919050565b6000819050919050565b62000249836200020c565b62000261620002588262000234565b848454620001a2565b825550505050565b600090565b6200027862000269565b620002858184846200023e565b505050565b5b81811015620002ad57620002a16000826200026e565b6001810190506200028b565b5050565b601f821115620002fc57620002c68162000170565b620002d18462000185565b81016020851015620002e1578190505b620002f9620002f08562000185565b8301826200028a565b50505b505050565b600082821c905092915050565b6000620003216000198460080262000301565b1980831691505092915050565b60006200033c83836200030e565b9150826002028217905092915050565b6200035782620000d2565b67ffffffffffffffff811115620003735762000372620000dd565b5b6200037f82546200013b565b6200038c828285620002b1565b600060209050601f831160018114620003c45760008415620003af578287015190505b620003bb85826200032e565b8655506200042b565b601f198416620003d48662000170565b60005b82811015620003fe57848901518255600182019150602085019450602081019050620003d7565b868310156200041e57848901516200041a601f8916826200030e565b8355505b6001600288020188555050505b505050505050565b61291680620004436000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", + "devdoc": { + "events": { + "Approval(address,address,uint256)": { + "details": "Emitted when `owner` enables `approved` to manage the `tokenId` token." + }, + "ApprovalForAll(address,address,bool)": { + "details": "Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets." + }, + "Transfer(address,address,uint256)": { + "details": "Emitted when `tokenId` token is transferred from `from` to `to`." + } + }, + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "supportsInterface(bytes4)": { + "details": "See {IERC165-supportsInterface}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "details": "See {IERC721Metadata-tokenURI}." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 168, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_name", + "offset": 0, + "slot": "0", + "type": "t_string_storage" + }, + { + "astId": 170, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_symbol", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 174, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_owners", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 178, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_balances", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 182, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_tokenApprovals", + "offset": 0, + "slot": "4", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 188, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_operatorApprovals", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 3248, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_tokenIdCounter", + "offset": 0, + "slot": "6", + "type": "t_struct(Counter)1596_storage" + }, + { + "astId": 3250, + "contract": "contracts/NftToken.sol:NftToken", + "label": "baseUri", + "offset": 0, + "slot": "7", + "type": "t_string_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Counter)1596_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "members": [ + { + "astId": 1595, + "contract": "contracts/NftToken.sol:NftToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ], + "numberOfBytes": "32" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/members/missop/task5/web/src/hooks/contract.js b/members/missop/task5/web/src/hooks/contract.js new file mode 100644 index 000000000..ecf5db631 --- /dev/null +++ b/members/missop/task5/web/src/hooks/contract.js @@ -0,0 +1,184 @@ +import { useAccount, useReadContract, useWriteContract, useWatchContractEvent } from "wagmi"; + +import MissopToken from "@/assets/abi/MissopToken.json"; +import NftToken from "@/assets/abi/NftToken.json"; +import NftMarket from "@/assets/abi/NftMarket.json"; + +const NftAbi = NftToken.abi; +const NftMarketAbi = NftMarket.abi; +const NftTokenContractAddress = process.env.NftTokenContractAddress; +const NftMarketContractAddress = process.env.NftMarketContractAddress; +const MissopTokenAddress = process.env.MissopTokenContractAddress; + +const NFTContractParams = { + abi: NftAbi, + address: NftTokenContractAddress, +}; +const NFTMarketParams = { + abi: NftMarketAbi, + address: NftMarketContractAddress, +}; +const MissopTokenParams = { + abi: MissopToken.abi, + address: MissopTokenAddress, +}; +console.log(MissopTokenParams, NFTMarketParams, NFTContractParams); + +/** + * 写入操作所有方法 + * @returns + */ +export function useWrite() { + const account = useAccount(); + const { writeContractAsync } = useWriteContract(); + + /** + * 上架 NFT + * @param {*} tokenId + * @param {*} price + * @returns + */ + async function listNFT(tokenId, price) { + try { + return await writeContractAsync({ + functionName: "listNft", + args: [NftTokenContractAddress, tokenId, price], + ...NFTMarketParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 铸造 NFT + * @returns + */ + async function mintNFT(baseUri) { + try { + return await writeContractAsync({ + functionName: "mint", + args: [account.address, baseUri], + ...NFTContractParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 调用setApprovalForAll,参数为NFTMarket 合约地址和 true + * @returns + */ + async function setApprovalForAll() { + try { + return await writeContractAsync({ + functionName: "setApprovalForAll", + args: [NftMarketContractAddress, true], + ...NFTContractParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 授权NFTMarket 合约使用 MT 代币额度,因此参数为NFTMarket 合约地址 + * @param {*} params + */ + async function approveAmount(amount) { + try { + return await writeContractAsync({ + functionName: "approve", + args: [NftMarketContractAddress, amount], + ...MissopTokenParams, + }); + } catch (error) { + console.log("error", error); + } + } + + /** + * 购买 NFT + * @param {*} _tokenId + * @returns + */ + async function buyNFT(_tokenId) { + try { + return await writeContractAsync({ + functionName: "buyNft", + args: [NftTokenContractAddress, _tokenId], + ...NFTMarketParams, + }); + } catch (error) { + console.log("error", error); + } + } + + async function unlistNFT(_tokenId) { + try { + return await writeContractAsync({ + functionName: "unlistNft", + args: [NftMarketContractAddress, _tokenId], + ...NFTMarketParams, + }); + } catch (error) { + console.log("error", error); + } + } + + return { + listNFT, + buyNFT, + mintNFT, + approveAmount, + setApprovalForAll, + unlistNFT, + }; +} + +/** + * 获取所有上架的 NFT + * @returns + */ +export function useGetListsNFTs() { + const { data, error } = useReadContract({ + ...NFTMarketParams, + functionName: "getListsArray", + args: [NftMarketContractAddress], + }); + + console.log("error", error); + + return data; +} + +/** + * 获取所有上架的 NFT + */ +export function useNftList() { + const { data, error } = useReadContract({ + ...NFTMarketParams, + functionName: "getList", + args: [], + }); + + console.log("error", error); + return data; +} + +const useWatchParams = { + NFTContractParams, + NFTMarketParams, + MissopTokenParams, +}; + +export function useWatchEvent({ key, eventName, onSuccess, onError }) { + const params = useWatchParams[key] || {}; + useWatchContractEvent({ + ...params, + eventName, + onLogs: onSuccess, + onError, + }); +} diff --git a/members/missop/task5/web/tailwind.config.js b/members/missop/task5/web/tailwind.config.js new file mode 100644 index 000000000..abf6a0fb7 --- /dev/null +++ b/members/missop/task5/web/tailwind.config.js @@ -0,0 +1,17 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + colors: { + background: "var(--background)", + foreground: "var(--foreground)", + }, + }, + }, + plugins: [], +}; From e042fe7a9800b4edbe5ce8f3532d3cf111b6d69c Mon Sep 17 00:00:00 2001 From: missop Date: Sun, 27 Oct 2024 21:59:08 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20cid=20=E5=85=B3=E8=81=94=E5=9B=BE?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task5/contracts/contracts/NftMarket.sol | 32 ++++--- .../task5/contracts/contracts/NftToken.sol | 8 +- .../deployments/localhost/MissopToken.json | 6 +- .../deployments/localhost/NftMarket.json | 62 +++++++------ .../deployments/localhost/NftToken.json | 26 +++--- .../2af2f9ba1a66ee6f5c17052112925613.json | 90 ------------------- .../c6aaaff768b13d48c1e916369f33894e.json | 81 ----------------- ... => f3ccb1b89e4cf68339a84fd309cc4f67.json} | 44 ++++++++- members/missop/task5/web/next.config.mjs | 10 +++ members/missop/task5/web/package.json | 1 + .../task5/web/src/app/components/ListNFTs.js | 51 +++++++++-- .../web/src/app/components/Operations.js | 76 +++++++++------- members/missop/task5/web/src/app/provider.js | 2 +- .../task5/web/src/app/{config.js => wagmi.js} | 0 .../task5/web/src/assets/abi/MissopToken.json | 6 +- .../task5/web/src/assets/abi/NftMarket.json | 62 +++++++------ .../task5/web/src/assets/abi/NftToken.json | 26 +++--- .../missop/task5/web/src/hooks/contract.js | 8 +- 18 files changed, 266 insertions(+), 325 deletions(-) delete mode 100644 members/missop/task5/contracts/deployments/localhost/solcInputs/2af2f9ba1a66ee6f5c17052112925613.json delete mode 100644 members/missop/task5/contracts/deployments/localhost/solcInputs/c6aaaff768b13d48c1e916369f33894e.json rename members/missop/task5/contracts/deployments/localhost/solcInputs/{6baaea9d3ae99489cad522d95836e096.json => f3ccb1b89e4cf68339a84fd309cc4f67.json} (56%) rename members/missop/task5/web/src/app/{config.js => wagmi.js} (100%) diff --git a/members/missop/task5/contracts/contracts/NftMarket.sol b/members/missop/task5/contracts/contracts/NftMarket.sol index 8a8b93f3e..798042eae 100644 --- a/members/missop/task5/contracts/contracts/NftMarket.sol +++ b/members/missop/task5/contracts/contracts/NftMarket.sol @@ -19,12 +19,14 @@ contract NftMarket is ReentrancyGuard { address nftContract; uint256 tokenId; uint256 price; + uint256 listTime; + string cid; bool isActive; } mapping(address => mapping(uint256 => Listing)) public s_listings; uint256[] private s_tokenIds; - Listing[] private s_listArr; + // Listing[] private s_listArr; IERC20 public immutable i_paymentToken; // 上架 nft 事件 @@ -56,7 +58,8 @@ contract NftMarket is ReentrancyGuard { function listNft( address _nftContract, uint256 tokenId, - uint256 price + uint256 price, + string memory cid ) external { IERC721 nft = IERC721(_nftContract); if (nft.ownerOf(tokenId) != msg.sender) { @@ -68,16 +71,19 @@ contract NftMarket is ReentrancyGuard { if (s_listings[_nftContract][tokenId].isActive) { revert NftMarket__IsListed("NFT already listed"); } + uint256 listTime = block.timestamp; Listing memory item = Listing( msg.sender, _nftContract, tokenId, price, + listTime, + cid, true ); s_listings[_nftContract][tokenId] = item; s_tokenIds.push(tokenId); - s_listArr.push(item); + // s_listArr.push(item); emit NftListed(msg.sender, tokenId, _nftContract, price); } @@ -137,14 +143,14 @@ contract NftMarket is ReentrancyGuard { /** * @dev 从数组中获取,对比两者差异 */ - function getList( - address _nftContract - ) external view returns (Listing[] memory) { - for (uint256 i = 0; i < s_listArr.length; i++) { - Listing memory item = s_listArr[i]; - Listing memory listingItem = s_listings[_nftContract][item.tokenId]; - item.isActive = listingItem.isActive; - } - return s_listArr; - } + // function getList( + // address _nftContract + // ) external view returns (Listing[] memory) { + // for (uint256 i = 0; i < s_listArr.length; i++) { + // Listing memory item = s_listArr[i]; + // Listing memory listingItem = s_listings[_nftContract][item.tokenId]; + // item.isActive = listingItem.isActive; + // } + // return s_listArr; + // } } diff --git a/members/missop/task5/contracts/contracts/NftToken.sol b/members/missop/task5/contracts/contracts/NftToken.sol index f3859242d..3a823303d 100644 --- a/members/missop/task5/contracts/contracts/NftToken.sol +++ b/members/missop/task5/contracts/contracts/NftToken.sol @@ -7,21 +7,15 @@ import "@openzeppelin/contracts/utils/Counters.sol"; contract NftToken is ERC721 { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; - string private baseUri; // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量 constructor() ERC721("NftToken", "NT") { _tokenIdCounter.increment(); } - function mint(address to, string memory _baseUri) public { - baseUri = _baseUri; + function mint(address to) public { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); } - - function _baseURI() internal view virtual override returns (string memory) { - return baseUri; - } } diff --git a/members/missop/task5/contracts/deployments/localhost/MissopToken.json b/members/missop/task5/contracts/deployments/localhost/MissopToken.json index 941f7cfdb..e39e7311a 100644 --- a/members/missop/task5/contracts/deployments/localhost/MissopToken.json +++ b/members/missop/task5/contracts/deployments/localhost/MissopToken.json @@ -285,7 +285,7 @@ "transactionIndex": 0, "gasUsed": "1169429", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000040020000000000000100000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000042000000200000000000000000000000002000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xcd72fc0f1eb928ffcdf20ba85f098639cce1127244cf9657785383d1f28e2ff7", + "blockHash": "0xd7d507a2e71f657817f41429b14cb817c0eaf261e6781f120ca9fa1b4c6b7853", "transactionHash": "0xfbb257ff0558e5ab07b961971d878eb2fb8919656f40a3995e7669fcb3aa9a96", "logs": [ { @@ -300,7 +300,7 @@ ], "data": "0x000000000000000000000000000000000000000000000000002386f26fc10000", "logIndex": 0, - "blockHash": "0xcd72fc0f1eb928ffcdf20ba85f098639cce1127244cf9657785383d1f28e2ff7" + "blockHash": "0xd7d507a2e71f657817f41429b14cb817c0eaf261e6781f120ca9fa1b4c6b7853" } ], "blockNumber": 1, @@ -310,7 +310,7 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "2af2f9ba1a66ee6f5c17052112925613", + "solcInputHash": "f3ccb1b89e4cf68339a84fd309cc4f67", "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/MissopToken.sol\":\"MissopToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(address from, address to, uint256 amount) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(address owner, address spender, uint256 amount) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n}\\n\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/MissopToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\ncontract MissopToken is ERC20{\\n constructor() ERC20(\\\"MissopToken\\\",\\\"MT\\\") {\\n // \\u521d\\u59cb\\u5316\\u7ed9\\u5408\\u7ea6 mint \\u8fd9\\u4e48\\u591a token\\n _mint(msg.sender, 10000000000*10**6);\\n }\\n\\n function decimals()public view virtual override returns (uint8) {\\n return 6;\\n }\\n}\",\"keccak256\":\"0x4784f8877f71ac0d29af4a74a438953c39a7c9cf04759fe10fd5126b6a03b19b\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4d6973736f70546f6b656e0000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4d5400000000000000000000000000000000000000000000000000000000000081525081600390816200008f9190620004b4565b508060049081620000a19190620004b4565b505050620000bd33662386f26fc10000620000c360201b60201c565b620006b6565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000135576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200012c90620005fc565b60405180910390fd5b62000149600083836200023060201b60201c565b80600260008282546200015d91906200064d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000210919062000699565b60405180910390a36200022c600083836200023560201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002bc57607f821691505b602082108103620002d257620002d162000274565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200033c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002fd565b620003488683620002fd565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003956200038f620003898462000360565b6200036a565b62000360565b9050919050565b6000819050919050565b620003b18362000374565b620003c9620003c0826200039c565b8484546200030a565b825550505050565b600090565b620003e0620003d1565b620003ed818484620003a6565b505050565b5b81811015620004155762000409600082620003d6565b600181019050620003f3565b5050565b601f82111562000464576200042e81620002d8565b6200043984620002ed565b8101602085101562000449578190505b620004616200045885620002ed565b830182620003f2565b50505b505050565b600082821c905092915050565b6000620004896000198460080262000469565b1980831691505092915050565b6000620004a4838362000476565b9150826002028217905092915050565b620004bf826200023a565b67ffffffffffffffff811115620004db57620004da62000245565b5b620004e78254620002a3565b620004f482828562000419565b600060209050601f8311600181146200052c576000841562000517578287015190505b62000523858262000496565b86555062000593565b601f1984166200053c86620002d8565b60005b8281101562000566578489015182556001820191506020850194506020810190506200053f565b8683101562000586578489015162000582601f89168262000476565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620005e4601f836200059b565b9150620005f182620005ac565b602082019050919050565b600060208201905081810360008301526200061781620005d5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200065a8262000360565b9150620006678362000360565b92508282019050808211156200068257620006816200061e565b5b92915050565b620006938162000360565b82525050565b6000602082019050620006b0600083018462000688565b92915050565b61122f80620006c66000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220dad5e788bc06966bd04e5662b8eabbe46f8867b3f7e4265ea60f54087f29a4d064736f6c63430008140033", diff --git a/members/missop/task5/contracts/deployments/localhost/NftMarket.json b/members/missop/task5/contracts/deployments/localhost/NftMarket.json index 7357062d4..41ee66941 100644 --- a/members/missop/task5/contracts/deployments/localhost/NftMarket.json +++ b/members/missop/task5/contracts/deployments/localhost/NftMarket.json @@ -173,7 +173,13 @@ "type": "function" }, { - "inputs": [], + "inputs": [ + { + "internalType": "address", + "name": "_nftContract", + "type": "address" + } + ], "name": "getList", "outputs": [ { @@ -357,19 +363,19 @@ "type": "function" } ], - "transactionHash": "0x5cffe0fc9c93215980181bea0df52f512e14cacb8bf6be527c608790ca8eea7a", + "transactionHash": "0x423d3b4d91455af71b8350d2b267979c33d0603d0b8e0efaf02c0131e731363d", "receipt": { "to": null, "from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "contractAddress": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "transactionIndex": 0, - "gasUsed": "1556837", + "gasUsed": "1680549", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0ea5d8bf824025bd919ac46d2070fecc3dfa38dda51881fb5b0f643d71bc13fa", - "transactionHash": "0x5cffe0fc9c93215980181bea0df52f512e14cacb8bf6be527c608790ca8eea7a", + "blockHash": "0x72d09177fa1021c8d53c4fd9e0179852fb0dc24f4759491dfb61579e5a843d73", + "transactionHash": "0x423d3b4d91455af71b8350d2b267979c33d0603d0b8e0efaf02c0131e731363d", "logs": [], "blockNumber": 2, - "cumulativeGasUsed": "1556837", + "cumulativeGasUsed": "1680549", "status": 1, "byzantium": true }, @@ -377,14 +383,14 @@ "0x5FbDB2315678afecb367f032d93F642f64180aa3" ], "numDeployments": 1, - "solcInputHash": "6baaea9d3ae99489cad522d95836e096", - "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__IsListed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"}],\"name\":\"NftUnlisted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getList\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"unlistNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getList()\":{\"details\":\"\\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\"},\"getListsArray(address)\":{\"details\":\"\\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\nerror NftMarket__NotExist(string message);\\nerror NftMarket__IsListed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n uint256[] private s_tokenIds;\\n Listing[] private s_listArr;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n event NftUnlisted(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n if (s_listings[_nftContract][tokenId].isActive) {\\n revert NftMarket__IsListed(\\\"NFT already listed\\\");\\n }\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_tokenIds.push(tokenId);\\n s_listArr.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function unlistNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory item = s_listings[_nftContract][_tokenId];\\n if (!item.isActive) {\\n revert NftMarket__NotActive(\\\"not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(_tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n s_listings[_nftContract][_tokenId].isActive = false;\\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n /**\\n *\\n * @dev \\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\\n */\\n function getListsArray(\\n address _nftContract\\n ) public view returns (Listing[] memory) {\\n Listing[] memory listings = new Listing[](s_tokenIds.length);\\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\\n listings[i] = item;\\n }\\n return listings;\\n }\\n\\n /**\\n * @dev \\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\\n */\\n function getList() external view returns (Listing[] memory) {\\n return s_listArr;\\n }\\n}\\n\",\"keccak256\":\"0x71bf7b1d6f08aece5bc1796b971a39b2dafe69891cf85bb46a9d7e45a57dd6f6\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n}\\n\",\"keccak256\":\"0xf2560b5386574153057104d19a9e68a32ee912cf23c0c8df1fe9a0607f42d543\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001c0b38038062001c0b8339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b608051611ad262000139600039600081816104ff01526111d40152611ad26000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063942b765a1161005b578063942b765a146100ea578063a0b5a2ee14610108578063c922b17c1461013c578063cd2ae956146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906112b6565b610176565b6040516100a9919061143d565b60405180910390f35b6100cc60048036038101906100c7919061148b565b61037a565b005b6100e860048036038101906100e3919061148b565b6106d8565b005b6100f2610aca565b6040516100ff919061143d565b60405180910390f35b610122600480360381019061011d919061148b565b610c04565b6040516101339594939291906114f8565b60405180910390f35b6101566004803603810190610151919061154b565b610c94565b005b6101606111d2565b60405161016d91906115fd565b60405180910390f35b6060600060028054905067ffffffffffffffff81111561019957610198611618565b5b6040519080825280602002602001820160405280156101d257816020015b6101bf6111f6565b8152602001906001900390816101b75790505b50905060005b600280549050811015610370576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061023c5761023b611647565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061035157610350611647565b5b6020026020010181905250508080610368906116a5565b9150506101d8565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905080608001516104f8576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016104ef9061174a565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b81526004016105629392919061176a565b6020604051808303816000875af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906117cd565b6105e4576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105db90611846565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b81526004016106259392919061176a565b600060405180830381600087803b15801561063f57600080fd5b505af1158015610653573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106ca9190611866565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610856576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161084d906118cd565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108ab9190611866565b602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610942576040517f1901c6590000000000000000000000000000000000000000000000000000000081526004016109399061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161097d92919061199b565b602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117cd565b6109fd576040517fb85efa450000000000000000000000000000000000000000000000000000000081526004016109f490611a10565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60606003805480602002602001604051908101604052809291908181526020016000905b82821015610bfb57838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610aee565b50505050905090565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce99190611866565b602060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610d779061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610dbb92919061199b565b602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc91906117cd565b610e3b576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610e3290611a10565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610edc576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610ed390611a7c565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516111c39190611866565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061128382611258565b9050919050565b61129381611278565b811461129e57600080fd5b50565b6000813590506112b08161128a565b92915050565b6000602082840312156112cc576112cb611253565b5b60006112da848285016112a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131881611278565b82525050565b6000819050919050565b6113318161131e565b82525050565b60008115159050919050565b61134c81611337565b82525050565b60a082016000820151611368600085018261130f565b50602082015161137b602085018261130f565b50604082015161138e6040850182611328565b5060608201516113a16060850182611328565b5060808201516113b46080850182611343565b50505050565b60006113c68383611352565b60a08301905092915050565b6000602082019050919050565b60006113ea826112e3565b6113f481856112ee565b93506113ff836112ff565b8060005b8381101561143057815161141788826113ba565b9750611422836113d2565b925050600181019050611403565b5085935050505092915050565b6000602082019050818103600083015261145781846113df565b905092915050565b6114688161131e565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b600080604083850312156114a2576114a1611253565b5b60006114b0858286016112a1565b92505060206114c185828601611476565b9150509250929050565b6114d481611278565b82525050565b6114e38161131e565b82525050565b6114f281611337565b82525050565b600060a08201905061150d60008301886114cb565b61151a60208301876114cb565b61152760408301866114da565b61153460608301856114da565b61154160808301846114e9565b9695505050505050565b60008060006060848603121561156457611563611253565b5b6000611572868287016112a1565b935050602061158386828701611476565b925050604061159486828701611476565b9150509250925092565b6000819050919050565b60006115c36115be6115b984611258565b61159e565b611258565b9050919050565b60006115d5826115a8565b9050919050565b60006115e7826115ca565b9050919050565b6115f7816115dc565b82525050565b600060208201905061161260008301846115ee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b08261131e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e2576116e1611676565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611734600e836116ed565b915061173f826116fe565b602082019050919050565b6000602082019050818103600083015261176381611727565b9050919050565b600060608201905061177f60008301866114cb565b61178c60208301856114cb565b61179960408301846114da565b949350505050565b6117aa81611337565b81146117b557600080fd5b50565b6000815190506117c7816117a1565b92915050565b6000602082840312156117e3576117e2611253565b5b60006117f1848285016117b8565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611830600e836116ed565b915061183b826117fa565b602082019050919050565b6000602082019050818103600083015261185f81611823565b9050919050565b600060208201905061187b60008301846114da565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b60006118b7600a836116ed565b91506118c282611881565b602082019050919050565b600060208201905081810360008301526118e6816118aa565b9050919050565b6000815190506118fc8161128a565b92915050565b60006020828403121561191857611917611253565b5b6000611926848285016118ed565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b60006119656018836116ed565b91506119708261192f565b602082019050919050565b6000602082019050818103600083015261199481611958565b9050919050565b60006040820190506119b060008301856114cb565b6119bd60208301846114cb565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b60006119fa600c836116ed565b9150611a05826119c4565b602082019050919050565b60006020820190508181036000830152611a29816119ed565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611a666012836116ed565b9150611a7182611a30565b602082019050919050565b60006020820190508181036000830152611a9581611a59565b905091905056fea2646970667358221220c24d37e86dc378b7e8045a61d61aec786f11eb258fd51991c9cd9959d93dceb764736f6c63430008140033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063942b765a1161005b578063942b765a146100ea578063a0b5a2ee14610108578063c922b17c1461013c578063cd2ae956146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906112b6565b610176565b6040516100a9919061143d565b60405180910390f35b6100cc60048036038101906100c7919061148b565b61037a565b005b6100e860048036038101906100e3919061148b565b6106d8565b005b6100f2610aca565b6040516100ff919061143d565b60405180910390f35b610122600480360381019061011d919061148b565b610c04565b6040516101339594939291906114f8565b60405180910390f35b6101566004803603810190610151919061154b565b610c94565b005b6101606111d2565b60405161016d91906115fd565b60405180910390f35b6060600060028054905067ffffffffffffffff81111561019957610198611618565b5b6040519080825280602002602001820160405280156101d257816020015b6101bf6111f6565b8152602001906001900390816101b75790505b50905060005b600280549050811015610370576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061023c5761023b611647565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061035157610350611647565b5b6020026020010181905250508080610368906116a5565b9150506101d8565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581525050905080608001516104f8576040517fbe5d99180000000000000000000000000000000000000000000000000000000081526004016104ef9061174a565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b81526004016105629392919061176a565b6020604051808303816000875af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906117cd565b6105e4576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105db90611846565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b81526004016106259392919061176a565b600060405180830381600087803b15801561063f57600080fd5b505af1158015610653573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106ca9190611866565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610856576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161084d906118cd565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108ab9190611866565b602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610942576040517f1901c6590000000000000000000000000000000000000000000000000000000081526004016109399061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161097d92919061199b565b602060405180830381865afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117cd565b6109fd576040517fb85efa450000000000000000000000000000000000000000000000000000000081526004016109f490611a10565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060040160006101000a81548160ff0219169083151502179055508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b60606003805480602002602001604051908101604052809291908181526020016000905b82821015610bfb57838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505081526020019060010190610aee565b50505050905090565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610ce99190611866565b602060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190611902565b73ffffffffffffffffffffffffffffffffffffffff1614610d80576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610d779061197b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610dbb92919061199b565b602060405180830381865afa158015610dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfc91906117cd565b610e3b576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610e3290611a10565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610edc576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610ed390611a7c565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516111c39190611866565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061128382611258565b9050919050565b61129381611278565b811461129e57600080fd5b50565b6000813590506112b08161128a565b92915050565b6000602082840312156112cc576112cb611253565b5b60006112da848285016112a1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61131881611278565b82525050565b6000819050919050565b6113318161131e565b82525050565b60008115159050919050565b61134c81611337565b82525050565b60a082016000820151611368600085018261130f565b50602082015161137b602085018261130f565b50604082015161138e6040850182611328565b5060608201516113a16060850182611328565b5060808201516113b46080850182611343565b50505050565b60006113c68383611352565b60a08301905092915050565b6000602082019050919050565b60006113ea826112e3565b6113f481856112ee565b93506113ff836112ff565b8060005b8381101561143057815161141788826113ba565b9750611422836113d2565b925050600181019050611403565b5085935050505092915050565b6000602082019050818103600083015261145781846113df565b905092915050565b6114688161131e565b811461147357600080fd5b50565b6000813590506114858161145f565b92915050565b600080604083850312156114a2576114a1611253565b5b60006114b0858286016112a1565b92505060206114c185828601611476565b9150509250929050565b6114d481611278565b82525050565b6114e38161131e565b82525050565b6114f281611337565b82525050565b600060a08201905061150d60008301886114cb565b61151a60208301876114cb565b61152760408301866114da565b61153460608301856114da565b61154160808301846114e9565b9695505050505050565b60008060006060848603121561156457611563611253565b5b6000611572868287016112a1565b935050602061158386828701611476565b925050604061159486828701611476565b9150509250925092565b6000819050919050565b60006115c36115be6115b984611258565b61159e565b611258565b9050919050565b60006115d5826115a8565b9050919050565b60006115e7826115ca565b9050919050565b6115f7816115dc565b82525050565b600060208201905061161260008301846115ee565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006116b08261131e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036116e2576116e1611676565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611734600e836116ed565b915061173f826116fe565b602082019050919050565b6000602082019050818103600083015261176381611727565b9050919050565b600060608201905061177f60008301866114cb565b61178c60208301856114cb565b61179960408301846114da565b949350505050565b6117aa81611337565b81146117b557600080fd5b50565b6000815190506117c7816117a1565b92915050565b6000602082840312156117e3576117e2611253565b5b60006117f1848285016117b8565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611830600e836116ed565b915061183b826117fa565b602082019050919050565b6000602082019050818103600083015261185f81611823565b9050919050565b600060208201905061187b60008301846114da565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b60006118b7600a836116ed565b91506118c282611881565b602082019050919050565b600060208201905081810360008301526118e6816118aa565b9050919050565b6000815190506118fc8161128a565b92915050565b60006020828403121561191857611917611253565b5b6000611926848285016118ed565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b60006119656018836116ed565b91506119708261192f565b602082019050919050565b6000602082019050818103600083015261199481611958565b9050919050565b60006040820190506119b060008301856114cb565b6119bd60208301846114cb565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b60006119fa600c836116ed565b9150611a05826119c4565b602082019050919050565b60006020820190508181036000830152611a29816119ed565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611a666012836116ed565b9150611a7182611a30565b602082019050919050565b60006020820190508181036000830152611a9581611a59565b905091905056fea2646970667358221220c24d37e86dc378b7e8045a61d61aec786f11eb258fd51991c9cd9959d93dceb764736f6c63430008140033", + "solcInputHash": "f3ccb1b89e4cf68339a84fd309cc4f67", + "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_paymentToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__IsListed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotApproved\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__NotOwnerOf\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"NftMarket__PaymentFailed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"NftPurchased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"}],\"name\":\"NftUnlisted\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"buyNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getList\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"}],\"name\":\"getListsArray\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"internalType\":\"struct NftMarket.Listing[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_paymentToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"listNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_nftContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"unlistNft\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getList(address)\":{\"details\":\"\\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\"},\"getListsArray(address)\":{\"details\":\"\\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftMarket.sol\":\"NftMarket\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/NftMarket.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\"; // \\u9632\\u6b62\\u53cc\\u82b1\\u653b\\u51fb\\nimport \\\"hardhat/console.sol\\\";\\n\\nerror NftMarket__NotOwnerOf(string message);\\nerror NftMarket__NotApproved(string message);\\nerror NftMarket__NotActive(string message);\\nerror NftMarket__PaymentFailed(string message);\\nerror NftMarket__NotExist(string message);\\nerror NftMarket__IsListed(string message);\\n\\ncontract NftMarket is ReentrancyGuard {\\n struct Listing {\\n address seller;\\n address nftContract;\\n uint256 tokenId;\\n uint256 price;\\n bool isActive;\\n }\\n\\n mapping(address => mapping(uint256 => Listing)) public s_listings;\\n uint256[] private s_tokenIds;\\n Listing[] private s_listArr;\\n IERC20 public immutable i_paymentToken;\\n\\n // \\u4e0a\\u67b6 nft \\u4e8b\\u4ef6\\n event NftListed(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n // nft\\u8d2d\\u4e70\\u4e8b\\u4ef6\\n event NftPurchased(\\n address indexed buyer,\\n uint256 indexed tokenId,\\n address indexed nftContract,\\n uint256 price\\n );\\n\\n event NftUnlisted(\\n address indexed seller,\\n uint256 indexed tokenId,\\n address indexed nftContract\\n );\\n\\n constructor(address _paymentToken) {\\n i_paymentToken = IERC20(_paymentToken);\\n }\\n\\n function listNft(\\n address _nftContract,\\n uint256 tokenId,\\n uint256 price\\n ) external {\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n if (s_listings[_nftContract][tokenId].isActive) {\\n revert NftMarket__IsListed(\\\"NFT already listed\\\");\\n }\\n Listing memory item = Listing(\\n msg.sender,\\n _nftContract,\\n tokenId,\\n price,\\n true\\n );\\n s_listings[_nftContract][tokenId] = item;\\n s_tokenIds.push(tokenId);\\n s_listArr.push(item);\\n\\n emit NftListed(msg.sender, tokenId, _nftContract, price);\\n }\\n\\n function unlistNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory item = s_listings[_nftContract][_tokenId];\\n if (!item.isActive) {\\n revert NftMarket__NotActive(\\\"not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n if (nft.ownerOf(_tokenId) != msg.sender) {\\n revert NftMarket__NotOwnerOf(\\\"not the owner of the NFT\\\");\\n }\\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\\n revert NftMarket__NotApproved(\\\"not approved\\\");\\n }\\n item.isActive = false;\\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\\n }\\n\\n function buyNft(address _nftContract, uint256 _tokenId) external {\\n Listing memory listing = s_listings[_nftContract][_tokenId];\\n if (!listing.isActive) {\\n revert NftMarket__NotActive(\\\"NFT not active\\\");\\n }\\n IERC721 nft = IERC721(_nftContract);\\n // \\u5c06\\u8d2d\\u4e70\\u4eba\\u8eab\\u4e0a\\u7684\\u94b1\\u8f6c\\u7ed9\\u552e\\u5356\\u4eba\\n if (\\n !i_paymentToken.transferFrom(\\n msg.sender,\\n listing.seller,\\n listing.price\\n )\\n ) {\\n revert NftMarket__PaymentFailed(\\\"payment failed\\\");\\n }\\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\\n listing.isActive = false;\\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\\n }\\n\\n /**\\n *\\n * @dev \\u4ece s_listings \\u4e2d\\u83b7\\u53d6\\u4e0a\\u67b6\\u7684 NFT\\n */\\n function getListsArray(\\n address _nftContract\\n ) public view returns (Listing[] memory) {\\n Listing[] memory listings = new Listing[](s_tokenIds.length);\\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\\n listings[i] = item;\\n }\\n return listings;\\n }\\n\\n /**\\n * @dev \\u4ece\\u6570\\u7ec4\\u4e2d\\u83b7\\u53d6\\uff0c\\u5bf9\\u6bd4\\u4e24\\u8005\\u5dee\\u5f02\\n */\\n function getList(\\n address _nftContract\\n ) external view returns (Listing[] memory) {\\n for (uint256 i = 0; i < s_listArr.length; i++) {\\n Listing memory item = s_listArr[i];\\n Listing memory listingItem = s_listings[_nftContract][item.tokenId];\\n item.isActive = listingItem.isActive;\\n }\\n return s_listArr;\\n }\\n}\\n\",\"keccak256\":\"0x29f291dfb0bb1cfa7dcae49f53a9683b5d68102a121018d3c356eff8758ac872\",\"license\":\"MIT\"},\"hardhat/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.4.22 <0.9.0;\\n\\nlibrary console {\\n address constant CONSOLE_ADDRESS =\\n 0x000000000000000000636F6e736F6c652e6c6f67;\\n\\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\\n address consoleAddress = CONSOLE_ADDRESS;\\n /// @solidity memory-safe-assembly\\n assembly {\\n pop(\\n staticcall(\\n gas(),\\n consoleAddress,\\n add(payload, 32),\\n mload(payload),\\n 0,\\n 0\\n )\\n )\\n }\\n }\\n\\n function _castToPure(\\n function(bytes memory) internal view fnIn\\n ) internal pure returns (function(bytes memory) pure fnOut) {\\n assembly {\\n fnOut := fnIn\\n }\\n }\\n\\n function _sendLogPayload(bytes memory payload) internal pure {\\n _castToPure(_sendLogPayloadImplementation)(payload);\\n }\\n\\n function log() internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log()\\\"));\\n }\\n\\n function logInt(int256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(int256)\\\", p0));\\n }\\n\\n function logUint(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function logString(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function logBool(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function logAddress(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function logBytes(bytes memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n }\\n\\n function logBytes1(bytes1 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n }\\n\\n function logBytes2(bytes2 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n }\\n\\n function logBytes3(bytes3 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n }\\n\\n function logBytes4(bytes4 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n }\\n\\n function logBytes5(bytes5 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n }\\n\\n function logBytes6(bytes6 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n }\\n\\n function logBytes7(bytes7 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n }\\n\\n function logBytes8(bytes8 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n }\\n\\n function logBytes9(bytes9 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n }\\n\\n function logBytes10(bytes10 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n }\\n\\n function logBytes11(bytes11 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n }\\n\\n function logBytes12(bytes12 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n }\\n\\n function logBytes13(bytes13 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n }\\n\\n function logBytes14(bytes14 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n }\\n\\n function logBytes15(bytes15 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n }\\n\\n function logBytes16(bytes16 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n }\\n\\n function logBytes17(bytes17 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n }\\n\\n function logBytes18(bytes18 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n }\\n\\n function logBytes19(bytes19 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n }\\n\\n function logBytes20(bytes20 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n }\\n\\n function logBytes21(bytes21 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n }\\n\\n function logBytes22(bytes22 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n }\\n\\n function logBytes23(bytes23 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n }\\n\\n function logBytes24(bytes24 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n }\\n\\n function logBytes25(bytes25 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n }\\n\\n function logBytes26(bytes26 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n }\\n\\n function logBytes27(bytes27 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n }\\n\\n function logBytes28(bytes28 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n }\\n\\n function logBytes29(bytes29 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n }\\n\\n function logBytes30(bytes30 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n }\\n\\n function logBytes31(bytes31 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n }\\n\\n function logBytes32(bytes32 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n }\\n\\n function log(uint256 p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n }\\n\\n function log(string memory p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n }\\n\\n function log(bool p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n }\\n\\n function log(address p0) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n }\\n\\n function log(uint256 p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n }\\n\\n function log(string memory p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n }\\n\\n function log(bool p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n }\\n\\n function log(bool p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n }\\n\\n function log(bool p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n }\\n\\n function log(bool p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n }\\n\\n function log(address p0, uint256 p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n }\\n\\n function log(address p0, string memory p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n }\\n\\n function log(address p0, bool p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n }\\n\\n function log(address p0, address p1) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(string memory p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(bool p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, uint256 p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, string memory p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, bool p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, uint256 p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, string memory p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, bool p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n }\\n\\n function log(address p0, address p1, address p2) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(string memory p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(bool p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, string memory p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, bool p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, string memory p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, bool p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, string memory p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, bool p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n }\\n\\n function log(address p0, address p1, address p2, address p3) internal pure {\\n _sendLogPayload(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n }\\n}\\n\",\"keccak256\":\"0xf2560b5386574153057104d19a9e68a32ee912cf23c0c8df1fe9a0607f42d543\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162001e4838038062001e488339818101604052810190620000379190620000e4565b60016000819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000116565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000ac826200007f565b9050919050565b620000be816200009f565b8114620000ca57600080fd5b50565b600081519050620000de81620000b3565b92915050565b600060208284031215620000fd57620000fc6200007a565b5b60006200010d84828501620000cd565b91505092915050565b608051611d0f620001396000396000818161051101526110510152611d0f6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0b5a2ee1161005b578063a0b5a2ee146100ea578063c922b17c1461011e578063cd2ae9561461013a578063ef00e37a146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906114f3565b610188565b6040516100a9919061167a565b60405180910390f35b6100cc60048036038101906100c791906116c8565b61038c565b005b6100e860048036038101906100e391906116c8565b6106ea565b005b61010460048036038101906100ff91906116c8565b610a81565b604051610115959493929190611735565b60405180910390f35b61013860048036038101906101339190611788565b610b11565b005b61014261104f565b60405161014f919061183a565b60405180910390f35b610172600480360381019061016d91906114f3565b611073565b60405161017f919061167a565b60405180910390f35b6060600060028054905067ffffffffffffffff8111156101ab576101aa611855565b5b6040519080825280602002602001820160405280156101e457816020015b6101d1611433565b8152602001906001900390816101c95790505b50905060005b600280549050811015610382576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061024e5761024d611884565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061036357610362611884565b5b602002602001018190525050808061037a906118e2565b9150506101ea565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015161050a576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161050190611987565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b8152600401610574939291906119a7565b6020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611a0a565b6105f6576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105ed90611a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b8152600401610637939291906119a7565b600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106dc9190611aa3565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610868576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161085f90611b0a565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108bd9190611aa3565b602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610954576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161094b90611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161098f929190611bd8565b602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190611a0a565b610a0f576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610a0690611c4d565b60405180910390fd5b60008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610b669190611aa3565b602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610bf490611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610c38929190611bd8565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190611a0a565b610cb8576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610caf90611c4d565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610d59576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610d5090611cb9565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516110409190611aa3565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b6003805490508110156112f85760006003828154811061109b5761109a611884565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151826080019015159081151581525050505080806112f0906118e2565b915050611078565b506003805480602002602001604051908101604052809291908181526020016000905b8282101561142857838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250508152602001906001019061131b565b505050509050919050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114c082611495565b9050919050565b6114d0816114b5565b81146114db57600080fd5b50565b6000813590506114ed816114c7565b92915050565b60006020828403121561150957611508611490565b5b6000611517848285016114de565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611555816114b5565b82525050565b6000819050919050565b61156e8161155b565b82525050565b60008115159050919050565b61158981611574565b82525050565b60a0820160008201516115a5600085018261154c565b5060208201516115b8602085018261154c565b5060408201516115cb6040850182611565565b5060608201516115de6060850182611565565b5060808201516115f16080850182611580565b50505050565b6000611603838361158f565b60a08301905092915050565b6000602082019050919050565b600061162782611520565b611631818561152b565b935061163c8361153c565b8060005b8381101561166d57815161165488826115f7565b975061165f8361160f565b925050600181019050611640565b5085935050505092915050565b60006020820190508181036000830152611694818461161c565b905092915050565b6116a58161155b565b81146116b057600080fd5b50565b6000813590506116c28161169c565b92915050565b600080604083850312156116df576116de611490565b5b60006116ed858286016114de565b92505060206116fe858286016116b3565b9150509250929050565b611711816114b5565b82525050565b6117208161155b565b82525050565b61172f81611574565b82525050565b600060a08201905061174a6000830188611708565b6117576020830187611708565b6117646040830186611717565b6117716060830185611717565b61177e6080830184611726565b9695505050505050565b6000806000606084860312156117a1576117a0611490565b5b60006117af868287016114de565b93505060206117c0868287016116b3565b92505060406117d1868287016116b3565b9150509250925092565b6000819050919050565b60006118006117fb6117f684611495565b6117db565b611495565b9050919050565b6000611812826117e5565b9050919050565b600061182482611807565b9050919050565b61183481611819565b82525050565b600060208201905061184f600083018461182b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118ed8261155b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361191f5761191e6118b3565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611971600e8361192a565b915061197c8261193b565b602082019050919050565b600060208201905081810360008301526119a081611964565b9050919050565b60006060820190506119bc6000830186611708565b6119c96020830185611708565b6119d66040830184611717565b949350505050565b6119e781611574565b81146119f257600080fd5b50565b600081519050611a04816119de565b92915050565b600060208284031215611a2057611a1f611490565b5b6000611a2e848285016119f5565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611a6d600e8361192a565b9150611a7882611a37565b602082019050919050565b60006020820190508181036000830152611a9c81611a60565b9050919050565b6000602082019050611ab86000830184611717565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611af4600a8361192a565b9150611aff82611abe565b602082019050919050565b60006020820190508181036000830152611b2381611ae7565b9050919050565b600081519050611b39816114c7565b92915050565b600060208284031215611b5557611b54611490565b5b6000611b6384828501611b2a565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611ba260188361192a565b9150611bad82611b6c565b602082019050919050565b60006020820190508181036000830152611bd181611b95565b9050919050565b6000604082019050611bed6000830185611708565b611bfa6020830184611708565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611c37600c8361192a565b9150611c4282611c01565b602082019050919050565b60006020820190508181036000830152611c6681611c2a565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611ca360128361192a565b9150611cae82611c6d565b602082019050919050565b60006020820190508181036000830152611cd281611c96565b905091905056fea26469706673582212203284377f1419a0c20c3ed0274fd0fcdae3e823ce9346edcde948ad45eeb8683764736f6c63430008140033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a0b5a2ee1161005b578063a0b5a2ee146100ea578063c922b17c1461011e578063cd2ae9561461013a578063ef00e37a146101585761007d565b80632ad26116146100825780634ddf4f8f146100b257806354e6448e146100ce575b600080fd5b61009c600480360381019061009791906114f3565b610188565b6040516100a9919061167a565b60405180910390f35b6100cc60048036038101906100c791906116c8565b61038c565b005b6100e860048036038101906100e391906116c8565b6106ea565b005b61010460048036038101906100ff91906116c8565b610a81565b604051610115959493929190611735565b60405180910390f35b61013860048036038101906101339190611788565b610b11565b005b61014261104f565b60405161014f919061183a565b60405180910390f35b610172600480360381019061016d91906114f3565b611073565b60405161017f919061167a565b60405180910390f35b6060600060028054905067ffffffffffffffff8111156101ab576101aa611855565b5b6040519080825280602002602001820160405280156101e457816020015b6101d1611433565b8152602001906001900390816101c95790505b50905060005b600280549050811015610382576000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002848154811061024e5761024d611884565b5b906000526020600020015481526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508083838151811061036357610362611884565b5b602002602001018190525050808061037a906118e2565b9150506101ea565b5080915050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250509050806080015161050a576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161050190611987565b60405180910390fd5b60008390507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33846000015185606001516040518463ffffffff1660e01b8152600401610574939291906119a7565b6020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611a0a565b6105f6576040517f9593b4810000000000000000000000000000000000000000000000000000000081526004016105ed90611a83565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166342842e0e836000015133866040518463ffffffff1660e01b8152600401610637939291906119a7565b600060405180830381600087803b15801561065157600080fd5b505af1158015610665573d6000803e3d6000fd5b5050505060008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167f2fc5eefad2c7abf3de243dfce9d7ad1f31475139e163e1c8cef1ba87cb10fefd85606001516040516106dc9190611aa3565b60405180910390a450505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151610868576040517fbe5d991800000000000000000000000000000000000000000000000000000000815260040161085f90611b0a565b60405180910390fd5b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b81526004016108bd9190611aa3565b602060405180830381865afa1580156108da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fe9190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610954576040517f1901c65900000000000000000000000000000000000000000000000000000000815260040161094b90611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161098f929190611bd8565b602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d09190611a0a565b610a0f576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610a0690611c4d565b60405180910390fd5b60008260800190151590811515815250508373ffffffffffffffffffffffffffffffffffffffff16833373ffffffffffffffffffffffffffffffffffffffff167fad244263af1ee79c72175da87545b57c52ef828bb63c1d41ebb4437ae032633660405160405180910390a450505050565b6001602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040160009054906101000a900460ff16905085565b60008390503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610b669190611aa3565b602060405180830381865afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190611b3f565b73ffffffffffffffffffffffffffffffffffffffff1614610bfd576040517f1901c659000000000000000000000000000000000000000000000000000000008152600401610bf490611bb8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b8152600401610c38929190611bd8565b602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190611a0a565b610cb8576040517fb85efa45000000000000000000000000000000000000000000000000000000008152600401610caf90611c4d565b60405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060040160009054906101000a900460ff1615610d59576040517f84e4203b000000000000000000000000000000000000000000000000000000008152600401610d5090611cb9565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184815260200160011515815250905080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050506002849080600181540180825580915050600190039060005260206000200160009091909190915055600381908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555050508473ffffffffffffffffffffffffffffffffffffffff16843373ffffffffffffffffffffffffffffffffffffffff167fe77c968bf19b7719db31a77b3b1392ff896ba9e80d49e57381106452c9d7cc26866040516110409190611aa3565b60405180910390a45050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b6003805490508110156112f85760006003828154811061109b5761109a611884565b5b90600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090506000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000836040015181526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff16151515158152505090508060800151826080019015159081151581525050505080806112f0906118e2565b915050611078565b506003805480602002602001604051908101604052809291908181526020016000905b8282101561142857838290600052602060002090600502016040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff1615151515815250508152602001906001019061131b565b505050509050919050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006114c082611495565b9050919050565b6114d0816114b5565b81146114db57600080fd5b50565b6000813590506114ed816114c7565b92915050565b60006020828403121561150957611508611490565b5b6000611517848285016114de565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611555816114b5565b82525050565b6000819050919050565b61156e8161155b565b82525050565b60008115159050919050565b61158981611574565b82525050565b60a0820160008201516115a5600085018261154c565b5060208201516115b8602085018261154c565b5060408201516115cb6040850182611565565b5060608201516115de6060850182611565565b5060808201516115f16080850182611580565b50505050565b6000611603838361158f565b60a08301905092915050565b6000602082019050919050565b600061162782611520565b611631818561152b565b935061163c8361153c565b8060005b8381101561166d57815161165488826115f7565b975061165f8361160f565b925050600181019050611640565b5085935050505092915050565b60006020820190508181036000830152611694818461161c565b905092915050565b6116a58161155b565b81146116b057600080fd5b50565b6000813590506116c28161169c565b92915050565b600080604083850312156116df576116de611490565b5b60006116ed858286016114de565b92505060206116fe858286016116b3565b9150509250929050565b611711816114b5565b82525050565b6117208161155b565b82525050565b61172f81611574565b82525050565b600060a08201905061174a6000830188611708565b6117576020830187611708565b6117646040830186611717565b6117716060830185611717565b61177e6080830184611726565b9695505050505050565b6000806000606084860312156117a1576117a0611490565b5b60006117af868287016114de565b93505060206117c0868287016116b3565b92505060406117d1868287016116b3565b9150509250925092565b6000819050919050565b60006118006117fb6117f684611495565b6117db565b611495565b9050919050565b6000611812826117e5565b9050919050565b600061182482611807565b9050919050565b61183481611819565b82525050565b600060208201905061184f600083018461182b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006118ed8261155b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361191f5761191e6118b3565b5b600182019050919050565b600082825260208201905092915050565b7f4e4654206e6f7420616374697665000000000000000000000000000000000000600082015250565b6000611971600e8361192a565b915061197c8261193b565b602082019050919050565b600060208201905081810360008301526119a081611964565b9050919050565b60006060820190506119bc6000830186611708565b6119c96020830185611708565b6119d66040830184611717565b949350505050565b6119e781611574565b81146119f257600080fd5b50565b600081519050611a04816119de565b92915050565b600060208284031215611a2057611a1f611490565b5b6000611a2e848285016119f5565b91505092915050565b7f7061796d656e74206661696c6564000000000000000000000000000000000000600082015250565b6000611a6d600e8361192a565b9150611a7882611a37565b602082019050919050565b60006020820190508181036000830152611a9c81611a60565b9050919050565b6000602082019050611ab86000830184611717565b92915050565b7f6e6f742061637469766500000000000000000000000000000000000000000000600082015250565b6000611af4600a8361192a565b9150611aff82611abe565b602082019050919050565b60006020820190508181036000830152611b2381611ae7565b9050919050565b600081519050611b39816114c7565b92915050565b600060208284031215611b5557611b54611490565b5b6000611b6384828501611b2a565b91505092915050565b7f6e6f7420746865206f776e6572206f6620746865204e46540000000000000000600082015250565b6000611ba260188361192a565b9150611bad82611b6c565b602082019050919050565b60006020820190508181036000830152611bd181611b95565b9050919050565b6000604082019050611bed6000830185611708565b611bfa6020830184611708565b9392505050565b7f6e6f7420617070726f7665640000000000000000000000000000000000000000600082015250565b6000611c37600c8361192a565b9150611c4282611c01565b602082019050919050565b60006020820190508181036000830152611c6681611c2a565b9050919050565b7f4e465420616c7265616479206c69737465640000000000000000000000000000600082015250565b6000611ca360128361192a565b9150611cae82611c6d565b602082019050919050565b60006020820190508181036000830152611cd281611c96565b905091905056fea26469706673582212203284377f1419a0c20c3ed0274fd0fcdae3e823ce9346edcde948ad45eeb8683764736f6c63430008140033", "devdoc": { "kind": "dev", "methods": { - "getList()": { + "getList(address)": { "details": "从数组中获取,对比两者差异" }, "getListsArray(address)": { @@ -409,15 +415,15 @@ "type": "t_uint256" }, { - "astId": 320, + "astId": 3595, "contract": "contracts/NftMarket.sol:NftMarket", "label": "s_listings", "offset": 0, "slot": "1", - "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)313_storage))" + "type": "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)3588_storage))" }, { - "astId": 323, + "astId": 3598, "contract": "contracts/NftMarket.sol:NftMarket", "label": "s_tokenIds", "offset": 0, @@ -425,12 +431,12 @@ "type": "t_array(t_uint256)dyn_storage" }, { - "astId": 327, + "astId": 3602, "contract": "contracts/NftMarket.sol:NftMarket", "label": "s_listArr", "offset": 0, "slot": "3", - "type": "t_array(t_struct(Listing)313_storage)dyn_storage" + "type": "t_array(t_struct(Listing)3588_storage)dyn_storage" } ], "types": { @@ -439,8 +445,8 @@ "label": "address", "numberOfBytes": "20" }, - "t_array(t_struct(Listing)313_storage)dyn_storage": { - "base": "t_struct(Listing)313_storage", + "t_array(t_struct(Listing)3588_storage)dyn_storage": { + "base": "t_struct(Listing)3588_storage", "encoding": "dynamic_array", "label": "struct NftMarket.Listing[]", "numberOfBytes": "32" @@ -456,26 +462,26 @@ "label": "bool", "numberOfBytes": "1" }, - "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)313_storage))": { + "t_mapping(t_address,t_mapping(t_uint256,t_struct(Listing)3588_storage))": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => mapping(uint256 => struct NftMarket.Listing))", "numberOfBytes": "32", - "value": "t_mapping(t_uint256,t_struct(Listing)313_storage)" + "value": "t_mapping(t_uint256,t_struct(Listing)3588_storage)" }, - "t_mapping(t_uint256,t_struct(Listing)313_storage)": { + "t_mapping(t_uint256,t_struct(Listing)3588_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct NftMarket.Listing)", "numberOfBytes": "32", - "value": "t_struct(Listing)313_storage" + "value": "t_struct(Listing)3588_storage" }, - "t_struct(Listing)313_storage": { + "t_struct(Listing)3588_storage": { "encoding": "inplace", "label": "struct NftMarket.Listing", "members": [ { - "astId": 304, + "astId": 3579, "contract": "contracts/NftMarket.sol:NftMarket", "label": "seller", "offset": 0, @@ -483,7 +489,7 @@ "type": "t_address" }, { - "astId": 306, + "astId": 3581, "contract": "contracts/NftMarket.sol:NftMarket", "label": "nftContract", "offset": 0, @@ -491,7 +497,7 @@ "type": "t_address" }, { - "astId": 308, + "astId": 3583, "contract": "contracts/NftMarket.sol:NftMarket", "label": "tokenId", "offset": 0, @@ -499,7 +505,7 @@ "type": "t_uint256" }, { - "astId": 310, + "astId": 3585, "contract": "contracts/NftMarket.sol:NftMarket", "label": "price", "offset": 0, @@ -507,7 +513,7 @@ "type": "t_uint256" }, { - "astId": 312, + "astId": 3587, "contract": "contracts/NftMarket.sol:NftMarket", "label": "isActive", "offset": 0, diff --git a/members/missop/task5/contracts/deployments/localhost/NftToken.json b/members/missop/task5/contracts/deployments/localhost/NftToken.json index a48b1ff1e..091cad543 100644 --- a/members/missop/task5/contracts/deployments/localhost/NftToken.json +++ b/members/missop/task5/contracts/deployments/localhost/NftToken.json @@ -363,7 +363,7 @@ "transactionIndex": 0, "gasUsed": "2396710", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x0e410936bfcc9016123d92e7249c9089d370b55915e99bb21da735b14d5968cb", + "blockHash": "0xac3fb420ad8e4bc79f21ad696872de2ac40cc89bac981b19ebfd0b1b3e52c97d", "transactionHash": "0x4e8bbf51dd46e56a9dab30e658b41fadeef3041f6f80ada1febb74cf478fbb7a", "logs": [], "blockNumber": 3, @@ -373,7 +373,7 @@ }, "args": [], "numDeployments": 1, - "solcInputHash": "c6aaaff768b13d48c1e916369f33894e", + "solcInputHash": "f3ccb1b89e4cf68339a84fd309cc4f67", "metadata": "{\"compiler\":{\"version\":\"0.8.20+commit.a1b79de6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_baseUri\",\"type\":\"string\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when `owner` enables `approved` to manage the `tokenId` token.\"},\"ApprovalForAll(address,address,bool)\":{\"details\":\"Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `tokenId` token is transferred from `from` to `to`.\"}},\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/NftToken.sol\":\"NftToken\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _ownerOf(tokenId);\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner or approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner or approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\\n */\\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\\n return _owners[tokenId];\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _ownerOf(tokenId) != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId, 1);\\n\\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n unchecked {\\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\\n // Given that tokens are minted one by one, it is impossible in practice that\\n // this ever happens. Might change if we allow batch minting.\\n // The ERC fails to describe this case.\\n _balances[to] += 1;\\n }\\n\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n * This is an internal function that does not check if the sender is authorized to operate on the token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\\n\\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\\n owner = ERC721.ownerOf(tokenId);\\n\\n // Clear approvals\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // Cannot overflow, as that would require more tokens to be burned/transferred\\n // out than the owner initially received through minting and transferring in.\\n _balances[owner] -= 1;\\n }\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId, 1);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId, 1);\\n\\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n\\n // Clear approvals from the previous owner\\n delete _tokenApprovals[tokenId];\\n\\n unchecked {\\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\\n // `from`'s balance is the number of token held, which is at least one before the current\\n // transfer.\\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\\n // all 2**256 token ids to be minted, which in practice is impossible.\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n }\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\\n * - When `from` is zero, the tokens will be minted for `to`.\\n * - When `to` is zero, ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\\n * - When `from` is zero, the tokens were minted for `to`.\\n * - When `to` is zero, ``from``'s tokens were burned.\\n * - `from` and `to` are never both zero.\\n * - `batchSize` is non-zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\\n\\n /**\\n * @dev Unsafe write access to the balances, used by extensions that \\\"mint\\\" tokens using an {ownerOf} override.\\n *\\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\\n * that `ownerOf(tokenId)` is `a`.\\n */\\n // solhint-disable-next-line func-name-mixedcase\\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\\n _balances[account] += amount;\\n }\\n}\\n\",\"keccak256\":\"0x2c309e7df9e05e6ce15bedfe74f3c61b467fc37e0fae9eab496acf5ea0bbd7ff\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x5bce51e11f7d194b79ea59fe00c9e8de9fa2c5530124960f29a24d4c740a3266\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xa82b58eca1ee256be466e536706850163d2ec7821945abd6b4778cfb3bee37da\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Counters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Counters\\n * @author Matt Condon (@shrugs)\\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\\n *\\n * Include with `using Counters for Counters.Counter;`\\n */\\nlibrary Counters {\\n struct Counter {\\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\\n // this feature: see https://github.com/ethereum/solidity/issues/4637\\n uint256 _value; // default: 0\\n }\\n\\n function current(Counter storage counter) internal view returns (uint256) {\\n return counter._value;\\n }\\n\\n function increment(Counter storage counter) internal {\\n unchecked {\\n counter._value += 1;\\n }\\n }\\n\\n function decrement(Counter storage counter) internal {\\n uint256 value = counter._value;\\n require(value > 0, \\\"Counter: decrement overflow\\\");\\n unchecked {\\n counter._value = value - 1;\\n }\\n }\\n\\n function reset(Counter storage counter) internal {\\n counter._value = 0;\\n }\\n}\\n\",\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"contracts/NftToken.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.20;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Counters.sol\\\";\\n\\ncontract NftToken is ERC721 {\\n using Counters for Counters.Counter;\\n Counters.Counter private _tokenIdCounter;\\n string private baseUri;\\n\\n // \\u6bcf mint \\u4e00\\u4e2a nft \\u90fd\\u9700\\u8981\\u628a count+1 \\u8868\\u793a nft \\u603b\\u6570\\u91cf\\n constructor() ERC721(\\\"NftToken\\\", \\\"NT\\\") {\\n _tokenIdCounter.increment();\\n }\\n\\n function mint(address to, string memory _baseUri) public {\\n baseUri = _baseUri;\\n uint256 tokenId = _tokenIdCounter.current();\\n _tokenIdCounter.increment();\\n _safeMint(to, tokenId);\\n }\\n\\n function _baseURI() internal view virtual override returns (string memory) {\\n return baseUri;\\n }\\n}\\n\",\"keccak256\":\"0xe5bd71f34753632d2a366d45f753674a2fb002dbd700e8d50ea4273f92f3d47f\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523480156200001157600080fd5b506040518060400160405280600881526020017f4e6674546f6b656e0000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f4e5400000000000000000000000000000000000000000000000000000000000081525081600090816200008f91906200034c565b508060019081620000a191906200034c565b505050620000b66006620000bc60201b60201c565b62000433565b6001816000016000828254019250508190555050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200015457607f821691505b6020821081036200016a57620001696200010c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000195565b620001e0868362000195565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200022d620002276200022184620001f8565b62000202565b620001f8565b9050919050565b6000819050919050565b62000249836200020c565b62000261620002588262000234565b848454620001a2565b825550505050565b600090565b6200027862000269565b620002858184846200023e565b505050565b5b81811015620002ad57620002a16000826200026e565b6001810190506200028b565b5050565b601f821115620002fc57620002c68162000170565b620002d18462000185565b81016020851015620002e1578190505b620002f9620002f08562000185565b8301826200028a565b50505b505050565b600082821c905092915050565b6000620003216000198460080262000301565b1980831691505092915050565b60006200033c83836200030e565b9150826002028217905092915050565b6200035782620000d2565b67ffffffffffffffff811115620003735762000372620000dd565b5b6200037f82546200013b565b6200038c828285620002b1565b600060209050601f831160018114620003c45760008415620003af578287015190505b620003bb85826200032e565b8655506200042b565b601f198416620003d48662000170565b60005b82811015620003fe57848901518255600182019150602085019450602081019050620003d7565b868310156200041e57848901516200041a601f8916826200030e565b8355505b6001600288020188555050505b505050505050565b61291680620004436000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c806370a082311161008c578063b88d4fde11610066578063b88d4fde1461025b578063c87b56dd14610277578063d0def521146102a7578063e985e9c5146102c3576100ea565b806370a08231146101f157806395d89b4114610221578063a22cb4651461023f576100ea565b8063095ea7b3116100c8578063095ea7b31461016d57806323b872dd1461018957806342842e0e146101a55780636352211e146101c1576100ea565b806301ffc9a7146100ef57806306fdde031461011f578063081812fc1461013d575b600080fd5b61010960048036038101906101049190611897565b6102f3565b60405161011691906118df565b60405180910390f35b6101276103d5565b604051610134919061198a565b60405180910390f35b610157600480360381019061015291906119e2565b610467565b6040516101649190611a50565b60405180910390f35b61018760048036038101906101829190611a97565b6104ad565b005b6101a3600480360381019061019e9190611ad7565b6105c4565b005b6101bf60048036038101906101ba9190611ad7565b610624565b005b6101db60048036038101906101d691906119e2565b610644565b6040516101e89190611a50565b60405180910390f35b61020b60048036038101906102069190611b2a565b6106ca565b6040516102189190611b66565b60405180910390f35b610229610781565b604051610236919061198a565b60405180910390f35b61025960048036038101906102549190611bad565b610813565b005b61027560048036038101906102709190611d22565b610829565b005b610291600480360381019061028c91906119e2565b61088b565b60405161029e919061198a565b60405180910390f35b6102c160048036038101906102bc9190611e46565b6108f3565b005b6102dd60048036038101906102d89190611ea2565b61092a565b6040516102ea91906118df565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103be57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103ce57506103cd826109be565b5b9050919050565b6060600080546103e490611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461041090611f11565b801561045d5780601f106104325761010080835404028352916020019161045d565b820191906000526020600020905b81548152906001019060200180831161044057829003601f168201915b5050505050905090565b600061047282610a28565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006104b882610644565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051f90611fb4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610547610a73565b73ffffffffffffffffffffffffffffffffffffffff161480610576575061057581610570610a73565b61092a565b5b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac90612046565b60405180910390fd5b6105bf8383610a7b565b505050565b6105d56105cf610a73565b82610b34565b610614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060b906120d8565b60405180910390fd5b61061f838383610bc9565b505050565b61063f83838360405180602001604052806000815250610829565b505050565b60008061065083610ec2565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036106c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b890612144565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361073a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610731906121d6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60606001805461079090611f11565b80601f01602080910402602001604051908101604052809291908181526020018280546107bc90611f11565b80156108095780601f106107de57610100808354040283529160200191610809565b820191906000526020600020905b8154815290600101906020018083116107ec57829003601f168201915b5050505050905090565b61082561081e610a73565b8383610eff565b5050565b61083a610834610a73565b83610b34565b610879576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610870906120d8565b60405180910390fd5b6108858484848461106b565b50505050565b606061089682610a28565b60006108a06110c7565b905060008151116108c057604051806020016040528060008152506108eb565b806108ca84611159565b6040516020016108db929190612232565b6040516020818303038152906040525b915050919050565b80600790816109029190612402565b50600061090f6006611227565b905061091b6006611235565b610925838261124b565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610a3181611269565b610a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6790612144565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16610aee83610644565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610b4083610644565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610b825750610b81818561092a565b5b80610bc057508373ffffffffffffffffffffffffffffffffffffffff16610ba884610467565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16610be982610644565b73ffffffffffffffffffffffffffffffffffffffff1614610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca5906125d8565b60405180910390fd5b610cbb83838360016112aa565b8273ffffffffffffffffffffffffffffffffffffffff16610cdb82610644565b73ffffffffffffffffffffffffffffffffffffffff1614610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2890612546565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ebd83838360016112b0565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490612644565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161105e91906118df565b60405180910390a3505050565b611076848484610bc9565b611082848484846112b6565b6110c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b8906126d6565b60405180910390fd5b50505050565b6060600780546110d690611f11565b80601f016020809104026020016040519081016040528092919081815260200182805461110290611f11565b801561114f5780601f106111245761010080835404028352916020019161114f565b820191906000526020600020905b81548152906001019060200180831161113257829003601f168201915b5050505050905090565b6060600060016111688461143d565b01905060008167ffffffffffffffff81111561118757611186611bf7565b5b6040519080825280601f01601f1916602001820160405280156111b95781602001600182028036833780820191505090505b509050600082602001820190505b60011561121c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816112105761120f6126f6565b5b049450600085036111c7575b819350505050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611265828260405180602001604052806000815250611590565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff1661128b83610ec2565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b60006112d78473ffffffffffffffffffffffffffffffffffffffff166115eb565b15611430578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611300610a73565b8786866040518563ffffffff1660e01b8152600401611322949392919061277a565b6020604051808303816000875af192505050801561135e57506040513d601f19601f8201168201806040525081019061135b91906127db565b60015b6113e0573d806000811461138e576040519150601f19603f3d011682016040523d82523d6000602084013e611393565b606091505b5060008151036113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf906126d6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611435565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381611491576114906126f6565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd6126f6565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc6126f6565b5b0492506010810190505b6305f5e1008310611530576305f5e1008381611526576115256126f6565b5b0492506008810190505b612710831061155557612710838161154b5761154a6126f6565b5b0492506004810190505b60648310611578576064838161156e5761156d6126f6565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b61159a838361160e565b6115a760008484846112b6565b6115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd906126d6565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490612854565b60405180910390fd5b61168681611269565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906128c0565b60405180910390fd5b6116d46000838360016112aa565b6116dd81611269565b1561171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906128c0565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118276000838360016112b0565b5050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6118748161183f565b811461187f57600080fd5b50565b6000813590506118918161186b565b92915050565b6000602082840312156118ad576118ac611835565b5b60006118bb84828501611882565b91505092915050565b60008115159050919050565b6118d9816118c4565b82525050565b60006020820190506118f460008301846118d0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611934578082015181840152602081019050611919565b60008484015250505050565b6000601f19601f8301169050919050565b600061195c826118fa565b6119668185611905565b9350611976818560208601611916565b61197f81611940565b840191505092915050565b600060208201905081810360008301526119a48184611951565b905092915050565b6000819050919050565b6119bf816119ac565b81146119ca57600080fd5b50565b6000813590506119dc816119b6565b92915050565b6000602082840312156119f8576119f7611835565b5b6000611a06848285016119cd565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a3a82611a0f565b9050919050565b611a4a81611a2f565b82525050565b6000602082019050611a656000830184611a41565b92915050565b611a7481611a2f565b8114611a7f57600080fd5b50565b600081359050611a9181611a6b565b92915050565b60008060408385031215611aae57611aad611835565b5b6000611abc85828601611a82565b9250506020611acd858286016119cd565b9150509250929050565b600080600060608486031215611af057611aef611835565b5b6000611afe86828701611a82565b9350506020611b0f86828701611a82565b9250506040611b20868287016119cd565b9150509250925092565b600060208284031215611b4057611b3f611835565b5b6000611b4e84828501611a82565b91505092915050565b611b60816119ac565b82525050565b6000602082019050611b7b6000830184611b57565b92915050565b611b8a816118c4565b8114611b9557600080fd5b50565b600081359050611ba781611b81565b92915050565b60008060408385031215611bc457611bc3611835565b5b6000611bd285828601611a82565b9250506020611be385828601611b98565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c2f82611940565b810181811067ffffffffffffffff82111715611c4e57611c4d611bf7565b5b80604052505050565b6000611c6161182b565b9050611c6d8282611c26565b919050565b600067ffffffffffffffff821115611c8d57611c8c611bf7565b5b611c9682611940565b9050602081019050919050565b82818337600083830152505050565b6000611cc5611cc084611c72565b611c57565b905082815260208101848484011115611ce157611ce0611bf2565b5b611cec848285611ca3565b509392505050565b600082601f830112611d0957611d08611bed565b5b8135611d19848260208601611cb2565b91505092915050565b60008060008060808587031215611d3c57611d3b611835565b5b6000611d4a87828801611a82565b9450506020611d5b87828801611a82565b9350506040611d6c878288016119cd565b925050606085013567ffffffffffffffff811115611d8d57611d8c61183a565b5b611d9987828801611cf4565b91505092959194509250565b600067ffffffffffffffff821115611dc057611dbf611bf7565b5b611dc982611940565b9050602081019050919050565b6000611de9611de484611da5565b611c57565b905082815260208101848484011115611e0557611e04611bf2565b5b611e10848285611ca3565b509392505050565b600082601f830112611e2d57611e2c611bed565b5b8135611e3d848260208601611dd6565b91505092915050565b60008060408385031215611e5d57611e5c611835565b5b6000611e6b85828601611a82565b925050602083013567ffffffffffffffff811115611e8c57611e8b61183a565b5b611e9885828601611e18565b9150509250929050565b60008060408385031215611eb957611eb8611835565b5b6000611ec785828601611a82565b9250506020611ed885828601611a82565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611f2957607f821691505b602082108103611f3c57611f3b611ee2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f9e602183611905565b9150611fa982611f42565b604082019050919050565b60006020820190508181036000830152611fcd81611f91565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000612030603d83611905565b915061203b82611fd4565b604082019050919050565b6000602082019050818103600083015261205f81612023565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006120c2602d83611905565b91506120cd82612066565b604082019050919050565b600060208201905081810360008301526120f1816120b5565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061212e601883611905565b9150612139826120f8565b602082019050919050565b6000602082019050818103600083015261215d81612121565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006121c0602983611905565b91506121cb82612164565b604082019050919050565b600060208201905081810360008301526121ef816121b3565b9050919050565b600081905092915050565b600061220c826118fa565b61221681856121f6565b9350612226818560208601611916565b80840191505092915050565b600061223e8285612201565b915061224a8284612201565b91508190509392505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026122b87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261227b565b6122c2868361227b565b95508019841693508086168417925050509392505050565b6000819050919050565b60006122ff6122fa6122f5846119ac565b6122da565b6119ac565b9050919050565b6000819050919050565b612319836122e4565b61232d61232582612306565b848454612288565b825550505050565b600090565b612342612335565b61234d818484612310565b505050565b5b818110156123715761236660008261233a565b600181019050612353565b5050565b601f8211156123b65761238781612256565b6123908461226b565b8101602085101561239f578190505b6123b36123ab8561226b565b830182612352565b50505b505050565b600082821c905092915050565b60006123d9600019846008026123bb565b1980831691505092915050565b60006123f283836123c8565b9150826002028217905092915050565b61240b826118fa565b67ffffffffffffffff81111561242457612423611bf7565b5b61242e8254611f11565b612439828285612375565b600060209050601f83116001811461246c576000841561245a578287015190505b61246485826123e6565b8655506124cc565b601f19841661247a86612256565b60005b828110156124a25784890151825560018201915060208501945060208101905061247d565b868310156124bf57848901516124bb601f8916826123c8565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000612530602583611905565b915061253b826124d4565b604082019050919050565b6000602082019050818103600083015261255f81612523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006125c2602483611905565b91506125cd82612566565b604082019050919050565b600060208201905081810360008301526125f1816125b5565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061262e601983611905565b9150612639826125f8565b602082019050919050565b6000602082019050818103600083015261265d81612621565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006126c0603283611905565b91506126cb82612664565b604082019050919050565b600060208201905081810360008301526126ef816126b3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061274c82612725565b6127568185612730565b9350612766818560208601611916565b61276f81611940565b840191505092915050565b600060808201905061278f6000830187611a41565b61279c6020830186611a41565b6127a96040830185611b57565b81810360608301526127bb8184612741565b905095945050505050565b6000815190506127d58161186b565b92915050565b6000602082840312156127f1576127f0611835565b5b60006127ff848285016127c6565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061283e602083611905565b915061284982612808565b602082019050919050565b6000602082019050818103600083015261286d81612831565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006128aa601c83611905565b91506128b582612874565b602082019050919050565b600060208201905081810360008301526128d98161289d565b905091905056fea2646970667358221220a4056de23c4ced5962811f659a13de9c28d7ca64f92af3070c6033b7230e4e1964736f6c63430008140033", @@ -441,7 +441,7 @@ "storageLayout": { "storage": [ { - "astId": 168, + "astId": 780, "contract": "contracts/NftToken.sol:NftToken", "label": "_name", "offset": 0, @@ -449,7 +449,7 @@ "type": "t_string_storage" }, { - "astId": 170, + "astId": 782, "contract": "contracts/NftToken.sol:NftToken", "label": "_symbol", "offset": 0, @@ -457,7 +457,7 @@ "type": "t_string_storage" }, { - "astId": 174, + "astId": 786, "contract": "contracts/NftToken.sol:NftToken", "label": "_owners", "offset": 0, @@ -465,7 +465,7 @@ "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 178, + "astId": 790, "contract": "contracts/NftToken.sol:NftToken", "label": "_balances", "offset": 0, @@ -473,7 +473,7 @@ "type": "t_mapping(t_address,t_uint256)" }, { - "astId": 182, + "astId": 794, "contract": "contracts/NftToken.sol:NftToken", "label": "_tokenApprovals", "offset": 0, @@ -481,7 +481,7 @@ "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 188, + "astId": 800, "contract": "contracts/NftToken.sol:NftToken", "label": "_operatorApprovals", "offset": 0, @@ -489,15 +489,15 @@ "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" }, { - "astId": 3248, + "astId": 4012, "contract": "contracts/NftToken.sol:NftToken", "label": "_tokenIdCounter", "offset": 0, "slot": "6", - "type": "t_struct(Counter)1596_storage" + "type": "t_struct(Counter)2208_storage" }, { - "astId": 3250, + "astId": 4014, "contract": "contracts/NftToken.sol:NftToken", "label": "baseUri", "offset": 0, @@ -549,12 +549,12 @@ "label": "string", "numberOfBytes": "32" }, - "t_struct(Counter)1596_storage": { + "t_struct(Counter)2208_storage": { "encoding": "inplace", "label": "struct Counters.Counter", "members": [ { - "astId": 1595, + "astId": 2207, "contract": "contracts/NftToken.sol:NftToken", "label": "_value", "offset": 0, diff --git a/members/missop/task5/contracts/deployments/localhost/solcInputs/2af2f9ba1a66ee6f5c17052112925613.json b/members/missop/task5/contracts/deployments/localhost/solcInputs/2af2f9ba1a66ee6f5c17052112925613.json deleted file mode 100644 index 78384432f..000000000 --- a/members/missop/task5/contracts/deployments/localhost/solcInputs/2af2f9ba1a66ee6f5c17052112925613.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/ERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/ERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n * that `ownerOf(tokenId)` is `a`.\n */\n // solhint-disable-next-line func-name-mixedcase\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\n _balances[account] += amount;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Counters.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "contracts/MissopToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MissopToken is ERC20{\n constructor() ERC20(\"MissopToken\",\"MT\") {\n // 初始化给合约 mint 这么多 token\n _mint(msg.sender, 10000000000*10**6);\n }\n\n function decimals()public view virtual override returns (uint8) {\n return 6;\n }\n}" - }, - "contracts/NftMarket.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\"; // 防止双花攻击\n\nerror NftMarket__NotOwnerOf(string message);\nerror NftMarket__NotApproved(string message);\nerror NftMarket__NotActive(string message);\nerror NftMarket__PaymentFailed(string message);\n\ncontract NftMarket is ReentrancyGuard {\n struct Listing {\n address seller;\n address nftContract;\n uint256 tokenId;\n uint256 price;\n bool isActive;\n }\n\n mapping(address => mapping(uint256 => Listing)) s_listings;\n IERC20 public immutable i_paymentToken;\n\n // 上架 nft 事件\n event NftListed(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n // nft购买事件\n event NftPurchased(\n address indexed buyer,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n constructor(address _paymentToken) {\n i_paymentToken = IERC20(_paymentToken);\n }\n\n function listNft(\n address _nftContract,\n uint256 tokenId,\n uint256 price\n ) external {\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n s_listings[_nftContract][tokenId] = Listing(\n msg.sender,\n _nftContract,\n tokenId,\n price,\n true\n );\n\n emit NftListed(msg.sender, tokenId, _nftContract, price);\n }\n\n function buyNft(address _nftContract, uint256 _tokenId) external {\n Listing storage listing = s_listings[_nftContract][_tokenId];\n if (!listing.isActive) {\n revert NftMarket__NotActive(\"NFT not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n // 将购买人身上的钱转给售卖人\n if (\n !i_paymentToken.transferFrom(\n msg.sender,\n listing.seller,\n listing.price\n )\n ) {\n revert NftMarket__PaymentFailed(\"payment failed\");\n }\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\n listing.isActive = false;\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\n }\n}\n" - }, - "contracts/NftToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract NftToken is ERC721 {\n using Counters for Counters.Counter;\n Counters.Counter private _tokenIdCounter;\n\n // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量\n constructor() ERC721(\"NftToken\", \"NT\") {\n _tokenIdCounter.increment();\n }\n\n function mint(address to) public {\n uint256 tokenId = _tokenIdCounter.current();\n _tokenIdCounter.increment();\n _safeMint(to, tokenId);\n }\n}\n" - } - }, - "settings": { - "evmVersion": "paris", - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/members/missop/task5/contracts/deployments/localhost/solcInputs/c6aaaff768b13d48c1e916369f33894e.json b/members/missop/task5/contracts/deployments/localhost/solcInputs/c6aaaff768b13d48c1e916369f33894e.json deleted file mode 100644 index 6c6db78e9..000000000 --- a/members/missop/task5/contracts/deployments/localhost/solcInputs/c6aaaff768b13d48c1e916369f33894e.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC20/IERC20.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/ERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n * that `ownerOf(tokenId)` is `a`.\n */\n // solhint-disable-next-line func-name-mixedcase\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\n _balances[account] += amount;\n }\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Counters.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/ERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/introspection/IERC165.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "contracts/NftMarket.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\"; // 防止双花攻击\n\nerror NftMarket__NotOwnerOf(string message);\nerror NftMarket__NotApproved(string message);\nerror NftMarket__NotActive(string message);\nerror NftMarket__PaymentFailed(string message);\nerror NftMarket__NotExist(string message);\n\ncontract NftMarket is ReentrancyGuard {\n struct Listing {\n address seller;\n address nftContract;\n uint256 tokenId;\n uint256 price;\n bool isActive;\n }\n\n mapping(address => mapping(uint256 => Listing)) public s_listings;\n Listing[] private s_listsArray;\n IERC20 public immutable i_paymentToken;\n\n // 上架 nft 事件\n event NftListed(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n // nft购买事件\n event NftPurchased(\n address indexed buyer,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n event NftUnlisted(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract\n );\n\n constructor(address _paymentToken) {\n i_paymentToken = IERC20(_paymentToken);\n }\n\n function listNft(\n address _nftContract,\n uint256 tokenId,\n uint256 price\n ) external {\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n Listing memory item = Listing(\n msg.sender,\n _nftContract,\n tokenId,\n price,\n true\n );\n s_listings[_nftContract][tokenId] = item;\n s_listsArray.push(item);\n\n emit NftListed(msg.sender, tokenId, _nftContract, price);\n }\n\n function unlistNft(address _nftContract, uint256 _tokenId) external {\n Listing memory item = s_listings[_nftContract][_tokenId];\n if (!item.isActive) {\n revert NftMarket__NotActive(\"not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(_tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n s_listings[_nftContract][_tokenId].isActive = false;\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\n }\n\n function buyNft(address _nftContract, uint256 _tokenId) external {\n Listing storage listing = s_listings[_nftContract][_tokenId];\n if (!listing.isActive) {\n revert NftMarket__NotActive(\"NFT not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n // 将购买人身上的钱转给售卖人\n if (\n !i_paymentToken.transferFrom(\n msg.sender,\n listing.seller,\n listing.price\n )\n ) {\n revert NftMarket__PaymentFailed(\"payment failed\");\n }\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\n listing.isActive = false;\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\n }\n\n function getListsArray() public view returns (Listing[] memory) {\n return s_listsArray;\n }\n}\n" - }, - "contracts/NftToken.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract NftToken is ERC721 {\n using Counters for Counters.Counter;\n Counters.Counter private _tokenIdCounter;\n string private baseUri;\n\n // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量\n constructor() ERC721(\"NftToken\", \"NT\") {\n _tokenIdCounter.increment();\n }\n\n function mint(address to, string memory _baseUri) public {\n baseUri = _baseUri;\n uint256 tokenId = _tokenIdCounter.current();\n _tokenIdCounter.increment();\n _safeMint(to, tokenId);\n }\n\n function _baseURI() internal view virtual override returns (string memory) {\n return baseUri;\n }\n}\n" - } - }, - "settings": { - "evmVersion": "paris", - "optimizer": { - "enabled": false, - "runs": 200 - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/members/missop/task5/contracts/deployments/localhost/solcInputs/6baaea9d3ae99489cad522d95836e096.json b/members/missop/task5/contracts/deployments/localhost/solcInputs/f3ccb1b89e4cf68339a84fd309cc4f67.json similarity index 56% rename from members/missop/task5/contracts/deployments/localhost/solcInputs/6baaea9d3ae99489cad522d95836e096.json rename to members/missop/task5/contracts/deployments/localhost/solcInputs/f3ccb1b89e4cf68339a84fd309cc4f67.json index cc8e3882f..59426f291 100644 --- a/members/missop/task5/contracts/deployments/localhost/solcInputs/6baaea9d3ae99489cad522d95836e096.json +++ b/members/missop/task5/contracts/deployments/localhost/solcInputs/f3ccb1b89e4cf68339a84fd309cc4f67.json @@ -4,17 +4,59 @@ "@openzeppelin/contracts/security/ReentrancyGuard.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, "@openzeppelin/contracts/token/ERC20/IERC20.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" }, + "@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC721.sol\";\nimport \"./IERC721Receiver.sol\";\nimport \"./extensions/IERC721Metadata.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/Context.sol\";\nimport \"../../utils/Strings.sol\";\nimport \"../../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\n * {ERC721Enumerable}.\n */\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\n using Address for address;\n using Strings for uint256;\n\n // Token name\n string private _name;\n\n // Token symbol\n string private _symbol;\n\n // Mapping from token ID to owner address\n mapping(uint256 => address) private _owners;\n\n // Mapping owner address to token count\n mapping(address => uint256) private _balances;\n\n // Mapping from token ID to approved address\n mapping(uint256 => address) private _tokenApprovals;\n\n // Mapping from owner to operator approvals\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n\n /**\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\n return\n interfaceId == type(IERC721).interfaceId ||\n interfaceId == type(IERC721Metadata).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n /**\n * @dev See {IERC721-balanceOf}.\n */\n function balanceOf(address owner) public view virtual override returns (uint256) {\n require(owner != address(0), \"ERC721: address zero is not a valid owner\");\n return _balances[owner];\n }\n\n /**\n * @dev See {IERC721-ownerOf}.\n */\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\n address owner = _ownerOf(tokenId);\n require(owner != address(0), \"ERC721: invalid token ID\");\n return owner;\n }\n\n /**\n * @dev See {IERC721Metadata-name}.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev See {IERC721Metadata-symbol}.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev See {IERC721Metadata-tokenURI}.\n */\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\n _requireMinted(tokenId);\n\n string memory baseURI = _baseURI();\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \"\";\n }\n\n /**\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\n * by default, can be overridden in child contracts.\n */\n function _baseURI() internal view virtual returns (string memory) {\n return \"\";\n }\n\n /**\n * @dev See {IERC721-approve}.\n */\n function approve(address to, uint256 tokenId) public virtual override {\n address owner = ERC721.ownerOf(tokenId);\n require(to != owner, \"ERC721: approval to current owner\");\n\n require(\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\n \"ERC721: approve caller is not token owner or approved for all\"\n );\n\n _approve(to, tokenId);\n }\n\n /**\n * @dev See {IERC721-getApproved}.\n */\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\n _requireMinted(tokenId);\n\n return _tokenApprovals[tokenId];\n }\n\n /**\n * @dev See {IERC721-setApprovalForAll}.\n */\n function setApprovalForAll(address operator, bool approved) public virtual override {\n _setApprovalForAll(_msgSender(), operator, approved);\n }\n\n /**\n * @dev See {IERC721-isApprovedForAll}.\n */\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\n return _operatorApprovals[owner][operator];\n }\n\n /**\n * @dev See {IERC721-transferFrom}.\n */\n function transferFrom(address from, address to, uint256 tokenId) public virtual override {\n //solhint-disable-next-line max-line-length\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n\n _transfer(from, to, tokenId);\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {\n safeTransferFrom(from, to, tokenId, \"\");\n }\n\n /**\n * @dev See {IERC721-safeTransferFrom}.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override {\n require(_isApprovedOrOwner(_msgSender(), tokenId), \"ERC721: caller is not token owner or approved\");\n _safeTransfer(from, to, tokenId, data);\n }\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\n *\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\n * implement alternative mechanisms to perform token transfer, such as signature-based.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual {\n _transfer(from, to, tokenId);\n require(_checkOnERC721Received(from, to, tokenId, data), \"ERC721: transfer to non ERC721Receiver implementer\");\n }\n\n /**\n * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist\n */\n function _ownerOf(uint256 tokenId) internal view virtual returns (address) {\n return _owners[tokenId];\n }\n\n /**\n * @dev Returns whether `tokenId` exists.\n *\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\n *\n * Tokens start existing when they are minted (`_mint`),\n * and stop existing when they are burned (`_burn`).\n */\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\n return _ownerOf(tokenId) != address(0);\n }\n\n /**\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\n address owner = ERC721.ownerOf(tokenId);\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\n }\n\n /**\n * @dev Safely mints `tokenId` and transfers it to `to`.\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function _safeMint(address to, uint256 tokenId) internal virtual {\n _safeMint(to, tokenId, \"\");\n }\n\n /**\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\n */\n function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual {\n _mint(to, tokenId);\n require(\n _checkOnERC721Received(address(0), to, tokenId, data),\n \"ERC721: transfer to non ERC721Receiver implementer\"\n );\n }\n\n /**\n * @dev Mints `tokenId` and transfers it to `to`.\n *\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\n *\n * Requirements:\n *\n * - `tokenId` must not exist.\n * - `to` cannot be the zero address.\n *\n * Emits a {Transfer} event.\n */\n function _mint(address to, uint256 tokenId) internal virtual {\n require(to != address(0), \"ERC721: mint to the zero address\");\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n _beforeTokenTransfer(address(0), to, tokenId, 1);\n\n // Check that tokenId was not minted by `_beforeTokenTransfer` hook\n require(!_exists(tokenId), \"ERC721: token already minted\");\n\n unchecked {\n // Will not overflow unless all 2**256 token ids are minted to the same owner.\n // Given that tokens are minted one by one, it is impossible in practice that\n // this ever happens. Might change if we allow batch minting.\n // The ERC fails to describe this case.\n _balances[to] += 1;\n }\n\n _owners[tokenId] = to;\n\n emit Transfer(address(0), to, tokenId);\n\n _afterTokenTransfer(address(0), to, tokenId, 1);\n }\n\n /**\n * @dev Destroys `tokenId`.\n * The approval is cleared when the token is burned.\n * This is an internal function that does not check if the sender is authorized to operate on the token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n *\n * Emits a {Transfer} event.\n */\n function _burn(uint256 tokenId) internal virtual {\n address owner = ERC721.ownerOf(tokenId);\n\n _beforeTokenTransfer(owner, address(0), tokenId, 1);\n\n // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook\n owner = ERC721.ownerOf(tokenId);\n\n // Clear approvals\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // Cannot overflow, as that would require more tokens to be burned/transferred\n // out than the owner initially received through minting and transferring in.\n _balances[owner] -= 1;\n }\n delete _owners[tokenId];\n\n emit Transfer(owner, address(0), tokenId);\n\n _afterTokenTransfer(owner, address(0), tokenId, 1);\n }\n\n /**\n * @dev Transfers `tokenId` from `from` to `to`.\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n *\n * Emits a {Transfer} event.\n */\n function _transfer(address from, address to, uint256 tokenId) internal virtual {\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n require(to != address(0), \"ERC721: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, tokenId, 1);\n\n // Check that tokenId was not transferred by `_beforeTokenTransfer` hook\n require(ERC721.ownerOf(tokenId) == from, \"ERC721: transfer from incorrect owner\");\n\n // Clear approvals from the previous owner\n delete _tokenApprovals[tokenId];\n\n unchecked {\n // `_balances[from]` cannot overflow for the same reason as described in `_burn`:\n // `from`'s balance is the number of token held, which is at least one before the current\n // transfer.\n // `_balances[to]` could overflow in the conditions described in `_mint`. That would require\n // all 2**256 token ids to be minted, which in practice is impossible.\n _balances[from] -= 1;\n _balances[to] += 1;\n }\n _owners[tokenId] = to;\n\n emit Transfer(from, to, tokenId);\n\n _afterTokenTransfer(from, to, tokenId, 1);\n }\n\n /**\n * @dev Approve `to` to operate on `tokenId`\n *\n * Emits an {Approval} event.\n */\n function _approve(address to, uint256 tokenId) internal virtual {\n _tokenApprovals[tokenId] = to;\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\n }\n\n /**\n * @dev Approve `operator` to operate on all of `owner` tokens\n *\n * Emits an {ApprovalForAll} event.\n */\n function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {\n require(owner != operator, \"ERC721: approve to caller\");\n _operatorApprovals[owner][operator] = approved;\n emit ApprovalForAll(owner, operator, approved);\n }\n\n /**\n * @dev Reverts if the `tokenId` has not been minted yet.\n */\n function _requireMinted(uint256 tokenId) internal view virtual {\n require(_exists(tokenId), \"ERC721: invalid token ID\");\n }\n\n /**\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\n * The call is not executed if the target address is not a contract.\n *\n * @param from address representing the previous owner of the given token ID\n * @param to target address that will receive the tokens\n * @param tokenId uint256 ID of the token to be transferred\n * @param data bytes optional data to send along with the call\n * @return bool whether the call correctly returned the expected magic value\n */\n function _checkOnERC721Received(\n address from,\n address to,\n uint256 tokenId,\n bytes memory data\n ) private returns (bool) {\n if (to.isContract()) {\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\n return retval == IERC721Receiver.onERC721Received.selector;\n } catch (bytes memory reason) {\n if (reason.length == 0) {\n revert(\"ERC721: transfer to non ERC721Receiver implementer\");\n } else {\n /// @solidity memory-safe-assembly\n assembly {\n revert(add(32, reason), mload(reason))\n }\n }\n }\n } else {\n return true;\n }\n }\n\n /**\n * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.\n * - When `from` is zero, the tokens will be minted for `to`.\n * - When `to` is zero, ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is\n * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.\n *\n * Calling conditions:\n *\n * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.\n * - When `from` is zero, the tokens were minted for `to`.\n * - When `to` is zero, ``from``'s tokens were burned.\n * - `from` and `to` are never both zero.\n * - `batchSize` is non-zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}\n\n /**\n * @dev Unsafe write access to the balances, used by extensions that \"mint\" tokens using an {ownerOf} override.\n *\n * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant\n * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such\n * that `ownerOf(tokenId)` is `a`.\n */\n // solhint-disable-next-line func-name-mixedcase\n function __unsafe_increaseBalance(address account, uint256 amount) internal {\n _balances[account] += amount;\n }\n}\n" + }, + "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC721.sol\";\n\n/**\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\n * @dev See https://eips.ethereum.org/EIPS/eip-721\n */\ninterface IERC721Metadata is IERC721 {\n /**\n * @dev Returns the token collection name.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the token collection symbol.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\n */\n function tokenURI(uint256 tokenId) external view returns (string memory);\n}\n" + }, "@openzeppelin/contracts/token/ERC721/IERC721.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the caller.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" }, + "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title ERC721 token receiver interface\n * @dev Interface for any contract that wants to support safeTransfers\n * from ERC721 asset contracts.\n */\ninterface IERC721Receiver {\n /**\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\n * by `operator` from `from`, this function is called.\n *\n * It must return its Solidity selector to confirm the token transfer.\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\n *\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\n */\n function onERC721Received(\n address operator,\n address from,\n uint256 tokenId,\n bytes calldata data\n ) external returns (bytes4);\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, "@openzeppelin/contracts/utils/introspection/IERC165.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" }, + "@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "contracts/MissopToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MissopToken is ERC20{\n constructor() ERC20(\"MissopToken\",\"MT\") {\n // 初始化给合约 mint 这么多 token\n _mint(msg.sender, 10000000000*10**6);\n }\n\n function decimals()public view virtual override returns (uint8) {\n return 6;\n }\n}" + }, "contracts/NftMarket.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\"; // 防止双花攻击\nimport \"hardhat/console.sol\";\n\nerror NftMarket__NotOwnerOf(string message);\nerror NftMarket__NotApproved(string message);\nerror NftMarket__NotActive(string message);\nerror NftMarket__PaymentFailed(string message);\nerror NftMarket__NotExist(string message);\nerror NftMarket__IsListed(string message);\n\ncontract NftMarket is ReentrancyGuard {\n struct Listing {\n address seller;\n address nftContract;\n uint256 tokenId;\n uint256 price;\n bool isActive;\n }\n\n mapping(address => mapping(uint256 => Listing)) public s_listings;\n uint256[] private s_tokenIds;\n Listing[] private s_listArr;\n IERC20 public immutable i_paymentToken;\n\n // 上架 nft 事件\n event NftListed(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n // nft购买事件\n event NftPurchased(\n address indexed buyer,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n event NftUnlisted(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract\n );\n\n constructor(address _paymentToken) {\n i_paymentToken = IERC20(_paymentToken);\n }\n\n function listNft(\n address _nftContract,\n uint256 tokenId,\n uint256 price\n ) external {\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n if (s_listings[_nftContract][tokenId].isActive) {\n revert NftMarket__IsListed(\"NFT already listed\");\n }\n Listing memory item = Listing(\n msg.sender,\n _nftContract,\n tokenId,\n price,\n true\n );\n s_listings[_nftContract][tokenId] = item;\n s_tokenIds.push(tokenId);\n s_listArr.push(item);\n\n emit NftListed(msg.sender, tokenId, _nftContract, price);\n }\n\n function unlistNft(address _nftContract, uint256 _tokenId) external {\n Listing memory item = s_listings[_nftContract][_tokenId];\n if (!item.isActive) {\n revert NftMarket__NotActive(\"not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(_tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n s_listings[_nftContract][_tokenId].isActive = false;\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\n }\n\n function buyNft(address _nftContract, uint256 _tokenId) external {\n Listing memory listing = s_listings[_nftContract][_tokenId];\n if (!listing.isActive) {\n revert NftMarket__NotActive(\"NFT not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n // 将购买人身上的钱转给售卖人\n if (\n !i_paymentToken.transferFrom(\n msg.sender,\n listing.seller,\n listing.price\n )\n ) {\n revert NftMarket__PaymentFailed(\"payment failed\");\n }\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\n listing.isActive = false;\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\n }\n\n /**\n *\n * @dev 从 s_listings 中获取上架的 NFT\n */\n function getListsArray(\n address _nftContract\n ) public view returns (Listing[] memory) {\n Listing[] memory listings = new Listing[](s_tokenIds.length);\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\n listings[i] = item;\n }\n return listings;\n }\n\n /**\n * @dev 从数组中获取,对比两者差异\n */\n function getList() external view returns (Listing[] memory) {\n return s_listArr;\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\nimport \"@openzeppelin/contracts/security/ReentrancyGuard.sol\"; // 防止双花攻击\nimport \"hardhat/console.sol\";\n\nerror NftMarket__NotOwnerOf(string message);\nerror NftMarket__NotApproved(string message);\nerror NftMarket__NotActive(string message);\nerror NftMarket__PaymentFailed(string message);\nerror NftMarket__NotExist(string message);\nerror NftMarket__IsListed(string message);\n\ncontract NftMarket is ReentrancyGuard {\n struct Listing {\n address seller;\n address nftContract;\n uint256 tokenId;\n uint256 price;\n bool isActive;\n }\n\n mapping(address => mapping(uint256 => Listing)) public s_listings;\n uint256[] private s_tokenIds;\n Listing[] private s_listArr;\n IERC20 public immutable i_paymentToken;\n\n // 上架 nft 事件\n event NftListed(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n // nft购买事件\n event NftPurchased(\n address indexed buyer,\n uint256 indexed tokenId,\n address indexed nftContract,\n uint256 price\n );\n\n event NftUnlisted(\n address indexed seller,\n uint256 indexed tokenId,\n address indexed nftContract\n );\n\n constructor(address _paymentToken) {\n i_paymentToken = IERC20(_paymentToken);\n }\n\n function listNft(\n address _nftContract,\n uint256 tokenId,\n uint256 price\n ) external {\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n if (s_listings[_nftContract][tokenId].isActive) {\n revert NftMarket__IsListed(\"NFT already listed\");\n }\n Listing memory item = Listing(\n msg.sender,\n _nftContract,\n tokenId,\n price,\n true\n );\n s_listings[_nftContract][tokenId] = item;\n s_tokenIds.push(tokenId);\n s_listArr.push(item);\n\n emit NftListed(msg.sender, tokenId, _nftContract, price);\n }\n\n function unlistNft(address _nftContract, uint256 _tokenId) external {\n Listing memory item = s_listings[_nftContract][_tokenId];\n if (!item.isActive) {\n revert NftMarket__NotActive(\"not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n if (nft.ownerOf(_tokenId) != msg.sender) {\n revert NftMarket__NotOwnerOf(\"not the owner of the NFT\");\n }\n if (!nft.isApprovedForAll(msg.sender, address(this))) {\n revert NftMarket__NotApproved(\"not approved\");\n }\n item.isActive = false;\n emit NftUnlisted(msg.sender, _tokenId, _nftContract);\n }\n\n function buyNft(address _nftContract, uint256 _tokenId) external {\n Listing memory listing = s_listings[_nftContract][_tokenId];\n if (!listing.isActive) {\n revert NftMarket__NotActive(\"NFT not active\");\n }\n IERC721 nft = IERC721(_nftContract);\n // 将购买人身上的钱转给售卖人\n if (\n !i_paymentToken.transferFrom(\n msg.sender,\n listing.seller,\n listing.price\n )\n ) {\n revert NftMarket__PaymentFailed(\"payment failed\");\n }\n nft.safeTransferFrom(listing.seller, msg.sender, _tokenId);\n listing.isActive = false;\n emit NftPurchased(msg.sender, _tokenId, _nftContract, listing.price);\n }\n\n /**\n *\n * @dev 从 s_listings 中获取上架的 NFT\n */\n function getListsArray(\n address _nftContract\n ) public view returns (Listing[] memory) {\n Listing[] memory listings = new Listing[](s_tokenIds.length);\n for (uint256 i = 0; i < s_tokenIds.length; i++) {\n Listing memory item = s_listings[_nftContract][s_tokenIds[i]];\n listings[i] = item;\n }\n return listings;\n }\n\n /**\n * @dev 从数组中获取,对比两者差异\n */\n function getList(\n address _nftContract\n ) external view returns (Listing[] memory) {\n for (uint256 i = 0; i < s_listArr.length; i++) {\n Listing memory item = s_listArr[i];\n Listing memory listingItem = s_listings[_nftContract][item.tokenId];\n item.isActive = listingItem.isActive;\n }\n return s_listArr;\n }\n}\n" + }, + "contracts/NftToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport \"@openzeppelin/contracts/token/ERC721/ERC721.sol\";\nimport \"@openzeppelin/contracts/utils/Counters.sol\";\n\ncontract NftToken is ERC721 {\n using Counters for Counters.Counter;\n Counters.Counter private _tokenIdCounter;\n string private baseUri;\n\n // 每 mint 一个 nft 都需要把 count+1 表示 nft 总数量\n constructor() ERC721(\"NftToken\", \"NT\") {\n _tokenIdCounter.increment();\n }\n\n function mint(address to, string memory _baseUri) public {\n baseUri = _baseUri;\n uint256 tokenId = _tokenIdCounter.current();\n _tokenIdCounter.increment();\n _safeMint(to, tokenId);\n }\n\n function _baseURI() internal view virtual override returns (string memory) {\n return baseUri;\n }\n}\n" }, "hardhat/console.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.4.22 <0.9.0;\n\nlibrary console {\n address constant CONSOLE_ADDRESS =\n 0x000000000000000000636F6e736F6c652e6c6f67;\n\n function _sendLogPayloadImplementation(bytes memory payload) internal view {\n address consoleAddress = CONSOLE_ADDRESS;\n /// @solidity memory-safe-assembly\n assembly {\n pop(\n staticcall(\n gas(),\n consoleAddress,\n add(payload, 32),\n mload(payload),\n 0,\n 0\n )\n )\n }\n }\n\n function _castToPure(\n function(bytes memory) internal view fnIn\n ) internal pure returns (function(bytes memory) pure fnOut) {\n assembly {\n fnOut := fnIn\n }\n }\n\n function _sendLogPayload(bytes memory payload) internal pure {\n _castToPure(_sendLogPayloadImplementation)(payload);\n }\n\n function log() internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log()\"));\n }\n\n function logInt(int256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(int256)\", p0));\n }\n\n function logUint(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function logString(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function logBool(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function logAddress(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function logBytes(bytes memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes)\", p0));\n }\n\n function logBytes1(bytes1 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes1)\", p0));\n }\n\n function logBytes2(bytes2 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes2)\", p0));\n }\n\n function logBytes3(bytes3 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes3)\", p0));\n }\n\n function logBytes4(bytes4 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes4)\", p0));\n }\n\n function logBytes5(bytes5 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes5)\", p0));\n }\n\n function logBytes6(bytes6 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes6)\", p0));\n }\n\n function logBytes7(bytes7 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes7)\", p0));\n }\n\n function logBytes8(bytes8 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes8)\", p0));\n }\n\n function logBytes9(bytes9 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes9)\", p0));\n }\n\n function logBytes10(bytes10 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes10)\", p0));\n }\n\n function logBytes11(bytes11 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes11)\", p0));\n }\n\n function logBytes12(bytes12 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes12)\", p0));\n }\n\n function logBytes13(bytes13 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes13)\", p0));\n }\n\n function logBytes14(bytes14 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes14)\", p0));\n }\n\n function logBytes15(bytes15 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes15)\", p0));\n }\n\n function logBytes16(bytes16 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes16)\", p0));\n }\n\n function logBytes17(bytes17 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes17)\", p0));\n }\n\n function logBytes18(bytes18 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes18)\", p0));\n }\n\n function logBytes19(bytes19 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes19)\", p0));\n }\n\n function logBytes20(bytes20 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes20)\", p0));\n }\n\n function logBytes21(bytes21 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes21)\", p0));\n }\n\n function logBytes22(bytes22 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes22)\", p0));\n }\n\n function logBytes23(bytes23 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes23)\", p0));\n }\n\n function logBytes24(bytes24 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes24)\", p0));\n }\n\n function logBytes25(bytes25 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes25)\", p0));\n }\n\n function logBytes26(bytes26 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes26)\", p0));\n }\n\n function logBytes27(bytes27 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes27)\", p0));\n }\n\n function logBytes28(bytes28 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes28)\", p0));\n }\n\n function logBytes29(bytes29 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes29)\", p0));\n }\n\n function logBytes30(bytes30 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes30)\", p0));\n }\n\n function logBytes31(bytes31 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes31)\", p0));\n }\n\n function logBytes32(bytes32 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bytes32)\", p0));\n }\n\n function log(uint256 p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256)\", p0));\n }\n\n function log(string memory p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string)\", p0));\n }\n\n function log(bool p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool)\", p0));\n }\n\n function log(address p0) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address)\", p0));\n }\n\n function log(uint256 p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256)\", p0, p1));\n }\n\n function log(uint256 p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string)\", p0, p1));\n }\n\n function log(uint256 p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool)\", p0, p1));\n }\n\n function log(uint256 p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address)\", p0, p1));\n }\n\n function log(string memory p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256)\", p0, p1));\n }\n\n function log(string memory p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string)\", p0, p1));\n }\n\n function log(string memory p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool)\", p0, p1));\n }\n\n function log(string memory p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address)\", p0, p1));\n }\n\n function log(bool p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256)\", p0, p1));\n }\n\n function log(bool p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string)\", p0, p1));\n }\n\n function log(bool p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool)\", p0, p1));\n }\n\n function log(bool p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address)\", p0, p1));\n }\n\n function log(address p0, uint256 p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256)\", p0, p1));\n }\n\n function log(address p0, string memory p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string)\", p0, p1));\n }\n\n function log(address p0, bool p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool)\", p0, p1));\n }\n\n function log(address p0, address p1) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address)\", p0, p1));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool)\", p0, p1, p2));\n }\n\n function log(uint256 p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool)\", p0, p1, p2));\n }\n\n function log(string memory p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool)\", p0, p1, p2));\n }\n\n function log(bool p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool)\", p0, p1, p2));\n }\n\n function log(address p0, uint256 p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool)\", p0, p1, p2));\n }\n\n function log(address p0, string memory p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool)\", p0, p1, p2));\n }\n\n function log(address p0, bool p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, uint256 p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, string memory p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, bool p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool)\", p0, p1, p2));\n }\n\n function log(address p0, address p1, address p2) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address)\", p0, p1, p2));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(uint256 p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(uint256,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(string memory p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(string,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(bool p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(bool,address,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, uint256 p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,uint256,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, string memory p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,string,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, bool p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,bool,address,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, uint256 p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,uint256,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, string memory p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,string,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, bool p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,bool,address)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, uint256 p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,uint256)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, string memory p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,string)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, bool p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,bool)\", p0, p1, p2, p3));\n }\n\n function log(address p0, address p1, address p2, address p3) internal pure {\n _sendLogPayload(abi.encodeWithSignature(\"log(address,address,address,address)\", p0, p1, p2, p3));\n }\n}\n" diff --git a/members/missop/task5/web/next.config.mjs b/members/missop/task5/web/next.config.mjs index 9f588a65a..4910b39aa 100644 --- a/members/missop/task5/web/next.config.mjs +++ b/members/missop/task5/web/next.config.mjs @@ -11,6 +11,16 @@ const nextConfig = { config.externals.push("pino-pretty", "lokijs", "encoding"); return config; }, + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "bronze-elderly-pheasant-478.mypinata.cloud", + port: "", + pathname: "/ipfs/**", + }, + ], + }, }; export default nextConfig; diff --git a/members/missop/task5/web/package.json b/members/missop/task5/web/package.json index 05e7eee58..da8850a8d 100644 --- a/members/missop/task5/web/package.json +++ b/members/missop/task5/web/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@rainbow-me/rainbowkit": "^2.2.0", + "@wagmi/core": "^2.14.1", "next": "14.2.15", "react": "^18", "react-dom": "^18", diff --git a/members/missop/task5/web/src/app/components/ListNFTs.js b/members/missop/task5/web/src/app/components/ListNFTs.js index 773bbc9d9..a01c3025a 100644 --- a/members/missop/task5/web/src/app/components/ListNFTs.js +++ b/members/missop/task5/web/src/app/components/ListNFTs.js @@ -1,6 +1,9 @@ import { useGetListsNFTs, useNftList, useWrite } from "@/hooks/contract"; +import { waitForTransactionReceipt } from "@wagmi/core"; import React from "react"; import { useAccount } from "wagmi"; +import config from "../wagmi"; +import Image from "next/image"; export default function ListNFTs() { const { address } = useAccount(); @@ -15,12 +18,20 @@ export default function ListNFTs() { .filter((el) => el.isActive) .map((nft, index) => (
- {nft.name} + {nft.name}

NFT:#{nft.tokenId.toString()}

持有者:{nft.seller}

价格:{nft.price.toString()}MT

+

上架时间:{nft.listTime?.toString?.()}

{nft.seller === address ? (